PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Softwar PWM



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

Hanni
10.04.2006, 04:15
Jo, es gibt bessere Lösungen.
Deine Routine der PWM Erzeugung doch etwas ineffizient.

hier mal nen kleines Beispiel, wie man es noch machen könnte:



clr output
cp cout, pwm
ror output
out PORTB, output


Soll das ganze nun nichtinvertiert ausgegeben werden, sind lediglich 2 weitere Zeilen fällig:



clr output
cp cout, pwm
ror output
com output
andi output,0b00000001
out PORTB, output


Diese Beispiele gelten allerdings nur, wenn wenn der Rest des Ports nicht belegt ist oder als Eingang definiert wurde (wie in diesem Fall)

Desweiteren hat der Code den Nachteil, das das ganze mit den Werten 0 & 255 nicht so recht funktionieren dürfte ...
Allerdings kann man damit auch mal eben ne 8 Kanal Software PWM realisieren ...

BTW: leg dir nen Tiny 2313 zu .. damit wirste mehr freude haben ... der AT90S2313 zählt zu den Chips, die nicht mehr für neue Designs verwendet werden sollten.


Grüße, da Hanni.

teslanikola
10.04.2006, 14:14
BTW: leg dir nen Tiny 2313 zu .. damit wirste mehr freude haben ... der AT90S2313 zählt zu den Chips, die nicht mehr für neue Designs verwendet werden sollten.


hmm wenn du ca. 15 90s2313 rumfahren hättest und du dich mit deren Registern und so schon einigermansen auskennst was würdest du machen? Sie wegschmeißen? Jo klar das es den Tiny gibt aber ich werde da wohl erst noch meine 2313er verschaffen, befohr ich mir neue kaufe.

Danke für deinen Tipp, die ROR befehl kannte ich noch nicht.

Hanni
10.04.2006, 14:17
Hehe, kein Problem ... diese Variante hab ich auch in nem Forum gefunden, wieso also net weitergeben :D

Bernhard.Erfurt
14.04.2006, 17:25
Habe gerade zu diesem Thema etwas veröffentlicht:

http://www.mikrocontroller.net/forum/read-4-335961.html

Bei 16 MHz Takt eine 40KHz PWM, allerdings ohne Timer, denn der bremst zu stark, braucht zu viele Takte.

Bernhard

Hanni
14.04.2006, 18:09
Mag sein ... nur, in den seltensten fällen brauch ich nur ne PWM ...
Übrigens, ne reine Hardware PWM schafft beim Mega 8 @ 16 MHz immernoch 62.5 kHz ....

Im übrigen geht es hier ja nicht nur um einen Kanal ... wo du sicherlich überlegen bist (von der Frequenz her) sondern um was erweiterbares ...
Ich kann von mir zumindest behaupten, das meine PWM mit 8 Kanälen immernoch mit der selben Frequenz läuft ....

BTW: welche Auflösung hat deine PWM (also wieviele Schritte)

Nachtrag: Wenn man wirklich ne richtig schnelle PWM braucht kann man diverse Tinys verwenden, die dicke 400 kHz schaffen ...