Forum: Mikrocontroller und Digitale Elektronik XMEGA DMA transfer nach PORT


von spike (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe ein Problem mit dem DMA Controller des XMEGA. Ich möchte eine 
Tabelle Timer gesteuert auf einen PORT ausgeben. Ich hab den Code 
mehrfach überprüft und eigentlich sollte es gehen. Irgendwo mache ich 
noch einen Denkfehler. Hat mir jemand eine Idee?

Danke!

von Michael K. (mmike)


Lesenswert?

Hallo spike,

ich bin mir jetzt nicht 100% sicher, aber musst Du nicht die Daten per 
"pgm_read_byte" aus dem Flash holen, da Du Deine Arrays ja im PROGMEM 
ablegst?

Versuch mal das PROGMEM wegzulassen.

Grüße,
Michael

von XMEGA (Gast)


Lesenswert?

Servus,


spike schrieb:
> Hat mir jemand eine Idee?

mit PROGMEM funktioniert das Ganze nicht. Habe deinen Code mal getestet.


Dazu habe ich mal den TCC0 zum Testen etwas langsamer gemacht
und den PORTD über UART ausgegeben- es funktionierte dann sofort.

printf("%d %x = ",DMA.CH0.TRFCNT,stepper1[DMA.CH0.TRFCNT]);


//  TCC0 auf ca. 100ms eingestellt

TCC0.PER = 0xfff0; //  Sekundenabfrage
TCC0.CTRLA = ( TCC0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV1024_gc;
TCC0.INTCTRLA =(TCC0.INTCTRLA & ~TC0_OVFINTLVL_gm 
)|RTC_OVFINTLVL_MED_gc;


sei();  habe ich im Code nicht gefunden!!



Gruß XMEGA

von Spike (Gast)


Lesenswert?

Danke für die Tipps, das PROGMEM war das Problem

von Avr N. (balze)


Lesenswert?

Hallo zusammen,

Michael K. schrieb:
> Versuch mal das PROGMEM wegzulassen.

Schoen, dass es so funktioniert.
Was aber, wenn ich ein sehr grosses Array wiedergeben muss, das nur in 
den Flash passt??

(Hintergrund wen's interessiert: Ich muss einen hoch aufloesenden, 
schnellen Inkremetalgeber simulieren. Nur A und B gingen einfach mit 
einem 4 Byte Array (Hab ich schon probiert allerdings ohne PROGMEM ;-) 
). Ich muss aber auch N erzeugen. Der kommt alle 16384 Teilungen einmal 
vor.
Mein Array waere also 16k gross !
Datenblatt des Inkrementalgebers, Seite 3 oben beschreibt A, B und N:
http://motion.baumer.com/motion/products/downloads/Produkte/PDF/Datenblatt/Drehgeber/PI_ITD_61_A_4_Y_4_DE.pdf 
)

Gibt es dafuer auch eine Loesung
(Ich habe nicht finden koennen, wie man die Adresse des Flash an den DMA 
uebergibt oder geht das etwa gar nicht ?)

XMEGA schrieb:
> sei();  habe ich im Code nicht gefunden!!

Ich auch nicht ;-)
Dafuer aber dies hier:
1
    SREG=0x80;

Schoenen Gruss,

Balze aka AVR Noob

P.S. @spike:
Ich habe eine Zeit lang auch immer mit numerischen Konstanten fuer die 
Register gearbeitet. Dies wird schnell unuebersichtlich und man weiss 
nicht mehr was die Konstante bedeutet. Ich nutze jetzt die defines aus 
dem io-Headerfile und mein Code laesst sich besser lesen.
XMEGA hat Dir das am Beispiel von TCC0.CTRLA ja hier vorgemacht.
Gleiches gilt fuer SREG = 0x80;  die Funktion sei(); ist hier besser zu 
lesen, auch wenn sie (fast) nix anderes macht (Vermutlich: SREG |= 
0x80;)

von Michael K. (mmike)


Angehängte Dateien:

Lesenswert?

Anbei mal meine Fixed Point Tangens Funktion. Dort lege ich die LUT im 
Flash ab und lese daraus dann die Werte.

Grüße,
Michael

von Avr N. (balze)


Lesenswert?

80

6 Minuten ? Hast Du auf meine Frage gewartet?  :)

Danke fuer Deine Antwort.

