RTV forum PL | NewsGroups PL

Jak poprawnie zainicjować UART w ATMEGA128, aby uniknąć śmieci po starcie?

UART problem z wysyłaniem po starcie.

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawnie zainicjować UART w ATMEGA128, aby uniknąć śmieci po starcie?

Michał
Guest

Tue Oct 30, 2007 1:15 pm   



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

Artur Miller
Guest

Tue Oct 30, 2007 2:06 pm   



"Michał" <mmmm@edwew.pl> wrote in message
news:fg77bq$fqt$1@atlantis.news.tpi.pl...
Quote:
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.

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

@

Michał
Guest

Tue Oct 30, 2007 3:06 pm   



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

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

Paweł
Guest

Tue Oct 30, 2007 5:54 pm   



Quote:
Witam wszystkich
Mam problem ze śmieciami wysyłanymi zaraz po inicjalizacji UARTa w
ATMEGA128.

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

Paweł

Michał
Guest

Tue Oct 30, 2007 10:41 pm   



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


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

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawnie zainicjować UART w ATMEGA128, aby uniknąć śmieci po starcie?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map