Hi,
ich habe eine Funktion in Assembler geschrieben, die es erlaubt, von
einer beliebigen Frequenz die Steuerwörter für den DDS Baustein zu
bilden. Augenmerk lag dabei auf die Ausführungsgeschwindigkeit. Mit 67
bis 74 Takten dürfte dies mit die schnellste Version sein (bei 16MHz
sind das nur 4,2 bis 4,6µs). Die maximale Abweichung vom exakten
Ergebnis sollte bei 1 Bit liegen (dürfte nur selten auftreten).
Ich würde nun gerne wissen, wie man diese Funktion platzsparend als
Schleife ausführen könnte. Mein Ansatz wäre, den Abschnitt calcAA über
alle Bereiche laufen zu lassen (ggf. mit einer weiteren internen
Schleife). Die "magischen Zahlen" könnten doch mittels Pointer zugeführt
werden. Man könnte auch einen zweiten Pointer über die Register laufen
lassen (oder über den Ram), wo die Frequenz hinterlegt ist. Allerdings
komme ich da auf die dreifache Laufzeit. Lässt sich hier Speicherplatz
überhaupt sinvoll einsparen?
Das sind meine ersten Schritte mit Assembler und Atmega, Kommentare sind
also gerne erwünscht. Als größeres Ziel habe ich mir gesetzt, einen
kleinen Signalgenerator zu bauen, der auch simple Modulationsverfahren
beherrscht (erst einmal Sachen wie OOK, FSK). Der Code kann gerne
kopiert werden.
1
;table:
2
;you could get another bit of resolution out of this, if you shift all bits in the table one time to the left (the AD9850 accepts words up to 7FFFFFFF).
3
;if you want to sacrifice the X0Mhz range, you could get even further
4
;if you want to gain more speed, you can drop the rounding and the .XX Hz range
5
;12 34 56 78.90 Hz / 2^8 calculated
6
;.. .. .. .. EE 01010111 x 90 = 7830 30,5859375 30,9237645312
Hallo,
und auf welcher DDS-Taktfrequenz basiert der Ansatz ?
Wie kann die DDS-Taktfrequenz korrigiert werden ?
Wenn die Taktfrequenz etwas daneben liegt ?
Hinausgeschieben müssen die 32 Bit ja auch noch. Und da das
nicht beliebig schnell geht bietet es sich vielleicht an
geschachtelt (interleaved) zu rechnen. Also ein Byte rechnen
und gleich rausschreiben, wieder ein Byte rechnen usw. Dann
kann man - während die SPI aktiv ist - ein Byte rechnen ohne
auf das Busy Flag zu warten. Das muss man aber später noch
nachholen ....
So haben wir das früher auf dem Apple (II/IIGS) gemacht.