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ę

Dlaczego to jest źle?

Fredy
-
-
Posty:141
Rejestracja:27 mar 2005, o 21:45
Lokalizacja:Małopolska
Dlaczego to jest źle?

Postautor: Fredy » 21 mar 2007, o 21:28

Mam taki problem:
Oto fragment kodu programu:

Kod: Zaznacz cały

$regfile = "m32def.dat" $crystal = 8000000 $baud = 19200 On Urxc Przerwanie_od_rs232 Config Serialin = Buffered , Size = 20 Enable Interrupts Enable Urxc Do Loop End Przerwanie_od_rs232 Return
Nie wiem dlaczego, ale kompilator zgłasza błąd
"ISR already defined"
Zauważyłem że gryzą się dwie instrukcje
On Urxc Przerwanie_od_rs232
oraz
Config Serialin = Buffered , Size = 20
tak jakby się nawzajem wykluczały.
Macie może jakiegoś pomysła na tą zagadkę? :608:
Ostatnio zmieniony 22 mar 2007, o 16:55 przez Fredy, łącznie zmieniany 1 raz.

Awatar użytkownika
almatea
-
-
Posty:240
Rejestracja:12 gru 2003, o 17:02
Lokalizacja:Brzeszcze
Kontaktowanie:

Postautor: almatea » 21 mar 2007, o 22:24

Zaglądnij do Helpa.

Wyraźnie jest tam napisane, że ponieważ procedura _GotChar wykorzystuje przerwanie URXC, nie jest możliwe używanie tego źródła przerwania w programie użytkownika. Chyba, że zmodyfikuje on procedurę _GotChar znajdującą się w bibliotece.

Czyli widzisz, że temu przerwaniu została przyporządkowana już procedura.
Zresztą po to właśnie stosuje się bufor, aby nie tracić danych przychodzących na port szeregowy podczas wykonywania przez mikrokontroler innego zadania. Po zastosowaniu opcji bufora, polecam wykorzystanie instrukcji Ischarwaiting().
Drugim sposobem jest właśnie wykorzystanie bezpośrenio przerwania wystepującego na porcie szeregowym

Pozdrawiam.

Fredy
-
-
Posty:141
Rejestracja:27 mar 2005, o 21:45
Lokalizacja:Małopolska

Postautor: Fredy » 21 mar 2007, o 22:37

Dzięki za konkretną odpowiedź.
Chciałem wykorzystać przerwanie URXC tylko do ustawienia flagi że jest znak w buforze, a odebrać sobie znaki z bufora później - dlatego chcialem go powiększyć. Będę musiał coś innego zatem wymyślić.
Pozdrawiam :607:

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

Postautor: szymel » 22 mar 2007, o 18:24

Dzięki za konkretną odpowiedź.
Chciałem wykorzystać przerwanie URXC tylko do ustawienia flagi że jest znak w buforze, a odebrać sobie znaki z bufora później - dlatego chcialem go powiększyć. Będę musiał coś innego zatem wymyślić.
Pozdrawiam :607:
Nic nie musisz wymyślać , tylko poczytaj o opcji BYTEMATCH przy konfiguracji SERIALIN , lub o zmiennej _RS_BUFCOUNTR0 , lub instrukcji Ischarwaiting , lub ... czemu unikasz dokumentacji Bascoma :?: :D


Piotrek

Fredy
-
-
Posty:141
Rejestracja:27 mar 2005, o 21:45
Lokalizacja:Małopolska

Postautor: Fredy » 22 mar 2007, o 21:09

Dzięki za konkretną odpowiedź.
Chciałem wykorzystać przerwanie URXC tylko do ustawienia flagi że jest znak w buforze, a odebrać sobie znaki z bufora później - dlatego chcialem go powiększyć. Będę musiał coś innego zatem wymyślić.
Pozdrawiam :607:
Nic nie musisz wymyślać , tylko poczytaj o opcji BYTEMATCH przy konfiguracji SERIALIN , lub o zmiennej _RS_BUFCOUNTR0 , lub instrukcji Ischarwaiting , lub ... czemu unikasz dokumentacji Bascoma :?: :D


Piotrek
Nie unikam dokumentacji Bascoma - wręcz przeciwnie. Ale nigdzie nie znalazłem nic na temat BYTEMATCH czy o zmiennej _RS_BUFCOUNTR0. Owszem Ischarwaiting jest b. przydatne i rzeczywiście może działać jako flaga odebranego znaku. Ale o tamtych dwóch instrukcjach nie ma nic w helpie.
Pozdrawiam :611:

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

Postautor: szymel » 23 mar 2007, o 19:37

Przykład dla BYTEMATCH.

Kod: Zaznacz cały

'... Config Serialin=20 , Bytematch=13 Dim Event As Byte , Zmienna_tekstowa As String * 20 '... Event = 0 Enable Interrupts '... Do '... If Event>0 Then Input Zmienna_tekstowa Cli 'Disable interrupts Decr Event Sei 'Enable Interrupts End If '... Loop ' poniżej , procedura(user label wspomniany w helpie) ' wywoływana przez przerwanie RX , ' gdy znak odczytany z rejestru szeregowego , ' jest równy z zadeklarowanym w opcji Bytematch Serial0charmatch: 'po odebraniu znaku Chr(13) zwiększenie licznika lini(zdarzeń) 'Incr Event 'lub lds r24,{event} inc r24 sts {event},r24 ret
Powyższym sposobem , nie muszę czekać w instrukcji Input na odebranie ciągu znaków zakończonych 13 (1 linia tekstu z modemu C35i) , tylko odczytuję , kiedy wiem że już mogę ;) Niby istnieje opcja $Timeout , ale po co marnować czas procka :D
Podobnych "bajerów" jest więcej w Bascomie , tylko trzeba umieć czytać Helpa między wierszami , a znajomość assemblera jest dodatkowym atutem(zaglądanie do plików *.lib) :D

Piotrek

PS
Jeden obraz , za jeden tysiąc słów :D
Załączniki
Serialin.gif

Fredy
-
-
Posty:141
Rejestracja:27 mar 2005, o 21:45
Lokalizacja:Małopolska

Postautor: Fredy » 26 mar 2007, o 22:05

Rzeczywiście jestem pod wrażeniem. Nie widziałem tego w Helpie po patrzyłem w starszej wersji Bascoma. Spróbuje to w praktyce wykorzystać i dam znać jak mi poszło- dziękuję za pomoc.
Pozdrawiam :607:

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 31 gości