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.
Wäre super, wenn mir da jemand einen Tip geben kann.
Grüße
Enrico
Mit dem Dateianhang hat es wohl nicht richtig funktioniert...
Noch als Hinweiß: ich programmiere in Bascom und AVR
$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
Hallo,
du hast recht, ich habe das Programm noch mal etwas übersichtlicher
gemacht und das was nicht nötig war entfernt.
Das LCD ist ein 4 Zeilen à 27 Zeichen Display (WD-C2704M-1HNN), kein
grafisches.
Die Init-Routine findest du nach der Variablendeklaration. Was meinst du
mit Programm, wenn ich schreibe <LCD "Programm">, dann ist das die
Ausgabe auf dem Display.
$regfile = "m8def.dat"
$crystal = 3686400
Ddrd = &B00000000
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
___lcdno = 0
Locate 2 , 1
Lcd "Test Test Test"
Debounce Pind.4 , 0 , Programm , Sub
Loop
Sub Programm
___lcdno = 0
Cls
Locate 1 , 1
Lcd "Programm"
Waitms 200
End Sub
End
Grüße und danke
Enrico
Hallo,
4*40 geht für solche Display normalerweise garnicht, weil die nur 80Byte
Ram haben und bei 4*20 oder 2*40 Schluß ist.
Wenn es das übliche 27*4 von z.B. Pollin ist, das hat 2 getrennte
Controller und wurde hier irgendwo auch in BasCom schon mehrmals
diskutiert.
Ansonsten Sorry, ich habe mit BasCom eigentlich nichts am hut. ;)
Gruß aus Berlin
Michael
Hallo,
also wie bereits geschrieben, der Zustandswechsel (also LED an/aus)
funktioniert problemlos über eine Sub.
Ich weiß, dass 4*40 eigentlich nicht geht, aber wie du bereits gesagt
hast wurde das schon mehrfach diskutiert und desshalb muss ich an dieser
Stelle auch 4*40 nehmen, dann ist halt nach 27 Zeichen schluss und ich
muss in die nächste Zeile springen.
Aber das ist ja alles nicht das Problem, es funktioniert ja wunderbar.
Das einzigste Problem ist, dass ich das LCD nicht über eine Sub-Routine
ansprechen kann. Über eine Interrupt-Routine wiederrum funktioniert es.
Warum? Wenn noch jemand einen Tip hat wäre ich sehr dankbar.
Was ich als Fehlerquelle noch ausschließen kann ist der ATMega selbst,
den habe ich gerade gewechselt: das selbe Problem.
Kann es auch an den Einstellungen der Lock- & Fuse-Bits liegen?
Grüße
Enrico
Problem gelöst:
mit einer IF-Abfrage anstatt Debounce funktioniert es ohne Probleme.
Warum es mit Debounce nicht geht weiß ich nicht. Der Tip kam aus einem
anderen Forum.
Aber auch hier vielen Dank für die Hilfe.
Enrico