Skip to content

Instantly share code, notes, and snippets.

@pqlaz
Created February 23, 2012 10:58
Show Gist options
  • Save pqlaz/1892303 to your computer and use it in GitHub Desktop.
Save pqlaz/1892303 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
unsigned char pos = 0;
char hello[] = "Hello, world!";
// UDRE - USART Data Register Empty
ISR(USART_UDRE_vect) // вектор прерывания
{
char c = hello[pos++];
if ( c )
{
// UDR - USART Data Register
UDR0 = c; // вывод очередного символа в UART
}
else
{
// UDRIE - USART Data Register Empty Interrupt Enable
UCSR0B &= ~_BV(UDRIE0); // запретить прерывание при пустом буфере
pos = 0;
}
}
inline void init_uart(void) // инициализация UART
{
// UBRR - USART Baud Rate Register
UBRR0H = UBRRH_VALUE; // скорость (коэф. деления)
UBRR0L = UBRRL_VALUE; // скорость (коэф. деления)
// U2X - Double Speed Operation
UCSR0A &= ~_BV(U2X0); // отключить удвоение скорости
// UCSR - USART Control and Status Register
// 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 - Transmitter Enable
UCSR0B |= _BV(TXEN0); // включить передатчик
}
int main()
{
init_uart();
sei();
for (;;)
{
PORTB ^= LED; // изменить состояние выхода на противоположное
// UDRIE - USART Data Register Empty Interrupt Enable
UCSR0B |= _BV(UDRIE0); // разрешить прерывание при опустошении буфера
_delay_ms(500); // пауза 0.5 сек
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment