Danke, du hast mir sehr geholfen.
Der Overflow-Timer wird nun brav in der richtigen Frequenz aufgerufen.
Allerdings habe ich ein neues Problem! Wenn ich im Interrupt-Handler auf globale Variablen zugreife, vergessen diese ihren Zustand beim nächsten Call. Die Variablen sind als volatile deklariert:
Die Variable "frequencyAdjustmentCounter" gilt komischerweise nur im Scope des Interrupt-Handlers!Code:#ifndef MCU #define __AVR_ATmega8515__ #endif #ifndef F_CPU #define F_CPU 4000000UL #endif #include <avr/io.h> #include <avr/interrupt.h> #include <avr/portpins.h> #include <util/delay.h> #include <inttypes.h> volatile uint8_t frequencyAdjustmentCounter = 0; volatile uint8_t frequencyAdjustmentThreshold = 14; ISR(TIMER0_OVF_vect) { frequencyAdjustmentCounter++; //ist nach durchlaufen des handlers wieder 0 ohne Port C zu schalten! if(frequencyAdjustmentCounter == frequencyAdjustmentThreshold) { PORTC = ~PORTC; frequencyAdjustmentCounter = 0; } } int main() { DDRA = 0xff; PORTA = 0x0f; DDRC = 0xff; PORTC = 0x0f; TIMSK |= (1 << TOIE0); //overflow timer einschalten TCCR0 = (1 << CS02) | (0 << CS01) | (1 << CS00); //prescaler auf 1024 sei(); while(1) { PORTA = ~PORTA; _delay_ms(500); } }
Den Compiler-Aufruf habe ich auf das äußerste simplifiziert, es wird praktisch nur das mmcu Argument angegeben.
Woran kann das denn liegen?







Zitieren

Lesezeichen