-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: LCD flackert bei Verwendung von Gosub Anweisungen! Warum?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.03.2008
    Ort
    RLP
    Beiträge
    17

    LCD flackert bei Verwendung von Gosub Anweisungen! Warum?

    Anzeige

    Hallo zusammen,

    ich bin recht neu beim Thema Microcontrollerprogrammierung und bastle hier gerade zwecks Wissensaufbau etwas herum.

    Ich möchte mir ein Menü per LCD Display bauen - ansich funktioniert die Ansteuerung auch wirklich gut.
    Mein Problem ist, dass - immer wenn ich irgendwo im Programm einen Sprung mit Gosub oder Goto einfüge - mein Display anfängt zu flackern. Programmiere ich mit anderen Anweisungen und umgehe Sprünge (z.B. einer While Schleife) dann steht der Text auf dem Display absolut ruhig.

    Woran kann das liegen?

    Das Ganze läuft derzeit mit 16Mhz Quarz auf einem STK500 mit einem Atmega16...

    Ich hab hier mal meinen Code:

    Code:
    $regfile = "m16def.dat"
    $crystal = 16000000
    
    
    '**** Konstanten ****
    
    Const Fw_rev = "0.9"
    
    
    '**** LCD Initialisieren ****
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.5 , Db6 = Porta.7 , Db7 = Porta.2 , E = Porta.0 , Rs = Porta.1
    
    
    '**** Variablendeklaration ****
    
    
    '**** Ports etc. Parametrieren ****
    
    Config Portd.0 = Input
    Config Portd.1 = Input
    Config Portd.2 = Input
    Config Portd.3 = Input
    
    Config Pind.0 = Input
    Config Pind.1 = Input
    Config Pind.2 = Input
    Config Pind.3 = Input
    
    
    '**** Sprungverteiler
    
    Cls
    
    Cursor Off
    Upperline
    Lcd " *** Test1 *** "
    Lowerline
    Lcd "Lrn Prg Tst Fw?"           ' das soll quasi in der unteren Zeite angezeigt werden um darunterliegende Taster als Softkeys zu verwenden
    
    Debounce Pind.0 , 0 , Pr , Sub
    
    
    
    Pr:
    Lowerline
    Lcd "test1"
    Return
    
    
    End
    Schon mal vielen Dank!!!

    Grüße
    ElCapitano

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Da fehlt im Hauptteil:
    Do
    Loop

    lg gento

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    15.03.2008
    Ort
    RLP
    Beiträge
    17
    Stimmt...hatte ich zu Testzwecken rausgemacht und verwundert festgestellt dass es trotzdem läuft...

    Nur warum?

    Das Problem ist mit Do ... Loop genauso vorhanden!

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Muß blinken wenn Du immer Cls aufrufst.

    Bitte mal den Code mit Do Loop

    Gento

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    15.03.2008
    Ort
    RLP
    Beiträge
    17
    Nee...am Cls liegts leider nicht. Das hatte ich auch zuerst vermutet und daher hab ich es dann auch aus der Schleife rausgenommen und nur am Programmanfang einmal ausgeführt und testweise später nochmal ganz rausgenommen.

    Hier noch mal mein Code:

    Code:
    $regfile = "m16def.dat"
    $crystal = 16000000
    
    
    '**** Konstanten ****
    
    Const Fw_rev = "0.9"
    
    
    '**** LCD Initialisieren ****
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.5 , Db6 = Porta.7 , Db7 = Porta.2 , E = Porta.0 , Rs = Porta.1
    
    
    '**** Variablendeklaration ****
    
    
    '**** Ports etc. Parametrieren ****
    
    Config Portd.0 = Input
    Config Portd.1 = Input
    Config Portd.2 = Input
    Config Portd.3 = Input
    
    Config Pind.0 = Input
    Config Pind.1 = Input
    Config Pind.2 = Input
    Config Pind.3 = Input
    
    
    '**** Sprungverteiler
    
    Cls
    
    Do
    
    Cursor Off
    Upperline
    Lcd " *** Test1 *** "
    Lowerline
    Lcd "Lrn Prg Tst Fw?"           ' das soll quasi in der unteren Zeite angezeigt werden um darunterliegende Taster als Softkeys zu verwenden
    
    Debounce Pind.0 , 0 , Pr , Sub
    
    
    
    Pr:
    Lowerline
    Lcd "test1"
    Return
    
    Loop
    End

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hallo elcapitano,

    du darfst ein Unterprogramm (Pr nicht in die Hauptschleife einfügen.
    Unterprogramme gehören hinter das End.

    Gruß Dirk

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Das Unterprogramm sollte nicht in der Hauptschleife liegen, sonst wird das da auch nochmal mit ausgeführt. Und ein Return wenn nix zu returnen da ist, landet irgendwo im Nirvana/ Reset.
    Also das Loop oberhalb einbauen.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    15.03.2008
    Ort
    RLP
    Beiträge
    17
    Hmmm...also irgendwie stimmt hier was nicht...

    ...ich hab jetzt den Code so wie anbei angehängt. Jetzt flackert zwar nichts mehr aber das Programm funktioniert auch nicht.

    Ich hab mir zum Debuggen mal zwei LEDs angehängt (PB.0 und PB.1)...

    Folgendes Verhalten tritt auf:

    Nach dem Einschalten erscheint auf dem LCD wie erwartet

    *** Test 1 ***
    Lrn Prg Tst Fw?

    Soweit so gut! Nun würde ich erwarten, dass beim Drücken des Tasters, der an PD.0 hängt in der unteren Zeile Test1 ausgegeben wird und durch das Cls der Rest vom LCD gelöscht wird. Das passiert aber nicht. Daher hab ich mir mal die LEDs im Programm gesetzt, da ich gedacht hab, das Programm würde nicht zu Pr: spingen - tut es aber. Nach Druck auf den Taster geht zunächste die LED PB.0 aus, dann nach 2 Sek. auch PB.1. Nur die LCD Anweisungen werden anscheinend nicht ausgeführt!

    Nur warum???


    Code:
    $regfile = "m16def.dat"
    $crystal = 16000000
    
    
    
    '**** Konstanten ****
    
    Const Fw_rev = "0.9"
    
    
    
    
    '**** LCD Initialisieren ****
    
    Dim ___lcdno As Bit
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.5 , Db6 = Porta.7 , Db7 = Porta.2 , E = Porta.0 , Rs = Porta.1
    
    
    
    
    '**** Variablendeklaration ****
    
    
    
    
    
    '**** Ports etc. Parametrieren ****
    
    
    Config Portd.0 = Input
    Config Portd.1 = Input
    Config Portd.2 = Input
    Config Portd.3 = Input
    
    Config Pind.0 = Input
    Config Pind.1 = Input
    Config Pind.2 = Input
    Config Pind.3 = Input
    
    Config Portb.0 = Output
    Config Portb.1 = Output
    
    '**** Sprungverteiler
    
    Cls
    
    Do
    
    
    Cursor Off
    Upperline
    Lcd " *** Test 1 *** "
    Lowerline
    Lcd "Lrn Prg Tst Fw?"
    
    
    
    Debounce Pind.0 , 0 , Pr
    
    
    
    Loop
    
    End
    
    
    Pr:
    Cls
    Lowerline
    Lcd "test1"
    Portb.0 = 1
    Waitms 2000
    Portb.1 = 1

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Irgendwie ist Dein Code nur Schw_eiße

    Initlcd vergessen.

    Return nach Gosub.

    Statt Lowerlin würde ich Locate 1,1 schreiben

    So ist der Code nur Schrott.

    Bascom hat zig Beispiele anbei.
    Versuche Dich dort mal durchzulesen.

    lg
    Gento

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.11.2005
    Ort
    QTH: JO43BC
    Alter
    49
    Beiträge
    112
    Setz erstmal das "Cursor off" vor der do-loop. Man muss dem Display dieses nur einmal zur Laufzeit mitteilen - und nicht permanent. Und anstatt Lowerline und Upperline wuerde ich fest definierte Cursorpositionen anspringen. Also z.B. mit Locate 1,1, oder Locate 2,1 usw.
    Und wo ist das "Return" in Deiner Sr-Sub? Und wenn man schon mit Sub's arbeitet, wuerde ich dem Atmel obligatorisch auch etwas hwstack, swstack und framesize spendieren. Schau mal ins Bascom-Beispiel fuer "Debounce".
    Und wo wir schon mal grad dabei sind: ein "Config Debounce" gibt's bei Dir auch nicht. :)

    Mit freundlichen Gruessen
    Digitali

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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