SAM3x8e Register schnell beschreiben

Gast #3871499
Lesenswert?

Hallo zusammen,

gibt es eine Möglichkeit bei einem SAM3x8e ein Register pro Clockzyklus 
zu beschreiben? Am besten noch mit Timer o.ä getriggert?

Also z.B

1. Clock

RegisterA = VariableA

2.Clock

RegisterB = VariableB

3. Clock

RegisterC = Variable C


auf Trigger warten und wieder einige Register beschreiben.



Danke schon mal im Voraus
Gast #3871520
Lesenswert?

Hab ich schon probiert, allerdings funktioniert dass nur gut wenn die 
Register alle schön im Addressbereich hintereinander liegen, dass der 
DMA mit address-increment Arbeiten kann.

Die Output-Direktion-Register der verschiedenen Ports liegen leider an 
unterschiedlichen Addressbereichen :/
#3871525
Lesenswert?

@ Stefan (Gast)

>Die Output-Direktion-Register der verschiedenen Ports liegen leider an
>unterschiedlichen Addressbereichen :/

Und warum willst du dieses komische Timing machen? Wozu soll das gut 
sein? Im Extremfall muss man halt einen Timer-Interrupt nutzen und ein 
paar Zeilen Inlineassembler schreiben.
Gast #3871536
Lesenswert?

_________________|---|___|---|___|---|___________________________


_____________________|---|___|---|_______________________________


-------------------------------------|_____________|-------------



_________________________________________|---------|_____________


So sollen vier verschiedene Ports aussehen. Zuerst ein PWM Signal mit 
bis zu 4MHz welches z.B 1, 2, 3, 4, 10 oder mehr Pulse erzeugt direkt 
nach dem letzten Puls solls ein Ausgang auf high gesetzt werden. Wieder 
500ns (einstellbar bis 10 ys) später ein anderer Ausgang auf low. 
Wiederum eine gewisse zeit Später der eine Ausgang auf low und der 
andere auf high.

Das ganze ist einfach zu zeitkritisch für inline programmierung
Gast #3871700
Lesenswert?

Stefan schrieb:
> gibt es eine Möglichkeit bei einem SAM3x8e ein Register pro Clockzyklus
> zu beschreiben?
Nein, Register(Speicher)zugriffe auf nicht-aufeinanderfolgende Adressen 
brauchen quasi immer 2 Takte.

Aber die Teile laufen doch bei 84 MHz, da kommst du so doch leicht auf 
die 4 MHz...
Aber dennoch, das nur so machen wenn das mit Timern wirklich nicht 
geht...
Gast #3871917
Lesenswert?

Ja 2 takte, 3 takte...wär alles noch kein ding. Aber wenn ich jetzt nur 
direkt hintereinander zwei Ausgänge schalte, komme ich nur auf 10 Mhz. 
Also von wirklich "gleichzeitig" kann keine rede sein. Und DMA 
funktioniert ja auch nur mit aufeinanderfolgenden addressen. Außer 
linked lists, aber da is dann die ganze Geschichte auch < 3 Mhz. PWM 
funktioniert nur für die ersten beiden ausgänge, da die platine schon 
fertig gemapt ist. Und Ausgang 3 und 4 kein PWM können.
Gast #3871927
Lesenswert?

Stefan schrieb:
> Aber wenn ich jetzt nur
> direkt hintereinander zwei Ausgänge schalte, komme ich nur auf 10 Mhz.
Wie hast du das gemacht?

Stefan schrieb:
> Also von wirklich "gleichzeitig" kann keine rede sein.
Gleichzeitig geht nur wenn die Pins am selben Port sind. Der 
Prozessor-Bus kann in keinem Fall, egal ob DMA oder von der CPU, mehrere 
Port-Register gleichzeitig schreiben...

Stefan schrieb:
> Unter inline verstehe ich polling oder sowas.
Was wäre dann nicht inline? DMA und Timer?

Stefan schrieb:
> Oder bin ich da falsch :D
Komische Verwendung des Begriffs, denn "inline" bedeutet eigentlich 
etwas anderes...

Stefan schrieb:
> Das ganze ist einfach zu zeitkritisch für inline programmierung
Wie gesagt, bei 84MHz Prozessortakt solltest du eigentlich mit 21MHz 
togglen können.
Gast #3871938
Lesenswert?

1
PIOC -> PIO_SODR = PIO_SODR_P21;
2

3
PIOC -> PIO_SODR = PIO_SODR_P22;

So hab ich das gemacht. War nämlich auch leicht überrascht. Mit DMA und 
nur PIOC und mem2mem transfer geht das ganze mit 42 MHz, aber wie 
gesagt, leider sind die Ausgänge nicht alle auf PIOC und haben somit 
nicht die gleiche/aufeinanderfolgende addresse

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