XMEGA DMA transfer nach PORT

Gast #2057615
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!
Angehängte Dateien:
Gast #2057897
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
#2115326
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;)
#2115395
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
#2115441
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
#2115487
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
#2117277
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 ! ;-)
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren