Hallo zusammen! Zunächst einmal vielen Dank für dieses Forum. Konnte in den letzten Jahre immer wieder auf jede Menge nützliche Tips zurückgreifen und viel lernen. Jetzt komme ich aber nicht mehr weiter. Ich möchte gerne eine Art "Uhr" in den Controller einbauen. Jede Millisekunde wird die ISR aufgerufen und inkrementiert die Variable __Time_ms um 1. In der Haupt-While-Schleife wird überprüft, ob 500ms vergangen sind. Ist dem so, dann wird eine LED aktiviert bzw. deaktiviert. Jedoch blinkt die LED nicht regelmäßig. Ab und zu sind es nicht die veranschlagten 500ms, sondern weniger, bis sich der Status der LED ändert. Hab ich was offensichtliches übersehen? Anbei der Code:
1 | /****************/
|
2 | /* Bibliotheken */
|
3 | /****************/
|
4 | |
5 | #include <avr/io.h> |
6 | #include <avr/interrupt.h> |
7 | #include <util/delay.h> |
8 | #include "clock.h" |
9 | #include "led.h" |
10 | |
11 | |
12 | /****************/
|
13 | /* Prototypen */
|
14 | /****************/
|
15 | |
16 | void initAll (void); |
17 | |
18 | |
19 | |
20 | /*********************/
|
21 | /* Globale Variablen */
|
22 | /*********************/
|
23 | |
24 | volatile uint32_t __Time_ms = 0; |
25 | |
26 | |
27 | |
28 | /********************************************/
|
29 | /*-------PROGRAMMCODE-----------------------*/
|
30 | /********************************************/
|
31 | |
32 | /*****************/
|
33 | /* MAIN-Funktion */
|
34 | /*****************/
|
35 | |
36 | int main (void) |
37 | {
|
38 | uint32_t oldTime=0; |
39 | uint8_t ledStatus=0; |
40 | |
41 | |
42 | initAll(); |
43 | |
44 | |
45 | while (1) |
46 | {
|
47 | if ((oldTime + 500) < CLOCK_SystemTime()) |
48 | {
|
49 | if (ledStatus) |
50 | {
|
51 | LED_OnOff(0); |
52 | ledStatus = 0; |
53 | }
|
54 | else
|
55 | {
|
56 | LED_OnOff(1); |
57 | ledStatus = 1; |
58 | }
|
59 | oldTime = CLOCK_SystemTime(); |
60 | }
|
61 | }
|
62 | |
63 | return 1; |
64 | }
|
65 | |
66 | |
67 | |
68 | /****************/
|
69 | /* Funktionen */
|
70 | /****************/
|
71 | |
72 | void initAll (void) |
73 | {
|
74 | LED_Init(); |
75 | |
76 | TIMSK0|=1<<TOIE0); |
77 | TCCR0A |= (1<<CS01) | (1<<CS00); //Set Timer0 prescaler 64 |
78 | |
79 | sei(); |
80 | }
|
81 | |
82 | |
83 | |
84 | |
85 | |
86 | /***********************************************************/
|
87 | /*-------------INTERRUPT SERVICE ROUTINEN------------------*/
|
88 | /***********************************************************/
|
89 | |
90 | ISR (TIMER0_OVF_vect) |
91 | {
|
92 | __Time_ms++; |
93 | TCNT0 = 5; |
94 | }
|