Forum: Mikrocontroller und Digitale Elektronik XMega Timer 0 Compare Frage


von Zedd (Gast)


Lesenswert?

Hallo,

ich hatte mir vorgestellt, dass ich 8 Timer Compareregister mit dem DMA 
möglichst schnell befülle. (ca. im 1/3 MHz Intervall). Anschließend habe 
ich gehofft, dass diese neu eingespielten Register sofort verglichen 
werden.

Das Problem beginnt schon beim einspielen. Anscheinend kann man nur in 
den Vorbuffer einspielen, dann muss man warten bis der Timer auf Bottom 
gelaufen ist, dass es geupdatet wird und nun muss noch wartet werden bis 
die Zählerwerte mit den Comparewerten überein stimmen.

Ist dieser Timer überhaupt als reiner Vergleicher zu gebrauchen? Der 
Timer soll bei mir nicht selbstständig durchzählen, nur sofort 
vergleichen... dann gibt es ein Clock-Signal das die entstanden Bits in 
Schieberegister schiebt...

Kennt jemand ein Prozessor mit DMA und dieser Compare-Funktion? Problem 
ist die CPU würde dafür zu lange brauchen -> Byte aus RAM laden, mit 
Wert vergleichen und 0 oder 1 auf Portbit ausgeben.

Danke

Zedd

von Michael K. (Gast)


Lesenswert?

Die Xmega sind zwar nicht sehr populär hier, aber meiner Meinung nach 
das schärfste was es an neuen 8bit MCUs gibt. Jahre zu spät aber schöne 
Teile.

Was Du eigentlich machen willst erzählst Du nicht.
Du verwendest Ausdrücke wie vorgestellt, erwartet, gehofft ...
Steht alles im Datenblatt, da braucht man nicht hoffen oder erwarten.
Steht drin oder nicht und den 'Vorbuffer' kann man abstellen und 
unmittelbar beschreiben.


Zedd schrieb:
> Ist dieser Timer überhaupt als reiner Vergleicher zu gebrauchen? Der
> Timer soll bei mir nicht selbstständig durchzählen, nur sofort
> vergleichen... dann gibt es ein Clock-Signal das die entstanden Bits in
> Schieberegister schiebt...

Timer als Vergleicher ?
Der Timer vergleicht seinen aktuellen Counter Wert mit dem Compare 
Register.
Wenn der Timer nicht läuft was soll der denn dann vergleichen ?
Der Vergleich ist flankengetriggert und wenn es keine Flanke gibt dann 
... ?!

Willst Du den Timer ernsthaft dazu verwenden um einfache 16bit 
vergleiche durchzuführen ?

Was zum Geier sind die 'entstandenen Bits '

Bei 32Mhz Takt sollte es nicht so das Thema sein 333.000 mal die sec. 8 
x 16bit Werte mit einer Variable zu vergleichen und Schiebeoperationen 
auszuführen.

von Zedd (Gast)


Lesenswert?

Hallo Michael...

Hab das Datenblatt gelesen... keine Sorge... sonst würde ich hier nicht 
Fragen...

Wie gesagt, Schieberegister an den Ausgängen... 6 parallele Zweige 
(parallel ist für µC ja immer nen bissel bescheiden) Konstantstrom für 
LED Matrix.. Also muss die PWM von "Hand" hinein geschoben werden...

Das Datenblatt versteh ich so, wenn der CNT Wert nicht dem CCA Wert 
entspricht, passiert gar keine Aktion am Port Ausgang. Also bringt es 
mir auch herzlich wenig, wenn ich CNT (z.B. um eins) hochzählen lasse... 
wie du meinst (deine Flanke)...

Wie oben beschrieben, möchte ich 8 Timer compare Register befüllen!!! 
Der Timer0 ist schon auf 8 Bit gesplittet (=Timer2)... aber das macht 
keinen Unterschied zum Problem. Außer das deine Annahme, dass es die CPU 
in 1/3 MHz schafft, nicht war sein kann.

Trotzdem danke für deine Hilfe

Zedd

P.S. Ich find die XMega auch schick... aber ich habe ihn wohl funktional 
ein wenig überschätzt!
Die Frage ist, ob es überhaupt µC gibt, die so eine Timerfunktionalität 
mitbringen.

