mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik XMEGA DMA transfer nach PORT


Autor: spike (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: XMEGA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Spike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Tipps, das PROGMEM war das Problem

Autor: Avr Noob (balze)
Datum:

Bewertung
0 lesenswert
nicht 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... 
)

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:
    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;)

Autor: Michael K. (mmike)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Avr Noob (balze)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Avr Noob (balze)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird schon! Viel Erfolg!

Grüße,
Michael

Autor: Avr Noob (balze)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Avr Noob (balze)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klingt doch auch nicht schlecht ...

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann guck doch mal in Deinen anderen Post!

Autor: Avr Noob (balze)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 ! ;-)

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schick ... Glückwunsch!

Grüße,
Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.