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ę

Komunikacja rs232

nestor197
-
-
Posty:13
Rejestracja:19 sie 2007, o 19:28
Lokalizacja:Małopolska
Komunikacja rs232

Postautor: nestor197 » 23 lip 2008, o 21:20

Mój problem polega na tym, iż korzystam z rs232 i wysyłam pewną informację po szynie do innego procesora instrukcje PRINT jednak chciałbym wiedzieć czy ta informacja dotarła do owego drugiego procka w tym celu drugi procesor po odebraniu poprawnej informacji wysyła temu pierwszemu PRINT "OK"

W tym czasie ten pierwszy czeka na informację zwrotną instrukcja INPUT.

No i tu jest mój problem, gdy drugi procesor nie otrzyma informacji w ogóle, lub będzie ona niepoprawna na przykład przez jakieś zakłócenia to wtedy nie wyśle informacji zwrotnej do tego pierwszego procesora. Wtedy chciałbym, aby ten pierwszy, procek wysłał ponownie tom samom informacje i tak do skutku aż otrzyma informacje zwrotną potwierdzającą odbiór.
Jednak, jeśli użyję instrukcji INPUT na oczekiwanie na informację zwrotną to niestety, ale procesor czeka "do bólu" aż coś dostanie i nie wiem jak zrobić żeby powiedzmy jak nie dostanie informacji zwrotnej po 1 sekundzie to wysłał ponownie.
Myślałem o zastosowaniu w tym momencie przerwania wywoływanego powiedzmy, co 1 sekundę, które by sprawdzało zawartość informacji zwrotnej (zmiennej), jeśli zmienna była by pusta to znaczy, że informacja zwrotna nie dotarła, no i pomyślałem, że w takim wypadku mógłbym z przerwania zrobić GOTO do punktu wysyłania informacji przez pierwszy procesor.

Jednak nie jestem pewien, czy mogę za pomocą instrukcji, GOTO wyskakiwać z przerwania i zmuszać program do skoku do pętli głównej:( Nie wiem czy tak można, bo na przykład niektórzy nie zalecają wyskakiwania poprzez GOTO z pętli FOR....NEXT.

Pomyślałem, ze taki skok może cos pochrzanić w programie i procesor może źle wykonywać swój program.

W prawdzie tego nie testowałem-, choć na oko powinno zadziałać, tylko chodzi mi czy to będzie zgodnie z zasadami programowania?

No chyba, że jest jakiś inny sposób na sprawdzenie czy informacja zwrotna dotarła a jeśli to wysłanie informacji ponownie?

Wiem, że troszkę namieszałem w tym opisie, ale myślę, że jak się ktoś wczyta to zakapuje, co mam na myśli:)


Z góry dziękuje za jakieś podpowiedzi.....

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 23 lip 2008, o 21:50

Hmm... zagmatwales maksymalnie ;p
Myślałem o zastosowaniu w tym momencie przerwania wywoływanego powiedzmy, co 1 sekundę, które by sprawdzało zawartość informacji zwrotnej (zmiennej), jeśli zmienna była by pusta to znaczy, że informacja zwrotna nie dotarła, no i pomyślałem, że w takim wypadku mógłbym z przerwania zrobić GOTO do punktu wysyłania informacji przez pierwszy procesor.
Stosowanie GOTO w żadnym przypadku nie należy do eleganckich.

Po co chcesz wyskakiwać z przerwania?? Ustaw sobie w przerwaniu flagę w zależności od poprawności odebranego potwierdzenia, zaś obsługą tej flagi zajmij się już po opuszczeniu przerwania, czyli po wyjściu do pętli głównej.

nestor197
-
-
Posty:13
Rejestracja:19 sie 2007, o 19:28
Lokalizacja:Małopolska

Postautor: nestor197 » 24 lip 2008, o 12:41

Dzieki za odpowiedz :)

Wirem że zagmatwałem :(

Myślałem o taki rozwiązaniu jak proponujesz, jednak jeśłi procesor nie dostanie żadnej iformacji zwrotnej, to bez problemu wyskoczy do przerwania, jak podprogram przerwania się skończy to znów wróci do dalszego wykonywania instrukcji INPUT, czyli programik cały czas docelowo będzie stał w miejscu i czekał na informacje zwrotną, no chyba że w przerwaniu będe ponawiał "nawawanie, to wtedy by zadziałało- tak myśle.

W takim razie dzięki za sugestie - myśle że poprostu muszę nadawać ponowanie w przerwaniu aż do skutku. :)


Pozdrawiam.....

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 24 lip 2008, o 14:00

Uhm... no jak widać część Twojej idei mi umknęła... faktycznie tak jak teraz to przedstawiłeś to będzie Ci wisieć ;/

Nadawanie w przerwaniu od timera też jest wyjściem, ale co jeśli druga strona nie wstanie (nie odpowie) nigdy??

A może zrób to a'la :

Kod: Zaznacz cały

; Pseudokod flaga = 1; while (flaga) ; co jest tożsame z wartością flaga > 0 { IF (jest ustawiony bit odebranego znaku) INPUT (dane); wait 100ms; oczywiście można tą linijkę wyciąć, lub zmienić czas do woli - jest by nie sprawdzać za często, choć procek i tak będzie zajęty wyłącznie tym zadaniem }

Przerwanie od timera co 1 sek musiało by jedynie ustawić flaga na 0 co spowoduje wyjście z pętli while. Oczywiście pozostaje Ci jeszcze przełożyć to na Bascoma, oraz dowiedzieć się jak sprawdzić i który bit rejestru USATR'a sygnalisuje że dane zostały odebrane ;p

Możesz tutaj dołożyć sprawdzanie ile razy rozkaz został powtórzony i np. po x razie zgłosić błąd.

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