Witam wszystkich Mam problem ze śmieciami wysyłanymi zaraz po inicjalizacji UARTa w ATMEGA128. Wysyłam ciąg 15 bajtów np.:
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15W terminalu komputera otrzymuje:
34,2,6,32,35,2,6,3,9,10,11,12,13,14,15Czyli początkowy ciąg znaków jest losowy. Dzieje się to tylko zaraz po inicjalizacji UARTA. Potem jak wysyłam ten sam ciąg tą samą funkcją wszystko jest ok. Bardzo mnie to nie dziwi, bo pewnie moduł musi się ustabilizować po zmianie częstotliwości pracy, ale nie wiem jak sprawdzić, czy już można nadawać. Sprawdzałem bit TXC, ale to mi zawiesza program: while (!(UCSR1A&(1<<TXC1)));
Teoretycznie mógłbym wysyłać np. 10bajtów po inicjalizacji, ale to chyba nie najefektywniejsza metoda.
Czyli w skrócie jak przygotować rejestry i sprawdzić gotowość do nadawania po zmianie prędkości UARTA? Moja funkcja poniżej wysyła ten sam ciąg bajtów dla różnych prędkości UARTA. Ma to być wymuszenie trybu pracy dla GPSu. Tak samo robi program SIRFDemo.
//Kwarc to 14,75MHz #define NBAUDRATETAB 5 uint8_t BaudRateTab[]={191, 95, 47, 23, 15};
void init_gps(void) { uint8_t i; //Wyłączenie modułu na czas konfiguracji UCSR1B=(0<<RXCIE1)|(0<<RXEN1)|(0<<TXEN1); //Typ i budowa ramki : asynchroniczny, brak bitu parzystości, 1 bit stopu, 8 bitów danych UCSR1C=(0<<UMSEL1)|(0<<UPM11)|(0<<USBS1)|(1<<UCSZ11)|(1<<UCSZ10); UBRR1H=0;
for (i=0;i<NBAUDRATETAB;i++) { //Oczekiwanie na zwolnienie bufora nadawczego //Tu powinno być raczej TXC, ale mi zawiesza program while (!(UCSR1A&(1<<UDRE1))); //Wyłączenie USART na czas konfiguracji UCSR1B=(0<<RXCIE1)|(0<<RXEN1)|(0<<TXEN1); UBRR1L=BaudRateTab[i]; //Włączenie RX na czas wysłania ramki UCSR1B=(0<<RXCIE1)|(0<<RXEN1)|(1<<TXEN1);
//Wyślij konfigurację NMEA (działa ok) message_out(&SetNMEA4800); //Wyślij konfigurację SIRF message_out(&SetSF4800); }
//Oczekiwanie na zwolnienie bufora nadawczego //Tu także powinno być raczej RTX sprawdzający czy bufor jest pusty while (!(UCSR1A&(1<<UDRE1))); //Wyłączenie USART na czas konfiguracji UCSR1B=(0<<RXCIE1)|(0<<RXEN1)|(0<<TXEN1); //Konfiguracja ostateczna i włączenie przerwania na bajt odebrany UBRR1L=191; UCSR1B=(1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1); }
Gdzie są błędy? ) czym zapomniałem? Czy przerwanie globalne musi być koniecznie wyłączone? Nie można tylko wyłączyć przerwań UARTA? W teście przerwania włączałem dopiero po funkcji init_gps().
Pozdrawiam