ATmega32 i USART

Oct 07, 2005 11 Replies

Kiedys prosilem Was o pomoc w uruchomieniu portu USART w ATmega128. Teraz chce zrobic to samo dla ATmega32. Myslalem, ze wystarczy dostosowac uruchomiony kod dla 128-ki i wszystko bedzie hulac, niestety pomylilem sie. Adoptowany program wyglada nastepujaco:



  1. inicjalizacja dla 2400 8e1, kwarc 11,0592MHz uchar USARTinit(void) { unsigned int baud; baud = 287; /* Set baud rate */ UBRRH = (uchar)(baud>>8); UBRRL = (uchar)baud; UCSRC = 3<<UCSZ0; /* Set data bits */ UCSRC |= (2<<UPM0); /* Set Parity */ UCSRC |= (0<<USBS); /* Set stop bits */ /* Enable receiver and transmitter */ UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<TXCIE); return 1; }
  2. Przerwanie nadajnika SIGNAL( SIG_USART_TRANS ) { static char i='a';

cli(); // disable all interrupts UDR = i; sei(); // enable all interrupts } W przerwaniu dla uproszczenia wysylam jedynie stala wartosc. Niestety, w terminalu w PC odbierane sa jedynie zera (0). Przewody i uklad sprawdzilem. Wydaje mi sie, ze problem lezy po stronie programu. Dziwi mnie to, ze analogicznie zbudowane funkcje dla 128-ki dzialaja. Moze podpowiecie mi gdzie moze lezec problem? Z gory dziekuje.



Jacek



sprawdzilem.

Skoro s¹ odbierane zera, to znaczy, ¿e przerwanie dzia³a. S¹dzê, ¿e problem le¿y w linii static char i='a';, w której nastêpuje przypisanie zera do i. Spróbuj zrobiæ: UDR=97;.

Tego rowniez probowalem. Niestety jest bez zmian. Mam do dyspozycji jedynie stary, ruski oscyloskop wiec jego pomiarom nie mozna wierzyc ale poziomy napiec zmierzone miernikiem uniwersalnym na wyprowadzeniach maxa sa dobre. Nie mam pojecia gdzie szukac przyczyny. Zmienialem port w PC, uklad max232 i nic to nie dalo. Gdzie szukac dalej?

Jacek

Dobre, tzn. jakie? Czy jest jakokolwiek aktywnoœæ na linii TX procesora? Czy problem le¿y w tym, ¿e nic nie wysy³a, czy te¿ w tym, ¿e Ÿle wysy³a?

A zobacz jak to zostalo skompilowane ?

Jak sa odbierane - to dziala dobrze.

Jestes pewien ze predkosci sie zgadzaja ? Bo zera odbierzesz jak odbierac bedziesz co najmniej 8 razy za szybko. Np dlatego ze nie pracuje na kwarcu ..

J.

Jacek M. napisał(a):

Źle programujesz UCSRC - najstarszy bit musi być ustawiony.

Tomek

Poziom napiecia na wyprowadzeniu 6 maxa -8.33V a na wypr. 2 8.5V. Zasilanie na 16-ym oczywiscie 5V. Na wyprowadzeniu 15 (obudowa DIL40) jest przebieg ale tak jak pisalem oscyloskop mam slaby i nie moge go dokladnie pomierzyc. Poziomy H i L przebiegu jest sa w porzadku. Wydaje mi sie, ze problem lezy po stronie softu i niestety nie moge go zidentyfikowac. Jacek

to rowniez sprawdzilem, jest dobrze . Plik *.lss UDR = 'a'; // start USART interrupt ldi r24, 0x61 out 0x0c, r24

tego jeszcze nie sprawdzilem

To moze byc przyczyna. Jak sprawdze to odezwe sie. Dzieki Jacek

Rzeczywiscie, nie doczytalem tego. Dzieki Jacek

Serdeczne dzieki. Zmienilem ustawienia fuse bits i w inicjalizacji wprowadzilem zmienna, do ktorej wpisywalem wszystkie ustawienia tak jakbym programowal bajt UCSRC. Na koncu ustawilem na 1 bit URSEL. Dopiero taki bajt zapisalem do UCSRC. Teraz wysylanie wartosci 0x61 dziala. Teraz biore sie za oprogramowanie odbierania bajtow. Jeszcze raz dziekuje Wam wszystkim za pomoc. :-))

Jacek M.

Użytkownik Jacek M. napisał:

W uzupełnieniu tego co Napisali Koledzy: W obsłudze przerwania nie ma sensu wstawiać cli() .... sei(). AVRki nie mają wielopozomowych przerwań. Dopóki procek nie zakończy obsługi bieżącego przerwania nie przyjmie następnego (tzn. zapamięta fakt pojawienia się kolejnego przerwania ale wykona je dopiero po rozkazie reti bieżącej obsługi przerwania)

Pozdrawiam Grzegorz

Dziekuje za uwage. Pozdrawiam

Jacek

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required