Forum: Mikrocontroller und Digitale Elektronik ADC-MUX als negativen Eingang des Analogcomparator nutzen


von Christopher B. (chrispy)


Lesenswert?

Hallo liebe Leute,

ich arbeite gerade daran meinen AVR-Butterfly (ATMEGA169) dazu zu
bekommen einen Phasenanschnitt auszuwerten.
Mein Plan ist beim Nulldurchgang den 16-Bit-Timer (Timer1) zu starten
und dann beim Start des Phasenanschnitts den Timer rückzusetzen und
auszulesen.

Das Starten und Einstellen des Timers klappt inzwischen ganz
manierlich. Auch das Verwenden des CTC-Modus funktioniert und Dank der
Kalibrierungsfunktion, die bei der Demo-Software des Butterfly dabei
ist, kommt der eingestellte Takt auch ziemlich genau heraus.

Zum Auswerten und Rückseztem des Timers möchte ich den
Capture-Interrupt verwenden. Durch das angeschlossene LCD kommt aber
nur der Analog-Comparator dafür in Frage.
Da dieser leider durch den Joystick belegt kann ich den Interrupt durch
den Joystick per Hand auslösen aber das Anschliessen meines Signals wird
schwierig.

Nun meine Frage:
Wenn ich die Dokumentation richtig verstanden habe ist es möglich den
negativen Eingang des Analog-Comparators durch einen beliebigen ADC
über den MUX zu ersetzen und den positiven Eingang durch eine interne
Referenzspannung.
Ist das wirklich so?
Hab ich das richtig verstanden oder baue ich grade Luftschlösser?

Es ist so verlockend, weil der ADC1 direkt auf Stecker geführt ist.

Ich habe schon erste Versuche unternommen den Timer und den
Analogcomparator (inkl. ADMUX) einzustellen.

Bei Interresse und falls überhaupt möglich <g> werde ich diesen Versuch
gerne posten

Vielen Dank im Vorraus für jede Form der Hilfe
chrispy

von Andi (Gast)


Lesenswert?

Ich habe den Mega169 zwar noch nicht verwendet, aber wenn es so ist wie
beim Mega88, dann sollte das schon funktionieren. Das Problem ist halt,
dass man den ADC abschalten muss, um den ADC-Multiplexer für den
Komparator verwenden zu können.

Gruss Andi

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Du musst das ACME-Bit im ADCSRB-Register setzen. Und der den ADC darfst
du nicht benutzen. (Ich schliesse mich also Andi an).
Seite 190ff im Datenblatt...

von Christopher B. (chrispy)


Lesenswert?

So,
hier mein Versuch:

TCCR1A = ((0<<COM1A1) | (1<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) |
(0<<WGM11) | (0<<WGM10));

TCCR1B = ((1<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12)
| (0<<CS11) | (0<<CS10));

TCCR1C = ((0<<FOC1A) | (0<<FOC1B));

TCNT1 = 0UL;

OCR1A = 100UL;

TIMSK1 = ((1<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1));

ACSR = ((0<<ACD) | (1<<ACBG) | (0<<ACIE) | (1<<ACIC) | (0<<ACIS1) |
(0<<ACIS0));

ADCSRA = ((0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) |
(0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0));

ADCSRB = ((1<<ACME) | (0<<ADTS2) | (0<<ADTS1) | (1<<ADTS0));

ADMUX = ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR) | (0<<MUX4) | (0<<MUX3) |
(0<<MUX2) | (0<<MUX1) | (1<<MUX0));

SIGNAL(SIG_INPUT_CAPTURE1)
{
  sbiBF(PORTE,PORTE6);    //LED2 an
}

aber irgendwie klappt das noch nicht so recht.
Der Capture-Interrupt löst nicht aus.

chrispy

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.