Grüezi, ich habe mir kürzlich hier aus dem Forum folgenden Code "geklaut" und eine Testschaltung (Mega128, 16MHz) aufgebaut. Der Timerinterrupt soll alle 1ms aufgerufen werden, und die LED im 1s-Rhytmus blinken (also 1s an, 1s aus). Tut sie aber nicht, erst wenn ich liveled bis 4000 laufen lasse, dann kommt das hin. Wo liegt der Fehler ? Die Fuses stehen auf externem Takt.......... #include <avr/io.h> #include <avr/interrupt.h> volatile uint16_t liveled=0; int main() { DDRG = 0xff; // CTC-Mode einstellen TCCR0 =0; TCCR0 |= (1<<WGM21) | (0<<WGM20); // Prescaler einstellen 64 TCCR0 |= (1<<CS20) | (1<<CS21) | (0<<CS22); // CTC-Vergleichswert OCR0 = 250-1; // Compare-Interrupt aktivieren TIMSK |= (1<<OCIE0); // Hilfszaehler loeschen liveled = 0; sei(); while (1) { // LiveLED steuern if (liveled > 1000) { liveled = 0; PORTG ^= (1<<PG4); } } return 1; } ///////////////////////////////////////////////////////////////// // // ///////////////////////////////////////////////////////////////// ISR(TIMER0_COMP_vect) { liveled++; }
Kontrolliere mit dem Datenblatt diese Zeilen > TCCR0 |= (1<<WGM21) | (0<<WGM20); > TCCR0 |= (1<<CS20) | (1<<CS21) | (0<<CS22); Die Bitnummern CS2x erscheinen mir für Timer0 fischig. ^ ^ Wenn das nicht hilft, dann checke auch die M103C Fuse und die Bedeutung der Bits im Atmega103 Datenblatt.
Oh shit, wie blöde bin ich eigentlich. Danke Stefan:-)
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.