Gast
#3389157
Schönen guten Abend, ich versuche seit 2 Stunden dieses Interrupt im ctc modus zum laufen zu bringen. Aber egal welche Zahl ich ins Register schreibe, die LED blinkt immer gleich schnell (bei dem geschriebenen Programm im Sekundentakt). Hat vielleicht jemand einen Tip für mich? Ich habe den verdacht dass mein Timer irgendwie nicht zurück gesetzt wird. Kann es sein dass der Timer nicht mit dem 20MHz quarz läuft? Vielen Dank im Vorraus Markus #include <avr/io.h> #include <asf.h> #include <math.h> #include <stdlib.h> #ifndef F_CPU #define F_CPU 20000000UL #endif #include <util/delay.h> #include <avr/interrupt.h> void servo_init(void); #define SERVOPIN 1 #define SERVOPORT PORTD #define DDRSERVO DDRD long double t=0; ISR(TIMER0_COMPA_vect) //interrupt { t++; } void servo_init(void) { TIMSK0|=(1<<OCIE0A); //interrupts TCCR0B |= (1<<CS00); //Prescale=1, TCCR0A |= (1<<WGM01); // CTC mode OCR0A = 200; //alle 10µs ein IRQ 0,00001s DDRSERVO|=(1<<SERVOPIN); //LED Pin als ausgang } int main (void) { servo_init(); sei (); //interrups an while(1) { if (t<20000)SERVOPORT|=(1<<SERVOPIN); //bis zum 20000. durchlaufen des Interrupts LED AN (200ms) else SERVOPORT &=(0<<SERVOPIN); //ab dann LED AUS if (t>40000) t=0; // bei 40000. interruptdurchlauf t zurücksetzen (insg. 400ms) } }