Ich habe den Fehler gefunden: Hardware Fast PWM funktioniert folgendermaßen: bei überganz von TOP zu BOTTOM wird auf HIGH gesetzt, und beim compare-match auf LOW.
Mit dem Programm haben wir jetzt das "HIGH setzen" übersprungen, was natürlich scheiße ist....
Hier ist das fertige Programm (8MHz)
Code:#include <avr/io.h> //I/O Port definitions #include <avr/interrupt.h> //Interrupt macros #include <util/twi.h> //TWI STATUS /*----------------------------------------------------------------------------------------*/ //PWM /*----------------------------------------------------------------------------------------*/ //750 = 1.5ms volatile int schulter= 750; volatile int huefte = 750; volatile int knie = 750; void pwm_init(int schulter, int huefte, int knie); //PWM_init Funktion //void pwm_chance(int schulter, int huefte, int knie);//Anpassen der PWM grössen /*----------------------------------------------------------------------------------------*/ //MAIN AUFRUF /*----------------------------------------------------------------------------------------*/ int main(void) { DDRB = 0xFF; //B... AUSGANG PORTB &= ~((1<<PORTB1) | (1<<PORTB2) | (1<<PORTB3)); //B.. Low sei(); //Globale Interupts zulassen pwm_init(schulter, huefte, knie); //PWM initialisieren while(1) { } } ISR(TIMER2_COMP_vect) //Überlaufinterupt Timer2 { TCCR2 &= 0x00; //Löschen von Timer2 } ISR(TIMER1_CAPT_vect) //Captureinterupt Timer1 { TCNT2 = 255; TCCR2 = (1<<WGM20) | (1<<WGM21) |(1<<COM21) | (1<<CS22) | (1<<CS20); //Setzten von Timer2 } void pwm_init(int schulter, int huefte, int knie) //PWM initialisieren { TIMSK |= (1<<TICIE1) | (1<<OCIE2); //Interupt initialisieren, freischalten //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 = 10000; //Periodendauer Servo 20ms OCR1A = schulter; //Servosignal (Port 0, Schulter) OCR1B = huefte; //Servosignal (PORT 1, Hüfte) //Timer 2 (Port 2) TCCR2 = (1<<WGM20)| (1<<WGM21) | (1<<COM21) | (1<<CS22) | (1<<CS20); //Fast PWM OCR2 = (knie/8); //Servosignal (Port2, Knie) }







Zitieren

Lesezeichen