Hi leute, ich hab mit die aufgabe gestellt einen erweiterbaren ( Kannäle ) Soft-PWM zu schrieben, hier mal mein ergebnis:
Jetztz das prob, ich kann ja nur geringe PWM frequenzen erzeugen, gäbs ne bessere Lösung? Wie ist mein Code? Kann man noch was verbessern?Code:;µC-Typ bestimmen
.include "2313def.inc" ; AT90S2313
;Register definition
.def tmp = r16 ; Allgem. Arbeitsregister
.def pwm = r17 ; PWM Vergleichswert
.def cout = r18 ; Zähler
;Interupt Config. I
.org 0000
rjmp start
.org OVF1addr ; Sprungvektoren einrichten
rjmp ovf1
Start:
;IO Config.
ldi tmp, (1<<PB0) ; Pinb.0 als Ausgan setzen
out ddrb, tmp
;Interupt Config II
ldi tmp, (1<<TOIE1) ; Timer1 Interrupt
out timsk, tmp ; aktivieren
clr tmp ; TCCR1 High auf 0
out tccr1a,tmp
ldi tmp,(1<<ICNC1)|(1<<CS10) ; Noiscanceler deaktiv.
out tccr1b,tmp ; Timer1 Clock = Clock
ldi tmp,0xff ; Timervorgabewerte:
out tcnt1h, tmp ; Highbyte= 0xff
ldi tmp,0xfa ; Lowbyte = 0xfa
out tcnt1l, tmp
sei ; Interuptts freigeben
;Hauptprogramm
main:
ldi pwm, 255
rjmp main
;Timer1 Overflow Interrupt
ovf1:
push tmp
in tmp, sreg
push tmp
ldi tmp,0xff ; Timervorgabewerte:
out tcnt1h, tmp ; Highbyte= 0xff
ldi tmp,0xfa ; Lowbyte = 0xfa
out tcnt1l, tmp
cpi cout,255
brne notzero
cbi portb, pinb0
notzero:
cp cout,pwm
brne noteq
sbi portb, pinb0
noteq:
dec cout ; Zählerwert erhöhen
pop tmp
out sreg,tmp
pop tmp
reti
Grezzles teslanikola