Jitter LPC 1769

Es ist allerdings deutlich schwieriger als bei AVRs, Pins exakt 
reproduzierbar per Software taktgenau zu steuern, da die Laufzeit von 
Befehlen nicht exakt festgelegt ist, sondern von Faktoren wie 
Wartezyklen und Flash-Puffern abhängt und auch von laufendem DMA 
beeinflusst wird.

Wesentlich besser ist es, wenn man solche Tätigkeiten per Timer 
abwickelt. Es gibt zudem leistungsfähige Controller, die an solche 
Tätigkeiten weit besser angepasst sind als ausgerechnet ARMs wie 
LPC1700.
Möchtest Du ein bestimmtes digitales Protokoll per Bitbanging 
implementieren oder geht es um Signale die sich immer gleich wiederholen 
- wie z.B. PWM?

PWM geht ohne Probleme über die verschiedenen Timer. Schau ins 
Datenblatt, da ist erklärt was da geht. Auf jeden Fall hast Du bei dem 
Hardware-PWM einiges Mehr an Möglichkeiten im Vergleich zum AVR.

Wenn es um Bitbanging geht: Du kannst eine vordefinierte Bitfolge in den 
Speicher schreiben und dann per DMA timergesteuert auf die GPIOs 
schreiben lassen. Damit läuft das vom Timing her exakt nach Deinen 
Vorgaben.

Ich finde letzteres übrigens bei den STM32 besser implementiert, dort 
kann man mit einem 32Bit-Wort gleichzeitig 16 Bit GPIOs und eine 
Bitmaske schreiben. Bei den LPC17xx sind Maske und Daten getrennt, die 
Zugriffe sind daher nicht atomic. Damit ist es schwer auf den selben 
Port gleichzeitig sowohl per DMA als auch per regulärem Programm 
zuzugreifen.
Gast
Hallo,

erstmal vielen Dank für die Antworten!

Also, der Controller erzeugt per Timer&Interrupt eine Sequenz von 
Pulsen. Das funktioniert auch auf einen Cycle genau. Das ganze wird 
gestartet von einem externen Puls, der einen ext. Interrupt auslöst. Und 
dieser Interrupt scheint relativ zum auslösenden Puls auf drei 
Latenzzeiten verteilt, die einige (~10) Cylcles auseinander liegen. Es 
geht nicht um ein digitales Protokoll, sondern um die Erzeugung einer 
belieb. Pulssequenz.

Schwieriger: Ja, da stimme ich Dir zu! Das mit DMA und Flash-Wait-States 
dämmert mir auch so allmählich, das muss ich mir nochmal anschauen. Da 
fehlts noch eindeutig bei mir ;)

Im Programm wird allerdings im Moment nichts mit DMA gemacht, und die 
CPU läuft mit 120MHz. Es ist nichts in Assembler programmiert, rein C.

Bitbanging per DMA: Hm, da schau ich dann auch mal rein.

Der externe Puls ist allerdings auch nicht in Phase mit dem 
Controllertakt, das verursacht vermutlich auch min 1 Cycle Jitter.

Danke für die Tips!

nicolas
Gerd E. schrieb:

> Wenn es um Bitbanging geht: Du kannst eine vordefinierte Bitfolge in den
> Speicher schreiben und dann per DMA timergesteuert auf die GPIOs
> schreiben lassen. Damit läuft das vom Timing her exakt nach Deinen
> Vorgaben.

DMA wird zwar ASAP ausgeführt, ist aber nicht taktgenau. Der Bus wird 
ggf. erst frei, wenn der Prozessor ihn freigibt. Folglich hängt die 
Latenz davon ab, ob grad ein Zyklus läuft und wie lange der dauert.
nicolas schrieb:

> geht nicht um ein digitales Protokoll, sondern um die Erzeugung einer
> belieb. Pulssequenz.

Da könnte SPI in Verbindung mit DMA helfen. Das ist taktgenau, 
zumindest so schnell wie das SPI-Modul zulässt. Eine Pinfrequenz von 
60MHz (120MHz Takt) ist vermutlich sowieso nicht offiziell von der 
Hardware vorgesehen und auch nicht per Befehle möglich.
Gast
zu DMA: "ASAP" ?? Ich hatte mit DMA schon mal gespielt, RAM-Bereich per 
DAM in den DAC, das klappte super. War halt nur ein einziger DMA-Kanal 
in Benutzung. Ist das denn Taktgenau, wenn man sicherstellt das kein 
anderer DMA-Kanal dazwischenfunkt? (eine generelle Frage, ich würde 
schätzen ja)

SPI: Es geht darum, Pulse auf vielen unabhängigen Kanälen zu erzeugen, 
SPI ist daher nicht so gut geeignet denke ich. Die Pulse müssen auch 
nicht besonders kurz sein oder kurze Abstände haben, 1 µs reicht völlig. 
Aber diese Timings sollten eben möglichst präzise stimmen und 
keinen/möglichst geringen Jitter haben.
nicolas schrieb:

> in Benutzung. Ist das denn Taktgenau, wenn man sicherstellt das kein
> anderer DMA-Kanal dazwischenfunkt? (eine generelle Frage, ich würde
> schätzen ja)

Nein. Prozessor und DMA teilen sich einen (oder mehrere) gemeinsam 
verwendete Busse. Es kann folglich ein paar Takte dauern, bis der DMA 
dran kommt.
Gast
Hallo,

der Jitter, der jetzt da ist, lässt sich verkraften, die gewünschte 
Spezifikation ist erfüllt. Mir geht es nur darum, ob man da noch was 
machen kann, und darum das zu verstehen. Man kann das sicher eleganter 
und vermutlich auch effektiver mit einem FPGA oder anderem Controller 
lösen.

>Nein. Prozessor und DMA teilen sich einen (oder mehrere) gemeinsam
>verwendete Busse. Es kann folglich ein paar Takte dauern, bis der DMA
>dran kommt.

Hm, ok. Aber der Cortex-M3 hat ja diese "Bus-Matrix", kann man das 
irgendwie erreichen, dass die sich nicht gegenseitig stören, wenn man 
die Anwendung hinreichend beschränkt? Also quasi jeder seine Leitung 
benutzt? Ich hatte z.B. eine RAM Bank per DMA an den DAC gesendet, 
während die CPU etwas auf der anderen RAM-Bank gemacht hat. Und so wie 
ich das verstanden habe, hat jede RAM-Bank ihren "eigenen" Zugang zu der 
Bus-Matrix, und CPU und DAC auch. Hmhm, geht das überhaupt 
grundsätzlich? Grübel...

>Da könnte SPI in Verbindung mit DMA helfen. Das ist taktgenau,
>zumindest so schnell wie das SPI-Modul zulässt. Eine Pinfrequenz von
>60MHz (120MHz Takt) ist vermutlich sowieso nicht offiziell von der
>Hardware vorgesehen und auch nicht per Befehle möglich.

Bei SPI geht es dann?

Danke für die super Unterstützung hier, ich bin immer wieder begeistert!


nicolas
nicolas schrieb:

> Bei SPI geht es dann?

Wenn man per DMA auf GPIO schaufelt, dann wirkt sich das DMA-Timing 
direkt auf die Pins aus. Nicht jedoch, wenn man per DMA den SPI-Puffer 
nachfüllt.

Das SPI erwähnte ich, als noch nicht von vielen Kanälen die Rede war. 
Das ist nur bei einem Datenkanal pro SPI praktikabel.
Weiss ich nicht. Dazu müsste ich zu tief in den verwendeten Controller 
einsteigen. Möglicherweise tiefer als die offizielle Doku hergibt. Da 
man sich damit auf ein Gebiet begibt, für dass diese nicht wirklich 
konzipiert sind, würde ich nicht auf erschöpfende Auskunft zu diesem 
Thema wetten.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.