Ich habe einen Arduino DUE und möchte damit ein Delay von 100 ns
erzeugen. Da ich nur eine Delay-Funktion für µs gefunden habe, wollte
ich mir die Informationen aus dem Datenblatt des µC holen. Allerdings
habe ich bislang nur mit einem ATMEGA2560 gearbeitet und komme mit dem
Datenblatt des SAM3X8E noch nicht ganz zurecht.
Zunächst einmal habe ich die folgenden Fragen:
- Mit welchem Takt laufen die Timer?
- Wie heißen die Interrupt-Handler?
- Lässt sich der DUE auch über Atmel-Studio und den
ICE-Programmieradapter (JTAG) programmieren?
Ich würde mich freuen, wenn ihr mir helfen könntet und die passenden
Stellen im Datenblatt zeigen könntet.
Ich habe zwar noch nie etwas mit den Atmel SAM Chips gemacht, aber hier
ist was ich im Datenblatt finden konnte:
Der Timer Takt lässt sich mit den TCCLKS bits im TC_CMRx Register
einstellen. Die wahrscheinlich schnellste clock einstellung ist 0 für
MCK/2.
Mit den Interrupt Handlern kann ich dir leider nicht helfen.
Programmieren mit Atmel Studio sollte funktionieren, wirst aber einen
Programmer dafür brauchen.
Ist dir bewusst dass 100ns einer Frequenz von 10Mhz entspricht?
Da der DUE mit 84Mhz taktet, bedeutet dies dass 100ns nur etwa 8.4
Takten entspricht...
D.h. exakt 100ns wirst du nicht hinbekommen und am nächsten dran kommst
du mit 8 NOPs.
x = Nummer des Timers, also 0 bis 8
Andere Interrupts heissen z.B. UART_Handler, USART0_Handler,
PIOD_Handler, TRNG_Handler, etc.
Der Watchdog ist per default aktiv, wenn du den abschalten willst:
1
voiddisable_watchdog(void)
2
{
3
WDT->WDT_MR|=DISABLE_WATCHDAOG;
4
}
Bei Interrupts kannst du Prioritaeten verwenden, z.B.:
Alex G. schrieb:> Da der DUE mit 84Mhz taktet, bedeutet dies dass 100ns nur etwa 8.4> Takten entspricht...
Stimmt, das würde mit Timer gar nicht gehen, ein Cortex-M3 hat eine
Interrupt latenz von 12 cycles, also schon 140ns.
Raff schrieb:> Ich würde mich freuen, wenn ihr mir helfen könntet und die passenden> Stellen im Datenblatt zeigen könntet.
Wenn ich solche schwierigen Frage lese dann frage ich erst
mal was eigentlich damit gemacht werden soll ... bevor ich
mich bemühe, nachschlage und Rat gebe.
Also: wozu soll's denn gut sein?
Frickelfritze schrieb:> Also: wozu soll's denn gut sein?
Solche Art Delay braucht man beispielsweise vom runterziehen des CS zur
1. Clockflanke bei einigen SPI Slaves.
Je nach anwendung braucht der OP also nur 8 oder 9 von
Jim M. schrieb:> Solche Art Delay braucht man beispielsweise vom runterziehen des CS zur> 1. Clockflanke bei einigen SPI Slaves.
Das sollte der TO schon selbst wissen wenn er fragt.
Und ich schätze dass er es dazu nicht braucht, dazu sind
seine Aussagen/Fragen zu naiv.
Frickelfritze schrieb:> Also: wozu soll's denn gut sein?
Ich will ein PWM erzeugen, das seinen Duty Cycle zyklisch verändert.
Mein PWM hat eine Periodendauer von 6,098 µs und bei dem kleinsten Duty
Cycle, den ich einstellen möchte, habe ich eine On-Time von 190 ns.
Alex D. schrieb:> Die wahrscheinlich schnellste clock einstellung ist 0 für> MCK/2.
Ich gehe mal davon aus, dass MCK der Master Clock von 84 MHz ist und
meine Timer dann mit 42 MHz laufen können?
Peter D. schrieb:> Was stört Dich denn an der Hardware-PWM?
Das war schon meine erste Überlegung.
Hätte dann MCK/512 verwendet, damit ich die Periodendauer von 6,09 µs
erhalte.
Dann müsste ich alle 6,09 µs einen neuen Wert in das Register für den
Duty Cycle (das Register habe ich auf die schnelle nicht gefunden).
Hierfür würde ich dann ja einen weiteren Timer benötigen, mit dem ich
die 6,09 µs messe.
Ich hatte bei dieser Lösungsmöglichkeit aber die Befürchtung, dass ich
den Duty-Cylce nicht so einstellen kann, dass ich eine High-Zeit von 190
ns bei der ersten Periode, 380 ns bei der zweiten Perioden, usw.
erhalte.
Das kannst du drehen und wenden, dass verhältniß von Takt zur
Anfordernist zu knapp und zu krumm. Für dass was du willst ist er zu
lahm, selbt mit grifen in die Trickkiste. In reinem ASM kämest du in die
Nähe wäre der Takt günstiger aber IRQs benötige au Zeit und die ist bei
derlei Anforderungen zu knapp, glaube ich. soll das ein Videosignal
werden? 190 ns hab ich schonmal irgendwo gefunden keine Ahnung wobei.
Namaste
Nö Hardware PWM und das Value kommt vom DMA Controller.. Der schiebt
jede Periode ein Value nach.. Leider kann der DMA glaube ich nicht auf
die PIO zugreifen, so lässt sich auch jedes Signal erzeugen..
Ich möchte den Duty Cycle des PWMs mit einer Frequenz von 2,5 kHz (T=400
µs) verändern. Also bei der ersten Periode ist der Duty Cycle 0%. Dann
steigt er kontinuierlich, bis er bei t=200 µs bei 100 % ist und fällt
danach wieder kontinuierlich bis auf 0%. Dann wiederholt sich das Ganze.
Bei der Frequenz des PWM an sich möchte ich den maximalen Wert nehmen,
der möglich ist. Meiner Meinung nach ist das jetzt ungefähr 42 kHz
(T=23,8 µs -> auf 24 µs ).
400 µs/23,8 µs= 16,8 -> Nach 8 Wiederholungen möchte ich 100 % haben
23,8 µs/ 8 = 2,976 -> ON-Time wird nach jeder Periode um 3 µs erhöht
(würde sogar mit Arduino-Funktion gehen DelayMicroseconds)
Sind leider alles unschöne Werte. Würdet ihr das anders machen?
Raff schrieb:> Dann müsste ich alle 6,09 µs einen neuen Wert in das Register für den> Duty Cycle (das Register habe ich auf die schnelle nicht gefunden).> Hierfür würde ich dann ja einen weiteren Timer benötigen, mit dem ich> die 6,09 µs messe.
Das macht man auf den dicken Cortex-Mx via DMA. Ich bin mir einigermaßen
sicher das der SAM3X8E die dazu nötige Hardware an Board hat.
Unterstützung in den Arduino Libs würde mich allerdings eher
überraschen, denn die kleinen ATMega kennen kein DMA weil das alte
Designs sind.
Das ist die Stelle wo man sich das dicke Refernz Hanbuch zum SAM3X8E mal
raussuchen und durchlesen müsste...
Alex G. schrieb:> D.h. exakt 100ns wirst du nicht hinbekommen und am nächsten dran kommst> du mit 8 NOPs.Winfried J. schrieb:> In reinem ASM kämest du in die> Nähe
Leider ist bei solchen Prozessoren die Zeit pro Instruktion nicht fix.
Je nach Zustand der Pipeline oder des Flash(-Cache, falls vorhanden)
kann auch ein NOP kürzer oder länger dauern. Durch Instruktionen zählen
lässt sich nur schwer ein präzises Timing erreichen. Dazu müsste man
mindestens den Code aus dem RAM ausführen und den Bus für sich alleine
haben (d.h. alles DMA abschalten).
Daher sollte man so etwas auf jeden Fall ganz mit DMA machen - dann ist
die CPU ganz frei und kann parallel alles mögliche andere tun. Mit den
SAM3X8E-Controllern kenne ich mich nicht so gut aus, aber bei den STM32
geht das definitiv.
Niklas G. schrieb:> SAM3X8E-Controllern kenne ich mich nicht so gut aus, aber bei den STM32> geht das definitiv.
Der STM32F103 spielt nach minimaler Initialisierung eine
3-Phasen-Sinus-PWM ab, ohne auch nur eine CPU-Takt zu benötigen. In
meinen (Test-)Fall macht er 2..200Hz "Drehstrom" mit ca. 30kHz
PWM-Frequenz. Sollte der SAM das nicht können, wäre ich überrascht.