ich hatte neulich ein ähnliches problem, allerdings in assembler und mit 33kHz. wenn du es dir umstrickst auf c dürft es aber gehen:
Code:
   .NOLIST                
   .INCLUDE <m8def.inc> 
   .LIST                    


   ; MCU Takt für diverse Berechnungen festlegen 
   .equ      tosc      = 1000000       

   ; Ausgabefreq festlegen 
   .equ      fout      = 33000 
    
   ; Timer 1 Ladewert 
   .equ      ladewert    = (tosc / (2 * fout)) - 1 

   .CSEG                    
   .org 0 


   ; Interupt Vektoren 
   rjmp    init             ; Reset Handler 
   reti                   ; IRQ0 Handler 
   reti                   ; IRQ1 Handler 
   reti                   ; Timer2 Compare Handler 
   reti                   ; Timer2 Overflow Handler 
   reti                   ; Timer1 Capture Handler 
   reti                   ; Timer1 CompareA Handler 
   reti                   ; Timer1 CompareB Handler 
   reti                   ; Timer1 Overflow Handler 
   reti                   ; Timer0 Overflow Handler 
   reti                   ; SPI Transfer Complete Handler 
   reti                   ; USART RX Complete Handler 
   reti                   ; UDR Empty Handler 
   reti                   ; USART TX Complete Handler 
   reti                   ; ADC Conversion Complete Handler 
   reti                   ; EEPROM Ready Handler 
   reti                   ; Analog Comparator Handler 
   reti                   ; Two-wire Serial Interface Handler 
   reti                   ; Store Program Memory Ready Handler


init:                   
   ldi    r16,   high(RAMEND); Stackpointer initialisieren 
   out    SPH,   R16 
   ldi    r16,   low(RAMEND) 
   out    SPL,   R16 

   ldi    r24,   255                 
   out    DDRB,   r24         ; Port B als Ausgang 
   out    DDRD,   r24         ; Port D auch 
   out    PORTC,  r24         ; Pullups von Port C aktivieren 
                        ; (-> damit hat dieser einen definierten Pegel 
                        ; und nicht osziliert sinnfrei rum) 




   ldi    r17,   (1<<COM1A0)   ; Timer 1 konfigurieren (Mode 4 -> CTC) 
   ldi    r16,   (1<<WGM12)|(1<<CS10) 
   out    TCCR1A,   r17 
   out    TCCR1B,   r16 

   ldi    r16,   high(ladewert) 
   out    OCR1AH,r16 
   ldi    r16,   low(ladewert) 
   out    OCR1AL,r16 


;   in      r16,   TIMSK      ; Diese auskommentierten Zeilen sind hier unnötig, 
;   ori       r16,   (1<<OCIE1A)   ; ich habe sie nur drinne gelasen um zu zeigen, 
;   out    TIMSK,   r16         ; wie ich es machen würde 

   sei                    ; Interrupts aktivieren
loop:                     ; hauptschleife 
   ldi    r24,   160 
   out    PORTD,   r24 

   ldi    r24,   0 
   out    PORTB,   r24         ; PD5+6 auf HIGH 

   ldi      r17,   0x09      ; delay loop, 1Hz 
WGLOOP0:  
   ldi      r18,   0xBC 
WGLOOP1: 
   ldi      r19,   0xC4 
WGLOOP2: 
   dec      r19 
   brne   WGLOOP2 
   dec      r18 
   brne   WGLOOP1 
   dec      r17 
   brne   WGLOOP0 
   nop 

   ldi      r24,   64 
   out      PORTD,   r24         ; PD5+6 auf HIGH

   ldi      r24,   1 
   out      PORTB,   r24         ; PD5+6 auf HIGH
    
   ldi      r17,   0x09      ; delay loop, 1Hz 
WGLOOP3: 
   ldi      r18,   0xBC 
WGLOOP4: 
   ldi      r19,   0xC4 
WGLOOP5: 
   dec      r19 
   brne WGLOOP5 
   dec      r18 
   brne   WGLOOP4 
   dec      r17 
   brne   WGLOOP3 
   nop 

   rjmp    loop
in der hauptschleife werden jeweils 2 ports für eine sekunde geschalten, derweil erzeugt OC1A ( am atmega 8 ) ein 33kHz signal.

vielleicht hilfts..(mir hat damals "Hanni" geholfen)

gruesse von der katze