Du mußt überprüfen, ob die Taste (der Pin) tatsächlich "0" UND "1" erreichen kann. (Pullup ?).
Hallo Leute,
ich bin Ratlos!
Ich frage mit Debounce eine Taste ab. Wenn die Taste "0" ist, dann Springe ich in eine Unterroutine die etwas auf dem LCD ausgeben soll.
Doch leider wird auf dem LCD nichts angezeigt. (Das "Eins" wird angezeigt, nur das "Zwei" nicht!)
Irgendwie weis ich nicht was ich falsch mache!
Gruß Bernd
Du mußt überprüfen, ob die Taste (der Pin) tatsächlich "0" UND "1" erreichen kann. (Pullup ?).
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo Robert,
die Pins erreichen tatsächlich "0" und "1" (nachgemessen). Ich setze ein STK500 zum Testen ein. Und einen Atmega8, habe ich vergessen zu erwähnen.
Das irre ist, das die Subroutinen auch angesprungen werden. Herausgefunden habe ich das indem ich die Subroutinen etwas erweitert habe. Es wird ein Portpin umgeschalten an dem ich eine LED angehängt habe. Und die schaltet auch brav ein und aus!
Noch Irrer ist aber, das sich die Sache im Simulator genau so verhält! Doch das "Zwei" wird nicht ausgegeben obwohl die Subroutine angesprungen und "abgearbeitet" wird.
Zur Not mache ich die Sache eben mit einem Merkerbit, das nach dem Tastendruck gesetzt wird und springe nach der Abfrage mit "gosub" in die Unterroutine. Das Funktioniert, ist aber meiner Meinung nach keine saubere Sache, weil es ja eigentlich mit dem "Debounce" gehen müsste!
Gruß Bernd (immer Ratloser)
D.h. EINZELN funktionieren, so scheint's, das "debounce" UND die subroutine "zwei", nur im Zusammenhang nicht.
Kannst du deine "Merkerversion" posten, die ja funktioniert ?
Da sich mein Glaube an Wunder in Grenzen hält, passiert da irgendein Unfug, den man finden muß
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo Robert,
danke für Deine hilfe beim Unfug finden. Ich werde heute Abend die LED-Version Rekonstruieren und Posten.
Die Merkerversion habe ich bisher nur auf dem Papier ist aber nicht schwer umzusetzen, solche Routinen hab ich in meiner Z80 Assembler Phase öfters gemacht. 15 Minuten mit Test genügen.
Am besten ich mache eine kombinierte Version, habe heute zum Glück nichts geplant.
Kleine Anmerkung: solche "komischen" Dinge waren Jahrelang der Grund warum ich Assembler programmiert habe. Ich habe Hochsprachen nie ganz getraut. Aber für Assembler fehlt mir inzwischen die (zusammenhängende) Zeit und da ist Bascom um längen besser für mich.
Gruß Bernd
Lieber Gast ! Ich kann deine Argumente völlig nachvollziehen.
Wie auch immer: Daß der Debounce so brutalen Unsinn treibt, glaub' ich auch wieder nicht, dazu wird er zu oft verwendet.
Also, schau' mer' mal.
PS: Z80 ? Womöglich gar ZX81 od Spectrum ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hi robert,
sorry, habe gar nicht gemerkt das ich nicht eingelogged war...
So, hier nun der Code.
Die Merkerversion funktioniert komischer weise auch nicht.
Die Einstellungen in meinem Bascom (1.11.7.7 Vollversion) sind: 4 Bit, Atmega8 und ich Takte mit 4MHz.
Die Routine "Drei" wird über einen Merker angesprungen. Funktioniert aber auch nicht. Ich habe es weiter oben missverständlich ausgedrückt. Mit "das funktioniert" meinte ich das Prinzip. Die Routine hatte ich zu dem Zeitpunkt noch nicht im AVR getestet.Code:Config Lcdpin = Pin , E = Portd.1 , Rs = Portd.3 , Db7 = Portd.7 , Db6 = Portd.6 , Config Lcdpin = Pin , Db5 = Portd.5 , Db4 = Portd.4 Config Lcd = 16 * 4 Config Portc = Output Dim ___lcdno As Bit Dim Mbit As Bit Initlcd Cls Lcd "Eins" Haupt: Debounce Pinb.1 , 0 , Zwei , Sub Debounce Pinb.2 , 0 , Merker , Sub If Mbit = 1 Then Gosub Drei Goto Haupt Zwei: Locate 2 , 1 Lcd "Zwei" Portc.0 = Not Portc.0 Return Merker: Mbit = 1 Return Drei: Locate 3 , 1 Lcd "Drei" Mbit = 0 Portc.1 = Not Portc.1 Return End
Wie Du siehst schalte ich in den Unterroutinen "Zwei" und "Drei" je einen Portpin um. Das mache ich zur Kontrolle ob auch wirklich in die Unterroutine gesprungen wird.
Es wird hineingesprungen (die LEDs schalten brav um), aber auf dem LCD wird nichts ausgegeben.
Im Bascom Simulator genau das gleiche.
Ich hoffe Du findest was!
Gruß Bernd
Tscha, mach folgendes, zum Fehler einkreisen:
Füge nach LCD "Eins" zwei Gehorsamkeitsprünge aus:
LCD "Eins"
gosub zwei ' sehen, ob sub korrekt
gosub drei ' sehen, ob sub korrekt
Waitms 2000 ' etwas zeit, zu schauen
Cls ' wieder weg damit
Haupt: 'normalbetrieb
....
Wenn nix zu sehen ist, hat's was mit den LCD-Befehlen an sich
Wenn schon --> die Leds funzen nicht -- >Problem DEBOUNCE
die Leds funzen, nix LOCATE/ LCD --> Problem
da schauen wir dann weiter
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hi Robert,
ich glaube ich wende mich mit dem Problem direkt an den Bascom Entwickler.
Ich habe die zwei Gosub-Zeilen, das Waitms und das CLS wie die vorgeschlagen hast eingebaut.
Ereignis:
Programm wie gepostet: hat NICHT Funktioniert!
Programm modifiziert nach Deinem Vorschlag: es Funktioniert! Taste drücken, "Zwei" oder "Drei" wird angezeigt!
Dann habe ich einen Befehl nach dem anderen wieder entfernt um den Fehler irgendwie einzukreisen.
Und jetzt kommt der Hammer der mich an meinem Verstand zweifeln läßt!
Das Programm hat wieder die Form wie von mir gepostet. Allerdings hat dieses Programm jetzt keine Fehlfunktion mehr!
Wie kann denn das sein?
Ich habe Null Plan!
Ich werde Bascom neu Installieren, mal sehen was dann los ist.
Das von mir gepostete Programm ist nämlich nur der Rest eines größeren Programms, das ich schon total demontiert habe um auf den Fehler zu kommen. Deshalb das kleine hier, denn wer will hier schon von zig Zeilen unnötigem Code belästigt werden...
Schade das es in meinem "großen" Programm trotzdem nicht Funktioniert. Da habe ich den "Trick" nämlich auch gleich ausprobiert, aber da hats nichts gebracht!
Gruß Bernd
Hi Bernd: Nur zur sicherheit: vergrößere mal den HW- und den SW-Stack. Im Fehlerfalls liefert das nämlich sehr seltsame Effekte.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen