Softwareentprellung funktioniert nicht

OP #2902137
Hallo

Ich versuche einen Tastersoftwareseitig zu entprellen:
1
ISR(INT1_vect)
2
{
3
  //Interrupts deaktivieren wegen Prellen
4
  cli();
5
  long_delay(750);
6
  
7
  //Taster immer noch gedrückt?
8
  if ((~PIND) & 0x8)
9
  {
10
    //stuff
11
  }
12
  //Interrupts aktivieren
13
  sei();
14
}
Allerdings scheint der Code nicht wirklich zu funktionieren. So ca alle 
5 mal wird der Taster doppelt interpretiert. Sieht jemand einen Fehler? 
Ich habe mal einen else-Teil hinzugefügt um zu überprüfen ob überhaupt 
etwas abgefangen wird. Das war jedoch nie der Fall, auch ein wenig 
komisch finde ich.

Danke im Voraus
Gast #2902141
Verabschiede dich von dieser ISR
cli(); //sinnlos, da Interrupts zu diesem Zeitpunkt so und so gesperrt 
sind
delay in der ISR, soll das dein Ernst sein?
sei(); //sinnlos, da Interrupts nach der ISR automatisch wieder aktiv 
sind

Tip:
Timer laufen lassen und in der ISR den Timer abfragen.
#2902158
Patrick Liedtke schrieb:

> Ich habe mal einen else-Teil hinzugefügt um zu überprüfen ob überhaupt
> etwas abgefangen wird. Das war jedoch nie der Fall, auch ein wenig
> komisch finde ich.

Nicht wirklich 'komisch'. Nur weil in du in der ISR bist, prellt ja der 
Taster deswegen nicht weniger. Und wenn er prellt, wird der nächste 
Interrupt registriert, der dann ausgeführt wird, wenn diese ISR 
abgelaufen ist.

-> es ist ein Irrtum zu glauben, Taster an externem Interrupt 
vereinfacht die Sache. Stimmt ganz einfach nicht.
Gast #2902170
Also wenn ein externer interupt kommt den timer starten und nach ablauf 
der Zeit den Portpin nochmal abfragen... Oder immer den timerlaufen 
lassen und bei ubierlauf pimn abfragen?
OP #2902171
> Nicht wirklich 'komisch'. Nur weil in du in der ISR bist, prellt ja der
> Taster deswegen nicht weniger. Und wenn er prellt, wird der nächste
> Interrupt registriert, der dann ausgeführt wird, wenn diese ISR
> abgelaufen ist.


Dafür war der delay() gedacht. Ich dachte das dann der Taster ja nicht 
mehr gedrückt wird, die if-Abfrage nicht zutrifft und der else-Teil 
ausgeführt werden muss. Nur wird er das nicht...
Gast #2902175
@schlauberger
"immer den timerlaufen lassen und bei ubierlauf pimn abfragen?" genau 
das ist der Vorschlag von kbuchegg gewesen.
Ich hätte einen anderen nicht ganz so eleganten Vorschlag gehabt 
(ähnlich einer RTC).
Gast #2902180
Wenn aber durchgehend der timer pollt, is das dann nicht sehr 
rechenlasstig wenn andauernd unterbrochen wird?? Is es da nicht besser 
erst wenn ein externer interrupt Eintritt diesen abzuarbeiten mit timer? 
Wozu soll sonst ein ext. Interrupt gut sein? ( ich programmiere 8051 
tiny mega xmega msp430 cortex m3...)
Gast #2902198
Wenn man z.B. alle 50-100ms die Taster-Eingänge in der ISR des Timers 
abfragt, dann ist das nicht wirklich rechenlastig.
Was die beste Lösung ist, hängt auch immer mit dem jeweiligen Programm 
und dem eigenen Programmierstiel zusammen. Auch die Hardware des uC muss 
natürlich ausreichend sein.
Dass das da oben nicht wirklich gut ist, wird wahrscheinlich jedem klar 
sein.

@Patrick
hast du auch irgendwo Pullups aktiviert?
Dass 750 ms verdammt lange sind, ist dir hoffentlich auch klar?
DDRD &= ~(1<<DDD3); //DDD ?????????
OP #2902207
ich habe ja einen externen PullUp, 10k zwischen dem Pin und VCC.

DDD3 ist eine Konstante um dem Pin einen Namen zu geben. Damit setze ich 
den Pin als Eingang

Und ja, ich weiß das 750ms verdammt viel sind, aber es scheint ja 
teilweise immer noch nicht zu reichen.
Gast #2902211
kein Taster prellt eine dreiviertel Sekunde, 75ms wären schon verdammt 
lang!
Der Fehler muss irgendwo anders im Programm liegen.

Hast du kein Oszi, mit dem du der Sache auf den Grund gehen kannst?
#2902213
schlauberger schrieb:
> Wenn aber durchgehend der timer pollt, is das dann nicht sehr
> rechenlasstig wenn andauernd unterbrochen wird??


Die PeDa Routinen verbrauchen, wenn ich das noch richtig im Kopf hab, 
irgendwas um die 0.2% Rechenzeit bei 1Mhz Systemtakt. Wird der 
Systemtakt höher, geht die 'Belastung' entsprechend zurück.

Also nichts, was einem Kopfzerbrechen machen müsste.
OP #2902215
Nein, ich steige grad erst in die Thematik Microcontroller ein und als 
Student fehlt da das Kleingeld für ein Oszilloskop...

Danke dir trotzdem soweit, ich werde weiter rumprobieren... falls mir 
noch was auffällt poste ich das nochmal, vielleicht ist das für jemanden 
ja der entscheidende Hinweis.
Gast #2902228
Keine Ahnung, was in der ISR noch so passiert (//stuff), aber bedenke, 
dass du Variablen die noch an anderer Stelle genutzt werde, als volatile 
zu deklarieren sind.
Beim restlichen, bisher geposteten Code, habe ich keinen Fehler 
gefunden.
Gast #2902233
Karl Heinz Buchegger schrieb:
> schlauberger schrieb:
>> Wenn aber durchgehend der timer pollt, is das dann nicht sehr
>> rechenlasstig wenn andauernd unterbrochen wird??
>
>
> Die PeDa Routinen verbrauchen, wenn ich das noch richtig im Kopf hab,
> irgendwas um die 0.2% Rechenzeit bei 1Mhz Systemtakt. Wird der
> Systemtakt höher, geht die 'Belastung' entsprechend zurück.
>
> Also nichts, was einem Kopfzerbrechen machen müsste.

Habe mal bei einer vergleichsweise komplexen Interrupt Routine (großes 
Array um x Positionen verschieben) mit dem Oszi nachgemessen. Selbst die 
hat sehr wenig Rechenzeit in Anspruch genommen (<1% bei 16Mhz). Über ein 
paar Taster abfragen würde ich mir da keine Gedanken machen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.