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.
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.
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.
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?
Hier ist der 125MSPs Funktionsgenerator: https://www.instructables.com/Arbitrary-Wave-Generator-With-the-Raspberry-Pi-Pic/
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.
Markus schrieb: > Wer oder was genau hat dich beauftragt, irgend jemandem etwas lehren zu > müssen? Niemand. Habe ich auch nirgendwo etwas derartiges behaupted.
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.
>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
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
Danke für's Posten. Ein paar PIO Infrarot-Sachen gibt's auch in https://github.com/raspberrypi/pico-examples/ hat viel mehr als https://github.com/raspberrypi/pico-micropython-examples https://github.com/peterhinch/micropython_ir Nutzt alles Hardware IR-Empfänger. https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html https://datasheets.raspberrypi.com/pico/pico-datasheet.pdf
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.
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
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.
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.
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...
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?
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.
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? ;-)
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".
Tim . schrieb: > Das ist alles low-level herumgehacke. Sehr "unpythonic". Klasse drum herum. Ab damit in ein Modul. Fertig für die Ästheten.
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.
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.