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.