Вот такой у меня еще вопрос:
Как прекратить передачу символов от контроллера к компу, после отправленных символов ?
Допустим: ввел "ANSWER", получил эхом его обратно, но только один раз, и не более.
А то получается, что сколько не нажму энтер, столько раз оно и появляется...
И отсюда еще вопрос: почему слово приходит порой не полностью ? Например "ANSWER" - "NSWER" или "SWER" ? - это происходит обычно после сброса контроллера или на второй или третий раз после энтер ?
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#define UART_BAUD 9600 // Скорость USART порта
void USART_init(void)
{
#if F_CPU < 2000000UL && defined(U2X)
UCSRA = _BV(U2X);
UBRRL = (F_CPU / (8UL * UART_BAUD)) - 1;
#else
UBRRL = (F_CPU / (16UL * UART_BAUD)) - 1;
#endif
UCSRB = (1 << TXEN) | (1 << RXEN);
UCSRB |= (1 << RXCIE);
sei();
}
volatile char buf[200]; // Буфер
volatile int bufsize = 0; // Длина строки
volatile char ready = 0; // Получена ли строка?
ISR(USART_RXC_vect)
{
int b;
b = UDR; // Получаем эти данные
if (((b == 13) || (b == 10))
&& (bufsize > 0)) ready = 1;
if ((b != 13) && (b != 10)
&& (bufsize < sizeof(buf)-1))
buf[bufsize++] = b;
}
ISR(USART_TXC_vect)
{
//if(ready==1)
//cli();
//UDR='J';
}
int main(void)
{
USART_init();
char *p = "A ?";
while (*p){while(!(UCSRA & (1 << UDRE)));UDR = (uint16_t)*p;p++;} //тестовая строка, вместоп риветствия
while (1)
{
while (ready);
int i;
for (i = 0; i < bufsize; i++)
{
while(!(UCSRA & (1 << UDRE)));
UDR = buf[i];
}
bufsize = 0;
ready = 0;
}
return 0;
} 