Du liest in Deinem Beispiel den Flash aber "konventionell" mit 
pgm_read_byte und nicht per DMA.

Mich interessiert, ob man per DMA aus dem Flash lesen kann.

MfG,

Balze aka AVR noob

von Michael K. (mmike)


Lesenswert?

> 6 Minuten ? Hast Du auf meine Frage gewartet?  :)

Nö ;-) War einfach grad online ...

>
> Danke fuer Deine Antwort.

Gern.

>
> Du liest in Deinem Beispiel den Flash aber "konventionell" mit
> pgm_read_byte und nicht per DMA.

Das ist richtig.

> Mich interessiert, ob man per DMA aus dem Flash lesen kann.

Da kann ich leider wenig dazu sagen, da noch nicht gemacht bzw. keinen 
Plan. Muss es denn wirklich so schnell sein ??

>
> MfG,
>
> Balze aka AVR noob

Grüße,
Michael

von Avr N. (balze)


Lesenswert?

Michael K. schrieb:
> Muss es denn wirklich so schnell sein ??

Ich versuche gerade die konventionell Methode per Array im PROGMEM mit 
pgm_read_byte in einer ISR.

Werde berichten ob's reicht (Ich befuerchte nicht ....)

MfG,

Balze aka AVR Noob

von Michael K. (mmike)


Lesenswert?

Wird schon! Viel Erfolg!

Grüße,
Michael

von Avr N. (balze)


Lesenswert?

Michael K. schrieb:
> Wird schon! Viel Erfolg!
>
> Grüße,
> Michael

So leider nicht ....

Mit pgm_read_byte in der ISR des Zaehlers (ggf. Rueksetzen des 
notwendigen Zaehlers) komme ich nicht unter 20Hz -> 1200min^-1

Ich brauche aber 3600 min^-1

mit ISR und pgm_read ist das wohl nicht zu machen !

Trotzdem vielen Dank.

Vielleicht findet sich ja jemand der sich mit DMA und PROGMEM auskennt.
(Ich habe hierzu einen neuen Thread gestartet: 
Beitrag "XMEGA DMA mit PROGMEM moeglich?" )

MfG,

Balze aka AVR Noob

von Michael K. (mmike)


Lesenswert?

Ggf. externes SRAM und die Daten im Flash ablegen. Dann in den ext. SRAM 
am Anfang laden und von dort "rauspusten" ... Könnte man doch mal mit 
nem XPlain ausprobieren ....

Grüße,
Michael

von Avr N. (balze)


Lesenswert?

Hallo Michael,

ja, das ginge sicherlich.

Ich habe das Problem, das ich keine Zeit habe mich in neue Hardware 
einzuarbeiten.
Ich muss in dieser Woche ein Problem eines Kunden loesen.
Der hat ein Geraet von uns gekauft mit oben erwaehntem Inkrementalgeber.

Jetzt hat er ein Problem und ich keinen Inkrementalgeber :(

Jetzt muss ich mir ASAP eine simulieren und stelle fest, dass ein 32MHz 
XMEGA damit an seine Grenzen stoesst 80

Naja, neue Idee, neues Glueck:
4 Byte Array mit A und B wie gehabt per DMA an den Port,
Hardwarezaehler der die Portaenderungen mitzaehlt und per TOVF und 
ComparCapture Pin auf zweitem Port (N) setzen.

Mal sehen, ...

MfG,

Balze aka AVR Noob

von Michael K. (mmike)


Lesenswert?

Klingt doch auch nicht schlecht ...

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Dann guck doch mal in Deinen anderen Post!

von Avr N. (balze)


Angehängte Dateien:

Lesenswert?

Nur zur Info,

ich hab's hinbekommen:

Timer Overflow gesteuerter DMA auf 4 Bytes um A und B zu erzeugen,
gleicher Timer erzeugt Event
Event triggert zweiten Timer.
Zweiter Timer in PWM Mode.
CCA und PER stehen auf max (4096 * 4(Flanken))

Bei richtiger Verwendung der 4 Byte im Array erzeugt der PWM Zaehler 
alle 4096 A (B) Perioden einen N Impuls wie im Datenblatt.

MfG,

Balze aka AVR Noob

EDIT: Sorry fuer zweimal Dateiansicht. Das mit der Vorschau werde ich 
nie begreifen ! ;-)

von Michael K. (mmike)


Lesenswert?

Schick ... Glückwunsch!

Grüße,
Michael

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.