Forum: Mikrocontroller und Digitale Elektronik DAC+DMA LPC1769


von Robert (Gast)


Angehängte Dateien:

Lesenswert?

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

von Henning (Gast)


Lesenswert?

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.

von Robert (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.