Forum: Mikrocontroller und Digitale Elektronik Interrupt History


von Thomas (Gast)


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");
    }
}

von leo9 (Gast)


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

von Peter D. (peda)


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

von Thomas (Gast)


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.

von leo9 (Gast)


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

von Peter D. (peda)


Lesenswert?

"Aufgrund meiner Anwendung brauche ich ganz einfach einen
Externen Interrupt..."

Ich häts ja nicht geschrieben, wenns nicht ohne ginge.
Aber Du mußt Dir nicht die Beispiele ansehen, es zwingt Dich keiner.


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.