Witam
Napisałem właśnie driver do UARTa.
/* interrupt from receive buffer - data in UDR is ready to read */
ISR(USART_RXC_vect)
{
/* read errors : frame error, data overrun, parity error */
uint8_t status=UCSRA;
/* read char from receive data register */
char data=UDR;
/* calculate new head index */
uint8_t temp_head;
temp_head=(uart_rx_head+1)&UART_RX_BUF_MASK;
/* check if the receive buffer is full */
if (temp_head==uart_rx_tail)
{
/* will execute if receive buffer overflow */
LED_RX_BUF_OVF=ON;
}
else
{
/* check if frame is good - mean has no errors */
if (!(status&((1<<FE)|(1<<DOR)|(1<<PE))))
{
uart_rx_head=temp_head;
uart_rx_buf[uart_rx_head]=data;
}
else
{
LED_ERR=ON;
}
}
}
Mam zrobioną "pętlę zwrotną" w Atmega16 - tj. dane które wysyłam trafiają mi na Rx i je sobie tym driverem czytam.
Wszystko działa poprawnie ponieważ po "zapchaniu" bufora zaświeca mi się dioda.
To co mnie niepokoi to to że nigdy nie zaświeca mi się dioda LED_ERR i w związku z tym mam pytania:
-
Czy poprawnie stworzyłem procedurę wykrywania błędów od Frame Error, Parity Error i Data Overrun ?
W dokumentacji pisało że zanim się zczyta UDR należy zczytać status więc tak też robię... -
Czy w przypadku gdy mam pętlę zwrotną a drucik ok 10 cm to nigdy takie błędy nie wystąpią ?
Moim zdaniem czasem powinny (szczególnie Frame Error) ponieważ nadajnik i odbiornik UART'a to dwa różne niezależne moduły a Atmedze16... Nie wiem jak jest z taktowaniem - być może błąd nie występuje dlatego że oba moduły są ze sobą zsynchronizowane w jakiś sposób i nigdy nie wystąpi przesunięcie modułu próbkującego i nadawczego ? Dodam tylko że pracuję na 8MHz (oscylator wew.) więc w związku z tym zgodnie z tabelą dot. błędów UARTa jakiś tam procent ramek błędnych powinien być.
U mnie jest tak że nie ma w ogóle. Błędów nie wykrywa nawet jeśli w przerwaniu przestanę odczytywać UDR, to jest linię:
char data=UDR;
zastąpię linią:
char data=0;
a to już wg mnie definitywnie powinno generować błąd od Data Overrun ponieważ po przyjściu kolejnej danej w UDR jest jeszcze poprzednio nieodczytana.
Ktoś pomoże ?