Jak poprawnie skonfigurować przerwania od transmisji szeregowej w mikrokontrolerze 8051?

'51 - serial interrupt ?!?!





Poprzedni Następny
Wiadomość
Spis treści
From: "Blady" <adam_at_nospam_netis.pl>
Subject: '51 - serial interrupt ?!?!
Date: Thu, 25 Apr 2002 09:24:29 +0200


Witam,
Czy ktoś przerabiał temat przerwań od transmisji szeregowej?
Mam prosty program - pętla głowna i obsługa przerwania od transmisji
szeregowej. Chciałbym odbierać znaki w przerwaniu dopisując je do bufora.
Niestety zaraz po starcie procesor wchodzi do procedury obsługi przerwania i
"siedzi" w niej cały czas, niezależnie od flag RI i TI w rejestrze SCON
(rejestr IE ma ustawiony bit 7 i 4). Kombinowałem na wszystkie sposoby ze
wszystkimi bitami rejestru SCON ale zawsze otrzymuje ten sam efekt.
Wynika z tego że procesor cały czas dostaje sygnał przerwania nawet przy
RI=0 i TI=0, dlaczego?
Może gdzieś w sieci jest coś na ten temat?

Enable Interrupts
Enable Serial
On Serial Rs

Do
...
Loop

Rs:
A=Sbuf
Reset Scon.0
Bufor=Bufor+A
Return

Pozdrawiam,
Blady



Poprzedni Następny
Wiadomość
Spis treści
From: "Leśnik" <lesnik_at_nospam_ck-sg.p.lodz.pl>
Subject: Re: '51 - serial interrupt ?!?!
Date: Thu, 25 Apr 2002 10:45:05 +0200



Witam


Mam prosty program - pętla głowna i obsługa przerwania od transmisji
szeregowej. Chciałbym odbierać znaki w przerwaniu dopisując je do bufora.
Niestety zaraz po starcie procesor wchodzi do procedury obsługi przerwania
i
"siedzi" w niej cały czas, .

a skąd wiesz, że tam "siedzi"? i co wtedy robi?
Czy testowałeś program na jakimś symulatorze '51 czy w rzeczywistym
układzie?
Ja używam assemblera i jedyną rzeczą którą robię to na początku obsługi
przerwania kasuję znacznik zgłoszenia przerwania komendą CLR SCON.0 po
zakończeniu procedury program nie wchodzi do niej ponownie aż do chwili
odebrania kolejnego znaku.

--
Pozdrawiam Leśnik



Poprzedni Następny
Wiadomość
Spis treści
From: "Blady" <adam_at_nospam_netis.pl>
Subject: Re: '51 - serial interrupt ?!?!
Date: Thu, 25 Apr 2002 11:51:46 +0200


a sk?d wiesz, że tam "siedzi"? i co wtedy robi?
W pętli głownej program inkrementuje zmienn? co 0,5 s i wyswietla w górnej
linii wyswietlacza. Niestety program nie realizuje pętli głownej bo na 100%
siedzi w przerwaniu, w którym wypisuje na dolnej linii LCD to co przyszło na
RSa.
Własnie o to chodzi że po wykryciu przerwania ja też robię CLR SCON.0 ale to
nic nie daje.
W symulatorze jest ok, natomiast w układzie jest zle. Procek to 89C55WD.

Pozdrawiam,
Blady






Poprzedni Następny
Wiadomość
Spis treści
From: "Tomasz Gumny" <tgumny_at_nospam_idn.org.pl>
Subject: Re: '51 - serial interrupt ?!?!
Date: Thu, 25 Apr 2002 12:29:12 +0200


W symulatorze jest ok, natomiast w układzie jest zle.

W takich przypadkach pomaga czasem zainicjalizowanie
wskaznika stosu :-)
TG





Poprzedni Następny
Wiadomość
Spis treści
From: "Blady" <adam_at_nospam_netis.pl>
Subject: Re: '51 - serial interrupt ?!?!
Date: Thu, 25 Apr 2002 13:38:13 +0200


W takich przypadkach pomaga czasem zainicjalizowanie
wskaznika stosu :-)
A tak bardziej po polsku?



Poprzedni Następny
Wiadomość
Spis treści
From: "Bartosz Rakowski" <rakbar_at_nospam_poczta.onet.pl>
Subject: Odp: '51 - serial interrupt ?!?!
Date: Thu, 25 Apr 2002 13:54:15 +0200


