Forum: Projekte & Code Spielereien mit asm_pio + MicroPython auf dem PI PICO


von Michael S. (Gast)


Angehängte Dateien:

Lesenswert?

Spielereien mit asm_pio + MicroPython auf dem PI PICO

Auf dem PI PICO kann man komfortabel mit MicroPython arbeiten und 
nebenbei kleine, taktgenau arbeitende Erweiterungen in ASM auf den PIO's 
hinzufügen, die unabhängig vom restlichen Programmcode ablaufen und 
weder Speicherplatz noch zusätzliche Rechenzeit beanspruchen.

"Just for fun" hier meine Spielereien mit asm_pio und MicroPython, in 
denen ich ausloten wollte, wie ich als Hobbyist im Bereich 
Homeautomation diese zusätzliche Hardware für mich nutzen könnte.

- Generatoren für symmetrische / asymmetrische Rechtecksignale
- Generatoren durch Ausgabe von 32-Bit-Patterns
- Timer/Counter für die Messung von Impulszeiten
- UART-Transmitter, optional mit Even/Odd Parity-Bit
- UART-Transmitter, optional mit 32-Byte Fifo-Sendebuffer
- UART-Receiver, optional mit 32-Byte Fifo-Empfangsbuffer
- Intervall-Summer
- PWM (bis zu 32 Bit) mit exponentieller Interpolation der Zwischenwerte
- IR-Remote Transmitter / Receiver (NEC-Protokoll, 38KHz)
- Taster zum Ein-/Ausschalten bzw. mit Ein-/Ausschaltverzögerung
- Inverter (Not-Gate)

Weitere Erläuterungen gibt es im Programmcode und in der Readme.pdf.

Michael S.

von c-hater (Gast)


Lesenswert?

Michael S. schrieb:

> Spielereien mit asm_pio + MicroPython auf dem PI PICO

Du liebst understatement...

Es ist schon ziemlich geil, fast unvorstellbare Sachen mit Hilfe der 
PIOs realisieren zu können, selbst aus einer Schriptsprache heraus.

Das Problem ist nur: Die Dödels, die schon nicht in der Lage sind, C 
oder Asm zu lernen, werden auch den Assembler der PIOs nicht lernen 
wollen oder können. Denn der ist zwar sehr simpel, aber eben deswegen 
auch ziemlich weit weg von der "normalen Logik" von Programmiersprachen. 
Sehr viel weiter als auch nur die normalen Asm-Sprachen der MCUs, die 
auch schon kaum einer lernen will...

Und man muss selbst als erfahrener Asm-Programmierer vieler Systeme 
erstmal lernen, ein wenig "um die Ecke" zu denken, um die PIOs gut 
nutzen zu können. Von reinen Python-Leuten kannst du das echt nicht 
erwarten. Also wirst du niemals sehr viele Antworten ernten. Laß' dich 
davon nicht entmutigen. Mach' weiter, poste weiter.

von Norbert (Gast)


Lesenswert?

Habe auch schon einige interessante Dinge mit µPy gemacht, auf STM32F4 
und PicoPi.
Die sind auch schön mit ARM-Thumb innerhalb von Python zu programmieren.
Damit ist dann problemlos 500ksps ADC, Kompression und Übertragung per 
VCP möglich. Zwei Kerne helfen. ;-)
PIO: bis jetzt ein 125MHz Signal erzeugt das mein uraltes analoges 50MHz 
Scope zum Weinen gebracht hat (PicoPi von 133MHz auf 250MHz übertaktet).
Dieser PicoPi hier geht sogar bis 282MHz, dann streckt er aber die 
Flügel.
Werde in den nächsten Tagen mal ADC mit DMA machen.
Auf dem STM32F4 läuft das schon absolut problemlos (2.4Msps * 3 Kanäle 
interleaved).

Was ich allerdings feststellen musste, die µPy 1.17 Version für PicoPi 
braucht noch reichlich Liebe und Zuwendung…

Viel Spaß weiterhin.

von Markus (Gast)


Lesenswert?

c-hater
>Das Problem ist nur: Die Dödels, die schon nicht in der Lage sind, C
>oder Asm zu lernen, werden auch den Assembler der PIOs nicht lernen
>wollen oder können.

Wer oder was genau hat dich beauftragt, irgend jemandem etwas lehren zu 
müssen?

von Markus (Gast)


Lesenswert?


von Johannes S. (Gast)


Lesenswert?

