PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anzeige Menü mit Unterpunkten auf LCD?



wölfchen
11.12.2005, 16:10
Hallo,
seid kurzem beschäftige ich mich mit AVR’s. Bei meiner suche nach einer leicht erlernbaren Programmiersprache bin ich auf Bascon gestoßen. Habe mir auch sofort Fachliteratur von Kühnel und Walter gekauft und arbeite diese gerade durch.
Habe aber einer Frage an Euch. Sie bezieht sich auf mein späteres Projekt, welches übrigens der ausschlaggebende Faktor gewesen ist das ich mich mit AVR etc. beschäftige.
Ich habe später vor mit dem Atmega 32 und einem (G)LCD eine Art „Überwachung“ für meine RC-Autos zu bauen. Dazu möchte ich mir eine Art „Menü“ auf dem Display anzeigen lassen.
Warum Menü? Nun ich fahre unterschiedliche Antriebszahnräder, Reifengrößen und manchmal auch andere Verbrennermotoren. Damit ich nicht ständig auf einen Computer angewiesen bin, kam mir die Idee mit dem Menü in dem man über Taster „Festwert“ eingeben kann.
Vorgestellt hatte ich mir das so, das der Atmega nach dem einschalten eine Abfrage startet ob „Festwerte“ im Menü eingetragen sind, wenn nicht erscheint das Menü „Basiswerte“ mit den Unterpunkten die eingetragen werden müssen. Diese Werte werden später zur Berechnung verwendet.
Leider finde ich im Web nichts, in dem erklärt wird wie ich so ein Menü erstellen kann. Hoffe ihr könnt mir weiterhelfen.
Danke

Stromi
11.12.2005, 17:11
Stichworte:
ReadEEProm, Tastenabfrage, Case-Befehl, usw.

Marco78
11.12.2005, 19:10
Hier ein paar Ausschnitte aus einem Code von mir.


Menü:
Zeit = 0 'anzeige der Zeit verhindern.

Cls
Locate 1 , 9
Lcd "Menõ"
Lowerline
Lcd "--------------------"
Thirdline
Lcd "1. Datum & Zeit"
Fourthline
Lcd "2. Hintergrundbel."

Waitms 300 'alte FB-Taste ignorieren

Do
Gosub Getir
If Command = 0 Then Goto Pc_aus
If Command = 1 Then Goto Menü11
If Command = 2 Then Goto Menü2
Loop

Menü11:
Cls
Locate 1 , 9
Lcd "Menõ"
Lowerline
Lcd "--------------------"
Thirdline
Lcd "1. Zeit stellen "
Fourthline
Lcd "2. Timer stellen "
Do
Gosub Getir
If Command = 0 Then Goto Menü
If Command = 1 Then Gosub Zeit_stellen
If Command = 2 Then
A = 1
Goto Timer_stellen
End If
Loop

Zeit_stellen:
Cls
Lcd " Zeit stellen"
Lowerline
Lcd "Bitte Datum und"
Thirdline
Lcd "Uhrzeit eingeben"
Fourthline
Lcd " --.--.20-- --:--"
Cursor Blink

Do
Locate 4 , 3
Do
Gosub Getir 'Tag stellen
Loop Until Command < 10
Lcd Command
A = Command * 10
Waitms 200
Locate 4 , 4
Do
Gosub Getir
Loop Until Command < 10
Lcd Command
B = Command
Tag = A + B
Loop Until Tag < 32

Do
Waitms 200
Locate 4 , 6
Do
Gosub Getir 'Monat stellen
Loop Until Command < 10
Lcd Command
A = Command * 10
Waitms 200
Locate 4 , 7
Do
Gosub Getir
Loop Until Command < 10
Lcd Command
B = Command
Monat = A + B
Loop Until Monat < 13

Waitms 200
Locate 4 , 11
Do
Gosub Getir 'Jahr stellen
Loop Until Command < 10
Lcd Command
A = Command * 10
Waitms 200
Locate 4 , 12
Do
Gosub Getir
Loop Until Command < 10
Lcd Command
B = Command
Jahr = A + B
Writeeeprom Jahr , 8

Do
Waitms 200
Locate 4 , 15
Do
Gosub Getir 'Stunden stellen
Loop Until Command < 10
Lcd Command
A = Command * 10
Waitms 200
Locate 4 , 16
Do
Gosub Getir
Loop Until Command < 10
Lcd Command
B = Command
Stunden = A + B
Loop Until Stunden < 24