von Zedd (Gast)


Lesenswert?

Ich sehe gerade, hier liegt ein Missverständnis vor...

Intervall = Zeiteinheit

Und ich hätte vielleicht doch Klammern setzen sollen:

1/(3 MHz)

VG

Zedd

von Michael K. (Gast)


Lesenswert?

Ich habe immer noch nicht die leiseste Vorstellung wie Du vom Ansteuern 
einer LED Matrix mit PWM auf dieses komische Timer Konstrukt kommst und 
auf 1/3 (ein drittel) Mhz bzw. 1/3Mhz (333ns) und was genau Du 
eigentlich von der Timer Hardware verlangst.
Du verstehst mich und anscheinend auch die Timer Hardware völlig falsch.
Ich habe Dir nicht geraten den Counter zu erhöhen, sondern ich habe Dir 
geraten zu verstehen wie der Timer arbeitet und was der kann und was 
nicht.

Du scheinst vorrauszusetzen das ich genau weiß was Du da machst obwohl 
Du es auf eine Art tust wie es wohl niemand macht.

Ich kann nur vermuten das Dein Problem ursächlich daher kommt das Du 
eine große Anzahl an PWM Quellen brauchst und das irgendwie in die 
Hardware reintricksen willst.
Wenn dem so ist verwende PDM (Pulse Dichte Modulation) die läßt sich 
wunderbar in Software machen und kann eine große Anzahl 'PWM' Signale 
zur Verfügung stellen.

Andere verwenden Schieberegister mit /OE und senden Ihre PWM Bitmuster 
per DMA an den SPI.

10bit / 100Hz reicht selbst für sehr gute RGBW Leuchten aus um weder 
flackern noch Farbsprünge zu sehen.
Das sind 1024 Vergleiche pro Ausgang alle 10ms und ich das habe ich mit 
16 Kanal PDM schon auf winzigen 8051er gemacht.

Von mir aus nehme ein FPGA und einen 170Mhz ARM wenn selbst ein 32Mhz 
Xmega noch zu schwach ist. Jeder wie er meint.

von Daniel (Gast)


Lesenswert?

wenn du viele Kanäle brauchst, warum nutzt du dann nicht DMA und 
schaufelst
entsprechende Werte aus einem vordefinierten Array mit Hilfe des Event 
Systems auf entsprechende Ports?

Wenn du z.b. 32Bits brauchst dann schreibst in einem Array Deine Werte 
entsprechend rein. Dann konfigurierst die DMA so, dass diese dann immer 
jeweils 4Byte direkt auf ports ausgibt, oder halt mehr, soviele ports es 
gibt.
Die Xmega DMA kann nämlich vom SRAM zum PORT Daten schieben. dann 
erscheinen entsprechende Pegel an entsprechenden Pins.

Ist es das was Du machen willst?

von Basti M. (counterfeiter)


Lesenswert?

Ja schon...

Aber mal den RAM Bedarf bei 32x16Leds mit 3 Farben und 256 PWM Schritten 
durchgerechnet?

Ganz abgesehen von der nötigen Übertragungszeit von außerhalb...

von Zedd (Gast)


Lesenswert?

@Basti M. so ist es... und es könnten noch mehr LEDs sein...

@Michael Knoelke ich habe nicht vorausgesetzt, dass du das Problem 
verstehen sollst (daher auch nicht näher beschrieben)... das ist nen 
kleiner Unterschied.

Mein Frage vom Ausgangspost steht immer noch:
Gibt es einen µC bei dem ich den Comparewert per DMA einspielen kann und 
der Vergleich mit dem Zählregister unmittelbar nach dem Einspielen des 
neuen Comparewertes erfolgt und mir dann sofort das entsprechende Bit 
auf den Port schreibt (0 oder 1)?

Das Datenblatt des XMegas sagt: nein, geht nicht. Daher suche ich einen 
alternativen Controller. (kein FPGA)

Evtl. habe ich was im Datenblatt übersehen. Falls ich mich geirrt haben 
soll und der XMega so etwas kann, dann korrigiert mich...

VG

Zedd

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.