Cześć

Użytkownik "Blady" <adam_at_nospam_netis.pl> napisał w wiadomości
news:aa8pl7$73v$1_at_nospam_news.tpi.pl...
W takich przypadkach pomaga czasem zainicjalizowanie
wskaznika stosu :-)
A tak bardziej po polsku?

Jeśli nie ustawiasz wskaźnika stosu na początku programu, to po wywołaniu
przerwania program może pójść "w maliny", tzn. po odłożeniu na stos PC i
innych zmiennych stos włazi na coś innego i już się nie da odczytać ze stosu
poprawnej wartości PC. Ustaw wskaźnik stosu gdzieś na początku programu,
tak, żeby miał trochę pamięci na ów stos.

Rakbar



Poprzedni Następny
Wiadomość
Spis treści
From: "Arni" <expercik_at_nospam_poczta.fm>
Subject: Re: '51 - serial interrupt ?!?!
Date: Fri, 26 Apr 2002 01:13:12 +0200



Jeśli nie ustawiasz wskaźnika stosu na początku programu, to po wywołaniu
przerwania program może pójść "w maliny", tzn. po odłożeniu na stos PC i
innych zmiennych stos włazi na coś innego i już się nie da odczytać ze
stosu
poprawnej wartości PC. Ustaw wskaźnik stosu gdzieś na początku programu,
tak, żeby miał trochę pamięci na ów stos.

Po starcie SP ma wartość 07h nie trzeba wymuszać mu innej wartości tylko
trzeba zadbać aby zmienne (komurki wew. ram) były wykorzystywane od wyższych
adresów czyli na przykład wykorzystywać je od adresu 20h tak żeby stos miał
pewną głębokość (żeby można było odłożyć na niego trochę danych)

Arni



Poprzedni Następny
Wiadomość
Spis treści
From: "Bartosz Rakowski" <rakbar_at_nospam_poczta.onet.pl>
Subject: Odp: '51 - serial interrupt ?!?!
Date: Fri, 26 Apr 2002 06:46:26 +0200


Cześć

Użytkownik "Arni" <expercik_at_nospam_poczta.fm> napisał w wiadomości
news:aaa2i8$sur$1_at_nospam_news.lublin.pl...

Po starcie SP ma wartość 07h nie trzeba wymuszać mu innej wartości tylko
trzeba zadbać aby zmienne (komurki wew. ram) były wykorzystywane od
wyższych
adresów czyli na przykład wykorzystywać je od adresu 20h tak żeby stos
miał
pewną głębokość (żeby można było odłożyć na niego trochę danych)

Jeśli wolisz martwić się o to, gdzie umieszczać zmienne, a nie o to, gdzie
wskaźnik stosu, to co to praktycznie za różnica?
Dla mnie łatwiej jest zająć tyle pamięci zmiennymi, ile trzeba, a resztę
wolnych przeznaczyć na stos. I łatwo można zrobić w kompilatorze, aby ten
adres wpisywał się do SP wraz ze zmianą wersji programu, bez potrzeby
zmieniania.

Rakbar



Poprzedni Następny
Wiadomość
Spis treści
From: Ireneusz Niemczyk <i.niemczyk_at_nospam_multispedytor.com.pl>
Subject: Re: Odp: '51 - serial interrupt ?!?!
Date: Fri, 26 Apr 2002 10:28:49 +0200


Chyba jednak lepiej mieć dolne części pamięci dla siebie, a stos puścić dalej,
aż do końca RAMu....jakoś tak bardziej naturalnie to wygląda (dla mnie
oczywiscie). Często robię tak, że stos z definicji ustawiam od 0x80 - jeśli
tylko wystarczy mi pierwsza półstrona na zmienne i jesli procek ma na tyle
ramu oczywiście. Popieram więc Twoje zdanie.

Zastanawia mnie jeszcze jedno - Bascom powinien sobie chyba sam radzić z czymś
takim jak wskaźnik stosu - inaczej po cholerę cały ten program?

--
PZD, Irek.N.



Poprzedni Następny
Wiadomość
Spis treści
From: Marek Lewandowski <nospam_at_nospam_poczta.onet.pl>
Subject: Re: Odp: '51 - serial interrupt ?!?!
Date: Fri, 26 Apr 2002 15:49:44 GMT


