Hi, ich habe ein kleines Problem mit einem Timer des ATMega 328. Ich
möchte eine ISR jede Millisekunde aufrufen. Das habe ich gebaut:
1 | void timer1_init(void)
|
2 | {
|
3 | cli();
|
4 | TIMSK1 |= (1<<OCIE1A); //Allow Compare Interrupt
|
5 | TIFR1 |= (1<<OCF1A); //Execute ISR
|
6 | TCNT1 = 0x0000; //Set Counter to zero
|
7 | TCCR1A = 0x00; //COM1A1,COM1A0,COM1B1,COM1B0,-,-,WGM11,WGM10
|
8 | TCCR1B = (1<<CS11) | (1<<WGM12); //CS11 = 1 -> Prescaler 8, CTC1 (renamed WGM12) = 1 -> CTC-Mode
|
9 | OCR1A = ((F_CPU/8)/1000)-1; //((1e6/8)/1e3) = 125
|
10 | sei();
|
11 | }
|
12 |
|
13 | ISR(TIMER1_COMPA_vect)
|
14 | {
|
15 | }
|
Taktquelle ist ein Quarzoszillator mit 1 MHz, Fuses:
lfuse 0xe0
hfuse 0xd9
efuse 0xfb
Problem: Seltsamerweise läuft das Ding nur mit der Hälfte der
berechneten Geschwindigkeit. Habe ich im Datenblatt irgendwas übersehen?
Die Timerbeschreibung ist irgendwie deutlich stärker zerstückelt als bei
den einfacheren Megas, besser als es da oben steht kriege ich das nicht
eingestellt...
Achja: efuse wird mit 0x03 zurückgelesen*, kann ich einfach mit 0x03
flashen um die Fehlermeldung zu vermeiden? Ich sehe kein Problem, habe
mich aber noch nicht getraut.
*http://www.engbedded.com/fusecalc sagt: "*Note that some numerical
values refer to fuses containing undefined bits (set to '1' here).
Depending on the target device these fuse bits will be read either as
'0' or '1'. Verification errors will occur if the values are read back
with undefined bits set to '0'. Everything is fine if the values read
from the device are either the same as programmed, or the following
values (undefined set to '0'): Extended: 0x04."