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
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
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.
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".
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
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.
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
@ 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.