Guten Tag, ich hänge seit ein paar Tagen an einem Problem fest und bitte um Hilfe. Konkret will ich mit dem Analog Comparator eines Mega16 zwei Spannungszustände ( 0V und 5V ) vergleichen, diese habe ich an AIN0 und AIN1 angelegt. Wenn die 5V-Spannung fällt soll eine Interrupt ausgelöst werden und die ISR aufgerufen werden. Gemäß der App-Notes habe ich AREF usw. an die Versorgungsspannung angelegt. Im Software Debugger vom AVR wird bei mir ein Interrupt aber nur ausgelöst wenn ich am ACI-Kästchen ein Hacken setzte. Nun meine Eigentliche Frage: Ich man bislang an, das an AIN0 bzw. AIN1 eine Veränderung stattfinden muß, damit eine Interrupt ausgelöst wird. Was mache ich falsch, wo liegt mein Denkfehler oder ist der Code falsch ?? Ich verwende der AVR-GCC. Der Code liegt im Anhang. Vielen Dank im vorraus, Martin
Verstehe jetzt nicht ganz, WAS da verglichen werden soll. Habe fast den Eindruck, Du hast das Prinzip eines Komparators nicht verstanden. AREF hat mit dem Komparator nichts zu tun! Der Komparator vergleicht die Spannungen an AIN0 und AIN1. Je nachdem welche der beiden größer ist, ist der Ausgang HIGH oder LOW und je nachdem wie der Interrupt konfiguriert ist, gibt es einen Interrupt bei Wechsel von HIGH nach LOW oder umgekehrt. Bei Dir würde sich nur dann was ändern, wenn die '5V' (die dann keine mehr sind) unter 0V fallen, was nicht geht... Abgesehen davon löscht man ein Interrupt Flag (in diesem Fall ACI) durch Schreiben einer '1' und nicht durch eine '0'. Das ACSR &= ~(1<<ACI); in Deinem Programm hat keine Wirkung! Gruß Johnny
Hm, ich denke ich habe das Prinzip schon verstanden. In meiner Schaltung währe am Anfang auch ein AIN0=1 und eine AIN1=1 als Spannung von 5V möglich. Selbst wenn ich andere Modi für ACIS0 und ACIS1 setzte bekomme ich keinen Interrupt, außer wiederum ich verändere den Zustand von ACI. Mal davon abgesehen, wie sähe denn der Code richtig aus wenn ein Interrupt bei einer Veränderung einer der beiden vorliegen sollte. Gruß Martin
In dem Code aus Deinem ersten Posting ist das ganze so konfiguriert: AIN0 und AIN1 als Eingänge, Interrupt auf fallende Flanke am Komparator-Ausgang (der wird durch das Bit ACO ausgegeben). Das bedeutet, dass ACO HIGH-Pegel hat, wenn die Spannung an AIN0 (nichtinvertierender Eingang) größer ist als die Spannung an AIN1 (invertierender Eingang). Das Interrupt-Flag wird bei den Einstellungen dann gesetzt, wenn die Spannung an AIN0 kleiner wird, als die an AIN1, also wenn ACO von HIGH nach LOW wechselt. Wenn Du ACIS0 und ACIS1 auf '0' setzt, wird das Interrupt-Flag bei jeder Änderung von ACO gesetzt. Wenn ACIS0 und ACIS1 beide '1' sind, wird das Flag bei einer Änderung von LOW nach HIGH gesetzt (also wenn die Spannung an AIN0 größer wird als die an AIN1). Außerdem fällt mir gerade so auf, dass Du die Analog-Eingänge als Ausgänge programmiert hast (autsch). So kann es nicht funktionieren! Ich hoffe, das hilft weiter. Gruß Johnny
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.