Hallo
Ich habe den gezeigten Thread durchgelesen, aber irgendwie scheint mir das nicht schlüssig. Der Timer läuft ohne Vorteiler im Mode 1 (WGM10 im TCCR1A ist gesetzt). Mode1 bedeutet: PWM, Phase Correct, 8-bit. Beim Match wird die ISR aufgerufen und OCR1A wird mit dem nächsten Wert aus der Tabelle geladen:
ISR(TIMER1_COMPA_vect){
OCR1A=pgm_read_byte(&sinewave[tone][(i>>8)]);
i += scale;
}
Es werden je nach Größe von scale einige Werte in der Tabelle übersprungen, so dass die Dauer einer Periode durch die Anzahl der Werte pro Periode beeinflusst werden kann. Soweit, so gut. Aber PhaseCorrekt bedeutet, dass der Counter von 0 nach 255 und wieder zurück zählt. Beim Aufwärtszählen wird beim Match der Ausgang zurückgesetzt, beim Abwärtszählen wird beim Match der Ausgang wieder gesetzt (COM1A1:0 in TCCR1A ist 10: Clear OC1A/OC1B on compare match when
up-counting. Set OC1A/OC1B on compare match when downcounting.) Der neue OCR1A-Wert wird zwar in der Match-ISR geschrieben, aber erst bei TOP upgedatet (Mode1: Update of OCR1x). Dazu kommt noch, dass nur jeder zweite aus der Tabelle gelesene und ins OCR1A geschriebene Wert auch wirklich Wirkung zeigt.
Es gibt noch viel zu erforschen.
Gruß
mic
Lesezeichen