Klappt leider nicht, es scheint als würde TCCR2 nicht auf Null gesetzt werden. Oder der Timer gleich wieder gestartet.
Mein Code sieht komplett im Moment so aus:
Code:
#include <avr/io.h> // I/O Port definitions
#include <avr/interrupt.h> // Interrupt macros
#define F_CPU 16000000
#define timer 236
volatile int ms = 0;
void pwm_init(void)
{
TIMSK |= (1<<TICIE1);
//Timer 1 (Port 0/1)
TCCR1A = (1<<COM1A1)| (1<<COM1B1); //Clear OC on Comp Match when up-count, set downcount
TCCR1B = (1<<WGM13) | (1<<CS11) ; //PWM Phase abd Freq Correct. Prescaler 8
ICR1 = 20000; //Periodendauer Servo 20ms
OCR1A = 1000; //Servosignal (Port 0)
OCR1B = 1000; //Servosignal (PORT 1)
//Timer 2 (Port 2)
TCCR2 = (1<<WGM20)| (1<<COM21) /*| (1<<CS21)*/ | (1<<CS22);
OCR2 = 150;
};
ISR(TIMER2_OVF_vect)
{
TCCR2 = 0x00;
};
ISR(TIMER1_CAPT_vect)
{
TCCR2 = (1<<WGM20) | (1<<COM21) | (1<<CS22);
};
/*void timer_init(void)
{
TCCR0 |= (1<<CS01);
TCNT0 = timer;
TIMSK |= (1<<TOIE0);
TIFR |= (1<<TOV0);
};
ISR(TIMER0_OVF_vect)
{
TCNT0 = timer;
ms++;
if (ms >= 1000)
{
OCR1A++;
ms = 0;
}
if (OCR1A >= 2000)
OCR1A = 1000;
};*/
int main(void)
{
//Initialisierungen
sei(); //Globale Interupts zulassen
pwm_init(); //PWM initialisieren
/*timer_init(); //Timer initialisieren*/
DDRB |= (1<<PORTB1) | (1<<PORTB2) | (1<<PORTB3); //B... AUSGANG
PORTB &= ~((1<<PORTB1) | (1<<PORTB2) | (1<<PORTB3)); //B.. Low
while(1)
{
}
}
Lesezeichen