ATmega8, Assembler- Programm fehler oder Taster entprellen?

OP #3802087
Lesenswert?

Moin moin!
Habe folgendes Problem:

Ich will das LCD display über den Taster S1 nach links verschieben bei 
jedem druck um ein Zeichen. Das Verschieben funktioniert jedoch springt 
es mal 3-4 zeichen weiter, mal garnicht, mal beim drücken nicht dafür 
beim loslassen und manchmal beim drücken und beim loslassen.

Liegt das am Programm oder am Taster ?
Angehängte Dateien:
OP #3802153
Lesenswert?

>  So etwas nennt sich Tasterprellen und dauert so bis 40-50mS.
>  Wenn Taster gedruckt - LCD schieben, 50mS warten und dann erst auf
>  losgelassenen Taster abfragen.
>
>>   rcall  shift_left
>  --- rcall  Delay_50mS
>>  sbic  PINB, 0    ;S1=GEDRÜCKT

Ja hab mal nen delay eingefügt. Jetzt schiebt er 1 Zeichen nach links 
und dann geht ca. 5-50mal drücken garnichts mehr, auch wenn ich 4-5 min 
warte.. nichts :D
(Firma: Vescomp) #3802162
Lesenswert?

Simon K. schrieb:
> Ja hab mal nen delay eingefügt. Jetzt schiebt er 1 Zeichen nach links
> und dann geht ca. 5-50mal drücken garnichts mehr, auch wenn ich 4-5 min
> warte.. nichts :D

 Aus einem anderen T:
spess53 schrieb:
> Abgesehen von solchen unwichtigen Informationen wie Taster L-/H-aktiv

 Okay, probieren:

links:
  sbic  PINB, 0    ;S1=GEDRÜCKT
  rjmp  links
  rcall  shift_left
  rcall  Delay_50mS
wait:
  sbis  PINB, 0    ;S1=UNGEDRÜCKT
  rjmp  wait
  rjmp  links
#3802206
Lesenswert?

Das analoge Entprellen mit Kondensator, Widerstand (Pullup) und 
Schmidt-trigger  (= AVR Eingänge) ist wegen der relativ kleinen 
Hysterese am AVR nicht so einfach.

Man kann es aber auch gut ganz in Software machen - daa Delay ist schon 
ein möglicher Weg. 50 ms sind da schon recht lang, 5-10 ms sollten 
ausreichen. Das Delay wird man aber auch an beiden Flanken brauchen, 
also nicht nur beim Warten auf gedrückt, sondern auch beim Warten auf 
losgelassen - auch da können einige Taster prellen.
(Firma: Vescomp) #3802225
Lesenswert?

Ulrich H. schrieb:
> also nicht nur beim Warten auf gedrückt, sondern auch beim Warten auf
> losgelassen - auch da können einige Taster prellen.

 Ja, aber hier wird das weitgehend mit LCD schieben und Delay
 aufgefangen, es kann schlimmstenfalls beim loslassen nur 1 zeichen
 mehr geschoben werden, aber niemals mehrere hintereinander.
 Mit anständigem Taster natürlich...
#3802256
Lesenswert?

Bau mal eine Schleife ein die ohne Taster jede (halbe) Sekunde ein Feld 
weiterrückt und am Ende entweder auf Start geht und weitermacht oder die 
Richtung ändert.

Nur mal um sicherzustellen ob es wirklich am Taster liegt.

Umgekehrt die Tasterfunktion benutzen um eine LED auf Knopfdruck zu 
invertieren: leuchtet, leuchtet nicht, leuchtet...?

Divide an Conquer: Zerlegen und Funktionen systematisch und unabhängig 
voneinander testen. Dann weiß man wenigstens mit Sicherheit in welcher 
Programmhälfte der Fehler liegt, ohne den ganzen Code Zeile für Zeile 
auf Bugs und Glitches analysieren zu müssen.
#3802334
Lesenswert?

Wie sieht denn deine Schaltung aus?

