PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche Hilfe bei Variablen und Anwengung mit LCD



Nubbidubi
02.01.2009, 19:38
Hallo Zusammen

vielleicht kann mir jemand bei einem Problem Helfen.
Da ich noch nie Programmiert habe(weder in Basic noch sonst was)
kenne ich mich nicht sehr gut mit Bascom aus.
Habe vereinzelt Leds zum blinken bekommen und das LCD angesteuert.
Jetzt würde es mich interesieren wie das mit den Variablen funktioniert. Bzw erklären worauf ich auchten muss und in welcher Reihenfolge die Befehle kommen müssen.
Ne idee hätte ich schon zur Anwendung:

Taster 1 an Pinc.1
Taster 2 an Pinc.2

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 ,
Config Lcdpin = Pin , Db6 = Portd.6 , Db7 = Portd.7 ,
Config Lcdpin = Pin , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Config Lcdbus = 4
Config Portd = Output

Aufgabe: Per Taste 1 die Zahl 1 bis 10 per Tastendruck nach oben zählen
Per Taste 2 nach untenzählen.

Das müsste relativ schnell funktionieren und für mich als Noobie auch einfach zu verstehen.

Wenn jemand Helfen könnte würde ich mich sehr freuen

Grüße Noobidubi

Nubbidubi
02.01.2009, 21:29
Hab mir da schnell was zusammen geschustert. Läuft alles eigentlich gar nicht schlecht,
nur beim drücken der Taste1 zählt das Display wie verrückt durch und bei Taste2 geht nur einmal zurück.
Woran könnte das liegen?
Vielleicht mal das Programm durchschauen ob Ihr einen Fehler findet?
:-k
Ein Fehler muss ja da sein, sonst würde es wie gewünscht funktionieren #-o


'---------------------------------------------------------------------------
'Titel : LCD-Grundlagen Testen
'Datei : Grundlagen_LCD ansteuern
'---------------------------------------------------------------------------
'Funktion : Textausgabe an LCD
'Schaltung : Erweiterungsplatine "LCD" an Buchsenleiste
' :
' :
'---------------------------------------------------------------------------
'Display- :
'controller : KS0070, HD44100 kompatibel
'---------------------------------------------------------------------------
'Prozessor : ATmega8 3,6864MHz
'Sprache : Bascom-AVR
'Datum : 04.11.2008
'Version : 1.0
'Autor : Stefan Merk
'---------------------------------------------------------------------------
' hier Initialisierung durchführen
'---------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 3686400
$hwstack = 32
$swstack = 10
$framesize = 60

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , ' Config können
Config Lcdpin = Pin , Db6 = Portd.6 , Db7 = Portd.7 , ' auch in einer
Config Lcdpin = Pin , E = Portd.3 , Rs = Portd.2 ' Zeile stehen
Config Lcd = 16 * 2 ' LCD mit 16Zeichen
' je Zeile, 2 Zeilig
Config Portd = Output
Config Pinb.0 = Input
Config Pinb.1 = Input

'---------------------------------------------------------------------------
'Hier Alias inizialisieren
Taster1 Alias Pinb.0
Taster2 Alias Pinb.1
'---------------------------------------------------------------------------
'Hier PullUp inizialisieren
Portb.0 = 1
Portb.1 = 1
'---------------------------------------------------------------------------
'Hier Variable inizialisieren
Dim A As Integer
Dim B As Integer
A = 1
B = 1
'---------------------------------------------------------------------------
'Hier Unterprogramme Declarieren
Declare Sub Count_up
Declare Sub Count_down
Declare Sub Weiter
'---------------------------------------------------------------------------
'Tasten entprellen
Config Debounce = 30
Debounce Pinb.0 , 0 , Count_up , Sub
Debounce Pinb.1 , 0 , Count_down , Sub

'---------------------------------------------------------------------------

Cls
Cursor Off
Upperline
Lcd "Counter"
Lowerline
Lcd "T1=Up; T2=Down"
Wait 1
Cls
Upperline
Lcd "T1=Up; T2=Down"
Wait 1

Do
Start:
If Taster1 = 0 Then
Gosub Count_up
Else
Gosub Weiter
End If

If Taster2 = 0 Then
Gosub Count_down
Else
Gosub Weiter
End If

Loop
End

Sub Count_up:
A = A + 1
Locate 2 , 1
Lcd A
End Sub

Sub Count_down:
B = A - 1
Locate 2 , 1
Lcd B
End Sub

Sub Weiter:
Locate 2 , 8
Lcd "Weiter"
End Sub

for_ro
02.01.2009, 21:46
Hallo Noobidubi,
die Do..Loop läuft die ganze Zeit sehr schnell ab. Nur wenn einer der beiden Taster gedrückt ist, wird kurz die entsprechende Sub aufgerufen und dann geht's weiter in der Schleife. Da du die Taster nicht so schnell wieder loslassen kannst, werden immer gleich mehrere Durchläufe stattfinden.
Beim Count_up wird A erhöht und angezeigt. Bei mehrmaligen Durchlaufen wird A schnell größer.
Bei Count_down wird B=A-1 gesetzt und B wird angezeigt. Da A sich nciht ändert, wird die Sub zwar mehrfach aufgerufen, aber immer der gleiche Wert in B geschrieben.
Deine Debounce Befehle werden nur vor der Schleife aufgerufen. Wenn da keine Taste gedrückt ist, nutzen die nichts.
Schreibe mal so:


Do
Debounce Pinb.0 , 0 , Count_up , Sub
Debounce Pinb.1 , 0 , Count_down , Sub
Loop

End

Sub Count_up:
A = A + 1
Locate 2 , 1
Lcd A
End Sub

