Interrupt History

Gast #66405
Lesenswert?
• ▲
▼
Hallo!

Ich möchte einen Reed-Kontakt (Radl-Dacho Anwendung) entprellen.
Dazu will ich nach dem Interrupt (INT0) - Eingang den Interrupt
disablen und nach dem Ablauf eines Timers diesen wieder enablen.

Leider hab ich das Problem, dass wären der Interrupt disabled ist,
irgendwo etwas gesetzt wird wenn ein Zwischen Interrupt eintrifft.
Dh. Wenn ich zweimal den Taster betätige dann wird der 2. Druck gemerkt
und nach dem Verzögern ausgefürt...

Vielleicht kann mir wer helfen oder ich hab mich mit den
Register vertan... Aja ich arbeite mit dem ATMEGA16 / 10MHz

Hier der Code:

/** BENUTZUNG: REED ****/
interrupt [EXT_INT0] void ext_int0_isr(void)
{
  GICR &= 0xBF;    //  Disable Ext.Interrupt 0 --> Reed OFF.
  printf("Interrupt eingegangen, (EXT) Disabled\n\r");
  zaehler++;
  printf ("Zaehler: %i \n\r",zaehler);
  PORTD.5 = 1;
  TCNT2=0x00;
  TIMSK |= 0x40;  //  Enable --> Timer2-Interrupt ON.
}

/** BENUTZUNG: Reed-Entpreller ****/
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
  static int i = 0;
  i++;
  if (i>100)
    {
      PORTD.5 = 0;
      TIMSK &= 0xBF;  //  Disable --> Timer2-Interrupt OFF.
      TCNT2=0x00;
      i=0;
      GIFR &= 0xBF;
      GICR |= 0x40;  //  Enable Ext.Interrupt 0 --> Reed ON.
      printf("Interrupt (EXT) Enabled\n\r");
    }
}
Gast #66406
Lesenswert?
• ▲
▼
ich kann zwar kein C, aber GIFR &= 0xBF löscht wohl das 6.Bit ??
Gedanklich ist es zwar richtig das Interruptflag zu löschen, aber
dieses wird beim avr durch schreiben einer 1 gelöscht.

grüsse leo9
#66407
Lesenswert?
• ▲
▼
Diesen ganzen komplizierten Schrunz mit dem Umschalten zwischen externen
und Timerinterrupt kann man sich sparen, wenn man einfach nur den
Timerinterrupt nimmt.

Das hat auch noch den Vorteil, daß der Timerinterrupt durchläuft, also
noch für beliebig andere Sachen zur Verfügung steht.

In der Codesammlung findest Du Beispiele zuhauf.


Peter
Gast #66408
Lesenswert?
• ▲
▼
Also auf die 1. Anwort:

Wieso muss ich einen 1er schreiben damit ich etwas lösche?
Das ist mir irgendwie total unklar.
Wenn das Register ganz einfach mit & verknüpfe kann ich
doch gezielt Bits löschen?

Das ganze funktioniert auch, d.h. Der Interrupt wird
tatsächlich disabled, aber dazwischen wird da irgendetwas
gemerkt.

Auf die 2. Antwort:#

Aufgrund meiner Anwendung brauche ich ganz einfach einen
Externen Interrupt von der Peripherie und dann einen Abstand
der meiner Meinung nach nur mit einem Timer erzielt werden kann.

Danke, Thomas.
Gast #66409
Lesenswert?
• ▲
▼
weil sich das die Atmel-Fritzen so ausgedacht haben:

aus dem Atmel-Datenblatt:
"Alternatively, the flag can be cleared by writing a logical one to
it."

Halt dich ans Datenblatt oder nimm halt einen anderen Prozessor.

grüsse leo9

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.