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!
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
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
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;)
Anbei mal meine Fixed Point Tangens Funktion. Dort lege ich die LUT im Flash ab und lese daraus dann die Werte. Grüße, Michael
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
> 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
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
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
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
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
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 ! ;-)
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.