Skip to content

Instantly share code, notes, and snippets.

@pqlaz
Created February 24, 2012 10:37
Show Gist options
  • Save pqlaz/1900038 to your computer and use it in GitHub Desktop.
Save pqlaz/1900038 to your computer and use it in GitHub Desktop.
UART эхо с использованием прерываний
// 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