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:
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);
}
}
Die Variable "frequencyAdjustmentCounter" gilt komischerweise nur im Scope des Interrupt-Handlers!
Den Compiler-Aufruf habe ich auf das äußerste simplifiziert, es wird praktisch nur das mmcu Argument angegeben.
Woran kann das denn liegen?
Lesezeichen