Der Pin mit dem Taster muss immer auf einem definierten Potential 
liegen, wenn der Taster "High" gibt, muss der Pin über einen 
Pull-Down-Widerstand auf GND liegen, andersrum über Pull-Up auf High, da 
kann man auch den internen Pull-Up verwenden.
Gast #3802363
Lesenswert?

Wird so ein Blechding sein ohne richtige Kontakte. Wo Blechstreifen 
zusammengedrückt werden und wenn man den Knopf bewegt, reibt die 
sogenannte Kontaktfläche und gibt mal mehr, mal weniger Kontakt. 
Insofern kann ich dir nur recht geben, kein Taster prellt so lange. Aber 
das sind keine Taster, das ist Mist :-)
OP #3802409
Lesenswert?

Carsten R. schrieb:
> Bau mal eine Schleife ein die ohne Taster jede (halbe) Sekunde ein Feld
> weiterrückt und am Ende entweder auf Start geht und weitermacht oder die
> Richtung ändert.
>
> Nur mal um sicherzustellen ob es wirklich am Taster liegt.

Darauf bezogen war das mit den 0,4sec.

M. S. schrieb:
> Wie sieht denn deine Schaltung aus?
>

Taster liegen an GND, interne PullUp's sind an, geben also wenn 
ungedrückt ein HIGH-Pegel.

Habe jetzt die Schnauze voll und mache morgen weiter.
#3802745
Lesenswert?

Ok,

ich gehe mal davon aus das shift_left 100% unabhängig von dem Taster 
arbeitet und der Port-Pin definitiv nicht abgefragt wird. Ist das 
richtig?

Dann liegt der Fehler bei der Tastenroutine, also in dem Teil des Codes 
den wir auch haben. Habe es mir daher nun angeschaut mit der ersten 
empfohlenen Modifikation mit Delay.

Simon K. schrieb:
> Ja hab mal nen delay eingefügt. Jetzt schiebt er 1 Zeichen nach links
> und dann geht ca. 5-50mal drücken garnichts mehr, auch wenn ich 4-5 min
> warte.. nichts :D

Klicke nicht, sondern drücke den Taster einen Moment länger. 
Funktioniert es nun?
Gast #3802888
Lesenswert?

Marc Vesely schrieb:
> spess53 schrieb:
>> Unsinn. Kein Taster prellt 0,5s.
>
>  Kann mich dem nur anschliessen.

Hattet ihr das nicht gelesen?
Carsten R. schrieb:
> Bau mal eine Schleife ein die ohne Taster jede (halbe) Sekunde ein Feld
> weiterrückt und am Ende entweder auf Start geht und weitermacht oder die
> Richtung ändert.
>
> Nur mal um sicherzustellen ob es wirklich am Taster liegt.

Das war ein Test, der zeigen sollte, dass es am Tasterprellen liegt und 
nicht irgendwo sonst in der SW.
#3802908
Lesenswert?

@ Marc

Wir gehen wahrscheinlich von unterschiedlichem Code aus.

Carsten R. schrieb:
> Dann liegt der Fehler bei der Tastenroutine, also in dem Teil des Codes
> den wir auch haben. Habe es mir daher nun angeschaut mit der ersten
> empfohlenen Modifikation mit Delay.

Ich vermute Du betrachtest Deine zweite Modifikation, die sich anders 
verhält.

Simon K. schrieb:
> Ja hab mal nen delay eingefügt. Jetzt schiebt er 1 Zeichen nach links
> und dann geht ca. 5-50mal drücken garnichts mehr, auch wenn ich 4-5 min
> warte.. nichts :D

vs

Simon K. schrieb:
> Springt weiter mehrere schritte nach links mal beim drücken mal beim
> loslassen mal beides..

Ich habe bewußt die erste Variante ausgesucht und das auch gleich 
geschrieben. Ich wählte ihn wegen der beobachteten Eigenschaft um jene 
Frage stellen zu können, zwecks Eingrenzung, nicht um etwas blind zu 
behaupten. Das ist nicht meine Absicht. Es geht um Informationsgewinn.

Wer mich kennt weiß, daß ich nie etwas grundlos schreibe oder frage.
#3802924
Lesenswert?

