PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD über Subroutine ansprechen ???



Enrico3
11.02.2007, 20:12
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

Vitis
12.02.2007, 00:22
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

Enrico3
12.02.2007, 18:19
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

Zapo.
12.02.2007, 22:22
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.

Enrico3
13.02.2007, 19:23
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

Zapo.
13.02.2007, 19:32
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!

Enrico3
18.02.2007, 15:19
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

Zapo.
18.02.2007, 15:38
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!

Enrico3
18.02.2007, 16:36
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

Enrico3
18.02.2007, 19:31
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

Zapo.
18.02.2007, 20:59
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...

Enrico3
18.02.2007, 21:19
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

Zapo.
18.02.2007, 21:49
kann nicht sein, ich gebe auch in SUBs Texte aus! mit und ohne Interrupt sollte das Funktionieren...

Enrico3
21.02.2007, 09:41
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.

Enrico3
21.02.2007, 18:24
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.

Enrico3
23.02.2007, 09:52
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

Zapo.
23.02.2007, 10:15
welche BIB???

hast du mit $lib eingebunden?

Enrico3
23.02.2007, 10:31
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