Ireneusz Niemczyk wygenerował manualnie w wiadomości
<3CC90FC1.684269DE_at_nospam_multispedytor.com.pl> udostępnionej publicznie dnia
Fri, 26 Apr 2002 10:28:49 +0200 co następuje:

Chyba jednak lepiej mieć dolne części pamięci dla siebie, a stos puścić dalej,
aż do końca RAMu....jakoś tak bardziej naturalnie to wygląda (dla mnie
oczywiscie). Często robię tak, że stos z definicji ustawiam od 0x80 - jeśli
tylko wystarczy mi pierwsza półstrona na zmienne i jesli procek ma na tyle
ramu oczywiście.

Ja preferuję podejście odwrotne: stos niech będzie, gdzie jest
domyślnie, a zmiennymi zajmuję pamięć od jej "końca"...

--
Marek Lewandowski ICQ# 10139051
DOUSUNIECIAlocustDOUSUNIECIA_at_nospam_poczta.onet.pl
http://locust.republika.pl
UWAGA! w emailu wycinać DOUSUNIECIA z adresu!

Poprzedni Następny
Wiadomość
Spis treści
From: "GG" <gayosek_at_nospam_poczta.onet.pl>
Subject: Re: Odp: '51 - serial interrupt ?!?!
Date: Fri, 26 Apr 2002 19:39:31 +0200


Użytkownik "Marek Lewandowski" <nospam_at_nospam_poczta.onet.pl> napisał w
wiadomości news:aabur7$9k3le$4_at_nospam_ID-113053.news.dfncis.de...
Ja preferuję podejście odwrotne: stos niech będzie, gdzie jest
domyślnie, a zmiennymi zajmuję pamięć od jej "końca"...

Aaa, czyli metodą AVRków. Tyle, że dla AVR stos przeważnie ustawia się
na end_ram i schodzi w dół.

--
Grzesiek Gajewski
gayos_at_nospam_interia.pl



Poprzedni Następny
Wiadomość
Spis treści
From: Ireneusz Niemczyk <i.niemczyk_at_nospam_multispedytor.com.pl>
Subject: Re: Odp: '51 - serial interrupt ?!?!
Date: Fri, 26 Apr 2002 21:12:06 +0200


Ja preferuję podejście odwrotne: stos niech będzie, gdzie jest
domyślnie, a zmiennymi zajmuję pamięć od jej "końca"...

Marku, ale do obszaru >0x7f jest kiepski dostęp, a wskaźnik stosu dokonale sobie
tam radzi.
Z kolei nie szkoda Ci np: obszaru adresowanego bitowo na stos ? (chyba że mówimy o
małych kostkach) :-)

Hmm..przyzwyczajenia naturą człowieka, więc nie będę przekonywał, tylko nie
rozumiem ;-)
--
PZD, Irek.N.



Poprzedni Następny
Wiadomość
Spis treści
From: Marek Lewandowski <nospam_at_nospam_poczta.onet.pl>
Subject: Re: Odp: '51 - serial interrupt ?!?!
Date: Fri, 26 Apr 2002 20:45:38 GMT


Ireneusz Niemczyk wygenerował manualnie w wiadomości
<3CC9A686.6CBB5D94_at_nospam_multispedytor.com.pl> udostępnionej publicznie dnia
Fri, 26 Apr 2002 21:12:06 +0200 co następuje:

Ja preferuję podejście odwrotne: stos niech będzie, gdzie jest
domyślnie, a zmiennymi zajmuję pamięć od jej "końca"...

Marku, ale do obszaru >0x7f jest kiepski dostęp, a wskaźnik stosu dokonale sobie
tam radzi.
Z kolei nie szkoda Ci np: obszaru adresowanego bitowo na stos ? (chyba że mówimy o
małych kostkach) :-)

Hmm..przyzwyczajenia naturą człowieka, więc nie będę przekonywał, tylko nie
rozumiem ;-)

1. 90% moich zabawek ma AT89c2051 i to draństwo ma tylko 128BRAM
2. obszar bitowo adresowany wykorzystuję stosunkowo rzadko, wtedy też
oczywiście i stos ląduje inaczej... Moje przyzwyczajenia nie limitują
mi tak całkiem myślenia ;-) Jak mi się coś nie zgadza to robię
inaczej...
--
Marek Lewandowski ICQ# 10139051
DOUSUNIECIAlocustDOUSUNIECIA_at_nospam_poczta.onet.pl
http://locust.republika.pl
UWAGA! w emailu wycinać DOUSUNIECIA z adresu!