Do
Waitms 200
Locate 4 , 18
Do
Gosub Getir 'Minuten stellen
Loop Until Command < 10
Lcd Command
A = Command * 10
Waitms 200
Locate 4 , 19
Do
Gosub Getir
Loop Until Command < 10
Lcd Command
B = Command
Minuten = A + B
Loop Until Minuten < 60

Sekunden = 0 'nach letzter Eingabe Sekunden wieder auf 0 setzen

Cursor Off
Cursor Noblink

Jahr2 = Str(jahr)
Tag2 = Str(tag)
Monat2 = Str(monat)
Tag2 = Format(tag2 , "00")
Monat2 = Format(monat2 , "00")

Waitms 1000
Return


Getir: 'IR-Code empfangen und auswerten

Getrc5(adress , Command)
If Adress <> Fbcode Then Command = 127 'Command für falsche Adresse setzen damit nicht auf andere FB reagiert wird
If Command > 127 Then Command = Command - 128 'Togglebit einfernen

Return

Modus:

Cls
Lcd " Modus der HGB"
Lowerline
Lcd "--------------------"
Thirdline
Lcd "1. wenn PC an"
Fourthline
Lcd "2. wenn PC aus"

Waitms 200

Do
Gosub Getir
If Command = 0 Then Return
If Command = 1 Then Gosub Modus_an
If Command = 2 Then Gosub Modus_aus
Loop


Modus_an:

Cls
Lcd "1. Lightcontrol" '15 zeichen
Lowerline
Lcd "2. dauerhaft" '12 Zeichen
Thirdline
Lcd "3. dimmer" '9 zeichen
Fourthline
Lcd "4. Schwellwert" '14 Zeichen

Waitms 300

Do

Locate 1 , 17
If Lightcontrol = 1 Then
Lcd " Ja "
Else
Lcd "Nein"
End If

Locate 2 , 17
If Pwmandauer = 1 Then
Lcd "An "
Else
Lcd "Aus"
End If

Locate 3 , 19
If Pwmandimmer = 1 Then
Lcd "*"
Else
Lcd " "
End If

Locate 4 , 19
If Pwmanschwell = 1 Then
Lcd "*"
Else
Lcd " "
End If

Gosub Getir

Select Case Command
Case 0 : Return
Case 1 : Toggle Lightcontrol
Case 2 : Toggle Pwmandauer
Case 3 : Toggle Pwmandimmer
Case 4 : Toggle Pwmanschwell
End Select
Waitms 100

Loop




Modus_aus:


Cls
Lcd "1. dauerhaft"
Lowerline
Lcd "2. dimmer"
Thirdline
Lcd "3. Schwellwert"

Waitms 300

Do

Locate 1 , 17
If Pwmausdauer = 1 Then
Lcd "An "
Else
Lcd "Aus"
End If

Locate 2 , 19
If Pwmausdimmer = 1 Then
Lcd "*"
Else
Lcd " "
End If

Locate 3 , 19
If Pwmausschwell = 1 Then
Lcd "*"
Else
Lcd " "
End If

Gosub Getir

Select Case Command
Case 0 : Return
Case 1 : Toggle Pwmausdauer
Case 2 : Toggle Pwmausdimmer
Case 3 : Toggle Pwmausschwell
End Select

Waitms 100

Loop


Minhell:

Cls
Waitms 200

Lowerline
Lcd "Mit '1' speichern"
Thirdline
Lcd "mit '0' zurück"

Do

Upperline
A = Getadc(0)
B = A / 4
Lcd B

Gosub Getir
If Command = 0 Then Return
If Command = 1 Then
Minhell = B
Writeeeprom Minhell , 2
End If

Loop


Maxhell:
Cls
Waitms 200

Lowerline
Lcd "Mit '1' speichern"
Thirdline
Lcd "mit '0' zurück"

Do

Upperline
A = Getadc(0)
B = A / 4
Lcd B

Gosub Getir
If Command = 0 Then Return
If Command = 1 Then
Maxhell = B
Writeeeprom Maxhell , 4
End If

Loop


Hgb:
Cls
Lcd " HGB"
Lowerline
Lcd "--------------------"
Thirdline
Lcd "1. min. Wert"
Fourthline
Lcd "2. max. Wert"

Waitms 200
Do
Gosub Getir
If Command = 0 Then Return
If Command = 1 Then Gosub Hgbmin
If Command = 2 Then Gosub Hgbmax
Loop


Hgbmin:
Ocr2 = 0
A = 0

Cls
Lowerline
Lcd "7 = - 9 = +"
Thirdline
Lcd "1 = speichern"
Fourthline
Lcd "0 = zurück"

Waitms 200

Do
Gosub Getir
If Command = 0 Then Return
If Command = 1 Then
Pwmmin = A
Writeeeprom Pwmmin , 100
End If
If Command = 7 Then A = A - 5
If Command = 9 Then A = A + 5
If A < 0 Then A = 0
If A > 250 Then A = 250
Ocr2 = A
Upperline
Lcd A ; " "
Loop


Hgbmax:
Ocr2 = 250
A = 250

Cls
Lowerline
Lcd "7 = - 9 = +"
Thirdline
Lcd "1 = speichern"
Fourthline
Lcd "0 = zurück"

Waitms 200

Do
Gosub Getir
If Command = 0 Then Return
If Command = 1 Then
Pwmmax = A
Writeeeprom Pwmmax , 100
End If
If Command = 7 Then A = A - 5
If Command = 9 Then A = A + 5
If A < 0 Then A = 0
If A > 250 Then A = 250
Ocr2 = A
Upperline
Lcd A ; " "
Loop


Savecode:
Zeit = 0 'anzeigen der Zeit (Sekunden) verhindern.
Cls
Lcd "Bitte eine Taste auf"
Lowerline
Lcd "der Fernbedienung"
Thirdline
Lcd "dr" ; Chr(245) ; "cken..."

Do
Getrc5(adress , Command)
If Adress = 255 Then Loop 'wenn nix gedrückt, dann nochmal abfragen
Writeeeprom Adress , 1
Cls
Lcd "Code gespeichert..."
Fbcode = Adress
Waitms 1000
Cls
Return


Timeroffset: 'Vor- und Nachlauf der Uhr kompensieren

Zeit = 0
Cls
Lcd " ACHTUNG!!!"
Lowerline
Lcd "Bedienungsanleitung"
Thirdline
Lcd "beachten!"
Waitms 150

Do
Gosub Getir
Loop Until Command < 127 'erst wenn eine Taste gedrückt wurde weiter machen
If Command <> 5 Then Goto Pc_aus 'nur bei "5" weiter machen
Cls
Lcd "Wert eingeben:"
Lowerline
Lcd "Sollwert: 18661"
Thirdline
Lcd "Istwert: " ; Timervorgabe
Fourthline
Lcd "-----"
Cursor On
Cursor Blink

F = 1 : A = 10000 : C = 0
Waitms 250
Do
Locate 4 , F
Do
Gosub Getir
Loop Until Command < 10
Lcd Command
Waitms 250
B = A * Command
C = C + B
A = A / 10

Incr F

Loop Until F = 6

Cursor Off
Cursor Noblink
Waitms 1000

Timervorgabe = C
Writeeeprom Timervorgabe , 106

Goto ...



PS: (C) by Marco78!!!

wölfchen
11.12.2005, 19:48
Hallo ihr beiden,
möchte mich vorab schon einmal bei Euch bedanken.
Naja, als ich den Ausschnitt von deinem Code gelesen habe, stellt ich mit erschrecken fest das ich nocvh einen sehr weiten weg in sachen Programmieren vor mir habe.
Hast du das in Bascom geschrieben? Wie sieht das Ergebniss auf einem LCD aus. Könntest du vielleicht mal ein Bild hier rein stellen?
Danke

Marco78
11.12.2005, 20:31
Ja, das ist mit Bascom.

Fotos sind z.Zt. schlecht. Ich habe grade ein gLCD am "Testboard".
Aber ich werde den Code mal dort einfügen wenn ich Zeit habe. Es sieht dann nur etwas verloren aus wenn 4 Zeilen auf 240*128 Punkten dargestellt werden.

Im Code habe ich ja noch einige Subroutinen mit drin. Die sind speziell für's Menü ja nicht nötig.
Du kannst den Code ja auch auf deinem AVR aufspielen und schauen wie es aussieht.

Im Prinzip ist das ganze ja auch nicht soo schwer wie es aussehen mag.
Zuerst die Menüpunkte auf's Display schreiben.
Dann eine Abfrageroutine einbauen. Und ja nachdem was man auswählt muss in ein SUB gesprungen werden.
Das könnte dann wie z.T. bei mir ein weiteres Untermenü sein.

Die Abfrage passiert bei mir mit einer RC5-Fernbedienung.
Im Code ist auch ein für dich ein evtl weiterer hilfreicher Teil mit drin. Das speichern von Einstellungen im EEPROM.

Noch ein Tipp:
Wenn du ein Text-LCD nimmst, kannst du anstelle von LOCATE 1,X usw Firstline, Lowerline, Thirdline und Fourthline verwenden. Damit wird der Code kleiner.

wölfchen
11.12.2005, 21:01
Meine güte wenn das Bascom ist dann habe ich ja noch einiges vor mir. In dem Buch von Walter (AVR Mikrocontroller Lehrbuch) kommt das bis jetzt noch nicht vor. Gut ist ein Buch für Leute wie mich, Einsteiger.
Das mit dem Menü auf deinem GLCD darstellen klingt sehr interessant.
Wie gibst du Daten(Werte) ein und speicherst du sie auf einem externen EEprom?
Ich hatte mir überlegt das ich max. 4 Taster zur Menüführung und Eingabe (Werte) verwenden kann.
Du schreibst etwas von RC5. Was genau machst du mit dem Programm?

Marco78
11.12.2005, 22:00
RC5 ist einfach nur einer von vielen Code für Fernbedienungen.
Das schöne dran ist, das Bascom für das Auswerten der IR-Signale eine feste Routine hat.
Schau in der Hilfe mal nach GETRC5.

Die Zeit z.B. wird mit den Ziffern eingestellt. Den Menüpunkten habe ich auch Ziffern gegeben, auf die reagiert wird.
Das ganze wäre aber auch mit Tastern möglich!

Die Werte werden im internen EEPROM des Mega16 gespeichert. Ich denke, der wird für dich auch erstmal reichen. Der Mega16 hat 512Byte EEPROM und der Mega32 sogar 1024.
Wenn es nur um ein paar Einstellungen geht reicht das sicherlich.
Ein externen EEPROM kostet ja auch Geld und nimmt Platz weg :(

Ich selbst bezeichne mich auch noch als Einsteiger.
Ich habe zwar schon vor ein paar Monaten mit AVR'S angefangen aber noch nicht soviel Zeit gehabt mich damit zu beschäftigen. Andere hier sitzen da sicherlich fast jeden Tag/Abend dran.

Ich bin aber mit Basic aufgewachsen (hab damit vor etwa 15 Jahren angefangen) von daher fällt es mir relativ leicht das alles nachzuvollziehen.

Bücher habe ich mir auch zwei gekauft. Das eine war im Prinzip Müll, aber ist schön wenn man es mal zur Hand hat. Aber wenn nicht, ist es auch nicht schlimm.
Das andere hat schon etwas mehr geholfen. Aber man schaut es sich auch nur einmal an und dann evtl nochmal wenn was unklar war.
Vieles lernt man am besten in der Praxis.
Vor allem treten da Probleme auf, die man beim Lesen noch garnicht erahnen konnte.

Was ich mit dem Programm mache: Eine lange Geschichte, die auch noch nicht zuende ist...
Wenn es fertig ist und alles so funktioniert wie es soll, werde ich es hier auch vorstellen für den Fall das es jemand gebrauchen kann. Aber das wird bei der Zeit die ich im Moment habe noch einige Monate dauern.

wölfchen
12.12.2005, 19:37
So, habe erst einmal meine beiden Beiträge in denen ich Fachbücher erwähne editiert. Grund dafür war das ich Tampert und Walter verwechselt habe. Wieso? Weis ich leider auch nicht.

Ich beschäftige mich gerade mal zwei Wochen mit dem Thema Bascom und AVR, soweit es meine Zeit erlaubt.
Bascom habe ich noch nicht auf meinem Comp. installiert. Grund dafür ist das ich hier oben zurzeit keine Hardware (AVR's u.s.w.) habe doch sobald ich Urlaub habe und wieder in GE bin packe ich alles ein was ich an Elektronik habe und nehme es mit hoch. Habe dann hoffentlich abends öfters Zeit um auch mal praktisch etwas zu machen. Na ja zumindest sobald ich den ISP gebaut habe. Irgendwie freue ich mich schon drauf die Beispiele mit dem Atmega 8 aus dem Walter Buch nach zu machen und wenn ich mal Problem habe weis ich ein tolles Forum in dem mir sicherlich schnell geholfen wird.
Danke noch mal für eure Hilfe.