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.
Raff schrieb: > Wie heißen die Interrupt-Handler?
1 | void TCx_Handler(void) { |
2 | |
3 | } |
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 | void disable_watchdog(void) |
2 | {
|
3 | WDT->WDT_MR |= DISABLE_WATCHDAOG; |
4 | }
|
Bei Interrupts kannst du Prioritaeten verwenden, z.B.:
1 | NVIC_SetPriority(TC1_IRQn, 5); |
2 | NVIC_EnableIRQ(TC1_IRQn); |
3 | |
4 | NVIC_SetPriority(TC7_IRQn, 6); |
5 | NVIC_EnableIRQ(TC7_IRQn); |
6 | |
7 | NVIC_SetPriority(USART3_IRQn, 7); |
8 | NVIC_EnableIRQ(USART3_IRQn); |
9 | |
10 | NVIC_SetPriority(UART_IRQn, 8); |
11 | NVIC_EnableIRQ(UART_IRQn); |
12 | |
13 | NVIC_SetPriority(TRNG_IRQn, 10); |
14 | NVIC_EnableIRQ(TRNG_IRQn); |
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
1 | __NOP(); |
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?
Raff schrieb: > Ich will ein PWM erzeugen Was stört Dich denn an der Hardware-PWM? Vielleicht, daß sie keine CPU-Zeit verbraucht und keinen Jitter hat?
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..
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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.
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.