UART problem z wysyłaniem po starcie.

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,15

W terminalu komputera otrzymuje:

34,2,6,32,35,2,6,3,9,10,11,12,13,14,15

Czyli 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

Reply to
Michał
Loading thread data ...

a w kompie masz ustawiona predkosc transmisji na sztywno czy jest autodetect?

@
Reply to
Artur Miller

Tak jest na stałe. Tu musi być problem z oczekiwaniem na zwolnienie bufora nadawczego, bo zjada mi ostatni znak przy przejściu 4800->x . Czy ta linijka while (!(UCSR1A&(1<<TXC1))); na pewno czeka na opróżnienie bufora? Wieszało mi się prawdopodobnie dlatego, że najpierw sprawdzałem bufor czy jest pusty, a potem uruchamiałem USARTA. Dodałem tą linijkę funkcjami wysyłającymi polecenia i już się nie wiesza (USART wówczas działa), ale gubi mi ostatni znak, więc raczej do końca nie czeka na opróżnienie bufora :/ Co z globalnym wyłączeniem przerwań? Na pewno jest to konieczne przy zmianie prędkości? W przyszłości będą chodzić w tle inne przerwania, które wolał bym by były obsługiwane. Wysyłka całej inicjalizacji prędkością 4800 trwa trochę :/

Pozdrawiam

Reply to
=?windows-1250?Q?Micha=B3?=

Na początku masz wyłączony UART a stan TxD jest zapewne niski. PC potraktował to jako bit startu.

Paweł

Reply to
Paweł

Tak, najprawdopodobniej przez to mi się "wieszał". Założyłem, że jak nie wstawiłem nic do buforu, to jest pusty. Ruszył jak uruchomiłem UARTA. Pozostał tylko jeden problem, zjada mi ostatni znak przy przejściu na inną prędkość pomimo dodania linijki while (!(UCSR1A&(1<<TXC1))); po funkcji wysyłającej komendę, a przed wyłączeniem UARTA w celu zmiany prędkości. Popołudniu napisałem jedną odpowiedz o 15 i nie wiem czemu nie pojawiła się na googlach. U mnie w Outloku jest.

Pozdrawiam

Reply to
Michał

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.