www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Taster mit externen Interrupt prellt


Autor: Tom L. (munzi)
Datum:

Bewertung
0 lesenswert
nicht 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.
#define F_CPU 2000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/usart.c>

volatile uint8_t tick;

ISR(TIMER0_OVF_vect){
  tick++;
  if (tick==5){  
    tick=0;
    sei();
    TCCR0=0;
    usart_putc('y');
  }
}

ISR(INT0_vect){
  cli();
  TCCR0=(1<<CS02)|(1<<CS00);
  usart_putc('x');
}

int main(void){
    sei();
    usart_init();
    TIMSK=(1<<TOIE0);
    GICR=(1<<INT0);
    MCUCR=(1<<ISC01);
    
  while(1){
  }
  return 0;
}

//Ausgabe:
//xyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
//xxxxxxxxyxxxxxxxxxxyxxxxxxxxxxxy
//xxxxxxxxxxxxxyxxxxxxxxxxxxxxy
//xxxxxxxxxxxxxxxxyxyxyxyxxxyxxxxxy
//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

Autor: 1.8T-Passat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gastofatz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wilhelm F. (ferkes-willem)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.