Приветствую.
Суть : через терминал посылаются байты 0, либо 1, либо 2. В зависимости от этого светодиод зажигается либо 1, либо 2, либо 3 раза.
Проблема: когда посылаю 2, то должен сразу 3 раза поморгать светодиод, однако приходится 2 посылать 3 раза, и только на 3-й раз светодиод моргает 3 раза. Тоже самое когда посылаю 0 или 1, только на второй раз начинает нормально моргать светодиод (т.е только когда второй раз байт отправил).
В чем причина?
Вот код на Atmel Studio.
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/delay.h>
#include "USART.h"
void led_blink()
{
if(USART_reciv() == '0') //моргаем 1 раз
{
PORTB |= (1 << 2);
_delay_ms(100);
PORTB &= ~(1 << 2);
}
else if(USART_reciv() == '1') // моргаем 2 раза
{
PORTB |= (1 << 2);
_delay_ms(100);
PORTB &= ~(1 << 2);
_delay_ms(100);
PORTB |= (1 << 2);
_delay_ms(100);
PORTB &= ~(1 << 2);
}
else if(USART_reciv() == '2') // если прислали 2, то моргаем 3 раза
{
PORTB |= (1 << 2);
_delay_ms(100);
PORTB &= ~(1 << 2);
_delay_ms(100);
PORTB |= (1 << 2);
_delay_ms(100);
PORTB &= ~(1 << 2);
_delay_ms(100);
PORTB |= (1 << 2);
_delay_ms(100);
PORTB &= ~(1 << 2);
}
}
int main(void)
{
DDRB = 0xFF; // led
DDRD |= (1 << 1); //tx
DDRD &= ~(1 << 0); //rx
USART_init(MYUBRR); //инициализируем USART, MYUBRR - это скорость передачи, по спец формуле рассчитывается
USART_transmit('O'); USART_transmit('k'); USART_transmit('!'); USART_transmit(0x0d);
USART_transmit(0x0a); //отправляем "Ок!" в терминал, чтобы проверить работу USART
while (1)
{
led_blink();
_delay_ms(10); // думал поставить задержку, чтобы решить проблему, но все так же
}
}