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
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
Eventuell solltest du mal schauen ob du den DMA nutzen kannst um das PWM nach dem Durchlauf zu laden. Da hilft dir das Handbuch.
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 :/
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 ?
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
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.
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 :/
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.