algorytm do USART-a ATmega128
Masz problem? Zapytaj na forum elektroda.pl
From: "Jacek" <tymkonto_at_nospam_poczta.onet.pl>
Subject: algorytm do USART-a ATmega128
Date: Tue, 7 Jun 2005 00:21:02 +0200
Witam.
I znowu napotkalem problem z Atmega128. Kompilator GCC z pakietu WinAVR.
Wysylam przez USART wielobajtowe ramki danych. W tym celu zdefiniowalem jako
zmienne globalne: bufor nadajnika, licznik bajtow do wyslania i zmienna
stanu nadajnika.
Funkcja wysylajaca czeka na zakonczenie bierzacej transmisji ramki a
nastepnie wypelnia te zmienne danymi i uruchamia przerwanie USART. Bufor
jest oprozniany i licznik dekrementowany w przerwaniu. Po zakonczeniu
operacji USART jest gotowy do wysylki nowej ramki.
enum {STOP, WRITEN, SENDING};
volatile uchar USARTbuf[50];
volatile uchar counter = 0;
volatile static uchar rsState=STOP;
void USARTsend ( uchar* data, uchar count ){
static uchar *a=USARTbuf;
while(counter);
counter = count;
while(count--) *a++ = *data++;
rsState = WRITEN;
UCSR0B |= (1<<UDRIE);
}
SIGNAL( SIG_USART0_DATA ){
static uchar *a;
cli();
if( counter-- ){
if( rsState == WRITEN) { // is a first byte?
rsState = SENDING;
a = USARTbuf;
}
UDR1 = *a++;
}
else
{
rsState = STOP;
UCSR0B &= ~( 1<<UDRIE ); // USART0 transmit interrupt
disable
}
sei(); // enable all interrupts
}
Wszystko dziala bardzo dobrze dla predkosci 2400 bps, jednak zwiekszenie
predkosci transmisji powoduje wysylanie blednych bajtow. Jak wynika z data
scheet mikrokontrolera blad predkosci dla fosc 2MHz dla wszystkich
ustawianych przeze mnie predkosci jest taki sam (0,2%). Czy w moim
algorytmie jest jakis blad? Zastanawiam się nad zastosowaniem zewnetrznego
kwarcu ale przed tym chciałbym być pewny poprawnosci mojej koncepcji.
Jacek M.