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…
Beitrag #7175290 wurde von einem Moderator gelöscht.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.