Hallo Leute, ich bin ein blutiger Anfänger und trau mich kaum ne Frage über Timer zu stellen, aber ich seh den Wald vor lauter Bäumen wohl nicht mehr. Ich hab mal meinen kompletten C Code angehängt, aber ich wollte kurz auf die interessanten Teile eingehen: Ich hab nen externen Crystal mit 16GHz an nem Atmega644 Meine Frage ist nun, wenn ich oben in meinem Timer die Kommentare weg mache, dann blinken die LEDs alle 3 bis 4 Sekunden auf einmal unregelmäßig, danach für 3 Sekunden wieder normal. Mach ich was Grundlegendes falsch? Mache ich zu viele Berechnungen im Timer? Ich hab den Timer mit Clear Timer on Compare Match eingestellt:
1 | void timerInit(void) { |
2 | TCCR0A = (1 << WGM01); //Mode2: CTC Clear Timer on compare match |
3 | TCCR0B = (1 << CS01) | (1 << CS00); // prescaler = 64 |
4 | OCR0A = 250; //250 Takte = 1ms |
5 | |
6 | // TCCR1A = 0; // kein pwm
|
7 | TIMSK0 = (1 << OCIE0A); //Compare Interrupt aktivieren |
8 | }
|
9 | |
10 | Meine Timer Interrupt Funktion sieht so aus: |
11 | ISR (TIMER0_COMPA_vect) { |
12 | if (led1on) |
13 | led1on--; |
14 | millisekunden++; |
15 | /* if(millisekunden == 1000) {
|
16 | sekunde++;
|
17 | millisekunden = 0;
|
18 | }
|
19 | if(sekunde == 60) {
|
20 | minute++;
|
21 | sekunde = 0;
|
22 | }
|
23 | if(minute == 60) {
|
24 | stunde++;
|
25 | minute = 0;
|
26 | }*/
|
27 | }
|
28 | |
29 | Dann hier noch meine main: |
30 | int main(void) { |
31 | |
32 | uint16_t delay; |
33 | |
34 | cli(); |
35 | systemInit(); |
36 | timerInit(); |
37 | sei(); |
38 | while (1) { |
39 | if (IN(SWITCH_PORT, SWITCH_PIN)) |
40 | delay = 500; |
41 | else
|
42 | delay = 1000; |
43 | if (!led1on) { |
44 | leds(); |
45 | led1on = delay; |
46 | |
47 | }
|
48 | }
|
49 | }
|