Hallo, jetzt sind die Hardwarespezialisten gefragt. In einem Programm
habe ich (verzweifelt) gesucht, warum beim Umkonfigurieren des Timers
kein CTC-Ton kommt. Beim Experimentieren ist mir dann etwas total
seltsames aufgefallen, dieses Phänomen hab ich nicht so direkt aus dem
Datenblatt herausgelesen?
Ist hier wirklich ein Designfehler im Atmega oder habe ich einen
Denkfehler!
Langsam zum Mitdenken
Folgendes Miniprogramm:
1 | $regfile = "m644def.dat"
|
2 | $crystal = 8000000
|
3 | Ddrd.5 = 1 'OC1A als Output
|
4 | Tccr1a = &B01000000 'CTC Pin D5=OC1A, CTC-Mode
|
5 | Tccr1b = &B00011101 'CTC bei ICR1 statt OCR1A
|
6 | Icr1l = 4 '4=781,25 Hertz
|
7 | Ocr1al = 0
|
CTC-Modus 12, TOP=ICR1, die high-Bytes sind in jedem Register 0.
Das ergibt eine Frequenz von 1/(2*1024*(1+4))=781,25 Hertz
Passt auch alles und stimmt. Durch Ändern von Icr1l ändert sich auch die
Frequenz.
Was aber nicht hervorgeht ist, dass plötzlich auch Ocr1al den CTC-Modus
beeinflusst. Durch Experimentieren habe ich herausgefunden, dass
folgendes gelten muss: Ocr1a1<=Icr1l, sonst wird der Ton einfach
abgeschaltet.
Warum? Steht nicht so im Datenblatt!!
The Output Compare Registers contain a 16-bit value that is continuously
compared with the counter value (TCNTn). A match can be used to generate
an Output Compare interrupt, or to generate a waveform output on the
OCnx pin.
Es bleibt aber unklar, ob dieser Match auch beim frequenzbestimmtenden
Umschaltens des CTC auf Icr1l so gelten soll oder ob es nicht doch ein
Designfehler ist