mod02 ex03
This commit is contained in:
@@ -107,6 +107,7 @@
|
|||||||
#define FAST_PWM_TOP_OCR1A_IN_TCCR1A (1<<WGM11 | 1<<WGM10)
|
#define FAST_PWM_TOP_OCR1A_IN_TCCR1A (1<<WGM11 | 1<<WGM10)
|
||||||
#define FAST_PWM_TOP_ICR1_IN_TCCR1B (1<<WGM13 | 1<<WGM12)
|
#define FAST_PWM_TOP_ICR1_IN_TCCR1B (1<<WGM13 | 1<<WGM12)
|
||||||
#define FAST_PWM_TOP_ICR1_IN_TCCR1A (1<<WGM11 | 0<<WGM10)
|
#define FAST_PWM_TOP_ICR1_IN_TCCR1A (1<<WGM11 | 0<<WGM10)
|
||||||
|
// 16.11.8 : Timer/Counter1 Interrupt Mask Register
|
||||||
#define INTERRUPT_ENABLE_CHANNEL_A (1 << OCIE1A)
|
#define INTERRUPT_ENABLE_CHANNEL_A (1 << OCIE1A)
|
||||||
#define INTERRUPT_DISABLE_CHANNEL_A (0 << OCIE1A)
|
#define INTERRUPT_DISABLE_CHANNEL_A (0 << OCIE1A)
|
||||||
|
|
||||||
|
|||||||
@@ -107,6 +107,7 @@
|
|||||||
#define FAST_PWM_TOP_OCR1A_IN_TCCR1A (1<<WGM11 | 1<<WGM10)
|
#define FAST_PWM_TOP_OCR1A_IN_TCCR1A (1<<WGM11 | 1<<WGM10)
|
||||||
#define FAST_PWM_TOP_ICR1_IN_TCCR1B (1<<WGM13 | 1<<WGM12)
|
#define FAST_PWM_TOP_ICR1_IN_TCCR1B (1<<WGM13 | 1<<WGM12)
|
||||||
#define FAST_PWM_TOP_ICR1_IN_TCCR1A (1<<WGM11 | 0<<WGM10)
|
#define FAST_PWM_TOP_ICR1_IN_TCCR1A (1<<WGM11 | 0<<WGM10)
|
||||||
|
// 16.11.8 : Timer/Counter1 Interrupt Mask Register
|
||||||
#define INTERRUPT_ENABLE_CHANNEL_A (1 << OCIE1A)
|
#define INTERRUPT_ENABLE_CHANNEL_A (1 << OCIE1A)
|
||||||
#define INTERRUPT_DISABLE_CHANNEL_A (0 << OCIE1A)
|
#define INTERRUPT_DISABLE_CHANNEL_A (0 << OCIE1A)
|
||||||
|
|
||||||
@@ -136,13 +137,6 @@ char uart_rx(void) {
|
|||||||
int main() {
|
int main() {
|
||||||
uart_init();
|
uart_init();
|
||||||
|
|
||||||
TCCR1A |= CTC_TOP_OCR1A_IN_TCCR1A; // Table 16-4 : set timer in CTC (Clear Time on Compare) mode
|
|
||||||
TCCR1B |= CTC_TOP_OCR1A_IN_TCCR1B;
|
|
||||||
|
|
||||||
OCR1A = TIME_MS(PERIOD); // Table 16-4 : set CTC compare value on channel A, the counter is cleared to zero when the counter value (TCNT1) matches the OCR1A register
|
|
||||||
|
|
||||||
TCCR1B |= (PRESCALE_SET(PRESCALE_VALUE)); // 16.4 : set timer according to prescale value, in register TCCR1B, table 16-5 : prescale sets
|
|
||||||
|
|
||||||
char received_char;
|
char received_char;
|
||||||
while(1) {
|
while(1) {
|
||||||
received_char = uart_rx();
|
received_char = uart_rx();
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h> // https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
|
||||||
|
|
||||||
// mathematics
|
// mathematics
|
||||||
#define DIV_ROUND_CLOSEST(n, d) ((((n) < 0) == ((d) < 0)) ? (((n) + (d)/2)/(d)) : (((n) - (d)/2)/(d))) // https://stackoverflow.com/a/18067292
|
#define DIV_ROUND_CLOSEST(n, d) ((((n) < 0) == ((d) < 0)) ? (((n) + (d)/2)/(d)) : (((n) - (d)/2)/(d))) // https://stackoverflow.com/a/18067292
|
||||||
@@ -62,29 +62,33 @@
|
|||||||
|
|
||||||
// USART
|
// USART
|
||||||
// Table 20-1 : Baud Rate Calculation
|
// Table 20-1 : Baud Rate Calculation
|
||||||
#define USART_BAUDRATE 115200
|
#define USART_BAUDRATE 115200
|
||||||
#define BAUD_PRESCALER (DIV_ROUND_CLOSEST(F_CPU, (16 * USART_BAUDRATE)) - 1)
|
#define BAUD_PRESCALER (DIV_ROUND_CLOSEST(F_CPU, (16 * USART_BAUDRATE)) - 1)
|
||||||
// Table 20-8 : Mode Selection (USART Mode SELect)
|
// Table 20-8 : Mode Selection (USART Mode SELect)
|
||||||
#define ASYNCHRONOUS (0<<UMSEL01 | 0<<UMSEL00)
|
#define ASYNCHRONOUS (0<<UMSEL01 | 0<<UMSEL00)
|
||||||
#define SYNCHRONOUS (0<<UMSEL01 | 1<<UMSEL00)
|
#define SYNCHRONOUS (0<<UMSEL01 | 1<<UMSEL00)
|
||||||
// Table 20-9 : Parity Bit Selection (USART Parity Mode)
|
// Table 20-9 : Parity Bit Selection (USART Parity Mode)
|
||||||
#define PARITY_DISABLED (0<<UPM01 | 0<<UPM00)
|
#define PARITY_DISABLED (0<<UPM01 | 0<<UPM00)
|
||||||
#define PARITY_EVEN (1<<UPM01 | 0<<UPM00)
|
#define PARITY_EVEN (1<<UPM01 | 0<<UPM00)
|
||||||
#define PARITY_ODD (1<<UPM01 | 1<<UPM00)
|
#define PARITY_ODD (1<<UPM01 | 1<<UPM00)
|
||||||
// Table 20-10 : Stop Bit Selection (USART Stop Bit Select)
|
// Table 20-10 : Stop Bit Selection (USART Stop Bit Select)
|
||||||
#define STOP_ONE_BIT (0<<USBS0)
|
#define STOP_ONE_BIT (0<<USBS0)
|
||||||
#define STOP_TWO_BIT (1<<USBS0)
|
#define STOP_TWO_BIT (1<<USBS0)
|
||||||
// Table 20-11 : Data Bit Selection (USART Character SiZe)
|
// Table 20-11 : Data Bit Selection (USART Character SiZe)
|
||||||
#define DATA_FIVE_BIT (0<<UCSZ02 | 0<<UCSZ01 | 0<<UCSZ00)
|
#define DATA_FIVE_BIT (0<<UCSZ02 | 0<<UCSZ01 | 0<<UCSZ00)
|
||||||
#define DATA_SIX_BIT (0<<UCSZ02 | 0<<UCSZ01 | 1<<UCSZ00)
|
#define DATA_SIX_BIT (0<<UCSZ02 | 0<<UCSZ01 | 1<<UCSZ00)
|
||||||
#define DATA_SEVEN_BIT (0<<UCSZ02 | 1<<UCSZ01 | 0<<UCSZ00)
|
#define DATA_SEVEN_BIT (0<<UCSZ02 | 1<<UCSZ01 | 0<<UCSZ00)
|
||||||
#define DATA_EIGHT_BIT (0<<UCSZ02 | 1<<UCSZ01 | 1<<UCSZ00)
|
#define DATA_EIGHT_BIT (0<<UCSZ02 | 1<<UCSZ01 | 1<<UCSZ00)
|
||||||
#define DATA_NINE_BIT (1<<UCSZ02 | 1<<UCSZ01 | 1<<UCSZ00)
|
#define DATA_NINE_BIT (1<<UCSZ02 | 1<<UCSZ01 | 1<<UCSZ00)
|
||||||
// 20.11.3 : USART Control and Status Register B (UCSRnB)
|
// 20.11.3 : USART Control and Status Register B (UCSRnB)
|
||||||
#define RECEIVER_DISABLED (0<<RXEN0)
|
#define RECEIVER_DISABLED (0<<RXEN0)
|
||||||
#define RECEIVER_ENABLED (1<<RXEN0)
|
#define RECEIVER_ENABLED (1<<RXEN0)
|
||||||
#define TRANSMITTER_DISABLED (0<<TXEN0)
|
#define TRANSMITTER_DISABLED (0<<TXEN0)
|
||||||
#define TRANSMITTER_ENABLED (1<<TXEN0)
|
#define TRANSMITTER_ENABLED (1<<TXEN0)
|
||||||
|
#define INTERRUPT_RECEIVER_DISABLED (0<<RXCIE0)
|
||||||
|
#define INTERRUPT_RECEIVER_ENABLED (1<<RXCIE0)
|
||||||
|
#define INTERRUPT_TRANSMITTER_DISABLED (0<<TXCIE0)
|
||||||
|
#define INTERRUPT_TRANSMITTER_ENABLED (1<<TXCIE0)
|
||||||
|
|
||||||
// TIMER
|
// TIMER
|
||||||
#define PERIOD 2000
|
#define PERIOD 2000
|
||||||
@@ -107,45 +111,47 @@
|
|||||||
#define FAST_PWM_TOP_OCR1A_IN_TCCR1A (1<<WGM11 | 1<<WGM10)
|
#define FAST_PWM_TOP_OCR1A_IN_TCCR1A (1<<WGM11 | 1<<WGM10)
|
||||||
#define FAST_PWM_TOP_ICR1_IN_TCCR1B (1<<WGM13 | 1<<WGM12)
|
#define FAST_PWM_TOP_ICR1_IN_TCCR1B (1<<WGM13 | 1<<WGM12)
|
||||||
#define FAST_PWM_TOP_ICR1_IN_TCCR1A (1<<WGM11 | 0<<WGM10)
|
#define FAST_PWM_TOP_ICR1_IN_TCCR1A (1<<WGM11 | 0<<WGM10)
|
||||||
|
// 16.11.8 : Timer/Counter1 Interrupt Mask Register
|
||||||
#define INTERRUPT_ENABLE_CHANNEL_A (1 << OCIE1A)
|
#define INTERRUPT_ENABLE_CHANNEL_A (1 << OCIE1A)
|
||||||
#define INTERRUPT_DISABLE_CHANNEL_A (0 << OCIE1A)
|
#define INTERRUPT_DISABLE_CHANNEL_A (0 << OCIE1A)
|
||||||
|
|
||||||
|
// text
|
||||||
|
#define SWITCH_CASE(ch) (((ch) >= 'A' && (ch) <= 'Z') || ((ch) >= 'a' && (ch) <= 'z') ? ((ch) ^ (1 << 5)) : (ch))
|
||||||
|
|
||||||
// END MACROS
|
// END MACROS
|
||||||
|
|
||||||
void uart_init() {
|
void uart_init() {
|
||||||
UBRR0H = (unsigned char) (BAUD_PRESCALER >> 8); // 20.11.5 : UBRRnL and UBRRnH – USART Baud Rate Registers
|
UBRR0H = (unsigned char) (BAUD_PRESCALER >> 8); // 20.11.5 : UBRRnL and UBRRnH – USART Baud Rate Registers
|
||||||
UBRR0L = (unsigned char) BAUD_PRESCALER;
|
UBRR0L = (unsigned char) BAUD_PRESCALER;
|
||||||
|
|
||||||
UCSR0C |= ASYNCHRONOUS | PARITY_DISABLED | STOP_ONE_BIT | DATA_EIGHT_BIT; // 20.11.4 : set Frame Format
|
UCSR0C |= ASYNCHRONOUS | PARITY_DISABLED | STOP_ONE_BIT | DATA_EIGHT_BIT; // 20.11.4 : set Frame Format
|
||||||
|
|
||||||
UCSR0B |= RECEIVER_ENABLED | TRANSMITTER_ENABLED; // 20.11.3 : enable Receiver and/or Transmitter
|
UCSR0B |= RECEIVER_ENABLED | TRANSMITTER_ENABLED | INTERRUPT_RECEIVER_ENABLED; // 20.11.3 : enable Receiver and Transmitter, and interrupt on receiver
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// char uart_rx(void) {
|
||||||
|
// while (TEST(UCSR0A, RXC0) == 0); // 20.11.2 : do nothing until there are unread data in the receive buffer (UDRn), (RXCn flag in UCSRnA register set to 1 when buffer has data)
|
||||||
|
// return UDR0; // 20.11.1 : get data in buffer, UDRn – USART I/O Data Register (read and write)
|
||||||
|
// }
|
||||||
|
|
||||||
void uart_tx(char c) {
|
void uart_tx(char c) {
|
||||||
while (TEST(UCSR0A, UDRE0) == 0); // 20.11.2 : do nothing until UDRn buffer is empty, (UDREn flag in UCSRnA register set to 1 when buffer empty)
|
while (TEST(UCSR0A, UDRE0) == 0); // 20.11.2 : do nothing until UDRn buffer is empty, (UDREn flag in UCSRnA register set to 1 when buffer empty)
|
||||||
UDR0 = (unsigned char) c; // 20.11.1 : Put data into buffer, UDRn – USART I/O Data Register (read and write)
|
UDR0 = (unsigned char) c; // 20.11.1 : Put data into buffer, UDRn – USART I/O Data Register (read and write)
|
||||||
}
|
}
|
||||||
|
|
||||||
char uart_rx(void) {
|
ISR(USART_RX_vect) { // Table 12-7 : we select the code for USART Receive
|
||||||
while (TEST(UCSR0A, RXC0) == 0); // 20.11.2 : do nothing until there are unread data in the receive buffer (UDRn), (RXCn flag in UCSRnA register set to 1 when buffer has data)
|
// char received_char = uart_rx();
|
||||||
return UDR0; // 20.11.1 : get data in buffer, UDRn – USART I/O Data Register (read and write)
|
char received_char = UDR0; // Read received character
|
||||||
|
uart_tx(SWITCH_CASE(received_char)); // Toggle case and send back
|
||||||
}
|
}
|
||||||
|
|
||||||
// send back caracters received on serial port
|
// send back caracters received on serial port with case toggling, using interupt and empty infinite loop
|
||||||
// `screen /dev/ttyUSB0 115200`
|
// `screen /dev/ttyUSB0 115200`
|
||||||
int main() {
|
int main() {
|
||||||
uart_init();
|
uart_init();
|
||||||
|
|
||||||
TCCR1A |= CTC_TOP_OCR1A_IN_TCCR1A; // Table 16-4 : set timer in CTC (Clear Time on Compare) mode
|
sei(); // enable global interrupts
|
||||||
TCCR1B |= CTC_TOP_OCR1A_IN_TCCR1B;
|
|
||||||
|
|
||||||
OCR1A = TIME_MS(PERIOD); // Table 16-4 : set CTC compare value on channel A, the counter is cleared to zero when the counter value (TCNT1) matches the OCR1A register
|
while(1);
|
||||||
|
|
||||||
TCCR1B |= (PRESCALE_SET(PRESCALE_VALUE)); // 16.4 : set timer according to prescale value, in register TCCR1B, table 16-5 : prescale sets
|
|
||||||
|
|
||||||
char received_char;
|
|
||||||
while(1) {
|
|
||||||
received_char = uart_rx();
|
|
||||||
uart_tx(received_char);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user