Noch ein schönes Projekt:
https://forum.lvgl.io/t/100-mhz-oscilloscope-with-raspberry-pi-pico-lvgl-v8-and-micropython/5669

Optimieren wo es nötig ist und Hardware richtig nutzen.

von c-hater (Gast)


Lesenswert?

Markus schrieb:

> Wer oder was genau hat dich beauftragt, irgend jemandem etwas lehren zu
> müssen?

Niemand. Habe ich auch nirgendwo etwas derartiges behaupted.

von Michael S. (Gast)


Angehängte Dateien:

Lesenswert?

Serial over IR mit asm_pio + MicroPython auf dem PI PICO

Hier noch eine weitere Spielerei mit dem PI Pico (angeregt durch eine 
Diskussion im Forum Microcontroller zum Thema "Fragen zur 
IR-Datenübertragung").

Dem PI PICO fehlen die üblichen WLAN- oder Bluetooth-Schnittstellen.
Anstatt aber entsprechende Module anzuflanschen, genügt es unter 
Umständen,
eine einfache serielle Datenübertragung via Infrarot einzurichten.

Benötigt werden nur wenige Bauteile, senderseitig eine IR-Diode + 
Treibertransistor, empfangsseitig ein TSOPxxxx-Receiver.
Die Gegenstelle kann ein uC sein, oder ein PC, an den der TSOP über 
einen Seriell-USB-Adapter angeschlossen ist.

Für meine Tests arbeitete auf einem PC ein Python-Script (rx.py), um die 
eingehenden Daten zu prüfen.
Der Sendeteil (tx.py) sendet 100 Datenframes im Abstand von 0.5 
Sekunden, der Empfänger gibt die Erfolgsquote aus.

Der IR-Sender bestand aus 2 in Reihe geschaltete IR-Dioden 
(Strombegrenzung auf 100mA), die indirekt gegen eine weiße Wandfläche 
stahlten (entgegengesetzte Richtung zum Empfänger in ca. 3m Entfernung).

Die zuverlässig erreichbare Datenübertragungsrate lag bei 2400 Baud, 
sowohl bei 38 kHz als auch bei 56 kHz.
4800 Baud waren nur über 56 kHz erreichbar, wenn zusätzlich der Sender 
direkt in Richtung des Empfängers strahlt.

Der Programmcode funktioniert nur auf einem PI PICO, da die relevanten 
Programmteile in asm_pio geschrieben sind (serial_over_ir.py).
Diese Datei wird auf den Pico geladen und von dort importiert.

Senderseitig werden bis zu 9 Byte in den TX-Fifos zwischengespeichert, 
die Senderoutine kehrt in diesem Fall sofort in den aufrufenden 
Programmteil zurück.
Werden mehr als 9 Bytes übertragen, dann blockt die Routine solange, bis 
n - 9 Bytes versendet sind.


Als Nebenprodukt ist noch ein minimierter Beeper entstanden 
(pio_beeper.py).
Er wird aufgerufen mit der Beep-Dauer in Millisekunden als Parameter und
beendet sich nach Ablauf der Zeit selbstständig.

Michael S.

von CM (Gast)


Lesenswert?

>Dem PI PICO fehlen die üblichen WLAN- oder Bluetooth-Schnittstellen.
>Anstatt aber entsprechende Module anzuflanschen, genügt es unter
>Umständen, eine einfache serielle Datenübertragung via Infrarot >einzurichten.

Eine nette Idee. Manchmal könnte es sinnvoll sein, den Hardwareaufwand 
noch weiter zu reduzieren und einfach eine normale LED als Sender und 
Empfänger zu nutzen:

https://github.com/ChrisMicro/LedDataTransmission

von Tim  . (cpldcpu)


Lesenswert?

Welche IDE nutzt Du für MicroPython? Ich kann mich mit dem Vorhandenden 
nicht so recht anfreunden.

Am gängigsten erscheint die Lösung mit Stubs + rshell, aber das ist auch 
ein ziemliches Herumgehacke. Die Arduino-Style IDEs finde ich vom Editor 
her zu einfach.

Edit: Habe Pico Go gefunden. Scheint genau das zu sein, was ich haben 
wollte.

http://pico-go.net/docs/start/quick/

: Bearbeitet durch User
von Info (Gast)


Lesenswert?


von m.n. (Gast)


Lesenswert?

Tim  . schrieb:
> Ich kann mich mit dem Vorhandenden
> nicht so recht anfreunden.

Ebenso. Deshalb wollte ich dies hier verlinken: 
https://www.eevblog.com/forum/projects/usb-sniffer-using-rp2040/
Aber vielleicht hast Du (tim_?) diesen Beitrag schon selber gefunden. 
Der Umgang mit der PIO in 'capture.c' (inkl. 'pio_asm.h') ist schon 
recht clever. Das muß ich unbedingt noch selber testen.

von Tim  . (cpldcpu)


Lesenswert?

m.n. schrieb:
> Ich kann mich mit dem Vorhandenden
> nicht so recht anfreunden.

Damit bezog ich mich allerdings auf die Micropython IDEs, wie z.B. 
Thonny. Mit "Pico go" (s.O.) habe ich aber dann eine gute Lösung für VC 
Code gefunden.

> Aber vielleicht hast Du (tim_?) diesen Beitrag schon selber gefunden.

Ja, gerade heute morgen :)

