Forum: Mikrocontroller und Digitale Elektronik Doppelter ISR Einsprung beim Analog Comparator?


von M. G. (ixil96)


Lesenswert?

Hallo,

ich habe eine Frage zum AC beim ATMega88. Im folgenden Code 
(Dämmerungsschalter) soll eine LED leuchten, wenn die Vergleichsspannung 
am Pin AIN1 größer als die Referenzspannung am Pin AIN0 ist.
Das funktioniert soweit auch ganz gut!

Was ich aber noch nicht verstehe ist der doppelte ISR-Einsprung! Kann 
mir das bitte jemand erklären?

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
#define LED PC5
5
6
int main(void)
7
{
8
  DDRC = 0xFF;    //Richtungsregister PORTC auf Ausgang
9
  PORTC &= ~(1<<LED);  //LED OFF
10
  
11
  //Referenzspannung an AIN0 aktivieren, AC-Interrupt enable, Comparator Interrupt on output toggle
12
  ACSR = (1<<ACBG)|(1<<ACIE); 
13
  
14
  sei();        //Global Interrupt enable
15
  
16
    while(1)
17
    {
18
        
19
    }
20
}
21
22
ISR (ANALOG_COMP_vect)
23
{
24
  if ((ACSR & 0b00100000)==0)  // Wenn Bit ACO gelöscht ist
25
    PORTC |= (1<<LED);
26
  else
27
    PORTC &= ~(1<<LED);
28
}

von Georg G. (df2au)


Lesenswert?

Der Komparator hat keine definierte Hysterese. Es kann durchaus 
vorkommen, dass bei einem Durchgang der Interrupt mehrfach feuert. Das 
musst du per Software abfangen, quasi entprellen.

von M. G. (ixil96)


Lesenswert?

> musst du per Software abfangen, quasi entprellen.

Hast du da einen Vorschlag?
Mit cli(); am Anfang und sei(); am Ende funktioniert es z.B. nicht.
1
ISR (ANALOG_COMP_vect)
2
{
3
  cli();
4
  if ((ACSR & 0b00100000)==0)  //Wenn Bit ACO gelöscht ist
5
    PORTC |= (1<<LED);    //LED ON 
6
  else
7
    PORTC &= ~(1<<LED);    //LED OFF
8
  sei();
9
}

von Uwe (de0508)


Lesenswert?

Hallo m. g.,

in einer ISR Routine sind - ohne weiteres - keine anderen Interrupts 
möglich.
Also bringen Dir auch das cli() und sei() dort überhaupts nichts.

Georg G meinte eher, über einen DNA - Zustandsautomat das RICHTIGE 
Verhalten heraus zu filtern und dann ein eigenes Ereignis zu erzeugen.

von Peter D. (peda)


Lesenswert?

Ein Komparator ist (noch) kein Schmitt-Trigger.

Du könntest eine Hysterese programmieren, z.B. mit einem Ausgang und 
einem Widerstand.
Oder mit dem internen Pullup.

Du kannst aber auch eine Totzeit programmieren, z.B. mindestens 5min an 
bzw. aus.
Und wichtig!
Nach Ablauf der Totzeit vor Freigabe des Interrupts das Pending-Flag 
löschen (beim AVR also setzen).

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.