Forum: Projekte & Code Spielereien mit asm_thumb / Micropython auf dem PI PICO


von Michael S. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Norbert (Gast)


Lesenswert?

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.

von Norbert (Gast)


Lesenswert?

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…

Beitrag #7175290 wurde von einem Moderator gelöscht.
von Norbert (Gast)


Lesenswert?

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…

Beitrag #7175367 wurde von einem Moderator gelöscht.
Beitrag #7175871 wurde von einem Moderator gelöscht.
von Michael S. (Gast)


Angehängte Dateien:

Lesenswert?

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.

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.