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