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
Dein Codfragment ist ein bischen undurchsichtig. Wo ist deine Init Routine von > Initlcd ???
Noch was! Was für ein LCD ist es denn (Ein Grafisches mit SED1520 drauf)?
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
Man muss das doch irgendwie hinbekommen. Kennt da niemand einen Trick? 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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.