Forum: Mikrocontroller und Digitale Elektronik Automatisch durch ein vorhandenes Menü springen lassen (BASCOM)


von Peter (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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

von Weingut P. (weinbauer)


Lesenswert?

da nimmste einfach nen timer und zählst mit dem den index runter und gut 
ist.

von Peter (Gast)


Lesenswert?

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

von Kasperle (Gast)


Lesenswert?

Wer soll das ablesen können?
10 mal/sec einen anderen Text.

von Peter (Gast)


Lesenswert?

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

von Kasperle (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

Du musst die NAchrichten im Hintergrund auf die Werte parsen und die 
gesammelten Werte dann auf den LCD schicken..

von Sascha W. (sascha-w)


Lesenswert?

@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

von Peter (Gast)


Lesenswert?

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

von Sascha W. (sascha-w)


Lesenswert?

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

von Winne Z. (rugbywinne)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.