> Der Umgang mit der PIO in 'capture.c' (inkl. 'pio_asm.h') ist schon

Hier hat der Autor eine nette Sammlung an "Bare-Metal" Projekten:

https://github.com/ataradov/mcu-starter-projects

: Bearbeitet durch User
von Tim  . (cpldcpu)


Lesenswert?

Muss noch einmal die codesammlung oben loben! Habe einige Tricks 
gefunden, die ich woanders noch nichts geshene haben, z.b. um Konstanten 
>31 in die x und y register zu laden.

Irgendwie finde ich die PIO-Programmierung aber immer noch zu 
umständlich. Das Zyklenzählen nervt. Vieles könnte man über einen 
konfigurierbaren Timer auch sehr gut abdecken, ohne dass man sich bei 
jeder Änderung Gedanken über das Timing machen muss.

von Mi N. (msx)


Lesenswert?

Tim  . schrieb:
> Irgendwie finde ich die PIO-Programmierung aber immer noch zu
> umständlich. Das Zyklenzählen nervt. Vieles könnte man über einen
> konfigurierbaren Timer auch sehr gut abdecken, ohne dass man sich bei
> jeder Änderung Gedanken über das Timing machen muss.

Schon, aber PWM und 'blinky' mit PIO sind ja auch eher schlichte 
Anwendungen. Allerdings hat man die Freiheit, auf irgendeinem GPIO ein 
PWM-Signal auszugeben.
Interessanter werden Anwendungen, wo Register zum Beispiel per DMA 
nachgeladen werden. Auch ist es möglich, bei laufendem PIO-Programm 
einzelne Anweisungen zwischenzuschieben oder auch das Programm zu 
ändern.
Aber gut, da muß man wissen, wo u. a. die INSTR_MEMx-Register liegen und 
auch bereit sein, Taktzyklen zu zählen. Andererseits macht man das 
einmalig, bis das Programm steht, und das nicht 10 x täglich neu.

von Gerhard H. (Gast)


Lesenswert?

c-hater schrieb:
> Es ist schon ziemlich geil, fast unvorstellbare Sachen mit Hilfe der
> PIOs realisieren zu können, selbst aus einer Schriptsprache heraus.

Ja, ziemlich geil diese schnelle Hardware zu beherrschen. Eine andere 
Sache bleibt trotzdem, obs die Leistung zum Preis von mehr Doku-Studium 
für sehr viele Anwendungen überhaupt braucht. So ein kleiner AVR schafft 
viele davon auf wesentlich weniger Fläche genauso- und vor allem 
simpler...

von Tim  . (cpldcpu)


Lesenswert?

Mi N. schrieb:
> Aber gut, da muß man wissen, wo u. a. die INSTR_MEMx-Register liegen und
> auch bereit sein, Taktzyklen zu zählen. Andererseits macht man das
> einmalig, bis das Programm steht, und das nicht 10 x täglich neu.

Ich bin jetzt an dem Punkt angekommen, wo es ohne DMA nicht mehr weiter 
geht. Das offizielle Micropython scheint DMA für PIO nicht zu 
unterstützen?!?

Ich habe das hier gefunden:
https://github.com/robert-hh/RP2040-Examples/tree/master/rp2_util

Gibt es noch andere Libraries, die evtl. weiter verbreitet sind?

von Mi N. (msx)


Lesenswert?

Gerhard H. schrieb:
> So ein kleiner AVR schafft
> viele davon auf wesentlich weniger Fläche genauso- und vor allem
> simpler...

