Commit 8de5c12b authored by BuildTools's avatar BuildTools
Browse files

Session 2 ported for ATmega4809

parent b75291c7
...@@ -7,6 +7,10 @@ ...@@ -7,6 +7,10 @@
#include <avr/interrupt.h> #include <avr/interrupt.h>
/**
In LF, we use the OLDED Xplained extension bhoard to pwm two leds at the same time. Can they do that?
*/
/* /*
In the pin definitions below, we have defined the PORT as well. In the pin definitions below, we have defined the PORT as well.
Everything works the same way as before, except you have to change PORTx with the PORT definition. Everything works the same way as before, except you have to change PORTx with the PORT definition.
...@@ -24,13 +28,6 @@ Example: LED1_PORT.OUTSET = (1 << LED1); ...@@ -24,13 +28,6 @@ Example: LED1_PORT.OUTSET = (1 << LED1);
#define SW1 2 //pin
#define SW2 1 //pin
#define SW3 2 //pin
#define SW1_PORT PORTC //port
#define SW2_PORT PORTD //port
#define SW3_PORT PORTD //port
#define TOP_PERIOD 0x55 #define TOP_PERIOD 0x55
......
...@@ -12,9 +12,9 @@ ...@@ -12,9 +12,9 @@
#include <util/delay.h> #include <util/delay.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
#define LED1 0 // port B #define LED1 4 // port D
#define LED2 1 // port B #define LED2 5 // port D
#define LED3 4 // Port B
int main(void) int main(void)
...@@ -23,8 +23,8 @@ int main(void) ...@@ -23,8 +23,8 @@ int main(void)
First set up the LEDs like in the previous exercise. You can either copy paste from the previous exercise or start fresh. First set up the LEDs like in the previous exercise. You can either copy paste from the previous exercise or start fresh.
*/ */
PORTB.DIR = (1 << LED1) | (1 << LED2); PORTD.DIR = (1 << LED1) | (1 << LED2);
PORTB.OUTTGL = (1 << LED1); //Starting with only 1 LED on PORTD.OUTTGL = (1 << LED1); //Starting with only 1 LED on
/*We will be using timer A that will trigger an overflow interupt. /*We will be using timer A that will trigger an overflow interupt.
This is a 16 bit timer that can run in 2 modes This is a 16 bit timer that can run in 2 modes
...@@ -61,7 +61,7 @@ int main(void) ...@@ -61,7 +61,7 @@ int main(void)
ISR(TCA0_OVF_vect){ ISR(TCA0_OVF_vect){
//Do something with the led(s), like toggle. //Do something with the led(s), like toggle.
PORTB.OUTTGL = (1 << LED1) | (1 << LED2); PORTD.OUTTGL = (1 << LED1) | (1 << LED2);
//Clear the interrupt flag. //Clear the interrupt flag.
//If we do not clear the flag, we will instantly jump back into the ISR again //If we do not clear the flag, we will instantly jump back into the ISR again
......
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
* Author : Petter * Author : Petter
*/ */
#define F_CPU 3333333UL #define F_CPU 3333333
#define BAUD_9600 ((4UL*F_CPU)/9600) #define BAUD_9600 4*F_CPU/9600
#include <avr/io.h> #include <avr/io.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
...@@ -15,43 +15,57 @@ ...@@ -15,43 +15,57 @@
/* /*
In this exercise we will set up and use UART communication. In this exercise we will set up and use UART communication.
The embedded debugger has a virtual com port that we will use to communicate with the computer. The embedded debugger has a virtual com port that we will use to communicate with the computer.
*/ */
#define TX_PORT PORTB
#define TX_PIN 0
void uart_init(unsigned long baud){ void uart_init(unsigned long baud){
//From chapter 24.3 in datasheet //From chapter 22.3.1 in datasheet
PORTB.DIRSET = (1 << PIN2_bp); //Setting up TX pin as output
PORTB.OUTSET = (1 << PIN2_bp); //Setting the TX pin high
USART0.BAUDH = (baud >> 8); //Shift register right by 8 bits to get the 8 high bits TX_PORT.OUTSET = (1 << TX_PIN); //Setting up TX pin as output
USART0.BAUDL = baud; //Set baud rate without shifting to get the 8 low bits TX_PORT.DIRSET = (1 << TX_PIN); //Setting up TX pin as output
//It turns out the compiler can handle this automatically, meaning this works just as well: //Set baud rate register
//USART0.BAUD = baud; USART3.BAUDL = (uint8_t) baud; //Set baud rate without shifting to get the 8 low bits
USART3.BAUDH = (uint8_t)(baud >> 8); //Shift register right by 8 bits to get the 8 high bits
//USART.CTRLC CMODE bits default to async, 1 stop bit, 8 bit character size //USART.CTRLC CMODE bits default to async, 1 stop bit, 8 bit character size
//Since all bits are default 0 we only need to change the character size part
USART3.CTRLC = (0x3 << USART_CHSIZE0_bp);
USART0.CTRLB |= (1 << USART_RXEN_bp) | (1 << USART_TXEN_bp); //Enable RX and TX //Enable RX and TX
USART3.CTRLB = (1 << USART_RXEN_bp) | (1 << USART_TXEN_bp);
USART0.CTRLA |= (1 << USART_RXCIE_bp); //Enable interrupts on incoming data //Enable interrupts on incoming data
USART3.CTRLA |= (1 << USART_RXCIE_bp);
} }
// function to transmit data // function to transmit data
void uart_transmit(unsigned char data){ void uart_transmit(char data){
//In this function we will be send data. //In this function we will be send data.
//First we should check that there isn't already data being sent //First we should check that there isn't already data being sent
// if there is, we should probably wait for it to finish first // if there is, we should probably wait for it to finish first
while (!(USART0.STATUS & (1 << USART_DREIF_bp))){ while (!(USART3.STATUS & (1 << USART_DREIF_bp))){
//wait for previous transmit to finish //wait for previous transmit to finish
}; };
//Put our new data into se sending register //Put our new data into tx data register
USART0.TXDATAL = data; USART3.TXDATAL = data;
}
//To send a string we can do this
void uart_transmit_string(char* data) {
while (*data != '\0') {
uart_transmit(*data);
data++;
}
} }
...@@ -67,16 +81,21 @@ int main(void) ...@@ -67,16 +81,21 @@ int main(void)
{ {
//We don't really need to do anything here. //We don't really need to do anything here.
//the ISR will handle receiving. //the ISR will handle receiving.
uart_transmit_string("Dette er en test\n");
_delay_ms(200);
} }
} }
//Interrupt service routine for the receiver. //Interrupt service routine for the receiver.
ISR(USART0_RXC_vect){ ISR (USART3_RXC_vect) {
//In the interrupt we will read the data in the receive buffer
//Read out the received data to a variable //First we should check that new data has arrived the receive buffer
uint8_t data = USART0_RXDATAL; while (!(USART3.STATUS & (1 << USART_RXCIF_bp))){
//Do things with data: //wait for previous transmit to finish
uart_transmit(data + 1); //Example: Shift all characters by one step A -> B, B -> C etc. };
//Store the data in a temporarily variable
uint8_t tmp = USART3.RXDATAL;
} }
\ No newline at end of file
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#define LED1 4 // port D, connected to WO4 #define LED1 4 // port D, connected to WO4
#define LED2 5 // port D, connected to WO5 #define LED2 5 // port D, connected to WO5
#define SW0 2 //on port C
......
...@@ -7,9 +7,9 @@ ...@@ -7,9 +7,9 @@
#include <util/delay.h> #include <util/delay.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
#define LED1 0 // port B #define LED1 4 // port D
#define LED2 1 // port B #define LED2 5 // port D
#define LED3 4 // Port B
int main(void) int main(void)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment