PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleines Menü auf einem LCD



RobbyMartin
29.12.2010, 17:59
Hallo

ich wollte ein kleines Menü auf einem LCD erstellen mit 3 Unterpunkten (km/h; t pro Umdrehung; Drehzahl[wie oft sich die Achse gedreht hat])
Nun alles schön und gut ich kann per Interrupt zwischen den 3 Sachen wechseln und sie abwechselnd auf dem lcd anzeigen lassen, jetzt möchte ich mit dem anderen interrupt eingang den aktuellen punkt bestätigen und wieder in die main rutine springen, doch dies klappt leider nicht. :'(
Auch weiß ich noch nicht wie ich den ausgabe wert ändern soll also zB von km/h auf drehzal

hat jemand eine idee oder gibt es vielleicht eine möglichkeit das menü einfacher zu gestalten ??



'Martin Gluch
'grüne LED PD0
'Taster PD2 und PD3
'Sensor PB0
'LCD PC
'
'----------------------------------------------------------
$regfile = "m8def.dat" ' Inizialiesierung Microkontroller
$crystal = 3686400 ' Quarz Frequenz
Declare Sub Keypressed

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Config Lcdbus = 4 ' LCD Konfiguierung

Cursor Off ' Cursor auf dem LCD Ausblenden

Deflcdchar 0 , 32 , 32 , 32 , 32 , 12 , 16 , 16 , 31 ' Fahrrad Modul 1
Deflcdchar 1 , 32 , 32 , 32 , 32 , 32 , 30 , 8 , 30 ' Fahrrad Modul 2
Deflcdchar 2 , 7 , 9 , 17 , 17 , 18 , 16 , 8 , 7 ' Fahrrad Modul 3
Deflcdchar 3 , 4 , 18 , 9 , 8 , 8 , 8 , 16 , 32 ' Fahrrad Modul 4
Deflcdchar 4 , 9 , 9 , 10 , 10 , 31 , 2 , 1 , 32 ' Fahrrad Modul 5
Deflcdchar 5 , 28 , 18 , 9 , 5 , 29 , 1 , 2 , 28 ' Fahrrad Modul 6

On Icp1 Oncapture ' Interrupt Routine deklarieren
On Int0 Onmenue
On Int1 Onenter

Dim Wcapture As Long 'Variablen Declaration
Dim Geschw As Single 'Variablen Declaration
Dim Endgeschw As Single 'Variablen Declaration
Dim Menuepunkt As Integer
Menuepunkt = 0

Ddrb.0 = 0 ' Pin PB0 Eingang (Sensor + r. Taster)
Portb.0 = 1 ' PullUp von Pin PB0 aktivieren

Ddrb = &B00000001 ' Pin DB0 Ausgang (LED)
Portd = &B00001100
Mcucr = &B00001010
Gicr = &B11000000

'\/Begrüßungsbildschirm\/
Cls
Locate 1 , 1
Lcd "Fahrradtacho"
Locate 2 , 1
Lcd "Version 1.0"
Locate 1 , 14
Lcd Chr(0)
Locate 1 , 15
Lcd Chr(1)
Locate 2 , 13
Lcd Chr(2)
Locate 2 , 14
Lcd Chr(3)
Locate 2 , 15
Lcd Chr(4)
Locate 2 , 16
Lcd Chr(5)
Waitms 1500
Cls
Locate 1 , 1
Lcd "----------------"
Locate 2 , 3
Lcd "Martin Gluch"
Waitms 2000
Cls
'/\Begrüßungsbildschirm/\


Tccr1a = &B00000000
Tccr1b = &B10000101
Timsk.ticie1 = 1

Sreg.7 = 1


Main:

Goto Main


Oncapture:


Timer1 = Timer1 - Capture1
Wcapture = Capture1
Wcapture = Wcapture \ 3.600
'Wcapture = Wcapture \ 1000
Geschw = 2.03 / Wcapture ' 2,03 durch beliebigen Reifenumfang ersetzen
Endgeschw = Geschw * 360
Endgeschw = Endgeschw * 10

Cls
Locate 1 , 2
Lcd Chr(0)
Locate 1 , 3
Lcd Chr(1)
Locate 2 , 1
Lcd Chr(2)
Locate 2 , 2
Lcd Chr(3)
Locate 2 , 3
Lcd Chr(4)
Locate 2 , 4
Lcd Chr(5)
Locate 1 , 6
Lcd Endgeschw
Locate 1 , 12
Lcd " km/h "
Locate 2 , 6
Lcd "M. Gluch"

Return
Return

Onmenue:

Cls
Locate 1 , 1
Lcd "Menue"
If Menuepunkt = 0 Then
Locate 2 , 1
Lcd "km/h"
End If
If Menuepunkt = 1 Then
Locate 2 , 1
Lcd "Zeit/U"
End If
If Menuepunkt = 2 Then
Locate 2 , 1
Lcd "Drehzahl"
End If
Menuepunkt = Menuepunkt + 1
If Menuepunkt = 3 Then
Menuepunkt = 0
End If

Return


Onenter:

Return

Dies soll ein Fahrrad tacho werden die ganz normale Geschwindigkeitsmessung funktioniert auch doch das MEnü als besonderer Hingucker funktioniert leider noch nicht.

Gruß
Martin

BoGe-Ro
30.12.2010, 07:22
Hallo,

dein Programmaufbau ist etwas merkwürdig.
Du rechnest nach eingehendem ICP-Interrupt die Geschwindigkeit aus und gibst sie aus und springst zurück in die leere Main-Routine.
Im Menü änderst du lediglich die Einheit dahinter.
Trotz allem kommt als nächstes wieder ein ICP-Interrupt und die Geschwindigkeitsausgabe.

ich würde in der Menue-Interrupt-Routine nur bei jedem Klick eine Variable ähnlich der Variablen Menuepunkt verändern
(so wie du das schon machst: help=help+1 und if help=3 then help=0)

in die OnEnter-Routine würde ich dann nur Menuepunkt=help reinschreiben
damit wird die abzuprüfende Variable übernommen

und in der ICP-Interrupt-Routine die gemessenen Werte berechnen und meinetwegen alle 3 Ergebnisse in Variablen hinterlegen.

die Main würde ich nicht leer lassen, sondern da die Variable Menuepunkt durch eine Case-Abfrage laufen lassen und die entsprechende Ausgabe dort machen.


Gruß BoGe-Ro

Vitis
30.12.2010, 12:57
Du hast Deine LCD-Ausgabe in der Interruptroutine, das ist nicht besonders schön, weil das LCD die Int ausbremst.

Für Tasten brauchts auch keine Interrupts, so schnell sind die Tasten nicht.
Aus der Mainloop per debounce Befehl aufgerufen würde dicke reichen.

Goto ist so ziemlich das größte Schreckgespenst .... brrrrr

RobbyMartin
31.12.2010, 12:56
Dankeschöön für die Antworten werde mich mal direkt dran machen wenn irgendwas bei rauskommt melde ich mich noch mal

Gruß
Martin

RobbyMartin
01.01.2011, 18:19
So habe nun das Menü programmiert ist zwar nicht sonderlich komplex und schwierig aber es funktioniert.

Wenn jemand verbesserungen hat oder vorschläge wie ich es optimieren kann dem wäre ich sehr dankbar.



$regfile = "m8def.dat" ' Inizialiesierung Microkontroller
$crystal = 3686400 ' Quarz Frequenz
Declare Sub Key1
Declare Sub Key2

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Config Lcdbus = 4 ' LCD Konfiguierung

Cursor Off ' Cursor auf dem LCD Ausblenden

Deflcdchar 0 , 32 , 32 , 32 , 32 , 12 , 16 , 16 , 31 ' Fahrrad Modul 1
Deflcdchar 1 , 32 , 32 , 32 , 32 , 32 , 30 , 8 , 30 ' Fahrrad Modul 2
Deflcdchar 2 , 7 , 9 , 17 , 17 , 18 , 16 , 8 , 7 ' Fahrrad Modul 3
Deflcdchar 3 , 4 , 18 , 9 , 8 , 8 , 8 , 16 , 32 ' Fahrrad Modul 4
Deflcdchar 4 , 9 , 9 , 10 , 10 , 31 , 2 , 1 , 32 ' Fahrrad Modul 5
Deflcdchar 5 , 28 , 18 , 9 , 5 , 29 , 1 , 2 , 28 ' Fahrrad Modul 6

On Icp1 Oncapture ' Interrupt Routine deklarieren

Dim Wcapture As Long 'Variablen Declaration
Dim Geschw As Single 'Variablen Declaration
Dim Endgeschw As Single 'Variablen Declaration
Dim Menuepunkt As Integer
Dim Anzeigezahl As Single
Dim Einheit As String * 6
Dim Zaehler As Long
Dim Strecke As Single
Dim Zeit As Integer
Menuepunkt = 0
Zaehler = 0
Strecke = 0

Ddrd = &B0000001
Portd.2 = 1
Portd.3 = 1
Ddrb.0 = 0 ' Pin PB0 Eingang (Sensor + r. Taster)
Portb.0 = 1 ' PullUp von Pin PB0 aktivieren


'\/Begrüßungsbildschirm\/
Cls
Locate 1 , 1
Lcd "Fahrradtacho"
Locate 2 , 1
Lcd "Version 1.0"
Locate 1 , 14
Lcd Chr(0)
Locate 1 , 15
Lcd Chr(1)
Locate 2 , 13
Lcd Chr(2)
Locate 2 , 14
Lcd Chr(3)
Locate 2 , 15
Lcd Chr(4)
Locate 2 , 16
Lcd Chr(5)
Waitms 1500
Cls
Locate 1 , 1
Lcd "----------------"
Locate 2 , 3
Lcd "Martin Gluch"
Waitms 2000
Cls
Locate 1 , 5
Lcd "Computer"
Locate 2 , 6
Lcd "bereit"
Waitms 1000
'/\Begrüßungsbildschirm/\


Tccr1a = &B00000000
Tccr1b = &B10000101
Timsk.ticie1 = 1

Sreg.7 = 1


Do

Debounce Pind.2 , 0 , Key1 , Sub
Debounce Pind.3 , 0 , Key2 , Sub

Cls
If Menuepunkt = 0 Then
Anzeigezahl = Endgeschw
Locate 2 , 1
Lcd "Geschwindigkeit"
Locate 1 , 12
Einheit = " km/h "
End If
If Menuepunkt = 1 Then
Anzeigezahl = Zeit
Locate 2 , 1
Lcd "Zeit pro Umdreh."
Locate 1 , 12
Einheit = " ms "
End If
If Menuepunkt = 2 Then
Anzeigezahl = Zaehler
Locate 2 , 1
Lcd "Counter"
Einheit = " "
End If
If Menuepunkt = 3 Then
Anzeigezahl = Strecke \ 1000
Locate 2 , 1
Lcd "Strecke"
Einheit = " km "
End If

Locate 1 , 6
Lcd Anzeigezahl
Locate 1 , 11
Lcd Einheit
Waitms 70

Loop

Oncapture:

Timer1 = Timer1 - Capture1
Wcapture = Capture1
Wcapture = Wcapture \ 3.600
'Wcapture = Wcapture \ 1000
Geschw = 2.03 / Wcapture ' 2,03 durch beliebigen Reifenumfang ersetzen
Endgeschw = Geschw * 360
Endgeschw = Endgeschw * 10

Zaehler = Zaehler + 1
Strecke = Strecke + 2.03
Zeit = Wcapture

Portd.0 = 1
Waitms 1
Portd.0 = 0

Return

Sub Key1

Cls
If Menuepunkt = 0 Then
Locate 2 , 1
Lcd "Zeit pro Umdreh."
End If

If Menuepunkt = 1 Then
Locate 2 , 1
Lcd "Counter"
End If

If Menuepunkt = 2 Then
Locate 2 , 1
Lcd "Strecke"
End If

If Menuepunkt = 3 Then
Locate 2 , 1
Lcd "Geschwindigkeit"
End If

Menuepunkt = Menuepunkt + 1
If Menuepunkt = 4 Then
Menuepunkt = 0
End If

End Sub

Sub Key2

Zaehler = 0
Cls
Locate 1 , 1
Lcd "Counter Reset"
Waitms 500


End Sub
End


Gruß
Martin

pro-bot
02.01.2011, 14:13
frage wie teste ich sowas am pc in einer software???
also in welcher?
oder geht das überhaupt?

Vitis
02.01.2011, 14:18
frage wie teste ich sowas am pc in einer software???
also in welcher?
oder geht das überhaupt?

garnicht, geht oder geht nicht :)

pro-bot
02.01.2011, 18:25
ach das is bascom??? oder?

RobbyMartin
02.01.2011, 18:52
Jap das ist es ;) guck mal in welchem Unterforum du gelandet bist

"Basic-Programmierung (Bascom-Compiler)"

Gruß
Martin

pro-bot
03.01.2011, 00:54
oh garnich drauf geachtet