Hallo zusammen,
ich habe folgende Aufgabe zu lösen (AT90USB1287):
nachdem ein externer Interrupt (fallende Flanke) vom MC detektiert
wurde, soll der externe Interrupt-Eingang für 100ms für weitere Flanken
gesperrt werden und nach Ablauf der Zeit wieder für den Empfang
freigegeben werden.
Anbei meine beiden Interruptroutinen:
1 | startflag = true;
|
2 | ext_int = true;
|
3 |
|
4 | ISR(INT0_vect) // Interrupt routine for
|
5 | {
|
6 | if( (startflag == true) && (ext_int == true) ){
|
7 | EIMSK = 0x00; // Stop external Interrupt
|
8 | counter = counter + 1; // Do something important
|
9 | TCNT1 = 0x0000; // Reset Counter
|
10 | TCCR1B |= (1<<CS12); // Start Timer
|
11 | PORTD |= (1<<1); // Yellow LED on
|
12 | ext_int = false; // Set Interrupt Lock
|
13 | }
|
14 | }
|
15 |
|
16 |
|
17 | ISR(TIMER1_COMPA_vect)
|
18 | {
|
19 | TCCR1B &= ~(1 << CS12); // Stop Timer
|
20 | EIMSK = 0x01; // Start external Interrupt
|
21 | ext_int = true; // Reset Interrupt Lock
|
22 | PORTD &= ~(1<<1); // Yellow LED off
|
23 | }
|
Sobald ein externer Interrupt empfangen wird, wird durch die zugehörige
Interruptroutine das Maskregister auf 0 gesetzt und ein Timer aktiviert.
Nach 100ms erfolgt ein Timerinterrupt, welcher die Sperrung des externen
Interrupts rückgängig machen soll. Allerdings funktionieren die Routinen
nicht so wie sie sollen, da innerhalb der Totzeit auf weitere externe
Flanken reagiert wird.
Was mache ich falsch?
Gruß Jens