Forum: Mikrocontroller und Digitale Elektronik LCD über Subroutine ansprechen ???


von Enrico (Gast)


Lesenswert?

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

von Enrico (Gast)


Lesenswert?

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

von Enrico (Gast)


Lesenswert?

Hallo,

hat denn niemand einen Tip für mich?
Danke.

Enrico

von norad (Gast)


Lesenswert?

Dein Codfragment ist ein bischen undurchsichtig.

Wo ist deine Init Routine von  > Initlcd ???

von norad (Gast)


Lesenswert?

Noch was!
Was für ein LCD ist es denn (Ein Grafisches mit SED1520 drauf)?

von norad (Gast)


Lesenswert?

Und wo ist dein Programm für die Ausgabe >Lcd "Programm"?

von Enrico (Gast)


Lesenswert?

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

von Enrico (Gast)


Lesenswert?

Man muss das doch irgendwie hinbekommen. Kennt da niemand einen Trick?

Danke.
Enrico

von Karl H. (kbuchegg)


Lesenswert?

Wird denn die Sub überhaupt angesprungen?
Lass dir doch mal in der Sub eine LED aufleuchten.

von Michael U. (Gast)


Lesenswert?

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

von Enrico (Gast)


Lesenswert?

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

von Enrico (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.