Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD über Subroutine ansprechen ???
Hallo,
ich verzeifele fast an meinem LCD. Ich hab hier mal einen kleinen Teil meines Programms geposted. Darin soll momentan nichts anderes passieren, als dass wenn ich einen Taster drücke (von H zu L), die Subroutine aufgerufen werden soll und etwas anderes ins Display geschrieben wird.
Macht es aber nicht. Der Zustandswechsel an Portd.0 funktioniert, aber mit dem Display passiert nichts. Warum?
Komischerweise funktioniert es, wenn ich das ganze als Interrupt programmiere.
$regfile = "m8def.dat"
$crystal = 3686400 'Quarz: 3,6864 MHz
Ddrc = &B00000000
Ddrd = &B00000001 'Int0 als Eingang konfiguriert - Programmiertaste
Portc = &B00001111
Portd.4 = 1 'Pull-Up von Int0 an
Portd.3 = 1 'Pull-Up von PD3 an
Config Scl = Portc.5 'SCL-Port auf Port C.5
Config Sda = Portc.4 'SDA-Port auf Port C.4
Config Lcd = 40 * 4 'Anzeigemodus 40 x 4 Zeichen
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.1 , E2 = Portb.2 , Rs = Portb.3
Declare Sub Temperaturen 'Sub für Programmierung in zweiter Ebene
Declare Sub Schaltzeiten 'Sub für Programmierung in zweiter Ebene
Declare Sub Prog_auswahl 'Sub für Programmier-Auswahl
Declare Sub Wert_hoch 'Sub Temperatur hochzählen
Declare Sub Wert_runter 'Sub Temperatur runterzählen
Declare Sub Speichern 'Werte speichern
Declare Sub Pfeil_rechts 'Auswahl für Programmiermodus Pfeil nach rechts
Declare Sub Pfeil_links 'Auswahl für Programmiermodus Pfeil nach links
Declare Sub Programm
Dim ___lcdno As Bit 'Umschaltbyte für Anzeige 0=Chip 1; 1=Chip 2
Dim W_adr_1 As Byte 'Schreibadresse vom PCF8574(1)
Dim R_adr_1 As Byte 'Leseadresse vom PCF8574(1)
Dim Dat_1 As Byte 'Datenwerte vom PCF8574(1)
Dim W_adr_2 As Byte 'Schreibadresse vom PCF8574(2)
Dim R_adr_2 As Byte 'Leseadresse vom PCF8574(2)
Dim W_adr_3 As Byte 'Schreibadresse vom PCF8591(1)
Dim R_adr_3 As Byte 'Leseadresse vom PCF8591(1)
Dim T_boiler As Byte 'Temperatur vom Boiler
Dim T_puffer As Byte 'Temperatur vom Puffer
'******************** LCD initialisieren
___lcdno = 0 'auf Chip 1 schalten
Initlcd 'die beiden oberen Zeilen initialisieren
Cls
Locate 1 , 1
Lcd "Ausen Vorlauf Boiler Puffer" 'Beschriftung der ersten Zeile
Cursor Off
Do
___lcdno = 0 'auf Chip 1 schalten
Locate 2 , 1
Lcd "Test Test Test"
Debounce Pind.4 , 0 , Programm , Sub
Loop
'******************** Programm
Sub Programm
Portd.0 = Not Portd.0
___lcdno = 0 'auf Chip 1 schalten
Initlcd 'die beiden oberen Zeilen initialisieren
Cls
Locate 1 , 1
Lcd "Programm" 'Beschriftung der ersten Zeile
Waitms 200
End Sub
End
Wäre super, wenn mir da jemand einen Tip geben kann.
Grüße
Enrico
Da hab ich zu später Stunde aber nen Quatsch getippt ... sorry.
Also ich hab mal gespielt, hier mein im Simulator laufender Code:
$regfile = "m8def.dat"
$crystal = 3686400 'Quarz: 3,6864 MHz
Ddrc = &B00000000
Ddrd = &B00000001 'Int0 als Eingang konfiguriert - Programmiertaste
Portc = &B00001111
Portd.4 = 1 'Pull-Up von Int0 an
Portd.3 = 1 'Pull-Up von PD3 an
Config Scl = Portc.5 'SCL-Port auf Port C.5
Config Sda = Portc.4 'SDA-Port auf Port C.4
Config Lcd = 40 * 4 'Anzeigemodus 40 x 4 Zeichen
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.1 , E2 = Portb.2 , Rs = Portb.3
Initlcd
Declare Sub Sub_programm
Dim ___lcdno As Bit 'Umschaltbyte für Anzeige 0=Chip 1; 1=Chip 2
Dim W_adr_1 As Byte 'Schreibadresse vom PCF8574(1)
Dim R_adr_1 As Byte 'Leseadresse vom PCF8574(1)
Dim Dat_1 As Byte 'Datenwerte vom PCF8574(1)
Dim W_adr_2 As Byte 'Schreibadresse vom PCF8574(2)
Dim R_adr_2 As Byte 'Leseadresse vom PCF8574(2)
Dim W_adr_3 As Byte 'Schreibadresse vom PCF8591(1)
Dim R_adr_3 As Byte 'Leseadresse vom PCF8591(1)
Dim T_boiler As Byte 'Temperatur vom Boiler
Dim T_puffer As Byte 'Temperatur vom Puffer
'******************** LCD initialisieren
'die beiden oberen Zeilen initialisieren
Cls
Locate 1 , 1
Lcd "Ausen Vorlauf Boiler Puffer" 'Beschriftung der ersten Zeile
Cursor Off
Do
Locate 2 , 1
Lcd "Test Test Test"
Debounce Pind.4 , 0 , Sub_programm , Sub
Loop
'******************** Programm
Sub Sub_programm
Toggle Portd.0
Cls
Locate 1 , 1
Lcd "Programm" 'Beschriftung der ersten Zeile
Waitms 200
End Sub
End
Hallo,
danke für deine Antwort, aber das ist doch fast der selbe Code wie meiner, nur das du die Initialisierung vom LCD weggelassen hast. Aber das funktioniert leider auch nicht.
Im Simulator läuft mein Programm auch, nur wenn ich es brenne läuft es halt nicht ganz so wie es soll.
wie gesagt, das LCD zeigt mir die ersten zwei zeilen an, aber wenn ich in die Sub springe tut sich nichts mehr, nur das sich der Zustand vom Portd.0 ändert. Mehr nicht???
Grüße
Enrico
ich bin mir jetzt nicht ganz sicher, aber
sollte bei "declare sub xxx" nicht mindestens xxx() stehen? ich meine die Klammern?
versuchs doch mal ob das Programm läuft wenn du
programm:
'hier steht dann deine Anweisung
return
schreibst.....dann schließt du die Klammerfunktion mal aus....
(nur so ne idee...)
Zapo.
Also auch da tut sich nichts im LCD. Das komische ist ja, das er in die Sub geht, das sehe ich ja an der Pegeländerung vom Port, aber die Anweisung für das LCD führt er nicht aus.
Wenn ich das ganze als Interrupt programmiere funktioniert es, aber das will ich nicht.
Hat denn sonst keiner eine Idee?
Danke
Enrico
erhöhe mal die waitms zeit! wahrscheinlich wird der wert auf dem Display direkt wieder überschrieben, 200ms sollten zwar zu sehen sein aber setze es einfach mal auf 2 sek (wait 2) oder so.... das muß gehen!
Hallo,
danke für deine Hilfe, aber da wird ja hinterher nichts mehr in der selben Zeile überschrieben, Wenn ich im Hauptprogramm bin und von dort in die Sub springe wird einfach die zweite Zeile des Displays überschrieben, zurück im Hauptprogramm wird nichts neues mehr an die zweite Zeile geschickt.
Es flackert ja noch nicht einmal, wenn ich in die Sub springe. Ich weiß einfach nicht warum. Zur besseren Übersicht habe ich hier noch mal den Code in abgespeckter Form geschrieben:
$regfile = "m8def.dat"
$crystal = 3686400
Ddrd = &B00000001
Portd = &B00010000
Config Lcd = 40 * 4
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.1 , E2 = Portb.2 , Rs = Portb.3
Declare Sub Programm
Dim ___lcdno As Bit
___lcdno = 0
Initlcd
Cls
Locate 1 , 1
Lcd "Das ist ein Test"
Cursor Off
Do
Debounce Pind.4 , 0 , Programm , Sub
Loop
Sub Programm
Toggle Portd.0
___lcdno = 0
Locate 1 , 1
Lcd "Programm"
Wait 2
End Sub
End
Also auch mit mehr Wartezeit funktioniert es nicht. Vielen Dank.
Grüße
Enrico
so sollte es funktionieren... mir ist mal nichts aufgefallen...
vielleicht blendest du den Cursor mal ein damit du siehst wo der steht!
nicht das du doch ins Nirwana schreibst!
leider sehe ich auch mit dem Cursor nicht mehr als vorher, er steht am Ende von "Das ist ein Test", wenn ich in die Sub springe tut sich aber auch da nichts. Defekt ist das Display auch nicht, da das ganze ja mit einer Interrupt-Routine funktioniert, nur wie gesagt, ich möchte das ganze in einer Sub haben.
Danke.
Grüße
Enrico
CR-Racing
18.02.2007, 19:20
Also, ich würde das mal so probieren:
$regfile = "m8def.dat"
$crystal = 3686400
Ddrd = &B00000001
Portd = &B00010000
Config Lcd = 40 * 4
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.1 , E2 = Portb.2 , Rs = Portb.3
Dim ___lcdno As Bit
___lcdno = 0
Initlcd
Cls
Locate 1 , 1
Lcd "Das ist ein Test"
Cursor Off
Do
Debounce Pind.4 , 0 , Programm , Sub
Loop
Programm:
Toggle Portd.0
___lcdno = 0
Locate 1 , 1
Lcd "Programm"
Wait 2
return
End
Der DEBOUNCE befehl ist eine Art GOSUB, die sollte dann vor dem END-Programm stehen.
Eine SUB-Routine steht normalerweise nach dem END und wir mit Declare Sub IRGENDWAS(), declariert und mit CALL IRGENDWAS() aufgerufen.
Gruß CR
Danke für deinen Beitrag, aber der Tip kam ja schon von Zapo. Leider brachte mir das auch keine Erfolge, egal wie ich das Programm schreibe, er macht nicht alles was in der Sub steht. Bzw. machen wird er es vielleicht, nur kommt es, aus welchem Grund auch immer, nicht an.
Der Port wird ja geschalten und wenn ich's als Interrupt schreibe funktionierts auch. Nur als Sub nicht.
Zu schnell kann es ja auch nicht sein, ich warte ja in der Sub noch ca. 2 Sekunden lang bevor ich wieder ins Hauptprogramm springe.
Habt ihr noch mehr Ideen? Ich kann's drehen wie ich will, es funktioniert einfach nicht.
Grüße und danke
Enrico
lass das
Toggle Portd.0
___lcdno = 0
einfach mal weg!
schreibe einfach nur:
do
'Hauptprogramm
'debounce.....usw
loop
schniedelwutz:
cls
lcd "test"
wait 2 'ganz wichtig sonst siehst du den TEXT nicht !!!!
return
Zapo.
so wie schon 2x beschrieben, das MUß funktionieren!
und was auch gehen muß wäre:
if pinx.x = 0 then gosub schniedelwutz 'geht auf jeden FALL!!!! brauchst auch kein end if wenns in einer Zeile steht!
---> füge dann aber um zu entprellen direkt am Anfang der SUB eine kleine Wartezeit von 100 - 200 ms ein...... merkst du aber...
Auch das habe ich schon erfolglos probiert. Es ist ja nicht so, dass er nicht in die Sub geht wenn ich die Taste drücke - das macht er ja. Das einzige was er nicht macht, ist den Text aus der Sub auf dem LCD anzeigen.
Ich habe gerade noch probiert in der Sub eine Zählvariable bei jedem Tastdruck um eins zu erhöhen und dann im Hauptprogramm auf dem LCD anzuzeigen, auch das funktioniert problemlos.
Liegt es vielleicht an Bascom, dass das nicht funktioniert - Programmfehler?
Grüße
Enrico
kann nicht sein, ich gebe auch in SUBs Texte aus! mit und ohne Interrupt sollte das Funktionieren...
Hallo,
das hilft mir nur leider nicht weiter. Woran kann es denn noch liegen? Hardware vielleicht? Wobei das Display ja funktionsfähig ist.
Grüße
Enrico
kolisson
21.02.2007, 11:32
also ... wenn ich mir die hilfe von bascom zum thema debounce so ansehe, komme ich zu dem schluss, dass das so nicht gehen kann, wie du es eingegeben hast. ich denke du musst ein label setzten statt der sub-prozedur.
$regfile = "m8def.dat"
$crystal = 3686400 'Quarz: 3,6864 MHz
Ddrc = &B00000000
Ddrd = &B00000001 'Int0 als Eingang konfiguriert - Programmiertaste
Portc = &B00001111
Portd.4 = 1 'Pull-Up von Int0 an
Portd.3 = 1 'Pull-Up von PD3 an
Config Scl = Portc.5 'SCL-Port auf Port C.5
Config Sda = Portc.4 'SDA-Port auf Port C.4
Config Lcd = 40 * 4 'Anzeigemodus 40 x 4 Zeichen
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.1 , E2 = Portb.2 , Rs = Portb.3
Declare Sub Temperaturen 'Sub für Programmierung in zweiter Ebene
Declare Sub Schaltzeiten 'Sub für Programmierung in zweiter Ebene
Declare Sub Prog_auswahl 'Sub für Programmier-Auswahl
Declare Sub Wert_hoch 'Sub Temperatur hochzählen
Declare Sub Wert_runter 'Sub Temperatur runterzählen
Declare Sub Speichern 'Werte speichern
Declare Sub Pfeil_rechts 'Auswahl für Programmiermodus Pfeil nach rechts
Declare Sub Pfeil_links 'Auswahl für Programmiermodus Pfeil nach links
Declare Sub Programm
Dim ___lcdno As Bit 'Umschaltbyte für Anzeige 0=Chip 1; 1=Chip 2
Dim W_adr_1 As Byte 'Schreibadresse vom PCF8574(1)
Dim R_adr_1 As Byte 'Leseadresse vom PCF8574(1)
Dim Dat_1 As Byte 'Datenwerte vom PCF8574(1)
Dim W_adr_2 As Byte 'Schreibadresse vom PCF8574(2)
Dim R_adr_2 As Byte 'Leseadresse vom PCF8574(2)
Dim W_adr_3 As Byte 'Schreibadresse vom PCF8591(1)
Dim R_adr_3 As Byte 'Leseadresse vom PCF8591(1)
Dim T_boiler As Byte 'Temperatur vom Boiler
Dim T_puffer As Byte 'Temperatur vom Puffer
'******************** LCD initialisieren
___lcdno = 0 'auf Chip 1 schalten
Initlcd 'die beiden oberen Zeilen initialisieren
Cls
Locate 1 , 1
Lcd "Ausen Vorlauf Boiler Puffer" 'Beschriftung der ersten Zeile
Cursor Off
Do
___lcdno = 0 'auf Chip 1 schalten
Locate 2 , 1
Lcd "Test Test Test"
Debounce Pind.4 , 0 , Programm , Sub
Loop
end ; ----->>>>> hier ein end
Programm : ; <--------------------------- hier das label
Portd.0 = Not Portd.0
___lcdno = 0 'auf Chip 1 schalten
Initlcd 'die beiden oberen Zeilen initialisieren
Cls
Locate 1 , 1
Lcd "Programm" 'Beschriftung der ersten Zeile
Waitms 200
return ;<---------------------- hier das return
so ist es zumindest in der help beschrieben
helimike0705
21.02.2007, 18:05
habe deine orginalcode vom ersten thread genommen und den
debounce befehl ersetzt mit
If Pind.4 = 0 Then Programm
jetzt springt es ins sub und schreibt im sim mir auch den text
"programm".warum auch immer es bei debounce nicht funzt
weiss ich auch nicht,teste es halt mal.setzte die zeit vom waitms 200
ruhig mal auf 2 sekunden.
Das glaube ich ja nicht, mit der IF-Abfrage funktioniert es wirklich.
Aber warum nicht mit Debounce???
Na gut, wenn es so ist, dann ist es eben so. Aber gibt es da noch eine andere Möglichkeit einer sinnvollen Tastentprellung?
Grüße und vielen Dank für die zahlreiche Hilfe.
Enrico
helimike0705
21.02.2007, 18:28
ja .tastenentprellung wäre in dem fall mir einer warteschleife möglich.
kenne mich da auch noch nicht so aus,progge erst seit dez 06.warum der debounce nicht funzt ist mir auch ein rätzel.
aber was solls es geht ja jetzt wie du möchtest.wenn du herausbekommst
wie es mit deboundce funzt,melde dich.
Hallo,
das Problem ist gelöst, der Tip kam aus dem Forum von mcselec.com, ich habe vergessen die Biliothek für das 40 * 4 Display in den Code einzufügen bzw. in den Einstellungen von Bascom richtig einzustellen.
Da ich das nicht gemacht habe hat das ganze zwar funktioniert, aber der Text wurde irgendwo hingeschrieben und ausgerechnet dort hin, wo ich ihn nicht mehr sehen konnte.
Mit der richtigen Einstellung funktioniert es also ohne Probleme.
Also mal wieder viel Wind um nichts...
Danke aber nochmal für die starke Unterstützung!
Grüße
Enrico
welche BIB???
hast du mit $lib eingebunden?
es ist die hier: Lcd4e2.lib
ich habe sie nicht im Code eingebunden, sondern über die Einstellungen von Bascom. Da ich nur die Demo-Version besitze kann ich ja beim direkten einbinden die Ports für das LCD nicht ändern, also über das Einstellungs-Menü.
Die Einstellung hatte ich zwar vorher auch schon angepasst, aber was ich vorhin noch vergessen hatte hinzuzufügen:
Dim ___lcdno As Byte
muss als Byte deklariert werden und nicht als Bit, wie ich es ursprünglich mal hatte, dann funktioniert es.
Grüße
Enrico
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.