DAC+DMA LPC1769

Gast #3342443
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
Angehängte Dateien:
Gast
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.