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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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
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.