Forum: Mikrocontroller und Digitale Elektronik ATMega328 Timer falsche Frequenz


von Andi M. (rootsquash)


Lesenswert?

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."

von Ingo L. (corrtexx)


Lesenswert?

Toggelst du in der ISR ne LED? Falls ja kommt da die halbe Frequenz her 
;)

von spess53 (Gast)


Lesenswert?

Hi

>Problem: Seltsamerweise läuft das Ding nur mit der Hälfte der
>berechneten Geschwindigkeit. Habe ich im Datenblatt irgendwas übersehen?

Wie stellst du das fest? Außer das OCR1A 124 statt 125 sein muss passt 
es.

MfG Spess

von Andi M. (rootsquash)


Lesenswert?

Ich habe endlich die Nixie-Uhr zusammengelötet, da sehe ich ganz gut 
wann eine Sekunde rum ist.

Der Testaufbau lief mit einem 2 MHz-Quarzoszi mit der gewünschten 
Geschwindigkeit (zumindest gefühlt). Als ich dann den Code auf den 1 
MHz-Quarzoszi anpassen wollte habe ich mich ein wenig gewundert dass ich 
garnichts ändern muss..

Mh, dann muss ich vielleicht nochmal die ISR eine Zeit lang anstarren, 
vielleicht habe ich da irgendwas falsch geklammert oder so...

von Andi M. (rootsquash)


Lesenswert?

Wow..
ich habe in der Berechnung von OCR1A mal aus der 1000 eine 2000 gemacht, 
dann wieder eine 1000.. und jetzt legt die Uhr etwa 10 Minuten pro 
Sekunde zurück.

Irgendwas muss da doch kaputt sein.

/edit:
Noch etwas ist seltsam:
Wenn ich OCR1A = ((F_CPU/8)/1000)-1; schreibe flimmern die Zahlen über 
das angeschlossene Display (ich schone mal die Röhren), wenn ich 
hingegen OCR1A = 124 hinschreibe läuft die Uhr auch viel zu schnell, 
aber das Display wird nur mit ~2 Hz aktualisiert..

Brauche ich jetzt einen Exorzisten?

von Andi M. (rootsquash)


Lesenswert?

Andi M. schrieb:
> Der Testaufbau lief mit einem 2 MHz-Quarzoszi mit der gewünschten
> Geschwindigkeit (zumindest gefühlt). Als ich dann den Code auf den 1
> MHz-Quarzoszi anpassen wollte habe ich mich ein wenig gewundert dass ich
> garnichts ändern muss..

Boah bin ich doof. Ich habe nur in die main.c geguckt, natürlich muss 
ich da nichts ändern. Auf die Idee im Makefile F_CPU auf 1 MHz zu 
stellen bin ich natürlich nicht gekommen, ist ja auch viel zu 
kompliziert.

Kopf->Tisch

Sorry für den überflüssigen Thread, vielen Dank dass ihr auf die 
Timereinstellungen geguckt habt :)

von Uwe (de0508)


Lesenswert?

Hallo,

noch eine kleine Anmerkung:
diese Zeile
1
TIFR1 |= (1<<OCF1A);
muss
1
TIFR1 = (1<<OCF1A);
lauten.

von Andi M. (rootsquash)


Lesenswert?

Ist geändert, danke :)

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