Hallo zusammen. Ich moechte gerne ein Array moeglichst schnell auf einem Port ausgeben. Das Array ist zu gross fuer das RAM und muesste deshalb im Flash landen. Kann man per DMA auf diesen Bereich zugreifen? Ich habe die Forensuche und Suchmaschinen versucht, aber keine Informationen hierzu gefunden. Ueber jeden Hinweis, Link, SuchmaschinenEingabefeldText wuerde ich mich sehr freuen. Danke, schoenen Gruss, Balze aka AVR Noob P.S.: Mir ist klar, dass es sicherlich elegantere Moeglichkeiten als die von mir oben beschriebene gibt. Mir geht es hier darum ob und wie es generell moeglich ist mit einem XMEGA per DMA auf den Flashbereich zuzugreifen.
Avr Noob schrieb: > Das Array ist zu gross fuer das RAM und muesste deshalb im Flash landen. > > Kann man per DMA auf diesen Bereich zugreifen? Nein. Du kannst aber per DMA einen RAM-Block ausgeben und per DMA-Interrupt einen Block aus dem Flash in den RAM-Block kopieren. Avr Noob schrieb: > Mir geht es hier darum ob und wie es > generell moeglich ist mit einem XMEGA per DMA auf den Flashbereich > zuzugreifen. Nein, wie gesagt, ist das nicht möglich.
Hallo Knut, vielen Dank fuer die schnelle Antwort. Auch wenn sie wenig erfreulich ist. Kannst Du mir eine Quelle nennen, in der ich das nachlesen kann? Ich moechte das gerne verstehen. MfG, Balze aka AVR Noob
Avr Noob schrieb: > Kannst Du mir eine Quelle nennen, in der ich das nachlesen kann? > Ich moechte das gerne verstehen. Das XMEGA-A-Manual. http://www.atmel.com/dyn/resources/prod_documents/doc8077.pdf
Hallo Knut, :) Danke fuer den Link :) Dieses Dokument ist mir sehr wohl bekannt. Nur habe ich die Stelle an der steht das DMA mit Flash nicht moeglich ist nicht gefunden (oder es nicht verstanden. Bin eben trotz meines fortgeschrittenen Alters immernoch ein Noob :) MfG, Balze aka AVR Noob
Knut Ballhause schrieb: > .... und per > DMA-Interrupt einen Block aus dem Flash in den RAM-Block kopieren. Damit meinst Du in einer ISR und pgm_read_byte ? MfG, balze aka AVR Noob
Avr Noob schrieb: > Damit meinst Du in einer ISR Ja. Avr Noob schrieb: > und pgm_read_byte Was auch immer das sein mag. In ASM lade ich den Z-Pointer mit der zu lesenden Flash-Byte-Adresse und führe den Befehl "LPM" aus. Der X-Pointer zeigt auf die jeweilige RAM-Puffer-Adresse. Beide werden nach der Operation incrementiert. Das mache ich beispielsweise 16x, dann habe ich für die Zeit von 16 DMA-Triggern Ruhe. Über geschicktes Kombinieren von DMA-Ausgaben und zeitversetzt nachladendem Interrupt kann der Controller in der Zwischenzeit noch viele andere Dinge treiben...
Danke fuer Eure Infos! Ich glaube allmaehlich, dass man die µCs besser versteht, wenn man sie mal mit ASM programmiert hat. *Ich trau mich nicht. Ich glaub dafuer bin ich zu alt.* (Immerhin gab's damals meine ersten ASM Enttaeuschungen auf einem Apple II+ Klon) Die Applcation Note ist sehr interessant. Warum steht soetwas nicht im Datenblatt (Oder bin ich nur betriebsblind?) ? Danke, schoenen Gruss, Balze aka AVR Noob
Wenn man ASM kann ist es manchmal sicherlich von Vorteil, aber ich kanns leider auch nicht. Wenn ich in C mal ein Problem habe, dann wühle ich mich durch die map-Datei und versuche die asm Befehle nachzuvollziehen. Mit mehr oder minderem Erfolg. Das Datenblatt beschreibt ziemlich genau wie alles funzt und welche Register es gibt, aber für die eigentliche Anwendung, sind die Application Notes m.E. sehr sehr wertvoll. Da bekommt man immerhin schon mal einen Eindruck, was man machen kann ... Ich bleib dennoch bei C, auch wenn ich manchmal sehr bewundere, was andere in ASM an Fähigkeiten und Leistung aus so einem "kleinen" Chip rauskitzeln. Grüße, Michael
Avr Noob schrieb: > Ich moechte gerne ein Array moeglichst schnell auf einem Port ausgeben. > > Das Array ist zu gross fuer das RAM und muesste deshalb im Flash landen. > > Kann man per DMA auf diesen Bereich zugreifen? > Kann man leider nicht :-( Das liegt daran, dass die AVRs immer einen getrennten Daten- (SRAM, IO und beim XMEGA auch EEPROM) und Programm-Bereich (FLASH) haben (tinies und megas haben sogar noch einen dritten Bereich: EEPROM). Beide Bereiche fangen an der Adresse 0 an. Der DMA-Controller kennt nur Adressen und könnte somit nicht unterscheiden, welcher Bereich gemeint ist. Deshalb: DMA geht immer vom Datenbereich aus. Um größere Datenblöcke per DMA auszugeben, bleibt nur eine Möglichkeit: Externes RAM -> teuer und platzintensiv, geht nur mit großen (viele Pins) Xmegas Blockweise vom Flash ins RAM kopieren und dann per DMA raus ist unsinnig, da das Kopieren länger dauert als die Ausgabe... MfG, Xmegaman
Hallo Avr Noob, ich habe neulich zufällig genau das von Dir gefragte mal runtergetippt um den XMega besser zu verstehen. Ich hatte mir die PCM Daten aus ´ner WAV Sounddatei in den flash geschrieben und per DMA auf den on-chip DAC geschaufelt. Wie schon oben beschrieben geht das nur über einen RAM buffer. Das Kernstück davon hänge ich hier an. Das war wie gesagt nur zum Spielen und ist daher nicht kommentiert oder gar ausgiebig getestet. Vielleicht hilft Dir das trotzdem weiter. (P.S.: keine Angst vor Assembler: macht Spaß!) Colmar
Hallo zusammen, vielen Dank fuer Eure Beitraege !! @Michael: Wahrscheinlich hast Du Recht und es ist alles vernuenftig im Datenblatt beschrieben. Aber wer hat das schon ganz gelesen und hat sich alles gemerkt. Ich kann das jedenfalls nicht (mehr! - Auf mein fortgeschrittense Alter habe ich ja bereits hingewiesen ;-) Ohne AppNotes haette ich vermutlich noch kein laufendes XMEGA Programm. :) Aber (siehe oben) wer hat die schon alle gelesen und behalten ?! @Xmegaman: Danke fuer diesen Hinweis. Dies macht mir die Sache klarer. @Colmar: Ich kann Dein Beispiel im Moment nicht nachvollziehen, da ich Urlaub habe (4 Wochen :) !! ) Wenn ich wieder in der Firma bin, werde ich mir das genauer ansehen. Vielen Dank ! MfG, Balze aka AVR Noob
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.