algorytm do USART-a ATmega128



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
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.