Hallo
sei() und cli() sind in interrupt.h. Ich habe dir mal mein Programm auf's nötigste geputzt, ich hoffe, es funzt so:
Code:
#include <avr/io.h> // I/O Port definitions
#include <avr/interrupt.h> // Interrupt macros
uint8_t x, y, z;
void delay(uint16_t d)
{
uint16_t d1, dummy;
for (d1=d; d1>0; d1--) dummy^=d1;
}
void init(void)
{
cli();
DDRA |= 16;
DDRC |= 3;
TCCR0 = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0 |= (0 << COM00) | (0 << COM01); // ohne OCR-Pin
TCCR0 |= (0 << CS02) | (1 << CS01) | (0 << CS00); // prescaler /8
TIMSK = (1 << OCIE0); // Interrupt ein
OCR0 = 9; // 100kHz?
sei();
}
ISR(TIMER0_COMP_vect)
{
static uint16_t count=0;
if(count>x) PORTA &= ~16; else PORTA |= 16;
if(count>y) PORTC &= ~1; else PORTC |= 1;
if(count>z) PORTC &= ~2; else PORTC |= 2;
if(count<1000)count++; else count=0;
};
int main(void)
{
init();
z=105; y=110; x=90; delay(50000);
z=90; delay(10000);
while(1);
return 0;
}
Die Funktion delay() habe ich inzwischen so gelöst:
Code:
volatile uint16_t count, time;
void delay(uint16_t d) // Warteschleife
{
d+=time; while(d>time);
}
und in der ISR:
if (count < 1000) count++; else { count=0; time++; }
Gruß
mic
Lesezeichen