Created
February 24, 2012 10:37
-
-
Save pqlaz/1900038 to your computer and use it in GitHub Desktop.
UART эхо с использованием прерываний
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// UART эхо с использованием прерываний | |
// avr-gcc, arduino nano AtMega168 | |
#include <avr/interrupt.h> | |
#include <avr/io.h> | |
#include <util/delay.h> | |
#define BAUD 38400 // скорость UART | |
#include <util/setbaud.h> | |
#define LED _BV(5) // светодиод на плате arduino | |
char symbol; | |
// прерывание при получении символа из UART | |
ISR(USART_RX_vect) | |
{ | |
// UDR - USART Data Register | |
symbol = UDR0; | |
// UCSR - USART Control and Status Register | |
// UDRIE - USART Data Register Empty Interrupt Enable | |
UCSR0B |= _BV(UDRIE0); // разрешить прерывание при опустошении буфера передатчика | |
} | |
// прерывание при опустошении буфера передатчика | |
// UDRE - USART Data Register Empty | |
ISR(USART_UDRE_vect) | |
{ | |
// UDR - USART Data Register | |
UDR0 = symbol; | |
// UCSR - USART Control and Status Register | |
// UDRIE - USART Data Register Empty Interrupt Enable | |
UCSR0B &= ~_BV(UDRIE0); // запретить прерывание при опустошении буфера | |
} | |
inline void init_uart(void) | |
{ | |
// UBRR - USART Baud Rate Register | |
UBRR0H = UBRRH_VALUE; // скорость (коэф. деления) | |
UBRR0L = UBRRL_VALUE; // скорость (коэф. деления) | |
// UCSR - USART Control and Status Register | |
// U2X - Double Speed Operation | |
UCSR0A &= ~_BV(U2X0); // отключить удвоение скорости | |
// UCSZ - USART Character Size | |
UCSR0B &= ~_BV(UCSZ02); // формат кадра - 8 бит | |
UCSR0C |= _BV(UCSZ01) | _BV(UCSZ00); // формат кадра - 8 бит | |
// USBS - USART Stop Bit Select | |
// UPM - USART Parity Mode | |
UCSR0C &= ~_BV(USBS0) & // 1 стоп-бит | |
~_BV(UPM00) & ~_BV(UPM01); // контроль четности отключен | |
// TXEN - Transmit Enable | |
// RXEN - Receive Enable | |
UCSR0B |= _BV(TXEN0) | _BV(RXEN0); // включить передатчик и приемник | |
} | |
int main() | |
{ | |
init_uart(); | |
UCSR0B |= _BV(RXCIE0); // разрешить прерывание при приеме символа | |
sei(); | |
for (;;) // мигать светодиодом | |
{ | |
PORTB ^= LED; | |
_delay_ms(300); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment