Spielereien mit asm_thumb / Micropython auf dem PI PICO
Mit Micropython kann man auf erfrischend einfache Art und Weise mit dem
PICO arbeiten:
Python ist meist schon installiert, Thonny nachladen, USB-Kabel
anstecken und ab geht die Post.
Wer schon einmal mit Microcontrollern gearbeitet hat, der vermisst
vielleicht die Möglichkeit des direkten Zugriffs auf die Register.
Auch das ist mit Micropyhton kein Problem, über asm_thumb kann man
Bekanntschaft mit den Registerm schließen.
Der asm-Code wird ohne große Verrenkungen mit Hilfe eines Decorators in
den Programmcode eingebunden.
Das ist ideal für diejenigen, die dem PICO das entlocken wollen, was
Micropython verbirgz.
Ich habe beispielhaft mit dem direkter Zugriff auf die GPIOs (ohne
machine.Pin) und mit der PWM-Konfiguration auf Register-Ebeme
experimentiert.
Was kann man damit erreichen ?
Man kann verstehen, was "unter der Haube" abläuft - oder, warum es nicht
abläuft.
Zum Beispiel, warum ein geradzahliger PWM-Pin und der folgende
ungeradzahlige PWM-Pin nicht auf unterschiedliche Frequenzen
konfiguriert werden können (was im Manual nicht erwähnt wird).
Und Micropython unterstützt auch nicht alle Features des Controllers.
So kennt etwa machine.PWM keine Optionen, um den phase-correct Modus zu
aktivieren oder um Pins zu invertieren.
Auch die Performance kann (u.U) deutlich besser werden.
Beispiel: Um alle 29 Pins des PICO (nacheinander) zu schalten, benötigt
Micropython ca. 1500us.
Der Assembler Code schafft das in ca 90us (wenn alle Pins innerhalb
einer asm-Schleife geschaltete werden),
Wird nur an einem einzelnen Pin gewackelt, entschwinden die Vorteile des
asm-Codes, denn der wird über eine Python Funktiom aufgerufen - und die
braucht halt ihre Zeit.
Für diejenigen, die mit Micropython auf dem PICO arbeiten, aber etwas
über den Tellerrand von Micropython hinausschauen wollen, habe ich
einige Beispiele als Einstiegshilfe in der Anlage zusammengestellt.
Michael S.
Michael S. schrieb:> Wer schon einmal mit Microcontrollern gearbeitet hat, der vermisst> vielleicht die Möglichkeit des direkten Zugriffs auf die Register.>> Auch das ist mit Micropyhton kein Problem, über asm_thumb kann man> Bekanntschaft mit den Registerm schließen.
Na ja, einen direkten Registerzugriff kann man deutlich bequemer über
machine.mem8/16/32 erreichen.
Oder noch bequemer (geradezu Kindertauglich) über ctypes…
Aber wenn's schnell, richtig schnell sein soll, dann stimme ich dir zu.
Ich schrieb:> Aber wenn's schnell, richtig schnell sein soll, dann stimme ich dir zu.
Ach ja, @micropython.viper code hatte ich noch vergessen, der rast auch
recht flott…
Willhelm T. schrieb im Beitrag #7175290:
> Eine frage:> Da pi-pico und esp32 gleich viel kosten frage ich warum den pico> verwenden?> Welche vorteile hat er gegenüber dem esp?>> Ich hab einige von den pico's hier, aber nie ausprobiert. Motivier mich!
8-Kanal PIO, Interpolators, 8PWMs mit 16Kanälen, usw.usf.
Die sind so gut, für die gibt's sogar Datenblätter…
Hier noch ein Nachtrag zum Thema Pin-Konfiguration via GPIO-Register
Bei den 8-Bit-AVR-Controllern kann man alle Pins eines Ports innerhalb
eines CPU-Taktes (also gleichzeitig) schreiben, lesen oder
konfigurieren.
Beim rp2040 scheint daw zunächst anders zu sein, da hier für jeden Pin
ein eigener Registersatz existiert und konfiguriert werden muss.
Lesen, Schreiben etc. funktioniert so nur Pin für Pin nacheinander.
Das erscheint verwunderlich - aber es geht auch anders.
Bei der Lektüre des Kapitels 2.3.1 SIO (Single-cycle IO) findet man die
Hinweise, wie die Cores "atomic" innerhalb eines Taktes Zugriff auf alle
Pins haben.
Relevant sind die Register im SIO-Block
1
GPIO_IN
2
GPIO_OUT ,,,
3
GPIO_OE ...
über diese Register kann die Pin-Dir und der Pin-Status aller Pins
gelesen, gesetzt, gelöscht oder getoggled werden.
Der Vorteil ist:
- die Berechnung der Registeradressen der zu ändernden Pins entfällt,
- beliebige Pins können zeitgleich manipuliert werrden.
Voraussetzung ist allerdings, dass die Pins mit FUNCSEL = F_SIO (0x05)
konfiguriert worden sind.
Dieses und auch die Aktivierung von Pullups wiederum muss man Pim für
Pin durchführen. Es sei denn, ich habe etwas übersehen.
Michael S.