Sieht jemand den Fehler? Der Timer triggert leider nicht meine LED. Der Controller läuft mit einem 14.7456MHz Quarz, bei einem Prescaler von 1024 erwarte ich 14400 Interrupts in der Sekunde. Bei einer Zählvariable von 5000 sollte ich doch etwas an der LED sehen. Die flackert nicht mal. Vielleicht sieht jemand den Fehler, ich probier jetzt seit 2std rum... Vielen Dank und Gruß Spice [c] //Atmega128L, STK500 #include <avr/io.h> #include <avr/interrupt.h> #include "defines.h" #define F_CPU 14745600L void Timer_start(void); void Timer_stop(void); volatile unsigned int timer=0; ISR(TIMER0_OVF_vect) { timer++; if (timer >= 5000) { timer = 0; PORTB ^= (1 << LED1); } } int main (void) { DDRB |= (1 << LED1); Timer_start(); sei(); while(1) { ; } return 0; } void Timer_start(void) { timer = 0; TCCR0 = 0; //Register resetten TIMSK = (1 << TOIE0); //Overflow Interrupt enablen TCCR0 |= (1 << CS02); TCCR0 |= (1 << CS01); TCCR0 |= (1 << CS00); //Prescaler 1024, Timer starten TCNT0 = 0; } void Timer_stop(void) { timer = 0; TCCR0 = 0; TIMSK &= ~(1 << TOIE0); TCNT0 = 0; } [\c]
SORRY
1 | //Atmega128L, STK500
|
2 | |
3 | #include <avr/io.h> |
4 | #include <avr/interrupt.h> |
5 | #include "defines.h" |
6 | #define F_CPU 14745600L
|
7 | |
8 | void Timer_start(void); |
9 | void Timer_stop(void); |
10 | |
11 | volatile unsigned int timer=0; |
12 | |
13 | ISR(TIMER0_OVF_vect) |
14 | {
|
15 | timer++; |
16 | if (timer >= 5000) |
17 | {
|
18 | timer = 0; |
19 | PORTB ^= (1 << LED1); |
20 | }
|
21 | }
|
22 | |
23 | |
24 | int main (void) |
25 | {
|
26 | DDRB |= (1 << LED1); |
27 | Timer_start(); |
28 | sei(); |
29 | while(1) |
30 | {
|
31 | ;
|
32 | }
|
33 | |
34 | return 0; |
35 | }
|
36 | |
37 | void Timer_start(void) |
38 | {
|
39 | timer = 0; |
40 | TCCR0 = 0; //Register resetten |
41 | TIMSK = (1 << TOIE0); //Overflow Interrupt enablen |
42 | TCCR0 |= (1 << CS02); |
43 | TCCR0 |= (1 << CS01); |
44 | TCCR0 |= (1 << CS00); //Prescaler 1024, Timer starten |
45 | TCNT0 = 0; |
46 | }
|
47 | |
48 | void Timer_stop(void) |
49 | {
|
50 | timer = 0; |
51 | TCCR0 = 0; |
52 | TIMSK &= ~(1 << TOIE0); |
53 | TCNT0 = 0; |
54 | }
|
Spice schrieb: > Der Controller läuft mit einem 14.7456MHz Quarz, bei einem Prescaler von > 1024 erwarte ich 14400 Interrupts in der Sekunde. Bei einer Zählvariable > von 5000 sollte ich doch etwas an der LED sehen. Nein, es sind 56,25 Interrupts pro Sekunde (14745600/1024/256), und bei einer Zählvariablen von 5000 blinkt die LED dann ungefähr alle 89 Sekunden. Wartest du so lange?
Danke für die Antwort, jo warte schon etwas länger, ca 2.5std jetzt :-) Aber der Controller scheint irgendwie durchzudrehen... Der läßt sich jetzt nicht mehr Programmieren, obwohl die Fuses richtig gesetzt sind.
so nun läßt er sich wieder programmieren. Aber trotzdem keine Interrupts... Kann es an der Timer-Initialisierung liegen, ich meine ist zwar nicht viel was man falsch machen kann, aber komischerweise kommt kein Interrupt?
Also erstmal den Puls des kleinen Patienten fühlen... Wie schnell blinkt das folgende Programm, wenn du es mit -Os Optimieroption übersetzt?
1 | //Atmega128L, STK500
|
2 | |
3 | #define F_CPU 14745600L
|
4 | #include <avr/io.h> |
5 | #include <util/delay.h> |
6 | #include "defines.h" |
7 | |
8 | int main (void) |
9 | {
|
10 | DDRB |= (1 << LED1); |
11 | while(1) |
12 | {
|
13 | PORTB ^= (1 << LED1); |
14 | _delay_ms(1000); |
15 | }
|
16 | }
|
genau das hatte ich auch getestet, bevor ich mit dem Interrupt angefangen hab, "sekundengenau" (komischerweise!!!)... Weil ich vermute dass es entweder an den Fuses oder an den Jumper Einstellungen beim STK500/501 lag.
Ist deine LED ein oder aus? Lass doch mal den Teiler in der iSR weg. Wenn die ISR aufgerufen wird, dann sollte die LED so mit halber Helligkeit leuchten. Blöde Frage: Die M103C Fuse ist nicht zufällig noch eingeschaltet? Bei normalen Funktionen kommt der Compiler noch mit inlinen um den Funktionsaufruf rum. Aber spätestens bei ISR Aufrufen ist diese Fuse tödlich.
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.