Created
February 23, 2012 10:58
-
-
Save pqlaz/1892303 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 | |
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