hallo muat, here we go:
das programm ist in assembler geschrieben, für den atmega8. ich hatte gerade keinen anderen controller da. ich denke, man muss nicht viel ändern für den atmega32.
es macht ein 800Hz PWM an OC1A bei 16MHz-Takt.
man braucht den interrupt, um die 800Hz frequenz zu bekommen. vielleicht hilft es dir weiter.Code:.NOLIST
.INCLUDE <m8def.inc>
.LIST
.def temp = r20
.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
rjmp overflow ; 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:
;Stackpointer
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;Aus/Eingänge
ldi temp, 2
out DDRB, temp ; Ausgang
ldi temp, (1<<COM1A0)|(1<<COM1A1)|(1<<COM1B1)|(1<<WGM10) ; set PWM mode (phase correct)
out TCCR1A, temp
ldi temp, (1<<CS10)|(1<<CS11)
out TCCR1B, temp
ldi temp, (1<<TOIE1)
out TIMSK, temp
sei ; Generelle Interruptfreigabe
ldi temp, 50 ; <--- hier PWM duty cycle. Achtung! 255 bedeutet 0% duty! kleinerer wert -> grösserer duty-cycle
out OCR1AL, temp
Main: ;----------------------------- Einsprungspunkt Main
nop
rjmp Main
overflow:
ldi temp, 200
out TCNT1L, temp
reti
dein deutsch ist gar nicht so schlecht, dafür dass du in der türkei wohnst.
gruesse von der katz
edit: ach so, du wolltest es in c. ist aber nicht schwer zu portieren.