Sub Count_down:
A = A - 1
Locate 2 , 1
Lcd A
End Sub

dann solte es funktionieren.

Gruß

Rolf

Nubbidubi
02.01.2009, 22:03
hatt alles soweit funktioniert danke für die Hilfe. =D>
Jetzt ergibts sich nur ein Problem:

wenn bei 0 angekommen mit Taster2 gedrückt wird dann wird -1 angezeigt
wenn man jetzt mit Taster1 nach oben zählt ergibt sich dass aus -1 dann 01
wird und durch die Addresierung im Display Locate 2 , 1 dann bei 1 11steht bzw beim Weiterzählen 21; 31; 41 usw
WIe kann man das Umgehen?

Und noch eine Frage wie kann ich den Zählberreich begrenzen? So dass nur bis +10 bzw -10 gezählt werden kann.
Habe was mit 1 to 10 oder so ähnlich im Kopf. :-k

Vitis
02.01.2009, 22:13
if then ....

if a>10 then a=10

Nubbidubi
02.01.2009, 22:18
if then ....

if a>10 then a=10

danke Vitis

code zum begrenzen des Zählers von 10 bis -10
Codeschnippsel

Sub Count_up:
A = A + 1
If A > 10 Then A = 10 'begrenzt auf 10
Locate 2 , 1
Lcd A
End Sub

Sub Count_down:
A = A - 1
If A < -10 Then A = -10 'gebrenzt auf -10
Locate 2 , 1
Lcd A
End Sub

was jetzt noch probleme macht ist
dass wenn unter 0 gezählt wird,
also -1 bis -10 dann wird bei -10 3stellen im LCD benutzt.
Wenn man dann zurück über 0 Zählt
als 0 bis 10 dann wird die 2. und 3. Stelle im LCD nicht zurückgesetzt.
Klartext schaut es dann so aus:

Von -10 nach 0 per Tastendruck:
-10; -90(sollte aber -9 sein); -80;-70;-60;-50;-40;-30;-20;-10;
dann weiter

von 0 bis 10 per Tastendruck:
010(sollte aber 0 sein);110; 210;310;410;510;610;710;810;910;100

Ich hab das Problem per CLS gelöst, bin aber damit nicht zufrieden.
Kann man die 2. und 3. in der unteren LCD Anzeige auch anderst aktualisieren ohne dass man das Lcd mit CLS löscht?
Wenn jemand Erfahrung gemacht hat mit solchen Sachen wäre ich für
einen Gedankenanstoß sehr erfreut :-k

hier das ganze Programm mit CLS im Gosub Count_up bzw Count_down
das Ergebnis ist wie gedacht. Ohne CLS ist es dann wie oben beschrieben

'---------------------------------------------------------------------------
'Titel : LCD-Grundlagen Testen
'Datei : Grundlagen_LCD ansteuern
'---------------------------------------------------------------------------
'Funktion : Textausgabe an LCD
'Schaltung : Erweiterungsplatine "LCD" an Buchsenleiste
' :
' :
'---------------------------------------------------------------------------
'Display- :
'controller : KS0070, HD44100 kompatibel
'---------------------------------------------------------------------------
'Prozessor : ATmega8 3,6864MHz
'Sprache : Bascom-AVR
'Datum : 04.11.2008
'Version : 1.0
'Autor : Stefan Merk
'---------------------------------------------------------------------------
' hier Initialisierung durchführen
'---------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 3686400
$hwstack = 32
$swstack = 10
$framesize = 60

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , ' Config können
Config Lcdpin = Pin , Db6 = Portd.6 , Db7 = Portd.7 , ' auch in einer
Config Lcdpin = Pin , E = Portd.3 , Rs = Portd.2 ' Zeile stehen
Config Lcd = 16 * 2 ' LCD mit 16Zeichen
' je Zeile, 2 Zeilig
Config Portd = Output
Config Pinb.0 = Input
Config Pinb.1 = Input

'---------------------------------------------------------------------------
'Hier Alias inizialisieren
Taster1 Alias Pinb.0
Taster2 Alias Pinb.1
'---------------------------------------------------------------------------
'Hier PullUp inizialisieren
Portb.0 = 1
Portb.1 = 1
'---------------------------------------------------------------------------
'Hier Variable inizialisieren
Dim A As Integer
Dim B As Integer
A = 0
B = 0
'---------------------------------------------------------------------------
'Hier Unterprogramme Declarieren
Declare Sub Count_up
Declare Sub Count_down
'---------------------------------------------------------------------------
'Tasten entprellen
'---------------------------------------------------------------------------

Cls
Cursor Off
Upperline
Lcd "Counter"
Lowerline
Lcd "T1=Up; T2=Down"
Wait 1
Cls
Upperline
Lcd "T1=Up; T2=Down"
Wait 1

Do

Debounce Taster1 , 0 , Count_up , Sub
Debounce Taster2 , 0 , Count_down , Sub

Loop
End

Sub Count_up:
Cls 'Löscht LCD
A = A + 1 'berechnet variable
If A > 10 Then A = 10 'gebrenzen auf -10
Locate 1 , 1 'positioniert im LCD
Lcd "T1=Up; T2=Down"
Locate 2 , 1 'positioniert im LCD
Lcd A 'schreibt Variable ins LCD
End Sub

Sub Count_down:
Cls 'Löscht LCD
A = A - 1 'berechnet Variable
If A < -10 Then A = -10 'gebrenzt auf -10
Locate 1 , 1 'positioniert im LCD
Lcd "T1=Up; T2=Down"
Locate 2 , 1 'positioniert im LCD
Lcd A 'schreibt Variable ins LCD
End Sub

grüße Nubbidubi