Forum: Compiler & IDEs SIG_COMPARATOR


von Martin (Gast)


Angehängte Dateien:

Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.