Problem mit dem LCD Programm Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
| Autor |
Problem mit dem LCD Programm Suche nach: lcd (4707) |
|
|
|
|
BID = 473309
Elektromeister Gesprächig
  
Beiträge: 135
|
|
Hallo,
ich habe ein Problem mit meinem LCD Programm also wen ich den Taster B.0 drücke kommt Menü Off und wen ich ihn ein zweites mal drücke kommt Menü Stuffe 1 aber wen ich den Taster ein drittes mal drücke kommt gar nichts mehr auser die oberste Reihe zeigt die 16 Kästchen an auf dem LCD.
Abundzu geht es einen durchgang lang bis ich dan wida zu Stuffe 2 wechsel, danach kommen nur die Kästchen wieder.
Wen ich ein anderes Program laufen lasse geht das Lcd Display ohne Probleme nur bei diesem nicht.
Was habe ich falsch gemacht ???
Hier das Programm:
$regfile "m8def.dat"
$crystal = 1000000
Config Portb.0 = Input
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4
Portb.0 = 0
Debounce Pinb.0 , 0 , Taster
Dim X As Byte
X = 0
Taster:
Do
If X = 0 And Pinb.0 = 1 Then
X = 1
Cls
Locate 1 , 1
Lcd "Menue OFF"
End If
If X = 1 And Pinb.0 = 0 Then
X = 2
End If
If X = 2 And Pinb.0 = 1 Then
X = 3
Cls
Locate 1 , 1
Lcd "Menue Stuffe 1"
End If
If X = 3 And Pinb.0 = 0 Then
X = 4
End If
If X = 4 And Pinb.0 = 1 Then
X = 5
Cls
Locate 1 , 1
Lcd "Menue Stuffe 2"
End If
If X = 5 And Pinb.0 = 0 Then
X = 6
End If
If X = 6 And Pinb.0 = 1 Then
X = 7
Cls
Locate 1 , 1
Lcd "Menue Stuffe 3"
End If
If X = 7 And Pinb.0 = 0 Then
X = 8
End If
If X = 8 And Pinb.0 = 1 Then
X = 9
Cls
Locate 1 , 1
Lcd "Menue Stuffe 4"
End If
If X = 9 And Pinb.0 = 0 Then
X = 0
End If
Loop
Danke schon mal
MFG
Elektromeister |
|
BID = 473354
DonComi Inventar
     
Beiträge: 8604 Wohnort: Amerika
|
|
Der erste Fehler war, Basic zu nutzen; der zweite ist vermutlich im Debounce-Statement zu finden.
Zudem solltest du dir mal die Logik deines Programms angucken:
X wird innerhalb eines If-Blockes jeweils erhöht, nach Beendigung von If wird dann getestet, ob X der Wert ist, der vorher zugeordnet wurde. Das macht keinen Sinn, wenn der Taster noch gedrückt ist.
If schön und gut, aber vielleicht nimmst du doch lieber Select Case, da passiert das nicht.
Du fragst permanent den Taster mit If ab, wenn er sich ändert, dann wählst du mit Select Case die jeweilige Funktion und erhöhst X.
Zudem solltest du dich über die resourcenfressende Debounce-Funktion schlau machen.
Und zum Ende:
Das Wort heißt nicht 'wida' sondern 'wieder'.
Es heißt auch nicht Stuffe sondern Stufe.
_________________
|
|
BID = 473411
Elektromeister Gesprächig
  
Beiträge: 135
|
 sorry für die Rechtschreibfehler.
Ich bin noch Anfänger in Bascom könntest du mir die Select Case Funktion anhand eines Beispieles erklären ???
|
BID = 473418
DonComi Inventar
     
Beiträge: 8604 Wohnort: Amerika
|
dim x as byte
x = 0
do
do loop until Taste=0 'warten, bis Taste 0 ausgibt.
Select Case X
case 1:
lcd "X ist 1."
case 2:
lcd "Menue"
Case 3:
lcd "nun ist es drei"
X = 0
case else
lcd "X ist irgendwie anders."
end select
x = x + 1
loop
Das ist nur ein Beispielkode und soll die Funktion von Select Case aufzeigen. Pendant dazu in C/C++ ist switch.
_________________
|
BID = 473436
Elektromeister Gesprächig
  
Beiträge: 135
|
Wen ich den Taster das erste mal drücke wird das 0X zu 1X also Case 1 und wen ich ihn ein zweites mal drücke wird das 1X zu 2X (Case2) usw.
Stimmt das ??
Aber wie ist das mit dem "Do Loop Until Taste = 0 " wen ich es in das Programm einfüge meldet es einen Assigment error.
|
BID = 473440
DonComi Inventar
     
Beiträge: 8604 Wohnort: Amerika
|
Ich sagte ja, dass das Programm nur exemplarisch ist.
Beim ersten Durchlauf wir ausgegeben, dass X = 0 ist, denn X wird erst nach Select Case erhöht!
Do Loop Until Taste = 0 könnte auch anders geschrieben werden; probiers mal mit
Do Until Taste = 0
oder While Taste = 1
Wend
oder so ähnlich. Taste ist natürlich durch deine hardware zu ersetzen. Und jenachdem ob der Taster eine 0 oder eine 1 auf den Eingang schaltet muss das Programm geändert werden.
So kann man das machen, sinnvoll ist es aber nicht:
1. Der Kontroller hängt in der Schleife, solange der Taster nicht benutzt wird -> er kann nichts anderes machen!
2. Der Kontroller ist sauschnell für menschliche Maßstäbe -> du drückst vielleicht einmal richtig drauf, aber der Schalterkontakt schwingt noch einige Male hin- und zurück (nennt man Kontaktprellen) -> der Kontroller zählt daher möglicherweise viel zu oft X hoch und gibt alles blitzschnell auf dem Display aus, ohne das du es mitbekommst.
Besser ist, man hängt den Taster an eine externe Interruptquelle oder fragt in periodisch per Timer ab (einige 10-100mal pro Sekunde).
Damit kann man auch gleich das Kontaktprellen unterbinden.
_________________
|
BID = 474101
Elektromeister Gesprächig
  
Beiträge: 135
|
Es funtkioniert immer noch nicht da habe ich wohl irgend etwas falsch.
Ich habe einfach deine Case funktion eingefügt und angepasst.
Programm:
$regfile "m8def.dat"
$crystal = 1000000
Config Pinb.0 = Input
Portb.0 = 0
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4
Locate 1 , 1
Debounce Pinb.0 , 0 , Taster
Dim X As Byte
X = 0
Do
Do Loop Until Taster = 1 'warten, bis Taste 0 ausgibt
Select Case X
Case 1:
Cls
Lcd "X ist 1."
Case 2:
Cls
Lcd "Menue"
Case 3:
Cls
Lcd "nun ist es drei"
X = 0
Case Else
Cls
Lcd "X ist irgendwie anders."
End Select
X = X + 1
Loop
Ich habe mal gegoolgelt aber nicht wirklich etwas brauchbares über die Select -Case Funktion gefunden.
Könntest du es mir noch einmal in einzelnen Schritten erklären wie ich die Case funktion genau anwende und was ich falsch habe???
Wäre Super
|
BID = 474105
DonComi Inventar
     
Beiträge: 8604 Wohnort: Amerika
|
Hallo, erstmal:
Was soll das Debounce? Das ist zum Entprellen, ist mir klar, aber ist die Funktion da auf dem richtigen Platz?
Was schaltet der Taster? Masse oder VCC?
Select Case... Sagt ja schon die 1:1-Übersetzung: Wähle Fall.
Select Case wertet eine Speicherzelle/einen Ausdruck aus, der verschiedene Werte annehmen kann.
Hier beim x zum Beispiel, wird immer der Kode ausgeführt, der nach dem Case und dem Wert steht:
Dim X as Byte
X = 100
Select Case X 'X soll ausgewertet werden
Case 1: 'wenn X =1 ist, dann wird ab hier weitergemacht
Case 2: 'ebenso
Case 100:
Cls
LCD "Nun ist X 100"
End Select 'beendet Select wieder
Das ist so, als würde man für jeden möglichen Wert eine If-Abfrage machen:
If X = 1 then ...
if X = 2 then ...
Nur wird hier eben nur einmal ausgewertet, im Gegensatz zum If: Wird hier X in einem If-Block verändert, kann schon der nächste Vergleich positiv ausfallen. Daher nimmt man da Select Case. Der Kode wird verarbeitet und dann wird Select Case beendet.
In C/C++ gehts noch besser;
switch(x)
{
case 1:
break;
case 2: ...
break;
default:
lcd("ungleich 1 und ungleich 2");
break;
};
Klar soweit?
Jetzt prüfe erstmal, was der Taster überhaupt als Signal ausgibt.
Zudem ist es möglich, dass hier der Effekt des Prellens, wie bereits erwähnt, auftritt und deine Ergebnisse verhaut.
Basis sagt man zwar nach, dass es lahm sein, aber so lahm dann auch wieder nicht...
Allerdings kann ich nicht mehr vieles von Basic, zumal ein gewisser Dialekt für meinen Geschmack dem "Programmierer" zuviel abnimmt...
_________________
[ Diese Nachricht wurde geändert von: DonComi am 20 Nov 2007 19:50 ]
|
BID = 474127
Elektromeister Gesprächig
  
Beiträge: 135
|
Hallo,
Also der Taster schaltet Vcc.
Die Debounce Funktion muss ich ja unter das DO machen oder?? dan habe ich es an der falschen Stelle hineingeschrieben.
Also so:
Dim X As Byte
X = 0
Do
Debounce Pinb.0 , 0 , Taster
MFG
|
BID = 474182
Jornbyte Moderator
      
Beiträge: 7315
|
Ich verstehe nicht, das auf die Interne Hilfe verzichtet wird, da steht:
Example
| Code : |
Example
'-----------------------------------------------------------------------------------------
'name : case.bas
'copyright : (c) 1995-2005, MCS Electronics
'purpose : demonstrates SELECT CASE statement
'micro : Mega48
'suited for demo : yes
'commercial addon needed : no
'-----------------------------------------------------------------------------------------
$regfile = "m48def.dat" ' specify the used micro
$crystal = 4000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Dim I As Byte 'dim variable
Dim S As String * 5 , Z As String * 5
Do
Input "Enter value (0-255) " , I
Select Case I
Case 1 : Print "1"
Case 2 : Print "2"
Case 3 To 5 : Print "3-5"
Case Is >= 10 : Print ">= 10"
Case Else : Print "Not in Case statement"
End Select
Loop
End
|
|
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 16 Beiträge im Durchschnitt pro Tag heute wurden bisher 5 Beiträge verfasst © x sparkkelsputz Besucher : 186827214 Heute : 24850 Gestern : 47700 Online : 109 26.11.2025 13:51 8 Besucher in den letzten 60 Sekunden alle 7.50 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0843369960785
|