Problem mit dem LCD Programm

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 26 11 2025  13:51:37      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Oszilloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : 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.


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


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