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...

Billy
-
-
Posty:25
Rejestracja:28 lis 2004, o 17:45
Lokalizacja:Wronki
Kontaktowanie:
RS232 vs przerwania wewnętrzne...

Postautor: Billy » 10 gru 2004, o 18:26

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

Awatar użytkownika
ZbeeGin
-
-
Posty:170
Rejestracja:3 kwie 2003, o 10:10
Lokalizacja:Metropolia Katowice

Postautor: ZbeeGin » 10 gru 2004, o 21:38

A o który BASCOM ci chodzi, czyli z której rodziny procesor chcesz wykorzystać?

Awatar użytkownika
gawel
-
-
Posty:683
Rejestracja:24 lis 2003, o 11:19
Lokalizacja:Białystok

Re: RS232 vs przerwania wewnętrzne...

Postautor: gawel » 11 gru 2004, o 01:50

Jeśli ktoś zna odpwiedź na moje pytanie, to będę bardzo wdzięczny za podpowiedź.
A możesz trochę jaśniej określić problem (no i typ procka).

Billy
-
-
Posty:25
Rejestracja:28 lis 2004, o 17:45
Lokalizacja:Wronki
Kontaktowanie:

Postautor: Billy » 11 gru 2004, o 13:53

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

pch
-
-
Posty:23
Rejestracja:27 maja 2003, o 06:56
Lokalizacja:Gdańsk
Kontaktowanie:

Postautor: pch » 29 gru 2004, o 22:50

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

Billy
-
-
Posty:25
Rejestracja:28 lis 2004, o 17:45
Lokalizacja:Wronki
Kontaktowanie:

Postautor: Billy » 14 sty 2005, o 23:09

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
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??

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?

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 16 sty 2005, o 17:04

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.
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

JanWi
-
-
Posty:50
Rejestracja:7 maja 2003, o 15:44

Postautor: JanWi » 19 sty 2005, o 17:51

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.

Billy
-
-
Posty:25
Rejestracja:28 lis 2004, o 17:45
Lokalizacja:Wronki
Kontaktowanie:

Postautor: Billy » 19 sty 2005, o 22:11

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.
tak używam $large.

Masz może jakiś przykładzik ?? ;-)

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 21 gości