Hallo und grüß euch,
also ich möchte folgendes realisieren:
Dazu besteht folgende Hardware:
Ein Messstation schickt ständig per Funk alle 100ms 34 bytes auf ein
Terminal. Das Terminal ist ca 10x10cm groß und besteht nur aus einem M32
und ein Display und zwei Tasten für rauf und runter. Die 34 bytes
bestehen aus einem Anfangsbyte, 32 Datenbytes und ein Endbyte. Die 32
Datenbytes sind genau die 32 Zeichen des 2x16 Displays. Also alles was
die Messstation schickt, sehe ich alle 100ms am Display ( Natürlich
nicht Anfangs und Endbyte ). Nachdem die 34 Bytes angekommen sind,
schickt das Terminal direkt 5ms danach ein Byte zurück an die
Messstation. Es können drei verschiedene Bytes zurückgeschickt werden.
Das erste Byte ist "Taste Runter", das zweite Byte ist "Taste rauf" und
das dritte Byte ist "Ich drücke keine Taste". Wenn ich keinen Taster
drücke, kommt ständig alle 100ms der selbe Text der Messstation. Drücke
ich eine Taste kann ich durch das Menü hüpfen und mir mehrere Messdaten
anzeigen lassen.
Nun möchte ich dass dies automatisch passiert, also ich nicht mehr
Tasten drücken muss. Ich möchte gerne, dass alle 5 Ebenen automatisch
rauf und runterlaufen. In jeder Ebene werden natürlich die Messwerte
gesondert gespeichert. Der Vorteil liegt darin, dass ich nicht mehr nur
eine Ebene sehe, sondern die Daten dann anders aufs Display ausgebe,
damit ich alle Daten der 5 Ebenen sehe. So, ich hoffe ihr versteht mein
Vorhaben.
Ich habe schon ein Bascom Programm fertig, mit dem es mit den Tasten
funktioniert durch das Menü zu springen, aber wie mache ich es, dass es
automatisch läuft? Ich habe ebenfalls das RS232 Protokoll mit HTerm an
und sehe genau, was läuft.
Nun hätte ich folgendes probiert, also sprichwörtlich( "Daten" ist ein
Strin*34), Taste ist die Antwort die ich zurücksende:
Do
Do
Taste=Rauf
Loop until Mid(Daten,2,6)="Ebene1"
Do
Taste=Runter
Loop until Mid(Daten,2,6)="Ebene2"
Loop
End
Das Programm soll folgendes bewirken: Egal in welcher Ebene sich die
Messstation gerade befindet, springe solange rauf, bis er bei der ersten
Ebene ist und dann springe solange runter, bis er bei der fünften Ebene
ist. Dann ist das Programm fertig und es geht von neuem los.
Wenn ich das Programm so starte, macht er eigentlich genau das richtige,
wenn da nicht das große ABER wäre: es geht alles ganz schnell, nur wenn
er bei der Ebene1 angekommen ist und will wieder runter, bleibt er
ziemlich lange bei der Ebene2 stehen ( Ca. 1,7 Sekunden ) und geht erst
dann weiter runter. Das gleiche passiert auch unten. Also er ist auf
Ebene5 und will wieder rauf, aber bei Ebene4 verbleibt er wieder ca. 1,7
Sekunden, dann geht er aber mit jede 100ms rauf zu Ebene1. also Ebene2
und Ebene4 dauern sooo lange und ich weis nicht warum. Er sendet aber
das richtige Byte zurück...
Könnt ihr mir bei meinem Problem helfen?
Oder wisst ihr eine bessere Möglichkeit?
Vielen Dank!
Lg
Peter
Sorry, kleiner Tippfehler:
Do
Do
Taste=Rauf
Loop until Mid(Daten,2,6)="Ebene1"
Do
Taste=Runter
Loop until Mid(Daten,2,6)="Ebene5"
Loop
End
Ebene5 nicht Ebene2...
Hallo,
danke für deine Antwort.
Könntest du mir das bitte vielleicht noch genauer erklären? Also du
meinst zb. alle 100ms lasse ich durch einen Timer eine Taste drücken?
Lg
Peter
Darum ist es auch Sinn der Sache, durchs Menü zu hüpfen und die
verschiedenen Werte einzusammeln und dann alle auf einmal anzuzeigen...
Ausserdem sind die 100ms fix vorgegeben und können nicht verändert
werden. Gut, man könnte zb. alle 200ms hüpfen, dann muss ich aber
dazwischen immer wieder eine "Nicht betätigte Taste" schicken. Auch
nicht Sinn der Sache...
Also wüsste wer vielleicht noch einen Plan?
Oder kann mir einer sagen, wieso das mit der Do - Loop Until Schleife
nicht richtig funktioniert?
Lg
Peter
>Darum ist es auch Sinn der Sache, durchs Menü zu hüpfen und die>verschiedenen Werte einzusammeln und dann alle auf einmal anzuzeigen...
Wie willst du bei 2*16 Zeichen 5 verschiedene Menüs mit je 32 Zeichen
gleichzeitig anzeigen? Oder habe ich etwas falsch verstanden?
Hallo,
also auf den fünf Ebenen befindet sich jeweils nur ein "kurzer"
Messwert.
Das würde sich ausgehen auf einem 2x16 Display. Leider hab ich keine
Ahnung wie. Hab gestern wieder probiert, doch habe keinen Plan...
Vielen Dank
Lg
Peter
@Peter
mal noch 2 Fragen:
1) was passiert wenn du keine Informationen über den Tastenzustand
sendest? Werden dann weiter Messwerte vom anderen Modul zurückgeliefert,
oder stoppt die Übertragung?
2) kannst du anhand der gelieferten Messwerte zuordnen zu welchem
Menüpunkt der Wert gehört?
-> häng doch mal an wie die Messwerte ausehen!
Sascha
Hallo Sascha,
danke für deine Bemühungen. Also folgendes:
1: Wenn ich nichts zurücksende, dann stoppt die Übertragung zwar nicht,
aber es wird alles viel langsamer, er kommt halt aus dem "Takt" und
sendet immer wieder die gleichen 34 bytes. Also kurz gesagt, ich muss
ein byte zurückschicken, wenn die 34 bytes angekommen sind. Das
geschieht bei mir in dem Empfangsinterrupt gleich mit. Das funktioniert
auch.
2: Ja zuordnen ist kein Problem. Da weis ich schon, wo was hingehört.
In Zukunft möchte ich auch auf ein 128x64 GLCD umsteigen, dann ist der
Überblick besser. Aber erst eins nach dem anderen...
Wegen der Daten:
Ich lese also ein Byte nach dem anderen ein bis 34 bytes angekommen sind
und lege diese mittels einem "Dim ...as ...Overlay" als einen String mit
34 Zeichen ab.
Das schaut dann etwa so aus : "xEbene1 Spannung1 UBat=5.0V x". Die
x stehen für Anfangs und Endbyte.
Ich komme einfach nicht dahinter, wie ich das durchlaufen lassen kann.
Ich werde wohl probieren, probieren und probieren müssen...
Danke
Lg
Peter
also wenn du die 34Byts im Array speicherst, werden dann alle Daten im
selben Array gespeichert (1) und so die zuvor empfangen Byts
überschrieben, oder trennst du das schon beim Empfang in
unterschiedliche Arrays (2)?
[jetzt mal in universalsprache - da ich in asm programmiere und du
offens. in BASCOM]
Fall 1:
global sendebyte as byte
sendebyte=KeyDown ;Antwortcode für Menü Down
MAIN:
if sendebyte=KeyNothing then
;es wurde was empfangen
hier Datenarray auswerten und werte sichern ...
sendbyte=KeyDown ;weiter zum nächsten Menü
endif
loop MAIN
-------------------
UART_RX_ISR:
;hier deine Speicherfunktion für eingehende Daten
...
if bytecounter=34 then
UART_SEND_BYTE(sendebyte)
sendebyte=KeyNothing
endif
END
Fall 2:
sende als Antwort immer KeyDown oder KeyUp, so läuft der Empfang aller
Seiten immer durch.
-------
achso - hüpft das Menü nach Punkt 5 wieder zum Punkt 1 wenn du die
entsprechende Taste noch mal drückst, wenn nein müsste ja noch die
Richtung am Ende umgeschaltet werden.
=> häng doch dein Programm mal an
Sascha
Hi zusammen
Du hast uns nur den Programmteil mit der Auswertung des Tastendrucks
geschickt.
Du kannst im Programmteil der Tastaturabfrage den Tastendruck
simulieren.
Simple Version mit 2 Sekunden - Schritten
Tastaturabfrage: ' vermutlich alle 100ms
...
...
Zähler = Zähler + 1
if Zähler > 20 then
Taste = Rauf
Zähler = 0
end if
...
Return oder weiter zu anderen Routinen