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
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