Squarewaves - RP2040

OP #7585836
Lesenswert?

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??

OP #7585949
Lesenswert?

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);

1
gpio_set_function(0, GPIO_FUNC_PIO0);
2
gpio_set_function(1, GPIO_FUNC_PIO0);
3
gpio_set_function(2, GPIO_FUNC_PIO0);
4
gpio_set_function(4, GPIO_FUNC_PIO0);

Erster Blick wäre auf Zeile 42.

Wie müsste ich die verändern?

#7585965
Lesenswert?

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?

OP #7585971
Lesenswert?

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.

#7585972
Lesenswert?

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.

OP #7585982
Lesenswert?

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.

#7585997
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren