Forum: Mikrocontroller und Digitale Elektronik Atmega 16 Comparator / Interrupt Problem


von Eugen S. (Gast)


Lesenswert?

Hallo zusammen,

ich will dass mein Comparator, bei höhere Spannung als die Soll Spannung 
ein Interrupt auslöst und am Display etwas ausgibt. Dann soll er für 
500ms gesperrt werdenund erst nach denn 500ms soll er wieder 
vergleichen. Mit meinem Code wird ein Interrupt ausgelöst und für 500ms 
gesperrt, wie gewollt, aber nach den 500ms wird wieder ein interrupt 
ausgelöst ohne dass die Spannung sich erhöht hat. Im Klartext, es wird 
jedesmal 2 mal ein Interrupt ausgelöst und 2 mal wird am Display etwas 
ausgegeben.

Bitte um Hilfe!
1
ACSR=0x0A;
2
SFIOR=0x00;
1
interrupt [ANA_COMP] void ana_comp_isr(void)
2
{
3
4
lcd_putsf("Test");
5
6
delay_ms(500);
7
8
9
10
}
von STK500-Besitzer (Gast)


Lesenswert?

vielleicht das zugehörige Interruptflag noch löschen?
von Matze (Gast)


Lesenswert?

Hallo.

So wie ich das verstehe wartest du IN der Interrupt Service Routine 500 
ms bevor diese beendet wird. Das ist glaube ich wenig hilfreich.

Du solltest versuchen in der ISR des Comparators den Interrupt für den 
Comparator zu disablen, einen Timer mit 500 ms zu starten (auch 
Interruptgesteuert) und in dieser Timer-ISR den Interrupt für den 
Comparator wieder zu enablen.

Falls der Waert am Comparatoreiingang dann immer noch über dem 
Schwellwert liegt bekommst du dann aber wieder einen Interrupt.
von Eugen S. (Gast)


Lesenswert?

Das bringt alles leider nichts

Bitte um weitere Hilfe!
von Thomas E. (thomase)


Lesenswert?

Wenn die Spannung an AIN0 langsam verändert wird, erreicht man 
irgendwann den Punkt, an dem die Spannung an AIN0 = AIN1 ist. Oder 
gerade gleich oder gerade drüber. Das ist ein Tanz auf 'ner 
Rasierklinge, wo der Komparator dann ein paar Mal hin und her wackelt. 
Und dann natürlich jedesmal einen Interrupt auslöst. Wenn man 
steilflankig mit einer Rechteckspannung rangeht, passiert das nicht.

Wenn der Interrupt auslöst, wird das Interrupt-Flag gelöscht und die 
Interrupts werden global abgeschaltet. Dann springt er in die ISR und da 
der Komparator wackelt, setzt er jetzt wieder das Interrupt-Flag. Wenn 
die ISR dann fertig ist, werden die Interrupts wieder global 
eingeschaltet und da das Flag vom Komparator-Interrupt gesetzt ist, wird 
wieder ein Interrupt ausgelöst. Schaltet man vor dem Verlassen der ISR 
das Flag per Software ab, passiert das nicht. Aber eine wirklich Lösung 
ist das nicht.
Denn: Das gehört nicht in eine ISR: > delay_ms(500);
Das ist zwar kein Dogma aber der Controller steht dann komplett. Da 
solltest du dir etwas anderes einfallen lassen.
Lass' den Komparator einfach volle Kanne laufen und setzte darin ein 
Flag.

volatile Char Flag = 0;
volatile Char New = 1;

interrupt [ANA_COMP] void ana_comp_isr(void)
{
     Flag = 1;
}

int main(void)
{
  while(1)
  {
     if(Flag == New)
     {
       New = 0;
       lcd_puts....
       Timer starten, der nach 500 ms das Flag zurück setzt
     }
  }
}

ISR(Timer)
{
  Flag = 0;
  New = 1;
}

mfg.
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.