Der verlinkte Schalter scheint nicht gerade der beste zu sein trotz des 
hohen Preises. Meiner Meinung nach sind diese Taster gut die ab einem 
gewissen Druckpunkt schlagartig umspringen. Wie beim Knackfrosch. Bei 
dem verlinkten druckt man bestimmt nur 2 Kontakte zusammen die von einer 
schwachen Feder auseinander gedrückt werden.

http://commons.wikimedia.org/wiki/File:Calotte_en_flambement.png

Diese Hubtaster funktionieren ganz gut
http://cdn-reichelt.de/bilder/web/xxl_ws/C200/PHAP3301.png

Geh doch einfach mal das Programm im AVR Stuido durch, Build an Run und 
dann das Symbol für einzelschritt dann kann du den entsprechenden PIN 
anstoßen und beobachten wohin das Programm springt.

Viele Anfänger haben das gleiche Problem wenn Sie per Taste und einem µC 
eine LED leuchten lassen wollen, die LED geht meistens an und bleibt an 
weil das Programm gar nicht mehr prüft ob die Bedingung schon wieder 
hinfällig ist. Ich würde den Schiebevorgang erst starten wenn die Taste 
eine Mindestzeit gedrückt wurde und dann wieder losgelassen wird.
1. Taste einlesen,
2. wenn gedrückt 50mSek warten
3. wenn taste immer nochgedrückt beim nächsten loslassen schieben.

Wenn da jetzt kurze Peaks von ein paar mSek drin sind interessiert es 
das Programm garnicht.
(Firma: Vescomp) #3803050
Lesenswert?

Carsten R. schrieb:
> Sorry, das war unangemessen von mir. In dem Augenblick war mir nicht
> bewußt daß du selbst der Verfasser der Modifikation bist. Natürlich hast
> Du es dann gelesen.
>
> Wir haben uns auf unterschiedlichen Code bezogen.

 Kein Problem.
 Das ist ja gerade das Problem im Forum, dass man meistens nicht weiss,
 was der TO geändert hat und was nicht.
 Geänderten Code posten, konkrete Frage stellen wäre besser...
#3803321
Lesenswert?

Die beste Lösung zum Entprellen ist und bleibt ein Timerinterrupt.
In meiner Praxis hat sich eine 4-fach Abtastung mit 2 .. 50ms als 
ausreichend erwiesen.

Der große Vorteil einer solchen Lösung ist, man entwickelt sie einmal 
und setzt sie dann nur noch in jedes Projekt ein.
(Firma: Vescomp) #3803337
Lesenswert?

Peter Dannegger schrieb:
> Die beste Lösung zum Entprellen ist und bleibt ein Timerinterrupt.
> In meiner Praxis hat sich eine 4-fach Abtastung mit 2 .. 50ms als
> ausreichend erwiesen.
>
> Der große Vorteil einer solchen Lösung ist, man entwickelt sie einmal
> und setzt sie dann nur noch in jedes Projekt ein.

 Ja.
 In meiner Systimer routine habe ich 4 verschiedene Zähler die in
 Main auf einen bestimmten Wert gesetzt werden und bei Bedarf
 (Flag gesetzt) runtergezählt werden - 8Cycles verloren bei nicht
 gesetztem Flag, aber dafür universell und bewährt.
#3803661
Lesenswert?

Leider noch keine Antwort. Daher nur Spekulation. Da nur ein 
Codefragment zu sehen ist, ist unklar ob die Displayroutine ebenfalls 
noch den Port abfragt und ob delay_50ms wirklich (nur) 50 ms wartet. Der 
Schaltplan ist ebenso unbekannt.

Meine aktuelle Hypothese lautet:

Originalcode : Taster prellt

Code mit Modifikation 1:
Da bei jedem Schleifendurchlauf gewartet wird, wird das Prellen 
ausgeblendet, aber ein kurzer Stups wird wegen dem Delay nicht oder nur 
sporadisch detektiert wenn die Abfrage mit dem Signal zufällig zeitlich 
zusammenfällt. Dabei geht es nicht darum wie schnell der Finger ist, 
sondern was der Taster darauf macht. Der interne Aufbau des Tasters ist 
da relevant. Ein längerer Tastendruck müßte funktionieren.

