Hallo Leute,
ich habe hier ein ganz einfaches Testprogramm:
1 | #define F_CPU 8000000UL //Taktfrequenz auf 8 Mhz festlegen
|
2 |
|
3 | #include <avr/interrupt.h> //dient zur Behandlung der Interrupts
|
4 | #include <stdint.h> //definiert den Datentyp uint8_t
|
5 | #include <avr/io.h>
|
6 |
|
7 |
|
8 | uint8_t timer250ms = 0;
|
9 |
|
10 |
|
11 | int main (void)
|
12 | {
|
13 | //Ports initialisieren
|
14 | DDRD = 0b11111111; // PortD als Ausgang
|
15 | PORTD = 0b00000000; // Alle LEDs aus
|
16 |
|
17 | //Timer 1 konfigurieren alle 250ms
|
18 | TCCR1B |= (1<<CS11) | (1<<CS10);
|
19 | //Overflow Interrupt erlauben
|
20 | TIMSK |= (1<<TOIE1);
|
21 |
|
22 | sei();
|
23 |
|
24 | while (1)
|
25 | {
|
26 | if (timer250ms==3) PORTD = 0b11111111;
|
27 | }
|
28 |
|
29 | return 0;
|
30 | }
|
31 |
|
32 |
|
33 |
|
34 | ISR (TIMER1_OVF_vect)
|
35 | {
|
36 | // Vorfüllen des Timers
|
37 | TCNT1 = 34286; //8 Mhz
|
38 |
|
39 | timer250ms++;
|
40 | }
|
Eigentlich sollte der Timer vier Runden laufen und somit nach einer
Sekunde die LEDs an Port D schalten. Es passiert jedoch NICHTS :(
Wenn ich den Code wie folgt ändere klappt es:
1 | #define F_CPU 8000000UL //Taktfrequenz auf 8 Mhz festlegen
|
2 |
|
3 | #include <avr/interrupt.h> //dient zur Behandlung der Interrupts
|
4 | #include <stdint.h> //definiert den Datentyp uint8_t
|
5 | #include <avr/io.h>
|
6 |
|
7 |
|
8 | uint8_t timer250ms = 0;
|
9 |
|
10 |
|
11 | int main (void)
|
12 | {
|
13 | //Ports initialisieren
|
14 | DDRD = 0b11111111; // PortD als Ausgang
|
15 | PORTD = 0b00000000; // Alle LEDs aus
|
16 |
|
17 | //Timer 1 konfigurieren alle 250ms
|
18 | TCCR1B |= (1<<CS11) | (1<<CS10);
|
19 | //Overflow Interrupt erlauben
|
20 | TIMSK |= (1<<TOIE1);
|
21 |
|
22 | sei();
|
23 |
|
24 | while (1)
|
25 | {
|
26 |
|
27 | }
|
28 |
|
29 | return 0;
|
30 | }
|
31 |
|
32 |
|
33 |
|
34 | ISR (TIMER1_OVF_vect)
|
35 | {
|
36 | // Vorfüllen des Timers
|
37 | TCNT1 = 34286; //8 Mhz
|
38 |
|
39 | timer250ms++;
|
40 | if (timer250ms==3) PORTD = 0b11111111;
|
41 | }
|
Es ist ein sehr viel umfangreicheres Projekt welches ich zur Fehlersuche
soweit zurückgebaut habe das es so wie oben aussieht.
Braucht die while (1) Schleife mehr zu tun um mehrfach zu laufen? Wenn
ich die if-Abfrage in der while-Schleife weglasse, dann gehen die LEDs
auch an. Also einmal scheint die Schleife somit zu laufen.
Viele Grüße
Arnhold