Hallo! Für meine Bachelor-Arbeit muss ich ein Sinus-Signal mit dem LPC 1769 generieren. Dieses möchte ich zunächst in den SRAM schreiben, um es dann über DMA an den DAC zu übertragen. In einem Beispiel von NXP wird dazu der Timer des DAC verwendet, welcher, bei Null angelangt, einen DMA-Request des DAC auslöst. Dies geschieht, indem ein entsprechendes Request-Bit im Control-Register des DAC gesetzt wird. Nach der Übertragung wird ein Terminal Count Interrupt im DMA-Controller ausgelöst und danach der entsprechende Kanal initialisiert und konfiguriert. Letztendlich werden die Daten zyklisch übertragen. So verstehe ich das zumindest. Ich würde nun diese Übertraung gerne ohne Timer durchführen, da durch diesen die Frequenz der Signale gedrückt wird. Ansatt also den Timer zu verwenden, wollte ich den DMA-Request per Hand auslösen, indem ich das Request-Bit setze. Ist es überhaupt möglich, das so zu machen? Im Anhang ist der Code des Beispiels. In der Datei "dac_test_.c" habe ich den alternativen Code eingefügt. Dabei treten die folgenden Probleme auf: 1. Das Request-Bit wird in der main-Routine wieder zurückgesetzt, obwohl dies laut dem Manual (S.584) nur passiert, falls der DAC einen Wert erhält. 2. Der Terminal Count Interrupt wird mit dem alternativen Code trotzdem nie ausgelöst, was darauf hindeutet, dass keine Übertragung zustande kommt. Worin besteht mein Fehler? Viele Grüße, Robert
Hi, k.A. ob das geht. Aber mir stellt sich auch die Frage, warum? Wenn man schon Zeit hat, das Bit zu setzten, kann man doch auch gleich das Register beschreiben. Außerdem wird dir das ganze per Software auch ein Phasenrauschen bereiten. DMA wird eingesetzt, damit sich der Prozessor eben nicht drum kümmern muss. Wenn es ein DDS werden soll, muss man zum einstellen der Frequenz einfach die Überlaufzeit des Timers ändern.
Danke für deine Antwort. Meine Frage bezüglich des Timers kam folgendermaßen zustande: ich wollte ein direktes Beschreiben des DAC-Registers 1:1 mit DMA umsetzen, um den Prozessor nicht zu blockieren. Daher dachte ich, dass es eine Möglichkeit gibt, die Übertragung manuell zu starten. Am Ende der Übertragung kommt ohnehin ein Interrupt, in dessen Service Routine die Übertragung einfach wieder gestartet werden würde. Ich verstehe nicht, warum ich dazu einen Timer verwenden soll.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.