Forum: Mikrocontroller und Digitale Elektronik attiny84 und seltsame Taster-Verzögerung


von Stephan E. (loetzinn02)


Angehängte Dateien:

Lesenswert?

Grüß Gott an die Experten,

meine Experimente mit den Mikrocontrollern gehen weiter und ich stehe 
wieder mal
 vor einem Rätsel.
Das angehängte Progrämmchen läuft auf einem attiny84@1MHz und macht das, 
was es
soll. Aber ich stelle am Taster fest, daß der nicht immer sofort 
reagiert, sonde
rn manchmal erst mit einer kleinen Verzögerung - gefühlt im niedrigen 
Zehntelsekundenbereich.
Der "tasterwarten-Timer" ist da schon lange abgelaufen. Wenn ich den 
Taster dauernd gedrückt halte, läuft der pwm-Wechsel wie erwartet 
"durch" (schaltet etwa alle viertelsekunde weiter), scheint also kein 
Wackelkontakt oder sowas am Taster selbst zu sein.

Das Verhalten ist reproduzierbar, aber es scheint kein Muster zu geben 
und ich weiß nicht, ob und vor allem wie ich das wegbekommen kann.
Deshalb wäre ich für jeden Hinweis dankbar, der mir hier weiterhelfen 
könnte.

PS: Ich verwende bewußt erst mal keinen Interrupt.

von Martin V. (oldmax)


Lesenswert?

Hi
Du brauchst auch keinen Taster-Interrupt. Ich nehme an, dein "Taster 
warten" ist eine Wartezeit, die durch Pollen erreichst. Pollen ist aber 
abhängig von deiner Programmlaufzeit. Deshalb mache ich sowas mit einem 
Timer, der mir mSek. zur Verfügung stellt. Davon leite ich dann alles 
ab, was ich für Zeitfunktioonen brauche.
Ein weiterer Schritt, Flankenbildung. Ist zwar nicht immer erforderlich, 
dennoch finde ich es besser. Da ich mit Assembler arbeite und von "C" 
nur Bahnhof verstehe, kann ich auf dein Programm nicht weiter eingehen. 
Vielleicht hab ich dir trotzdem helfen können.
Gruß oldmax

von Georg M. (g_m)


Lesenswert?

Stephan E. schrieb:
> Aber ich stelle am Taster fest, daß der nicht immer sofort
> reagiert

Richtig. Nicht sofort, sondern "if(tasterwarten==0)".

von Spess53 (Gast)


Lesenswert?

Hi

Sieh dir einfach die Tastenentprellung von PeDa an:

https://www.mikrocontroller.net/articles/Entprellung#Timer-Verfahren_.28nach_Peter_Dannegger.29

MfG Spess

von S. Landolt (Gast)


Lesenswert?

> Richtig. Nicht sofort, sondern "if(tasterwarten==0)".
Eben. Und das kann, wenn tasterwarten zufällig auf 255 steht, eine 
Weile dauern, vermutlich 255 ms.

von Stephan E. (loetzinn02)


Lesenswert?

> Eben. Und das kann, wenn tasterwarten zufällig auf 255 steht,
> eine Weile dauern, vermutlich 255 ms.

Ja, das soll auch so sein.
Aber die kleine Verzögerung tritt auch nach einer oder mehr Sekunden 
warten noch auf. Allerdings nur sporadisch, ich erkenne kein Muster.


@spess53:
> Sieh dir einfach die Tastenentprellung von PeDa an:

Schaue ich mir mal an, danke.

von S. Landolt (Gast)


Lesenswert?

> Aber die kleine Verzögerung tritt auch nach einer oder
> mehr Sekunden warten noch auf. Allerdings nur sporadisch,
> ich erkenne kein Muster.
tasterwarten zählt ständig (abwärts) durch, springt dann, wenn mich 
mein bisschen C-Verständnis nicht im Stich lässt, von 0 auf 255, und so 
weiter und so fort. Wenn nun beim Stand von z.B. 200 der Taster gedrückt 
wird, dann dauert es eben 200 ms bis zur Reaktion. Schlimmer: wird 
vorher losgelassen, passiert gar nichts.

von Stephan E. (loetzinn02)


Lesenswert?

> tasterwarten zählt ständig (abwärts) durch, springt dann, wenn mich
> mein bisschen C-Verständnis nicht im Stich lässt, von 0 auf 255, und so

Perfekt! Das war's. Ich bin fälschlicherweise davon ausgegangen, daß ein 
unsigned int bei Null stehen bleibt, auch wenn man noch eins abzieht. 
Wieder was gelernt. Danke!
Das
1
tasterwarten--;
ersetzt duch
1
if (tasterwarten>0) tasterwarten--;
hat das Problem gelöst.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.