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.