verlorenes Schaf schrieb:
> Getestet und immer noch gleiches Verhalten.
>
> Hier mal ein Shot meines Oszis
Bei solchen seltsamen Erscheinungen testet man sinnvollerweise
schrittweise.
Als erstes: Ein Oszillogramm ganz ohne ISRs. Wird dann überhaupt erstmal
die gewünschte Frequenz erzeugt?
Als zweites: ISR für ADC und Testausgabe des ADC-Wertes z.B. per UART
oder wenigstens der oberen acht Bits auf einen Port mit acht LEDs dran.
Was gerade einfacher zu realisieren ist. Wird der Meßwert regelmäßig
aktualisiert? Bewegt sich der Meßwert im erwarteten Wertebereich?
Spätestens bei diesem Test wärst du darauf gestoßen, daß was mit dem ADC
nicht stimmt, denn
> ADCSRB = (1 << ADTS2) | (1 << ADTS1) | (1 << ADTS0);
ist schlicht Blödsinn. Wo soll das Capture-Event herkommen, welches den
ADC triggern könnte? D.h.: Der ADC wird genau eine Messung machen (weil
du die erste manuell angestoßen hast) und dann ist Schicht im Schacht.
Sinn hätte vielleicht ergeben, die Messung durch den Overflow von Timer
1 zu triggern, denn der tritt im CTC-Mode beim Compare-Match auf. Aber:
damit das klappt, müssen zwei Bedingengen erfüllt sein, die bei dir
beide nicht erfüllt sind:
1)
Der ADC zu diesem Zeitpunkt auch bereit sein zu einer Messung, d.h. die
vorige muß abgeschlossen sein. Da der kleinstmögliche Meßwert 0 ist,
damit die kleinstmögliche Einstellung für OCR1A ebenfalls 0, muß der ADC
schneller messen als 20.000.000/64.
Die ADC-Messung dauert bei deiner Initialisierung aber schon im
Normalfall 20.000.000/(13*16), im Falle der ersten Messung sogar
20.000.000/(25*16).
2)
Damit der Trigger überhaupt triggert, muß das auslösende Flag zuvor
zurückgesetzt sein. Das geschieht automatisch nur dann, wenn du eine ISR
für das Triggerflag hast, ansonsten muß es von Hand gemacht werden. Du
hast aber weder eine ISR für den Overflow, noch setzt du an irgendeiner
Stelle das Overflow-Flag manuell zurück.
Ich würde in dieser Anwendung schlicht auf eine Hardwaretriggerung ganz
verzichten und die ADC statt dessen im FreeRunning-Mode laufen lassen.