Forum: Mikrocontroller und Digitale Elektronik SAM3x8e unverhältnismäßig langsam


von Stefan (Gast)


Lesenswert?

Hallo zusammen.

Habe gerade ein etwas mit meinem Arduino Due gespielt. (SAM3x8e 
Controller, getaktet auf 84MHz). Programmiert wird der Controller in C.

Ich wollte ein PWM-Signal (2MHz) auf eine gewisse Anzahl an Pulsen 
begrenzen. Also nach jeder PWM-Periode einen Interrupt generieren, eine 
Variable hochzählen und ab einer gewissen Anzahl das PWM-Modul 
deaktivieren.

Der Ansatz funktioniert für Frequenzen von wenigen KHz super. Bei 2Mhz 
überspringt er mir jedoch immer einen Puls. Also bei gewünschten 8 
Pulsen, wird erst nach 9 deaktiviert usw. (Und ja, man könnte ja auch 
einfach immer auf einen Zählschritt weniger abfragen, is jedoch 
unbrauchbar wenn man nur einen Puls will!!!)

Ich habe das Problem jetzt bereits anderweitig gelöst (über einen 
weiteren Timer), also benötige ich keine Lösung mehr für mein Problem. 
Jedoch stellt sich bei mir schon die Frage ob dass normal ist. Verlange 
ich vielleicht zu viel von dem Controller, oder liegt ein Anwenderfehler 
meinerseits vor...

Ich meine 2MHz, bei einer Taktfrequenz von 84MHz. Also 1/42'tel der 
Prozessortaktfrequenz...Klar pro Befehl braucht der Controller mehrere 
Schritte (fetch, decode, execude, writeback). Aber ein 
ARM-Microcontroller macht doch sicher schon Pipelining. Und selbst wenn 
nicht, könnte ich theoretisch bei 2MHz - PWM - Periode bis zu 10 Befehle 
zwischen den Perioden abarbeiten.

Hat jemand eine Idee woran es liegen könnte? Muss man bei 
ARM-Controllern noch irgend eine Optimierung einstellen? Oder hat jemand 
schon das selbe Problem gehabt?


Mit freundlichen Grüßen

Stefan


PS: Ja der Controller ist wirklich mit 84MHz getaktet, ich habe schon 
die Eingänge toggeln lassen und auf dem Oszi angeschaut

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

so ein Controller hat auch einiges an Takten zu verbrennen beim Eintritt 
in einen Interrupt
Der Cortex-M3 muß z.B. vorher das Stacking erledigen und danach die 
Register auch wieder herunterholen. Kostet so ~ 2 x 12 Takte im 
Idealfall.

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/Babedgea.html

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Eventuell solltest du mal schauen ob du den DMA nutzen kannst um das PWM 
nach dem Durchlauf zu laden.
Da hilft dir das Handbuch.

von Stefan (Gast)


Lesenswert?

Stimmt das mit dem Interrupt hab ich zeitlich nicht bedacht. Ja DMA ist 
bereits getestet worden, hat auch super funktioniert.

Aber dann müsste doch das Pollen des Interruptflags ohne Ausführen des 
Interrupt um einiges schneller sein oder...
Ist es leider auch nicht :/

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Stefan schrieb:
> Stimmt das mit dem Interrupt hab ich zeitlich nicht bedacht. Ja DMA ist
> bereits getestet worden, hat auch super funktioniert.
>
> Aber dann müsste doch das Pollen des Interruptflags ohne Ausführen des
> Interrupt um einiges schneller sein oder...
> Ist es leider auch nicht :/

Ausführen aus dem internen SRAM haste schon probiert ?

von Stefan (Gast)


Lesenswert?

Danke, das probier ich morgen gleich mal aus. Muss ich mich nur in die 
CMSIS-Lib einlesen. Benutze den ganzen Startup-Code von dort. Bin mir 
allerdings gar nicht sicher ob die nicht eh den Code schon im SRAM 
ablegt

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Solltest dich vielleicht mit der Direkten Programmierung der Register 
auseinandersetzen.
Die CMSIS-Bib ist ja schön und gut, aber ziemlich überladen.

Ich denke aber der Cortex ist nicht die Richtig Plattform für dich.
Du mußt einen schnelleren nehmen oder eine andere Plattform so ala CPLD 
z.b. oder FPGA.

Oder vielleicht ein alter Atmel SAM7 mit viel Takt.
Der hat intern die Schattenregister für den Fastinterrupt und Stacking 
hat der auch nicht.

von Stefan (Gast)


Lesenswert?

Ja ich programmiere schon registerbasiert. Allerdings ist es doch recht 
bequem den startup-code und das linkerscript etc schon fertig zu haben. 
UND die ganzen registeraddressen :D. Ja ein FPGA liegt schon neben mir. 
Da stehe ich jedoch mit meinen programmierkenntnissen noch in den 
kinderschuhen :/

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Ist PWM für DAC-Wandlung gedacht ?

von Stefan (Gast)


Lesenswert?

Ne ich will damit einen ultraschall-transceiver ansteuern

von Gerhard (Gast)


Lesenswert?

hallo stefan,
in so einem fall sollte man sich mal ansehen, was der compiler aus 
deinem c code gemacht hat.
werden im main ev. interrupts gesperrt?

grus
gerhard

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.