Code mit Modifikation 2:
Hier wird nur gewartet wenn ein Tastendruck erkannt wird. Ohne 
Tastendruck erfolgt das Polling sehr schnell. Jedoch scheint der Taster 
auch beim loslassen zu prellen. Das wurde bei Modifikation 1 ebenfalls 
abgefangen, da bei jedem Durchlauf gewartet wurde, so auch beim 
loslassen.

Der Taster scheint jedoch beim drücken wieder zu prellen. das wäre 
erneut zu prüfen, da es auch bei Modifikation 1 hätte passieren müssen. 
Eventuell subjektive Wahrnehmung da das Prellen unerwartet beim 
Loslassen wieder auftaucht.

Alternativ könnte es auch bei längerem Drücken zum "Prellen" kommen. Bei 
sehr kleinen Strömen können Taster "stottern". Wenn nur der interne 
Pull-up oder ähnlich hochohmige externe Pull-up-Widerstände verwendet 
werden liegt der Strom weit unter einem Milliampere. Das würde auch das 
"Prellen" beim Loslassen erklären.

Abhilfe:
Ein externer 1 kOhm Pull-Up-Widerstand sollte helfen.
Plus Umbau der Software:
Entprellung nach Dannegger oder jeweils ein Delay nach Pegelwechsel.

Letzteres ist quick&dirty. Das andere eleganter und leichter 
wiederverwendbar. Das kann man von quick&dirty nicht behaupten. Polling 
behindert die restliche Software, sofern da noch mehr als nur 
Interruptroutinen vorhanden ist.

links:
  sbic  PINB, 0    ;S1=GEDRÜCKT
  rjmp  links
  rcall  shift_left
  rcall  Delay_50mS
wait:
  sbis  PINB, 0    ;S1=UNGEDRÜCKT
  rjmp  wait
  rcall  Delay_50mS
  rjmp  links
OP #3805128
Lesenswert?

Zum Vorpost noch:
displayroutine fragt den Port nicht ab.

Habe mal die Schaltung in der das LCD und die Taster integriert waren 
bei Seite gelegt und einen einfachen Aufbau auf Lochraster gemacht mit 
nem ATmega8, 5 Hubtastern (wie oben schonmal erwähnt) mit externen 
PullUp's und einem kleinen LCD.

Programm rein und siehe da, es funktioniert wesenltich besser als zuvor.
Ein Testerprellen ist nicht mehr bemerkbar nur, wie Carsten schon 
erwähnt hat, der Delay während der Schleifen sorgt hier und da für ein 
kleines stolpern/stottern.
Halte ich den Taster gedrückt wird ebenfalls wie gewollt nicht mehr 
weiter oder zurück gesprungen.
Werde nachher mal anfangen nen Timerinterrupt in das Programm einzubauen 
ich denke damit ist der Drops gelutscht.

Die grünen Taster habe ich in einem kleinen Tütchen mit der Aufschrift 
"Hat dir 2 Nächte Schlaf geraubt" ganz hinten in der Elektronik Krims 
Krams Kiste verschwinden lassen.

Danke an alle für die schnellen Antworten, war btw. mein erster Thread 
im Forum und freue mich auf weitere Diskussionen zum Thema Assembler, 
AVR.

MfG.
Simon
Gast #3805331
Lesenswert?

Hi
Nun, einfach Timer und gut ist's vermutlich auch nicht. Ich hab jetzt 
nicht alle Beiträge gelesen und deshalb sorry, wenn es nun doppelt 
kommt. Du mußt auch die Flanke der Taster erfassenund nix mit Delay und 
ähnlichem Zeug. Über Flankenauswertung hab ich schon so viel 
geschrieben, das ich da nicht noch mal mit anfange, aber wenn du mal bei 
den kollegen "AVR-Praxis-Forum.de reinschaust, findest du unter der 
Rubrik FAQ einen Beitrag "keine Angst vor Assembler". Dort steht alles 
drin, was du brauchst. Auch hier im Tutorial findest du wertvolle 
Information.
Gruß oldmax

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren