Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięRS232 vs przerwania wewnętrzne...
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
Można w BASCO'ie wywoływać procedury dla przerwania wewnętrznego portu COM i to potrafię.
Problem mój polega na tym, że przerwania dla COM'a rusza gdy są dane odbierane, jak i wysyłane, a ja chciałbym, żeby przerwanie to działało tylko gdy dane są odbierane i oczywiście, żeby przerwanie to "nie zakłócało" odbierania danych (np. zapis do bufora).
Jak to zrobić ??
Jeśli ktoś zna odpwiedź na moje pytanie, to będę bardzo wdzięczny za podpowiedź.
Pozdrawiam
Billy
Problem mój polega na tym, że przerwania dla COM'a rusza gdy są dane odbierane, jak i wysyłane, a ja chciałbym, żeby przerwanie to działało tylko gdy dane są odbierane i oczywiście, żeby przerwanie to "nie zakłócało" odbierania danych (np. zapis do bufora).
Jak to zrobić ??
Jeśli ktoś zna odpwiedź na moje pytanie, to będę bardzo wdzięczny za podpowiedź.
Pozdrawiam
Billy
Re: RS232 vs przerwania wewnętrzne...
A możesz trochę jaśniej określić problem (no i typ procka).Jeśli ktoś zna odpwiedź na moje pytanie, to będę bardzo wdzięczny za podpowiedź.
Przepraszam... to moje roztargnienie.
Bascom 8051, a typ procesora to AT89C4051
Mam jeszcze jeden problem związany z tym procesorem i przerwaniem Int0.
Otórz... Mam w tej chwili program przekraczający magiczną liczbę 2kB.
i mam tak skąfigurowane przerwanie:
On Int0 Int0_int
Enable Interrupts
Enable Int0
Priority Set Int0
umieszczone zaraz za deklaracją zmiennych
a samo przerwanie wygląda tak:
Int0_int:
Print "Awaria"
Return
Przerwanie przychodzi z układu PCF8574AP i jednyną rzeczą jaka pojawia się na wyjściu,
to:
"A"
i nic więcej nawet gdy wstawię opóźnienie waitms 250.
Natomiast gdy "skrócę" długość programu (mniej niż 2kB), to wszystko działa jak należy.
Co mam z tym zrobić??
Jak to rozwiązać??
Proszę pomóżcie
Za każdą podpowiedź będę wdzięczny
Pozdrawiam Billy
Bascom 8051, a typ procesora to AT89C4051
Mam jeszcze jeden problem związany z tym procesorem i przerwaniem Int0.
Otórz... Mam w tej chwili program przekraczający magiczną liczbę 2kB.
i mam tak skąfigurowane przerwanie:
On Int0 Int0_int
Enable Interrupts
Enable Int0
Priority Set Int0
umieszczone zaraz za deklaracją zmiennych
a samo przerwanie wygląda tak:
Int0_int:
Print "Awaria"
Return
Przerwanie przychodzi z układu PCF8574AP i jednyną rzeczą jaka pojawia się na wyjściu,
to:
"A"
i nic więcej nawet gdy wstawię opóźnienie waitms 250.
Natomiast gdy "skrócę" długość programu (mniej niż 2kB), to wszystko działa jak należy.
Co mam z tym zrobić??
Jak to rozwiązać??
Proszę pomóżcie
Za każdą podpowiedź będę wdzięczny
Pozdrawiam Billy
Nie wiem czy to cos da ale zmień reakcję INT0 na opadające zbocze bo domyślnie jest na stan i może zbyt szybko wykonuje się procedura obsługi przerwania i program ponownie do niej wskakuje przepełniając stos. Przed zdefiniowaniem przerwań wpisz: set TCON.0
Nie wiem też czy masz właczone przerwanie SERIAL czy nie. Jeżeli tak to nic dziwnego, że dziwnie działa. Gdy włączysz to przerwanie to nie możesz używać instrukcji PRINT. Należy napisać własną procedurę wysyłania.
PC
Nie wiem też czy masz właczone przerwanie SERIAL czy nie. Jeżeli tak to nic dziwnego, że dziwnie działa. Gdy włączysz to przerwanie to nie możesz używać instrukcji PRINT. Należy napisać własną procedurę wysyłania.
PC
Nie wiem czy to cos da ale zmień reakcję INT0 na opadające zbocze bo domyślnie jest na stan i może zbyt szybko wykonuje się procedura obsługi przerwania i program ponownie do niej wskakuje przepełniając stos. Przed zdefiniowaniem przerwań wpisz: set TCON.0
W programie chodzi mi poprotu o to, zeby:
procesor wykonywał główną petlę programu. Natomiast, jak jakieś urządzenie zacznie mu "nadawać" na wejście portu RX, procesor ma to wychwycić i zaczać odbierać dane.
I mam jeszcze jedno pytanie związane z tym tematem.
Jest taka zmienna (wewnętrzna Bascoma) jak $timeout,
którą trzeba ustawić na jakąś wartość (ja ustawiam na $timeout=2000) na pocztku programu, a poźniej
przy procedurze INPUT podajemy na końcu jeszcze "$timeout"
Ma to nacelu zakończenie oczekiwania na jakiś znak na wejściu portu szeregowego po określonym czasie.
U mnie działa to tak, że bez względu czy podam ten czas 2000 czy 200 procesora "jakby nie czekał" na to co przyjdzie na wejście portu, tylko dalej wykonuje nastepne procedury.
Jak tego używac? A może AT89C4051 nie obsługuje tego?
Rzeczywiście mam włączone przerwaie SERIAL, bo tak było w jednym z przykładów producenta, więc uznałem to za właściwe. To po co w takim razie jest przerwanie SERIAL??Nie wiem też czy masz właczone przerwanie SERIAL czy nie. Jeżeli tak to nic dziwnego, że dziwnie działa. Gdy włączysz to przerwanie to nie możesz używać instrukcji PRINT. Należy napisać własną procedurę wysyłania.
PC
W programie chodzi mi poprotu o to, zeby:
procesor wykonywał główną petlę programu. Natomiast, jak jakieś urządzenie zacznie mu "nadawać" na wejście portu RX, procesor ma to wychwycić i zaczać odbierać dane.
I mam jeszcze jedno pytanie związane z tym tematem.
Jest taka zmienna (wewnętrzna Bascoma) jak $timeout,
którą trzeba ustawić na jakąś wartość (ja ustawiam na $timeout=2000) na pocztku programu, a poźniej
przy procedurze INPUT podajemy na końcu jeszcze "$timeout"
Ma to nacelu zakończenie oczekiwania na jakiś znak na wejściu portu szeregowego po określonym czasie.
U mnie działa to tak, że bez względu czy podam ten czas 2000 czy 200 procesora "jakby nie czekał" na to co przyjdzie na wejście portu, tylko dalej wykonuje nastepne procedury.
Jak tego używac? A może AT89C4051 nie obsługuje tego?
Witam.I mam jeszcze jedno pytanie związane z tym tematem.
Jest taka zmienna (wewnętrzna Bascoma) jak $timeout,
którą trzeba ustawić na jakąś wartość (ja ustawiam na $timeout=2000) na pocztku programu, a poźniej
przy procedurze INPUT podajemy na końcu jeszcze "$timeout"
Ma to nacelu zakończenie oczekiwania na jakiś znak na wejściu portu szeregowego po określonym czasie.
U mnie działa to tak, że bez względu czy podam ten czas 2000 czy 200 procesora "jakby nie czekał" na to co przyjdzie na wejście portu, tylko dalej wykonuje nastepne procedury.
Jak tego używac? A może AT89C4051 nie obsługuje tego?
Nie wiem gdzie kolega Billy wyczytał , że "$timeout" to zmienna.Jest to dyrektywa kompilatora , taka sama jak "$large" czy "$map" i nie przyjmuje żadnych parametrów(można wpisać np. $timeout = "Filip z konopii").Żeby działał timeout przy funkcji INPUT należy:
$timeout 'zadeklarować
...
INPUT "Wprowadz" , zmienna TIMEOUT= 1000 'maksymalna wartość to ... 4294967295 czyli 32 bity
...
Teraz będzie działać
Pozdrawiam
Szymel
tak używam $large.Witam.
A czy wykorzystujesz dyrektywę $large.
Związana jest bezpośrednio z adresowaniem skoków.
Jeśli chodzi o przerwanie od RS to możesz przecież
sprawdzać w przerwaniu czy nadajesz czy odbierasz
i w zależności od tego sterować przerwaniem.
Pozdrawiam.
Masz może jakiś przykładzik ??
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 29 gości