Und eben auch nur simpel :-(

Tim  . schrieb:
> Ich bin jetzt an dem Punkt angekommen, wo es ohne DMA nicht mehr weiter
> geht. Das offizielle Micropython scheint DMA für PIO nicht zu
> unterstützen?!?

Bei der Arduino-IDE gibt es ähnliche Probleme - der Anwender soll ja 
auch die Finger davon lassen ;-)
Ich stelle gerade einige Pico-Pi Projekte von C mit CMSIS auf 
Arduino-IDE um. Der Grund ist eine einfache, kostengünstige Umgebung. Da 
kann man dann mit allen Registern nach Herzenslust arbeiten. Aber .py 
habe ich nicht auf dem Schirm.

von Norbert (der_norbert)


Lesenswert?

Tim  . schrieb:
> Das offizielle Micropython scheint DMA für PIO nicht zu
> unterstützen?!?

Das offizielle Micropython unterstützt (von sehr einfach bis etwas 
schwieriger)
mem[8,16,32], viper und asm_thumb.
Wenn das nicht reicht um DMA zu machen, was dann? ;-)

von Tim  . (cpldcpu)


Lesenswert?

Norbert schrieb:
> Das offizielle Micropython unterstützt (von sehr einfach bis etwas
> schwieriger)
> mem[8,16,32], viper und asm_thumb.
> Wenn das nicht reicht um DMA zu machen, was dann? ;-)

Das ist alles low-level herumgehacke. Sehr "unpythonic".

von Norbert (der_norbert)


Lesenswert?

Tim  . schrieb:
> Das ist alles low-level herumgehacke. Sehr "unpythonic".

Klasse drum herum. Ab damit in ein Modul. Fertig für die Ästheten.

von Frank O. (frank_o)


Lesenswert?

c-hater schrieb:
> Das Problem ist nur: Die Dödels, die schon nicht in der Lage sind, C
> oder Asm zu lernen, werden auch den Assembler der PIOs nicht lernen
> wollen oder können.

Wenn du "Dödels" weggelassen hättest, dann wäre dein Text ja ganz in 
Ordnung.
Die Welt besteht eben nicht nur aus Menschen die ASM machen wollen.
Vielen reicht es sogar ein Auto fahren zu können, ohne jeden 
Mikrocontroller darin selbst programmieren zu können. Die können 
teilweise nicht einmal Betriebsstoffe ergänzen.
Aber das ist doch völlig in Ordnung so.
Ich würde auch gerne noch ASM lernen, aber dafür wird meine Lebenszeit 
wohl zu kurz sein. Also beschränkt man sich auf das, was man irgendwie 
hin bekommen kann.

von Al. K. (alterknacker)


Lesenswert?

Frank O. schrieb:
> Ich würde auch gerne noch ASM lernen, aber dafür wird meine Lebenszeit
> wohl zu kurz sein. Also beschränkt man sich auf das, was man irgendwie
> hin bekommen kann.
Jetzt müssten die bekannten Ratschläge für die "Alten" kommen;-))

Um etwas Zeitaufwendiges, und dann noch wenig sinnvoll Anwendungsfähiges
im hohen Alter zu erlernen, da ist die Lebenszeit zu wichtig und besser 
einsetzbar.

MfG
alterknacker

von Raul K. (rkompass)


Lesenswert?

>Ich bin jetzt an dem Punkt angekommen, wo es ohne DMA nicht mehr weiter
>geht. Das offizielle Micropython scheint DMA für PIO nicht zu
>unterstützen?!?
>
>Ich habe das hier gefunden:
>https://github.com/robert-hh/RP2040-Examples/tree/master/rp2_util
>
>Gibt es noch andere Libraries, die evtl. weiter verbreitet sind?

Ich habe aus robert-hh s DMA-Routinen eine Klasse gemacht.
Die liegt zZ. auf Github hier: https://github.com/rkompass/RPi2040_mPy .

Der Code sollte die DMA-Programmierung einfacher machen, weil ich 
versucht habe, entsprechende Konstanten für GPIO, PIO usw. automatisch 
generieren zu lassen.

Es gibt inzwischen aber auch im RP2 Modul eine DMA-Klasse, die besser 
ins System integriert ist, aber nicht ganz die gleiche Einfachheit 
bietet.
Sie erkennt dafür (vermutlich) intern bereits belegte Kanäle (etwa DMA0 
für die Nutzung des WLAN auf dem Pico W) und erlaubt das Setzen von 
Interrupts.

: Bearbeitet durch User
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.