Hallo,
ich wollte zuerst einen einfachen Timer programmieren, der jede Sekunde
eine Variable auf 1 setzt. Dazu habe ich den 8-Bit Timer2 genommen, den
Prescaler auf 1024 gesetzt und den Overflow Interrupt eingeschaltet.
Jetzt sollte dieser Interrupt alle 1 / (16.000.000 / 1.024 / 256) = ca.
61 Millisekunden ausgelöst werden. Dies geschieht aber bei mir nur ca.
alle 3 bis 5 Millisekunden. Mein Code:
1
#define SET_BIT(x,y) x|=(1<<y)
2
#define CLR_BIT(x,y) x&=~(1<<y)
3
#define TGL_BIT(x,y) x^=(1<<y)
4
#define IS_BIT(x,y) (x&(1<<y))
5
6
7
volatileintchanged=0;
8
9
10
voidsetup(){
11
Serial.begin(9600);
12
13
SET_BIT(TCCR2B,CS20);
14
SET_BIT(TCCR2B,CS22);
15
SET_BIT(TIMSK2,TOIE2);
16
}
17
18
voidloop(){
19
longt=millis();
20
while(changed==0);
21
t=millis()-t;
22
Serial.println(t);
23
changed=0;
24
}
25
26
ISR(TIMER2_OVF_vect){
27
changed=1;
28
}
Was mache ich falsch?
Danke schon mal
burgerohnealles
Jonathan K. schrieb:> Jetzt sollte dieser Interrupt alle 1 / (16.000.000 / 1.024 / 256) = ca.> 61 Millisekunden ausgelöst werdenJonathan K. schrieb:> SET_BIT(TCCR2B, CS20);> SET_BIT(TCCR2B, CS22);
Dann stell deinen Prescaler auch auf 1024.
mfg.
Walter S. schrieb:> du verwendest timer2, dann musst du auch die Werte für timer2 nehmen
Ahh. Ok. Ich habe jetzt dieses Bit noch gesetzt, aber es funktioniert
trotzdem noch nicht ganz. Nach meinem Programm wird der Interrupt ca.
alle 32ms ausgelöst. Es müsste doch ca. alle 16ms sein. Wo ist jetzt der
Fehler?
Electronics'nStuff schrieb:> Electronics'nStuff schrieb:>> Naja, dann hast du offensichtlich die falsche Taktquelle.>> EDIT: Ich tippe mal auf interne Taktquelle, 8MHz.
Hab mal die Fuses gecheckt: FF DE 05 -> Das heißt Ext. Crystal Osc.
Der Arduino läuft mit 16Mhz. Das heißt daran kann es schon mal nicht
liegen.
Karl Heinz Buchegger schrieb:> Mach da mal> void loop () {>> while(changed == 0)> ;> changed = 0;>> long t = millis();> while(changed == 0)> ;> t = millis() - t;>> Serial.println(t);> changed = 0;> }>> draus.> je nach Baudrate braucht auch der println seine Zeit. Wenn du da einen> Timer-Interrupt verpasst, dann misst du die Zeit zwischen 2 Interrupts.
Das geht leider auch nicht. Der Arduino gibt immer noch 32 aus.
Hab jetzt nochmal ein bisschen herumprobiert. Ich dachte schon evtl. ist
mein Arduino kaputt. Aber mit der Library "TimerOne" funktionierts
perfekt. Der folgende Code sollte ca. alle 4 Sekunden die LED auf dem
Arduino ein-/ausschalten (1 / (16.000.000Hz/1024/65536) = ca. 4,2s).
Warum funktioniert der folgende Code nicht (die LED blink gar nicht)?