Forum: Mikrocontroller und Digitale Elektronik Dynamische DAC-Ausgabe mit DMA - Ideen gesucht


von dma_dac_Tester (Gast)


Lesenswert?

Moin, moin,

ich habe ein kleines Problem mit dem Xmega128a3 ;)

und zwar möchte ich den DAC über dma betreiben , funktioniert alles 
einwandfrei bis ich versuche die Ausgabe sehr dynamisch zu gestalten.

ich habe 2 Arrays mit einer länge von 300 vordefiniert in diese Arrays 
schreibe ich nun DAC-Wert rein nicht immer 300 aber zwischen 30 und 300. 
Während das eine Array vom DMAC auf den DAC ausgang geschickt wird will 
ich das andere Array neu beschreiben und danach direkt im Anschluss auch 
über DMAC an den DAC senden. Also einen ständigen wechsel zwischen den 
Arrays damit ich das eine neu beschreiben kann während das Andere 
ausgegeben wird

Lösungen die in Frage kommen ?

- DMAC in double Buffer-mode : geht nicht weil "TRFCNT"-Register immer 
unterschiedlich groß ist, da Array nicht immer voll geschrieben wird ( 
es sei denn jemand sagt mir das es doch geht ;) )

- DMA-ISR nutzen um die "SRCADDR" zu ändern : kA ob es klappt , bei mir 
bisher noch nicht und ich fürchte einen jitter zwischen den Ausgaben


Hat jemand noch Ideen ? ( ständige Ausgabe mit dynamischen Ausgabezeiten 
und Ausgabe-Buffern ohne Jitter )

grüße

von Basti M. (counterfeiter)


Lesenswert?

dma_dac_Tester schrieb:
> - DMA-ISR nutzen um die "SRCADDR" zu ändern : kA ob es klappt , bei mir
> bisher noch nicht und ich fürchte einen jitter zwischen den Ausgaben

vielleicht auch nicht so stark? Der DAC arbeitet doch mit 1MSample... 
wenn du zB. 32 MHz fährst, hast du 32 Ticks Zeit um den Interrupt 
auzulösen und darin einfach den anderen schon vorbereitet DMA Channel zu 
aktivieren...

Grüße

Basti

von Falk B. (falk)


Lesenswert?

Beide Buffer direkt hintereinander legen, bzw. einen doppelt so großen 
halbieren. PER DMA dauerhaft ausgeben. Die CPU muss nur immer in die 
richtige Hälfte schreiben. Könnte man per Timer rauskriegen, der snchron 
zur DMA läuft. Oder über passene ISRs, welche den Reload der DMA 
anzeigen.

von c-hater (Gast)


Lesenswert?

dma_dac_Tester schrieb:

> ich habe 2 Arrays mit einer länge von 300 vordefiniert in diese Arrays
> schreibe ich nun DAC-Wert rein nicht immer 300 aber zwischen 30 und 300.

Genau das ist der Blödsinn, der die Sache unnötig kompliziert macht. 
Schreibe einfach immer in denselben Puffer, bis der voll ist, erst dann 
tauschst du den Schreibpufferzeiger aus, wartest auf die DMA und 
schreibst dann einfach weiter, jetzt natürlich in den anderen Puffer.

Alles andere ist nur eine Variante des "Pferd von hinten aufzäumens".

von dma_dac_Tester (Gast)


Lesenswert?

Das mit dem einen Buffer voll laden schränkt mich ziemlich ein bei 
Periodischen Signalen. Da ich mit der Bufferlänge und dem 
Timer-Overflow-Event die Periodendauer von periodischen Signalen 
realisiere ( gute skalierbarkeit dadurch )

F_ziel = F_CPU/(Bufferlänge * TimerTick ),

würde ich nur die Bufferlänge ( bei minimaler Tick anzahl) benutzen 
würde die Skalierung nicht so schön sein und bei "langsamen" Signalen 
würde ich ziemlich lange in die Buffer schreiben.

Ich probiere das mal was Basti gesgat hat, hat sonst jemand ein Beispiel 
für die Einstellungen die ich für double-buffermode  des DMAC in 
verbindung mit dem DAC vornehmen muss ?

grüße

von c-hater (Gast)


Lesenswert?

dma_dac_Tester schrieb:

> Das mit dem einen Buffer voll laden schränkt mich ziemlich ein bei
> Periodischen Signalen.

Nein. Wenn dir das so vorkommt heißt das nur eins: du hast das Programm, 
welches in den Puffer schreibt, nicht korrekt designed.

von dma_dac_Tester (Gast)


Lesenswert?

Inwiefern ?

Wie kann ich denn , während mein DMAC den Puffer ausgibt feststellen an 
welcher Stelle im Puffer er ist um die Ausgaberate zu erhöhren oder zu 
vermindern ? Bzw wenn ich mit einer festen Ausgaberate arbeite wie 
stelle ich fest wo in meinem Puffer ich gerade bin ? Über den Overflow 
Interrupt n Counter starten (ab einen bestimmten Wert wieder in den 
Puffer von oben reinschreiben ) ?


grüße

von Falk B. (falk)


Lesenswert?

@ dma_dac_Tester (Gast)

>Wie kann ich denn , während mein DMAC den Puffer ausgibt feststellen an
>welcher Stelle im Puffer er ist

Das wird schweirig, geht wahrscheinlich nur über eine Zeitmessung 
mittels Timer.

>um die Ausgaberate zu erhöhren oder zu
>vermindern ?

Dieses Konzept ist ungünstig.

>Bzw wenn ich mit einer festen Ausgaberate arbeite wie
>stelle ich fest wo in meinem Puffer ich gerade bin ?

Wer ist ich? Deine CPU? Die weiß es doch durch das Programm. Den 
DMA-Controller sollte man als Black box betrachten und einfach laufen 
lassen.

> Über den Overflow
>Interrupt n Counter starten (ab einen bestimmten Wert wieder in den
>Puffer von oben reinschreiben ) ?

So in etwa.

von dma_dac_Tester (Gast)


Lesenswert?

Falk Brunner schrieb:
> So in etwa.

klingt schonmal schön ;) aber nicht nach "tu es genau so" :D was habe 
ich denn übersehen bzw nicht bedacht ?



Falk Brunner schrieb:
>>Bzw wenn ich mit einer festen Ausgaberate arbeite wie
>>stelle ich fest wo in meinem Puffer ich gerade bin ?
>
> Wer ist ich? Deine CPU? Die weiß es doch durch das Programm. Den
> DMA-Controller sollte man als Black box betrachten und einfach laufen
> lassen.

ja habe mich ein bisschen doof ausgedrückt ;-)



grüße

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.