Poprzedni Następny
Wiadomość
Spis treści
From: "Blady" <adam_at_nospam_netis.pl>
Subject: Re: '51 - serial interrupt - WYJASNIENIE
Date: Thu, 25 Apr 2002 14:36:46 +0200


Po kilku dniach pracy doszedłem w końcu o co chodzi.
Jeśli programujemy w BASCOMIE, to gdy wykorzystujemy takie komendy jak
print, input, inkey i inne standardowo pomocne w transmisji przez RS-232, to
nie możemy korzystać z przerwań od portu szeregowego! Najprawdopodobniej
komendy te same korzystają z tego przerwania i wszystko się gmatwa.
Aby móc korzystać z przerwania należy "ręcznie" ustawić Timer1, SCON, PCON i
korzystać z SBUF do przyjmowania i wysyłania bajtów.

Pozdrawiam,
Blady



Poprzedni Następny
Wiadomość
Spis treści
From: "QmX" <kumex_at_nospam_interia.pl>
Subject: Re: '51 - serial interrupt - WYJASNIENIE
Date: Fri, 26 Apr 2002 06:52:00 +0200


Użytkownik "Blady" <adam_at_nospam_netis.pl> napisał w wiadomości
news:aa8t46$d3f$1_at_nospam_news.tpi.pl...
Po kilku dniach pracy doszedłem w końcu o co chodzi.
Jeśli programujemy w BASCOMIE, to gdy wykorzystujemy takie komendy jak
print, input, inkey i inne standardowo pomocne w transmisji przez RS-232,
to
nie możemy korzystać z przerwań od portu szeregowego! Najprawdopodobniej
komendy te same korzystają z tego przerwania i wszystko się gmatwa.
Aby móc korzystać z przerwania należy "ręcznie" ustawić Timer1, SCON, PCON
i
korzystać z SBUF do przyjmowania i wysyłania bajtów.

I tu widac do czego nadaje sie Bascom. ;-)

QmX.




Poprzedni Następny
Wiadomość
Spis treści
From: "Blady" <adam_at_nospam_netis.pl>
Subject: Re: '51 - serial interrupt - WYJASNIENIE
Date: Fri, 26 Apr 2002 08:02:55 +0200


I tu widac do czego nadaje sie Bascom. ;-)
Nie można generalizować, poza kilkoma wadami ma on również kilka zalet.




Poprzedni Następny
Wiadomość
Spis treści
From: "Jado" <jdoli_at_nospam_optimus.waw.pl>
Subject: Re: '51 - serial interrupt - WYJASNIENIE
Date: Fri, 26 Apr 2002 15:01:18 +0200


Użytkownik "Blady" <adam_at_nospam_netis.pl> napisał w wiadomości
news:aa8t46$d3f$1_at_nospam_news.tpi.pl...
Po kilku dniach pracy doszedłem w końcu o co chodzi.
Jeśli programujemy w BASCOMIE, to gdy wykorzystujemy takie komendy jak
print, input, inkey i inne standardowo pomocne w transmisji przez RS-232,
to
nie możemy korzystać z przerwań od portu szeregowego!

Najprawdopodobniej mozesz, tylko nie mozesz drukowac z procedury obslugi
pzerwania SIO :-)
pzdr



Poprzedni Następny
Wiadomość
Spis treści
From: "Blady" <adam_at_nospam_netis.pl>
Subject: Re: '51 - serial interrupt - WYJASNIENIE
Date: Fri, 26 Apr 2002 15:11:09 +0200


Najprawdopodobniej mozesz, tylko nie mozesz drukowac z procedury obslugi
pzerwania SIO :-)
Na 100% nie moge.



Poprzedni Następny
Wiadomość
Spis treści
From: "Jado" <jdoli_at_nospam_optimus.waw.pl>
Subject: Re: '51 - serial interrupt - WYJASNIENIE
Date: Fri, 26 Apr 2002 15:17:58 +0200


Użytkownik "Blady" <adam_at_nospam_netis.pl> napisał w wiadomości
news:aabjfg$7v0$1_at_nospam_news.tpi.pl...
Najprawdopodobniej mozesz, tylko nie mozesz drukowac z procedury obslugi
pzerwania SIO :-)
Na 100% nie moge.

Chodzilo mi o to, ze mozesz uzywac przerwan oczywiscie, ale nie mozesz
drukowac z przerwania. :-)