algorytm do USART-a ATmega128

Jun 06, 2005 0 Replies

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.



Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required