ATmega32 i USART
Masz problem? Zapytaj na forum elektroda.pl
From: "Jacek M." <tymkonto_at_nospam_poczta.onet.pl>
Subject: ATmega32 i USART
Date: Fri, 7 Oct 2005 12:15:13 +0200
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
From: "Bogdan Gutknecht" <b_gutknecht_at_nospam_interia.pl>
Subject: Re: ATmega32 i USART
Date: Fri, 7 Oct 2005 12:28:01 +0200
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?
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;.
From: "Jacek M." <tymkonto_at_nospam_poczta.onet.pl>
Subject: Re: ATmega32 i USART
Date: Fri, 7 Oct 2005 12:43:37 +0200
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?
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
From: "Bogdan Gutknecht" <b_gutknecht_at_nospam_interia.pl>
Subject: Re: ATmega32 i USART
Date: Fri, 7 Oct 2005 13:03:31 +0200
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.
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?
From: "Jacek M." <tymkonto_at_nospam_poczta.onet.pl>
Subject: Re: ATmega32 i USART
Date: Fri, 7 Oct 2005 13:24:21 +0200
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.
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?
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
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: ATmega32 i USART
Date: Fri, 07 Oct 2005 13:04:47 +0200
On Fri, 7 Oct 2005 12:15:13 +0200, Jacek M. wrote:
2. Przerwanie nadajnika
SIGNAL( SIG_USART_TRANS )
{
static char i='a';
cli(); // disable all interrupts
UDR = i;
sei(); // enable all interrupts
}
A zobacz jak to zostalo skompilowane ?
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?
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.
From: "Jacek M." <tymkonto_at_nospam_poczta.onet.pl>
Subject: Re: ATmega32 i USART
Date: Fri, 7 Oct 2005 13:36:56 +0200
On Fri, 7 Oct 2005 12:15:13 +0200, Jacek M. wrote:
2. Przerwanie nadajnika
SIGNAL( SIG_USART_TRANS )
{
static char i='a';
cli(); // disable all interrupts
UDR = i;
sei(); // enable all interrupts
}
A zobacz jak to zostalo skompilowane ?
to rowniez sprawdzilem, jest dobrze . Plik *.lss
UDR = 'a'; // start USART interrupt
ldi r24, 0x61
out 0x0c, r24
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?
Jak sa odbierane - to dziala dobrze.
tego jeszcze nie sprawdzilem
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 ..
To moze byc przyczyna. Jak sprawdze to odezwe sie.
Dzieki
Jacek
From: "Tomek M." <t.m.v.t.m.v_at_nospam_interia.pl>
Subject: Re: ATmega32 i USART
Date: Fri, 07 Oct 2005 13:10:44 +0200
Jacek M. napisał(a):
UCSRC = 3<<UCSZ0; /* Set data bits */
UCSRC |= (2<<UPM0); /* Set Parity */
UCSRC |= (0<<USBS); /* Set stop bits */
Źle programujesz UCSRC - najstarszy bit musi być ustawiony.
Tomek
From: "Jacek M." <tymkonto_at_nospam_poczta.onet.pl>
Subject: Re: ATmega32 i USART
Date: Fri, 7 Oct 2005 13:41:02 +0200
UCSRC = 3<<UCSZ0; /* Set data bits */
UCSRC |= (2<<UPM0); /* Set Parity */
UCSRC |= (0<<USBS); /* Set stop bits */
Źle programujesz UCSRC - najstarszy bit musi być ustawiony.
Rzeczywiscie, nie doczytalem tego.
Dzieki
Jacek
From: "Jacek M." <tymkonto_at_nospam_poczta.onet.pl>
Subject: Re: ATmega32 i USART - ROZWIAZANIE
Date: Fri, 7 Oct 2005 13:59:25 +0200
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.
From: Grzegorz Kurczyk <grzegorz.usun.to_at_nospam_control.slupsk.pl>
Subject: Re: ATmega32 i USART
Date: Fri, 07 Oct 2005 16:46:49 +0200
Użytkownik Jacek M. napisał:
2. Przerwanie nadajnika
SIGNAL( SIG_USART_TRANS )
{
static char i='a';
cli(); // disable all interrupts
UDR = i;
sei(); // enable all interrupts
}
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
From: "Jacek M." <tymkonto_at_nospam_poczta.onet.pl>
Subject: Re: ATmega32 i USART
Date: Fri, 7 Oct 2005 18:02:03 +0200
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)
Dziekuje za uwage.
Pozdrawiam
Jacek