Gast
#1571403
Hallo! Ich versuche mit einem STK500 und ATMega16 mit Hilfe des Timer1 nach einer bestimmten Zeit eine ISR aufzurufen. Einstellungen sind wie folgt: - Der uC taktet mit 1Mhz in dem Auslieferungszustand - CTC Modus - Prescaler ist auf 64 eingestellt --> wenn der Timer1 also 1 Sekunde warten soll, bis ISR ausgelöst wird, muss bis 15625 gezählt werden Was soll passieren: 1. LED an PD5 und PD6 anschalten 2. LED an PD5 soll dauerhaft leuchten 3. Nach 1 Sekunde soll in die ISR gesprungen werden, wo LED an PD6 ausgeschaltet wird Mein Code: #define F_CPU 1000000L //Standardeinstellung 1MHz #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdlib.h> // Initialisierung vom Timer1 // als Clear Timer on Compare Match (CTC) Mode // (Mode 4 Tabelle 47 Atmega16 Datenblatt) void init_timer_1() { // Non-PWM, Tabelle 44 TCCR1A = 0x00; // Non-PWM Mode 4 (CTC), Tabelle 47 // Teiler 64, Tabelle 48 TCCR1B = (1<<WGM12) | (1<<CS11) | (1<<CS10); TCNT1H = 0; TCNT1L = 0; // Vergleichswert setzen. 1Mhz/64 => 1s //entspricht 15625 OCR1AH = ((15625 & 0xFF00) >> 8); OCR1AL = (15625 & 0x00FF); TIMSK = (1<<OCIE1A); } //Timerinterupt ISR(TIMER1_COMPA_vect) { // Ausgang PD6 ausschalten PORTD |= (1 << PD6); _delay_ms(1000); } int main (void) { // Pin 5 und 6 Ausgänge, Rest Eingänge (unbenutzt) DDRD = (1 << DDD5) | (1 << DDD6); // LED an PIN5 und PIN6 AN PORTD = (0<<PD5) | (0<<PD6); init_timer_1(); // Timer 1 initialisieren sei(); // Interupts global aktivieren while(1) { } return 0; } Was passiert ist folgendes: LED an PD5 und PD6 leuchten dauerhaft! Es wird kein Interrupt ausgelöst! Woran liegt das? Ich wäre echt dankbar, wenn sich jemand erbarmt und mir auf die Sprünge helfen könnte.