PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timeout für SUART ?



AVR-Knecht
28.02.2006, 23:04
Ich habe ein Problem mit dem SUART.

Ich sende alle 100ms zwei Zeichen zu einem Meßgerät. Das funktioniert ja auch noch. Jetzt kommt mein Problem.
Die Antwort vom Meßgerät kann zwischen 0 und 10 Zeichen lang sein.
Wenn ich nun den Input Befehl verwende, hängt sich das Programm auf.
Gibt es eine Möglichkeit, die Schleife zu verlassen, wenn innerhalb von 5ms kein Zeichen mehr ankommt? Die Zeichenkette hat kein CR oder LF.
Vieleicht gibt es ja auch eine andere Möglichkeit. Ich habe mir schon fast die Finger wund getippt aber noch keine dauerhaft funktionierende Lösung gefunden.
Vieleicht hat ja jemand einen Beispielcode oder einen guten Tipp ?

Vielen Dank im voraus =;

chr-mt
28.02.2006, 23:07
Hi,
guck' mal in der Hilfe beim Befehl "Timeout"
Wenn eine einstellbare Zeit lang nix kommt, verläßt er die Input Routine.
Hab's selber noch nicht ausprobiert..


Gruß
Christopher

AVR-Knecht
28.02.2006, 23:16
Ist nett gemeint, aber der Befehl ist nur für den HW-UART gedacht.

Danke für deine Mühe

chr-mt
28.02.2006, 23:56
Hi,
sorry. habe ich falsch verstanden, ich dachte du hättest dich verschrieben:
SUART = USART ;)

Gruß
Christopher

AVR-Knecht
01.03.2006, 00:01
Danke für den Hinweis.
Ich habe aber noch einen Fehler gemacht.
Ich sende und empfange nicht Zeichen sonder Bytes.
Deshalb kann ich auch nicht Inkey() verwenden.
Es könnte ja eine Null gesendet werden.

Danke für den Hinweis

chr-mt
01.03.2006, 00:22
Hi,
du könntest in einem Timer eine Variable hochzählen lassen, die du bei jedem empfangenen Zeichen nullst.
Erreicht die Variable einen bestimmten Wert (kein Zeichen mehr) , kannst du darauf reagieren.... Ach so, ja, BYTES , nicht Zeichen ;)
Du startest einfach direkt nach dem Input den Timer und wartest bis er den Wert erreicht hat.

Gruß
Christopher

AVR-Knecht
01.03.2006, 00:27
Habe ich schon probiert.
Ich bekomme einen Interrupt und springe in die entsprechende Routine.
Wenn ivh dann wieder zurück springe hänge ich wieder fest.

chr-mt
01.03.2006, 00:44
Hi,
Wie sieht es mit ischarwaiting aus und dann mit inkey holen ?
Das geht auch mit "0" und dem SW- UART.

Gruß
Christopher

AVR-Knecht
01.03.2006, 03:20
Das werde ich auf jeden Fall ausprobieren.

Danke

-tomas-
01.03.2006, 20:20
So einfach ist das nicht.
Ischarwaiting(#2) = 1
Ruft den Fehler hervor: Error : 328 Not valid for SW UART

Ich habe die Lösung für die Software UART ohne WAITKEY vor kurzem gepostet:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=17444

Kurzfassung: Du musst RX mit INTx verbinden und INT auf eine fallende Flanke auslösen und GIFR beachten.


Int0_int: 'Interrupt Handler For Int0
S = Inkey(#2) 'get it from Soft UART
Printbin S 'send to Hard UART
Set End_flag 'Flag für Soft_Ischarwaiting()
Gifr = Gifr Or &H40 'clear Flag Int0 !!!!!
Return

chr-mt
01.03.2006, 22:24
Aua... stimmt
da habe ich wohl was verwechselt... sorry.. :(

Hatte irgendwie in Erinnerung, daß ich das so schon mal verwendet hatte..
Tut mir leid wegen der Fehlinfo :(

Gruiß
Christopher

Vitis
02.03.2006, 09:25
doofe frage,
warum verwendest du die software-uart?

mit der hardware uart gings einfacher

AVR-Knecht
03.03.2006, 07:06
Hallo
Entschuldigt bitte meine abwesenheit.
Ich habe zwar noch einige Varianten ausprobiert, aber die meisten funktionieren nur mit der HW-UART.
Wobei ich da wieder das Problem habe, das ich den Pin dann nicht als Port benutzen kann. Das brauch ich aber um bestimmte Startsignale vorzugeben. Ist alles ein bischen blöd. Aus Zeitgründen habe ich ein anderes Programm geschrieben. Ich gebe meine Startsignale über den gleichen Pin aus, mit dem ich dann auch über den SW-UART meine Bytes sende. Danach frage ich dann den Pin für mein Eingangssignal in einer Schleife mit waitms ab. So kann ich aus den ankommenden Bits meine Daten zusammenbauen. Wird innerhalb einer bestimmten Zeit kein Signal empfangen wird die Übertragung abgebrochen.
Das Funktioniert zwar prima aber wenn ich das ganze für eine andere Baudrate brauche, muß ich die Zeiten wieder neu anpassen.
Aber wenn ich wieder etwas Zeit habe(was ist das eigentlich) werde ich mich weiter mit euren Ideen beschäftigen und sie ausprobieren. Auch wenn das Programm jetzt läuft gefällt es mir noch nicht.

Vielen Dank für eure Mühe

PS. Die HW-UART ist schon belegt

chr-mt
03.03.2006, 09:58
Hi,

aber die meisten funktionieren nur mit der HW-UART.
Wobei ich da wieder das Problem habe, das ich den Pin dann nicht als Port benutzen kann. Das brauch ich aber um bestimmte Startsignale vorzugeben


Wenn man den "BAUD" Befehl verwendet wird der HW UART eingeschaltet.
Also TXD und RXD an die entsprechenden Pins gelegt usw.
Die Pins lassen sich, wie du schon sagst, dann nicht mehr normal verwenden.
Man kann man den TXD oder RXD Pin trotzdem wahlweise als normalen Pin oder mit dem UART verwenden.
Das geht auch während der Laufzeit

SET UCR.3 schaltet TXD auf den TXD Pin
SET UCR.4 schaltet RXD auf den RXD Pin
RESET UCR.3 schaltet TXD vom TXD Pin weg
RESET UCR.4 schaltet RXD vom RXD Pin weg

Gruß
Christopher