Schönen Guten Abend liebe Bastler, 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 GPIO 0: 1100 GPIO 1: 0110 GPIO 2: 0011 GPIO 3: 1001 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??
Lennard schrieb: > GPIO 0: 1100 > GPIO 1: 0110 > GPIO 2: 0011 > GPIO 3: 1001 > Hex-Zustände wären: 0x009, 0x00C, 0x006 und 0x003 die sich immer > wiederholen Wie passt das zusammen? Ich sehe da 0x09, 0x03, 0x06 und 0x0c ( in dieser Reihenfolge, GPIO 0 ist das LSB). Wie sieht dein Code aus? Erster Blick wäre auf Zeile 42.
Rainer W. schrieb: > Wie passt das zusammen? > Ich sehe da 0x09, 0x03, 0x06 und 0x0c ( in dieser Reihenfolge, GPIO 0 > ist das LSB). Du hast natürlich recht. > Wie sieht dein Code aus? Für die Library habe ich (da muss ich noch den ersten und letzten Aufruf auslagern, sodass es auch einen Dutycycle von 50 % ergibt): #define squarewave_wrap_target 0 #define squarewave_wrap 5 static const uint16_t squarewave_program_instructions[] = { // .wrap_target 0xe08F, 0xe109, 0xe103, 0xe106, 0xe10C, 0x0001, // .wrap }; #if !PICO_NO_HARDWARE static const struct pio_program squarewave_program = { .instructions = squarewave_program_instructions, .length = 6, .origin = -1, }; Und den Programmcode habe ich nur hier verändert: pio->sm[0].pinctrl = (4 << PIO_SM0_PINCTRL_SET_COUNT_LSB) | (0 << PIO_SM0_PINCTRL_SET_BASE_LSB); gpio_set_function(0, GPIO_FUNC_PIO0); gpio_set_function(1, GPIO_FUNC_PIO0); gpio_set_function(2, GPIO_FUNC_PIO0); gpio_set_function(4, GPIO_FUNC_PIO0); > Erster Blick wäre auf Zeile 42. Wie müsste ich die verändern?
:
Bearbeitet durch User
Lennard schrieb: > gpio_set_function(4, GPIO_FUNC_PIO0); kleiner Fehler, müsste gpio_set_function(3, GPIO_FUNC_PIO0); sein.
:
Bearbeitet durch User
Lennard schrieb: > squarewave.pio.h rumgebastelt 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?
Lennard schrieb: > Lennard schrieb: >> gpio_set_function(4, GPIO_FUNC_PIO0); > > 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...
900ss schrieb: > 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.
Lennard schrieb: > 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.
:
Bearbeitet durch User
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.
900ss schrieb: > Mach dich gerne lustig, meine PIO statemachine macht was die soll :) Dann sag mal wie ich einen Dutycycle von 50 % erreiche
Lennard schrieb: > Dann sag mal wie ich einen Dutycycle von 50 % erreiche Erst machst du dich lustig und jetzt kommt eine Aufforderung zur Hilfe. Du solltest auch an deiner Art um Hilfe zu bitten arbeiten.
Lennard schrieb: > 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.
Andreas M. schrieb: > Für Deine Anwendung reichen im übrigen zwei Instruktionen in der > Schleife und zwei für die Initialisierung. So sieht es aus! Aber das wird dem TO jetzt sicherlich viel zu schnell gehen ;-)
Mi N. schrieb: > Andreas M. schrieb: >> Für Deine Anwendung reichen im übrigen zwei Instruktionen in der >> Schleife und zwei für die Initialisierung. > > So sieht es aus! > Aber das wird dem TO jetzt sicherlich viel zu schnell gehen ;-) Ja richtig, sonst würde ich das alles ja nicht fragen :(
> 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. Danke für deine Antwort !!
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.