Настраиваем микроконтроллер Atmega8 на прием данных через UART

Для приема данных будем использовать все настройки с предыдущего урока.
Так же необходимо активировать бит RXEN в регистре UCSRB.
После чего разрешаем прерывания на прием данных, так как нам заранее не известно когда придут данные.
ISR(USART_RXC_vect){}
По сути нам надо считать данные с регистра UDR,  когда они придут:
ISR(USART_RXC_vect)
{
int b;
b = UDR;
}
Наш программа будет принимать числа с компьютера и в зависимости от числа будем зажигать светодиоды:
Если мы отправляем символ 0 будем зажигать 1-ый светодиод, если символ 1, будем зажигать 2-ой светодиод. При отправке символа 2 — будут гореть оба, при любых других символах светодиоды не будут светиться.
Программный код:

#define F_CPU 4000000 // рабочая частота микроконтроллера
#define BAUD 9600L // скорость передачи данных
#define UBRRL_value (F_CPU/(BAUD*16))-1 //Согластно заданной скорости подсчитываем значение для регистра UBRR
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
void init_pin(void);
#define HL1_on() PORTB|=(1<<PB0)
#define HL1_off() PORTB&=~(1<<PB0)
#define HL2_on() PORTB=(1<<PB1)
#define HL2_off() PORTB&=~(1<<PB1)
int b;
ISR(USART_RXC_vect)// прерывание на прием данных
{
b = UDR; // считываем данные
}
void init_USART() {
UBRRL = UBRRL_value; //Младшие 8 бит UBRRL_value
UBRRH = UBRRL_value >> 8; //Старшие 8 бит UBRRL_value
UCSRB |=(1<<TXEN)|(1<<RXEN); //Бит разрешения передачи и приема
UCSRC |=(1<< URSEL)|(1<< UCSZ0)|(1<< UCSZ1); //Устанавливем формат 8 бит данных
UCSRB |= (1<<RXCIE);// разрешаем прерывание по приему данных
sei();// разрешение глобального прерывания
}
void send_UART(char value) {
while(!( UCSRA & (1 << UDRE))); // Ожидаем когда очистится буфер передачи
UDR = value; // Помещаем данные в буфер, начинаем передачу
}

int main(void)
{
init_pin();
init_USART(); //инициализация
send_UART(‘O’);
send_UART(‘K’);
send_UART(‘!’);
send_UART(0x0D); //переход в начало строки
send_UART(0x0A);//переход на новую строку
while(1)
{
if(b==’0′)// если символ 0
{
HL1_on(); HL2_off();
send_UART(‘1’);
send_UART(0x0D); //переход в начало строки
send_UART(0x0A);//переход на новую строку
_delay_ms(500);
}
if(b==’1′) // если символ 1
{
HL2_on();HL1_off();
send_UART(‘2’);
send_UART(0x0D); //переход в начало строки
send_UART(0x0A);//переход на новую строку
_delay_ms(500);
_delay_ms(500);
}
if(b==’2′) // если символ 2
{
HL2_on();HL1_on();
send_UART(‘-‘);
send_UART(0x0D); //переход в начало строки
send_UART(0x0A);//переход на новую строку
_delay_ms(500);
_delay_ms(500);
}
if (b ==’3′){
send_UART(‘0’);
send_UART(0x0D); //переход в начало строки
send_UART(0x0A);//переход на новую строку
HL1_off();
HL2_off();
}
}
}
void init_pin(void)
{
PORTB=0b00000000;//PB0, PB1
DDRB= 0b00000011;//PB0, PB1 output
}