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"); } }
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
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
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.
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
"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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.