Forum: Compiler & IDEs zu blöd für Analog Komparator?


von Philipp Cochems (Gast)


Lesenswert?

Hallo,

ich würde gern den Analog Komparator aus dem 2313 nutzen. Zum testen
habe ich folgendes gemacht:

PINB1 (AIN1) gegen Masse
PINB0 (AIN0) gegen +5V

und an PINB3 (OC1) eine LED

das Programm sieht folgendermassen aus:


ACSR = 0x00;
ACSR |= (1<<ACO) | (1<<ACIC);
ACSR &= ~(1<<ACD);

DDRB = 0x00; PORT B als Eingang
DDRB |= (1<<PINB3); PINB3 als Ausgang

nun sollte doch der Komparartor Ausgang an PINB3 liegen oder? Aber egal
was ich mit PB0 und PB1 mache PB3 bleibt auf 0.

Hat jmd eine Idee was ich falsch mache?

Vielen Dank schonmal Philipp

von sven (Gast)


Lesenswert?

ok, blöd vielleicht nicht, aber sehr unwissend :-)

dein code schritt für schritt:

1.)
PINB1 (AIN1) gegen Masse
PINB0 (AIN0) gegen +5V
----> so weit, so gut

und an PINB3 (OC1) eine LED
----> hier liegt denke ich dein erster denkfehler. unten schreibst du,
das hier jetzt der ausgang des komparator sein sollte... wie kommst du
da drauf???? OC1 steht für output compare und gehört weder zum analog
comparator, noch ist er dessen ausgang!!!! er gehört zu einm timer und
du kannst ihn zb zur pwm-erzeugung nutzen... immer das datenblatt
gründlich lesen... sinnvoll programmieren kann der, der seine
zielplattform gut kennt ;-)

ACSR = 0x00;
----> ok

ACSR |= (1<<ACO) | (1<<ACIC);
----> 1.) wie du im DATENBLATT erkennen kannst, ist ACO ein readonly -
bit... spar dir es zu beschreiben... ausserdem: ACO ist dein ersehnter
ausgang des comparator ;-)
2.) hier dämmert die idee, wie der zusammehang zu timer1 zustande
kommt, dessen ausgang du benutzen möchtest... aber auch hier klärt das
datenblatt auf, und verrät, das nun der comparator einen capture im
timer1 auslösen kann... dh: er friert den aktuellen zählerstand ein und
kopiert ihn ins input-capture register des timer1... damit kannst du zb
pulsweiten messen... aber oc1 bleibt davon eigentlich unbeeindruckt
;-)

ACSR &= ~(1<<ACD);
----> ok, obwohl du zwei zeilen früher eh schon gelöscht hast...
speicherfressender pragmatismus :-)

DDRB = 0x00; PORT B als Eingang
DDRB |= (1<<PINB3); PINB3 als Ausgang
----> ok

nun sollte doch der Komparartor Ausgang an PINB3 liegen oder?
----> NEIN

Aber egal
was ich mit PB0 und PB1 mache PB3 bleibt auf 0.
----> KLAR

Hat jmd eine Idee was ich falsch mache?
----> versuchs mal damit:

/////////////////////////////////////////////////
unsigned char tmp;

DDRB = 0x00; PORT B als Eingang
DDRB |= (1<<PINB3); PINB3 als Ausgang

ACSR = 0;
for(;;){
    tmp = ACSR;
    tmp = (tmp >> 2);
    tmp &= 0x08;
    PORTB &= 0xf7;
    PORTB |= tmp;
}
///////////////////////////////////////////////////

...es gibt aber noch tausend andere wege :-)

von Philipp (Gast)


Lesenswert?

Ja danke, habe das Problem inzwischen anders gelöst. Wollte ohnehin den
Compare Int nutzen um den Komparator auszuwerten, deshalb übersprang
ich die Idee aus meinem Posting und das klappte sofort.

Ich war irgendwie mit einem Brett vor dem Kopf davon überzeugt das
dieser PIN OC der Ausgang sein könnte. Deshalb schrieb ich auch ACO :)

War echt blind, jetzt gibt das Datenblatt auch wieder Sinn. Vielen Dank
das du mir die Augen geöffnet hast.

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.