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.







Zitieren


Lesezeichen