ADC-MUX als negativen Eingang des Analogcomparator nutzen

OP #394510
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
Gast #394511
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
OP #394513
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren