Taster mit externen Interrupt prellt

OP #1557088
Lesenswert?
• ▲
▼
Hallo,


ich schreibe gerade ein Programm, welches die externen Interrupts 
INT0..2 benutzt um Taster auszuwerten. Leider muss ich auf externe 
Iterruptszurückgreifen, da ich den Controller so noch aus dem Schlaf 
wecken muss. Nun schaffe ich es leider nicht, die Taster zu etprellen. 
Im Beitrag zum Taster entprellen wird auf die externen Interrupts leider 
nicht eingegangen, aber diese zu benutzen ist Vorgabe.
Ich habe versucht einen Timer mit Auftreten des externen Interrupts zu 
aktivieren, den Interrupt dann auszuführen und am Ende der ISR 
Interrupts zu deaktivieren und nach Ablauf einer bestimmten Zeit bedingt 
durch den Timer die Interrupts wieder zuzulassen. Leider funktionert 
dies nicht.
Der Interrupt wird in der Zeit nach Tastendruck und vor Ablaufen der 
Timerzeit immer wieder ausgeführt.
1
#define F_CPU 2000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include <avr/interrupt.h>
5
#include <avr/usart.c>
6

7
volatile uint8_t tick;
8

9
ISR(TIMER0_OVF_vect){
10
  tick++;
11
  if (tick==5){  
12
    tick=0;
13
    sei();
14
    TCCR0=0;
15
    usart_putc('y');
16
  }
17
}
18

19
ISR(INT0_vect){
20
  cli();
21
  TCCR0=(1<<CS02)|(1<<CS00);
22
  usart_putc('x');
23
}
24

25
int main(void){
26
    sei();
27
    usart_init();
28
    TIMSK=(1<<TOIE0);
29
    GICR=(1<<INT0);
30
    MCUCR=(1<<ISC01);
31
    
32
  while(1){
33
  }
34
  return 0;
35
}
36

37
//Ausgabe:
38
//xyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
39
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
40
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
41
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
42
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
43
//xxxxxxxxyxxxxxxxxxxyxxxxxxxxxxxy
44
//xxxxxxxxxxxxxyxxxxxxxxxxxxxxy
45
//xxxxxxxxxxxxxxxxyxyxyxyxxxyxxxxxy
46
//xxxxxxyxxxxxxxy

Ich denke mir wäre sehr geholfen, wenn ich wüsste, was der Controller in 
der Zwischenzeit macht, bzw. was ich grundlegend falsch mache.

Danke
Tom
Gast #1557094
Lesenswert?
• ▲
▼
So wird das nichts. cli () und sei() haben in einer ISR nichts zu 
suchen. Beim verlassen der ISR werden Interrupts wieder enabled. Setz 
ein flag in der ISR, und schalte dann in der main-Routine den INT ab, 
und nach einer Zeit wieder an.
Gast #1557105
Lesenswert?
• ▲
▼
>Leider muss ich auf externe
>Iterruptszurückgreifen, da ich den Controller so noch aus dem Schlaf
>wecken muss.

Das verbietet Dir aber nicht, die Tasten ansonsten ganz normal in einem 
festen Zeitraster abzufragen und nach einer der bewährten Methoden zu 
entprellen.
Gast #1557126
Lesenswert?
• ▲
▼
Das ist schon richtig, daß jede einzelne Prellung den Interrupt wieder 
auslöst.

Falls der Interrupt nicht besonders zeitkritisch ist, und das bei der 
Vorgabe keine Rolle spielt:

Dann bau eine Software-Entprellschleife in die ISR ein, die die Prellung 
am Pin kontrolliert und eine Variable herunter zählt. Sobald die Taste 
nicht mehr prellt, wird die Entprellschleife verlassen. Zeitverzögerung 
dürfte im Bereich unter 10ms liegen, je nach Tastenart.

Eleganter sind zyklische Abfragen von Tasten aus dem Timer-Interrupt, 
aber das ist ja nicht das Thema.
#1557210
Lesenswert?
• ▲
▼
Tom Linz schrieb:
> Nun schaffe ich es leider nicht, die Taster zu etprellen.

Weil Du versuchst, 2 verschiedene Sachen zusammen zu mähren.

Mach das Aufwachen mit dem externen Interrupt, das ist richtig.
Und das Entprellen nach bewährter Methode im Timerinterrupt, dann 
funktioniert alles super.


Peter

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.