Da fehlt im Hauptteil:
Do
Loop
lg gento
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:
Schon mal vielen Dank!!!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
Grüße
ElCapitano
Da fehlt im Hauptteil:
Do
Loop
lg gento
Stimmt...hatte ich zu Testzwecken rausgemacht und verwundert festgestellt dass es trotzdem läuft...
Nur warum?
Das Problem ist mit Do ... Loop genauso vorhanden!
Muß blinken wenn Du immer Cls aufrufst.
Bitte mal den Code mit Do Loop
Gento
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
Hallo elcapitano,
du darfst ein Unterprogramm (Pr nicht in die Hauptschleife einfügen.
Unterprogramme gehören hinter das End.
Gruß Dirk
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.
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
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
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
Lesezeichen