teslanikola
10.04.2006, 00:22
Hi leute, ich hab mit die aufgabe gestellt einen erweiterbaren ( Kannäle ) Soft-PWM zu schrieben, hier mal mein ergebnis:
;µ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
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?
Grezzles teslanikola
;µ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
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?
Grezzles teslanikola