Ok also das mit den 255kHz leuchtet ein 
Allerdings kann ich ja auch den Timer einfach hochzählen lassen und dann den einfach prüfen ob der Wert in TCNT1 kleiner oder größer des vorgegebenen Wertes ist. Habe hier den Code eben genau so umgebastelt. Die Frequenz stimmt, allerdings der duty cycle nicht
Laut Datenblatt ist der Top-Wert ja ICR1, folglich müsste ICR1 / 2 einen 50% duty cycle ergeben. Leider kommt dies nur bei ca. 5kHz hin 
Code:
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
#define F_PWM 1000
#define PWM_RES 255
#define Prescaler 8
#define ICR1_val ((F_CPU / F_PWM) / Prescaler) - 1
uint8_t PWM_setting[8];
int main(void){
TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11); // CTC mode prescaler 8
ICR1 = (uint16_t)ICR1_val;
DDRC = 0xFF;
for(uint8_t i = 0; i < 8; i++){
PWM_setting[i] = ICR1_val / 2; // 50% duty cycle
}
while(1){
for(int i = 0; i < 8; i++){
if( TCNT1 < PWM_setting[i] ){
PORTC |= (1<<i);
}
else{
PORTC &= ~(1<<i);
}
}
}
return 0;
}
Lesezeichen