Forum: Mikrocontroller und Digitale Elektronik Probleme mit Tasterentprellung


von Stefan (Gast)


Lesenswert?

Hallo,
ich habe mal eine Frage,...hoffe das mir einer weiter hilft.

Ich verwende einen Atmega32. Über den Pin PD2 wird über den Interrupt 
ständig ein Taster abgefragt. Wird dieser betätigt setze ich alarm auf 1

bisher:

SIGNAL(SIG_INTERRUPT0)
{
  alarm = 1;
}


Nun habe ich aber Probleme mit der EMV bekommen da der Taster an einem 
längeren Kabel angeschlossen ist, Deswegen möchte ich den Taster gerne 
entprellen. Da die main methode im Ruhezustand keine anderen Aufgaben 
hat außer den Schalter zu überwachen kann ich mir einen etwas längeren 
interupt leisten.

habe es mit folgendem Code versucht:


SIGNAL(SIG_INTERRUPT0)
{
  alarm = 1;
        timer_wait(500);
        if (0<<PD2)
        alarm = 1;
}


JEdoch kann ich jetzt den Alarm nicht mehr auslösen. Kann mir einer 
sagen was ich falsch mache ... oder wie man den Pin richtig abfragt.
Würde mich auf eine Antwort freuen!
Vielen Dank
Stefan

von Stefan (Gast)


Lesenswert?

sorry ein alarm = 1 ist unten zu viel es muss natürlich heißen:



SIGNAL(SIG_INTERRUPT0)
{
        timer_wait(500);
        if (0<<PD2)
        alarm = 1;
}

von Stefan (Gast)


Lesenswert?

liegt es vielleicht daran das die abfrage:

 if (0<<PD2)

nicht korrekt ist?

von Stephan H. (stephan-)


Lesenswert?

Tasten im Interrupt ?? Pfui
Den ext Interrupt sollte man tunlichst lassen.

Ich hoffe es ist der Timer gemeint.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten

von YS-500 (Gast)


Lesenswert?

if ( !(PIND & (1<<PIND2)) )

von Peter D. (peda)


Lesenswert?

Stefan wrote:
> Nun habe ich aber Probleme mit der EMV bekommen da der Taster an einem
> längeren Kabel angeschlossen ist, Deswegen möchte ich den Taster gerne
> entprellen.

Dazu hat sich bei mir die 4-fach Abtastung bewährt.
Ein Zustandswechsel wird nur dann übernommen, wenn 4-mal hintereinander 
der entgegengesetzte Zustand erkannt wird.
Als Abtastintervall hat sich 10ms bewährt. Die 40ms Verzögerung sind bei 
manueller Betätigung unmerkbar.


> Da die main methode im Ruhezustand keine anderen Aufgaben
> hat außer den Schalter zu überwachen kann ich mir einen etwas längeren
> interupt leisten.

Kann man machen.
Also bei jedem Programm von neuem anfangen zu überlegen, welche 
umständliche Entprellmethode man sich denn nun leisten kann.
Und wenn das Programm wächst, sich ärgern, daß man es sich plötzlich 
nicht mehr leisten kann und von neuem anfangen nachzudenken.


Ich bevorzuge allerdings die eine für alles Entprellmethode.
Da muß man nie wieder nachdenken. Einfach ins neue Programm einfügen und 
vergessen. Ich hab sie deshalb bulletproof genannt.


Peter

von Stefan (Gast)


Lesenswert?

Vielen Dank für die Antworten,....
@ Stefan Henning:
warum sollte man so was immer vermeiden? warum wird es denn dann 
hardwareseitig unterstützt. das ist ja ein alarm gerät was nur über 
einen taster ausgelöst werden kann.

von Stefan (Gast)


Lesenswert?

habe es gerade mit folgendem Code probiert:


SIGNAL(SIG_INTERRUPT0)
{
        timer_wait(500);
        if ( !(PIND & (1<<PIND2)) )
        alarm = 1;
}


Jetzt passiert gar nichts...bekomme den alarm einfach nicht auf 1 ???

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.