Hallo zusammen,
ich habe ein Problem mit dem Analog Comparator des Atmega128. Ich habe
den Interrupt bei steigender Flanke aktiviert:
1 | /* Analog comparator initialization*/
|
2 | void AC_Init()
|
3 | {
|
4 | /*AC "first off", interrupt enabled, interrupt on rising output edge*/
|
5 | ACSR = (1<<ACD)|(0<<ACBG)|(1<<ACIE)|(0<<ACIC)|(1<<ACIS1)|(1<<ACIS0);
|
6 | }
|
Wenn ich die ISR ausführe, möchte ich beim ersten Durchlauf einen Zähler
inkrementieren, 100ms warten und danach die ISR verlassen. Ist der
AC-Ausgang immer noch "high", dann soll im nächsten Aufruf der ISR etwas
ausgeführt werden. Dazu wollte ich beim ersten Aufruf der ISR die
Interrupt Flag ACI löschen, doch ich habe festgestellt, dass diese
bereits direkt nach dem Aufruf gelöscht wird. Also müsste die ISR doch
nach Durchlauf des ersten ISR-Aufrufs erneut aufgerufen werden, da der
AC-Ausgang immer noch "high" ist. Aber es passiert leider kein zweiter
Interrupt nach Durchlauf des ersten ISR-Aufrufs. Hier die ISR:
1 | ISR(ANALOG_COMP_vect)
|
2 | {
|
3 | cli();
|
4 |
|
5 | counter++;
|
6 |
|
7 | ACSR &= ~(1<<ACIE);/*deactivate analog comparator interrupt*/
|
8 | if(counter == 2)
|
9 | {
|
10 | //Hier soll etwas ausgeführt werden
|
11 | }
|
12 | else{_delay_ms(100);}
|
13 |
|
14 | sei();
|
15 | ACSR |= (1<<ACIE); /*activate analog comparator interrupt*/
|
16 | }
|
Habe es auch schon mit deaktivieren und erneuten aktivieren des AC
versucht aber es bracht keine Veränderung. Habt ihr eine Idee woran es
liegen könnte?
Vielen Dank und viele Grüße.