PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Debounce -> Sub -> LCD "" Funktioniert nicht



Dnerb
13.03.2005, 19:59
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

PicNick
14.03.2005, 09:12
Du mußt überprüfen, ob die Taste (der Pin) tatsächlich "0" UND "1" erreichen kann. (Pullup ?).

14.03.2005, 09:30
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)

PicNick
14.03.2005, 09:57
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ß

14.03.2005, 12:48
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

PicNick
14.03.2005, 13:19
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 ?

Dnerb
14.03.2005, 21:20
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.



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


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.

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

PicNick
15.03.2005, 09:18
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

Dnerb
16.03.2005, 01:26
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

PicNick
16.03.2005, 09:20
Hi Bernd: Nur zur sicherheit: vergrößere mal den HW- und den SW-Stack. Im Fehlerfalls liefert das nämlich sehr seltsame Effekte.

Dnerb
16.03.2005, 09:42
Hi Robert,

werde ich heute Abend austesten.

Zum Z80: Damit habe ich nur so herumgespielt. Wirkliche "sinnvolle" Anwendungen habe ich mit dem Z80 nur einmal gemacht und das war meine Technikerarbeit.
Und auch beim herumspielen habe ich immer so ein "Experimentierboard" im Eurokartenformat benutzt, 19" etc. ZX81, Spectrum oder gar Amstrad/Schneider CPC gingen an mir vorbei. -> wegen C64, dort auch Assembler...

Gruß Bernd

Dnerb
16.03.2005, 22:16
Hi Robert,

das hat leider auch nichts gebracht.

Ich glaube ich mache mir eine eigene entprellroutine.

Gruß Bernd

PicNick
17.03.2005, 07:32
In deiner Situation würde ich das auch tun.
trotzdem glaub ich, daß die "DEBOUNCE" Funktion prinzipiell in Ordnung ist, ist kanns mir nicht vorstellen.
Aber im Moment wüßt ich auch nix besseres