Ошибка FE по USART (atmega8, Си)
Добавлено: Сб окт 18, 2014 19:12:57
Доброго времени суток! Реализую циклическую асинхронную передачу байта по USART на Си (8 бит, 9600 bod, 2 stop-бита; F_CPU=8 МГц). Проверяю на светодиодах. Чтобы не загружать процессор на ожидание пересылки, прием/передачу данных повесил на прерывания... Передатчик вроде отрабатывает нормально. Но при симуляции в Протеусе в логе появляется ошибка Frame Error (ошибка кадрирования) на приемнике. Я так понимаю это рассинхронизация, хотя скорости обмена одинаковые... (однако в общем пакеты доходят и нужные светодиоды загораются). Если в обработке прерывания добавить блок обработки флагов ошибок (закомменчен), то светодиоды приемника вообще не реагируют... Помогите разобраться, что я делаю не так?
Код приемника:

п.с. не смог загрузить файл протеуса(
Код приемника:
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned char word=0x00;
ISR(USART_RXC_vect)
{
cli();
/*---------------------------*/
/*
unsigned char status;
status=UCSRA;
if(status & (1<<FE)|(1<<DOR)|(1<<PE))
{
while(UCSRA&(1<<RXC))status=UDR;
return;
}
*/
word=UDR;
/*---------------------------*/
sei();
return;
}
int main(void)
{
/*Port C - LEDs*/
DDRC=0xFF;
PORTC=0x00;
/*Speed: 9600 BOD*/
UBRRH=0;
UBRRL=51;
/*Inicial UCSRA*/
UCSRA=0x00;
/*UCSRB*/
UCSRB=0x00;
UCSRB=(1<<RXCIE)|(1<<RXEN);
/*UCSRC: 8 bit;*/
UCSRC=(1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
sei();
while(1)
{
PORTC=word;
_delay_ms(10);
}
return 0;
}
п.с. не смог загрузить файл протеуса(