ich versuche seit heute morgen einen Programmcode zu schreiben und bin kläglich am scheitern...
Und zwar geht es darum vier Signale mittels Statemachine an den GPIOs des RP2040 auszugeben. Ich habe bisher an dem Programmcode squarewave.c und der Bibliothek squarewave.pio.h rumgebastelt und komme nicht wirklich weiter.
Es sollen vier Signale ausgegeben werden mit den Zuständen
Hex-Zustände wären: 0x009, 0x00C, 0x006 und 0x003 die sich immer wiederholen
Wenn ich die Library mit den Werten anpasse, vorher anstelle von nur GPIO0 (0x081) die weiteren GPIOs (0x08F) als Output setze und im Programmcode die einzelnen GPIOs auch mittels Set Funktion konfiguriere, klappt es nicht. Jemand eine Idee oder Lösungsvorschlag??
Das ist der erste Fehler. Diese Datei erzeugt die Toolchain wenn die squarewave.pio Datei übersetzt wird.
Also letzt genannte ist der Quellcode für die PIO. Dort stehen die Assemblerinstruktionen, deren Hexcode in squarewave.pio.h im Array squarewave_program_instructions[] von der Toolchain abgelegt wird.
Dieser Hexcode hat aber nichts mit den Signalen/Daten zu tun, die du ausgeben möchtest sondern sind die Instruktionen für die PIO statemachine.
Woher hat du denn für Idee den squarewave.pio.h File zu ändern?
kleiner Fehler, müsste
gpio_set_function(3, GPIO_FUNC_PIO0);
sein.
So, es klappt auf jeden Fall jetzt. Die Frage ist jetzt nur noch wie ich den Befehl 0x08F und 0x001 richtig auslagere, um den gewünschten Dutycycle zu erreichen...
Das ist der erste Fehler. Diese Datei erzeugt die Toolchain wenn die
squarewave.pio Datei übersetzt wird.
Also letzt genannte ist der Quellcode für die PIO. Dort stehen die
Assemblerinstruktionen, deren Hexcode in squarewave.pio.h im Array
squarewave_program_instructions[] von der Toolchain abgelegt wird.
Dieser Hexcode hat aber nichts mit den Signalen/Daten zu tun, die du
ausgeben möchtest sondern sind die Instruktionen für die PIO
statemachine.
Woher hat du denn für Idee den squarewave.pio.h File zu ändern?
Du bist ja ein ganz Lustiger :)
Was, denkst du, macht die Statemachine mit den Instruktionen?? Natürlich ausführen und wenn die richtigen GPIOs als Outputs festgelegt sind, werden die dementsprechend high oder low gesetzt mittels hexadezimalem Zuständen, welche im Assemblercode stehen.
Was, denkst du, macht die Statemachine mit den Instruktionen?? Natürlich
ausführen
Eben. Und die Quelle dieser Hexcodes ist nicht der pio.h File sondern der pio File in dem die Assembler Mnemonics stehen. Der h-File wird daraus erzeugt.
Mach dich gerne lustig, meine PIO statemachine macht was die soll :)
Nachtrag:
Ich habe dich so verstanden, dass du deine Änderungen in dem squarewave.pio.h gemacht hast. Und das ist die falsche Stelle (falsche Datei). Auch wenn es jetzt funktioniert. Solange bis jemand dann den .pio File ändert, dann sind alle deine Änderungen im pio.h File futsch.
Meine Annahme kommt daher weil du oben den Inhalt der pio.h gezeigt hast.
Ich habe dich so verstanden, dass du deine Änderungen in dem
squarewave.pio.h gemacht hast. Und das ist die falsche Stelle (falsche
Datei). Auch wenn es jetzt funktioniert. Solange bis jemand dann den
.pio File ändert, dann sind alle deine Änderungen im pio.h File futsch.
Meine Annahme kommt daher weil du oben den Inhalt der pio.h gezeigt
hast.
Jetzt verstehe ich auch, was du meinst.
Solange ich die Datei umbenenne und separat speicher, sollte dies aber kein Problem darstellen.
Dann sag mal wie ich einen Dutycycle von 50 % erreiche
Meinst Du im Ernst, das jemand hier deine Hex-Zahlen dechifriert? Was hindert dich daran den PIO Assemblercode zu posten? Ansonsten informier dich mal über die Wrapping Funktion.
Für Deine Anwendung reichen im übrigen zwei Instruktionen in der Schleife und zwei für die Initialisierung. (Letztere könnte man noch Auslagern) Annahme Shiftwidth ist passend auf 32bit oder 16bit konfiguriert:
1
.program quadrature
2
pull ifempty block
3
mov X, OSR
4
.wrap_target
5
pull ifempty noblock
6
out PINS, 4
7
.wrap
Dazu in die Initialisierug noch ein einzelnes
1
pio_sm_put(pio,0,0xc639c639);
Das Program nutzt aus, das der pull Befehl nach 8 Outs (8x4 Bit = 32) Das OSR vom X Register neu lädt, da die TXFIFO leer ist.