25.01.2019, 01:38 PM
(Dieser Beitrag wurde zuletzt bearbeitet: 25.01.2019, 01:51 PM von alfsch.)
jo, gcc optimiert schon gut. aber bei sowas...ist selbst/assembler , mit zb nur 2 registern benutzt, die gesichert werden müssen, kaum von nem compiler zu erwarten.
+
mach doch, so wie es nu ist, auf 125khz rate. ist ja auch noch gut ausreichend , um bis 20k Ton zu erzeugen.
+
wenn pll in low power mode bringst, macht es 32 MHz und somit ist die volle pckl gleich passend für 125khz rate...und verbraucht weniger Saft.
ob der core dann noch auf 16MHz laufen kann -was er hier ja sollte- hab ich jetzt nich im Kopf...muttu DB befragen
hier ein Beispiel: DDS in asm, timer INT --- läuft mit 256kHz rate problemlos ( im sinus sind es rund 16 Befehle, bei 16MHZ sind die in < 2us durch...)
+ es wird nur sreg , 1 Register benutzt ! und push/pop gesichert. DAS macht der compiler sicher nicht so...
+
mach doch, so wie es nu ist, auf 125khz rate. ist ja auch noch gut ausreichend , um bis 20k Ton zu erzeugen.
+
wenn pll in low power mode bringst, macht es 32 MHz und somit ist die volle pckl gleich passend für 125khz rate...und verbraucht weniger Saft.
ob der core dann noch auf 16MHz laufen kann -was er hier ja sollte- hab ich jetzt nich im Kopf...muttu DB befragen
hier ein Beispiel: DDS in asm, timer INT --- läuft mit 256kHz rate problemlos ( im sinus sind es rund 16 Befehle, bei 16MHZ sind die in < 2us durch...)
+ es wird nur sreg , 1 Register benutzt ! und push/pop gesichert. DAS macht der compiler sicher nicht so...
Code:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
timer:
in sregsave, SREG ; Statusregister sichern
; Sägezahn und Rechteck bekommen eine Sonderbehandlung:
cpi waveform, t_square ; ist Rechteck eingestellt?
breq square ; wenn ja, springe zu square
cpi waveform, t_sawtooth ; ist Sägezahn eingestellt?
breq sawtooth ; wenn ja, springe zu sawtooth
;Bei Sinus oder Dreieck wird einfach der Wert aus dem Speicher gelesen
lpm ; Funktionswert aus dem Speicher lesen
add z1, change1 ; Phasenakkumulator
adc z2, change2
adc z3, change3
out PORTD, R0 ; Wert an den Analog-Digital-Wandler ausgeben
out SREG, sregsave ; Statusregister wiederherstellen
reti ; Interrupt verlassen, zurück zum Hauptprogramm
square: ; falls Rechteck:
add z1, change1 ; Phasenakumulator
adc z2, change2
adc z3, change3
cpi z3, 128 ; Wenn die Mitte einer Schwingungsperiode
; überschritten ist...
brlo square_1
out PORTD, null ; ...dann minimale Ausgangsspannung (0)
out SREG, sregsave ; Statusregister wiederherstellen
reti ; Interrupt verlassen, zurück zum Hauptprogramm
square_1:
out PORTD, full ; ...andernfalls maximale Ausgangsspannung
out SREG, sregsave ; (siehe oben)
reti ;
sawtooth:
add z1, change1 ; Phasenakkumulator
adc z2, change2
adc z3, change3
out PORTD, z3 ; Beim Sägezahn ist die Spannung proportional zur
; Position in der Phase, das höchstwertige Byte
; der Position kann also direkt an den AD-Wandler
; gegeben werden
out SREG, sregsave
reti
Don't worry about getting older. You're still gonna do dump stuff...only slower