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
Lesezeichen