Hallo ! Habe folgendes Problem: Mein ATmega168 läuft mit internen 8Mhz und ich versuche mit Hilfe des Timer/Counter 0 bei jedem Überlauf eine Variable hoch zu zählen. Das funktioniert auch, nur leider etwa 100 mal schneller als zuvor berechnet. Der Prescaler ist auf 1024 eingestellt, so sollte sich eine Frequenz von ungefähr 7800Hz einstellen. Die Zählervariable sollte also pro sec. ca. 30 mal erhöht werden. Wenn ich sie jedoch nach einer sekunde auslese steht die variable zwischen 3000 und 4000 ! Jemand eine idee waoran das liegen kann ? Gruß S.Dierking
PS: So erhöhe ich die Variable: ISR(TIMER0_OVF_vect) { tov0Counter++; }
Sören D. schrieb: > Jemand > eine idee waoran das liegen kann ? zb. an einem Fehler im Programm, welches wir leider nicht kennen.
Das Programm:
1 | int tov0Counter = 0; |
2 | |
3 | ISR(TIMER0_OVF_vect) |
4 | {
|
5 | tov0Counter++; |
6 | }
|
7 | |
8 | int main(void) |
9 | {
|
10 | |
11 | DDRB = (0<<DDB2) | (1<<DDB4) | (1<<DDB5); |
12 | DDRC = (0<<DDC0) | (0<<DDC1) | (0<<DDC2) | (0<<DDC3); |
13 | DDRD = (0<<DDD2) | (0<<DDD3) | (1<<DDD5) | (1<<DDD6) | (1<<DDD7); |
14 | |
15 | PORTB = (0x00); |
16 | PORTC = (0x00); |
17 | PORTD = (0x00); |
18 | |
19 | sei(); |
20 | TIMSK0=(1<<TOIE0); |
21 | TCCR0B = (1<<CS00) | (0<<CS01) | (1<<CS10); |
22 | EICRA = (1<<ISC00) | (1<<ISC01) | (1<<ISC10) | (1<<ISC11); |
23 | EIMSK = (1<<INT0) | (1<<INT1); |
24 | |
25 | while(1) |
26 | {
|
27 | if(tov0Counter == 300) |
28 | sbi(PORTD, 5); |
29 | }
|
30 | return 0; |
31 | }
|
Sören D. schrieb:
> int tov0Counter = 0;
1 | volatile int tov0Counter = 0; |
> sei(); Den sei macht man zum Schluss der Initialisierung, wenn alles eingerichtet ist. Du bringst ja auch zuerst die Pappkartons in Stellung, ehe du aus dem 2. Stock in die Kartons springst und nicht umgekehrt. > TIMSK0=(1<<TOIE0); > TCCR0B = (1<<CS00) | (0<<CS01) | (1<<CS10); CS10 hat bei der Konfiguration des Timers 0 nichts zu suchen. Die erste Ziffer ist der Timer, die zweite die Nummer des Konfigurationsbits TCCR0B = (1<<CS00) | (0<<CS01) | (1<<CS02); > EICRA = (1<<ISC00) | (1<<ISC01) | (1<<ISC10) | (1<<ISC11); > EIMSK = (1<<INT0) | (1<<INT1); Lass die restlichen Interrupts um Himmels willen abgeschaltet, wenn du keinen Interrupt Handler dafür hast! Tritt ein Interrupt auf, und du hast keine ISR, dann greift der Default: Der Prozessor wird resettet.
1. deine Variable muss volatile sein. 2. deine Timereinstellungen stimmen nicht, z. B. CS10 hat Timer 0 nicht. Das ist für den Timer 1. Timer 0 hat CS 00 01 und 02. Das Datenblatt vom 168 habe ich nicht zur Hand, aber ich denke, dass Atmel die Timer, respektive die Bitnamen, bei den Megas überall gleich benennt. Michael
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.