- LiFePO4 Speicher Test         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: LCD über Subroutine ansprechen ???

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.10.2004
    Beiträge
    54

    LCD über Subroutine ansprechen ???

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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.

    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
    
    
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Da hab ich zu später Stunde aber nen Quatsch getippt ... sorry.
    Also ich hab mal gespielt, hier mein im Simulator laufender Code:
    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
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    09.10.2004
    Beiträge
    54
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.11.2006
    Ort
    K-Town
    Alter
    46
    Beiträge
    178
    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.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    09.10.2004
    Beiträge
    54
    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

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.11.2006
    Ort
    K-Town
    Alter
    46
    Beiträge
    178
    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!

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    09.10.2004
    Beiträge
    54
    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:


    Code:
    $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

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.11.2006
    Ort
    K-Town
    Alter
    46
    Beiträge
    178
    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!

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    09.10.2004
    Beiträge
    54
    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

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    27.01.2005
    Ort
    München
    Beiträge
    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

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen