Squarewaves - RP2040

OP #7585836

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.

OP

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?

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

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

OP

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.

OP

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.

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

Eine eigene Frage? Dieser Thread ist über 2 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.