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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren