Forum: Mikrocontroller und Digitale Elektronik Squarewaves - RP2040


von Lennard (lenn4rd)


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

von Rainer W. (rawi)


Lesenswert?

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.

von Lennard (lenn4rd)


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

    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
von Lennard (lenn4rd)


Lesenswert?

Lennard schrieb:
> gpio_set_function(4, GPIO_FUNC_PIO0);

kleiner Fehler, müsste
gpio_set_function(3, GPIO_FUNC_PIO0);
sein.

: Bearbeitet durch User
von 900ss (900ss)


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?

von Lennard (lenn4rd)


Lesenswert?

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

von Lennard (lenn4rd)


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.

von 900ss (900ss)


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.

: Bearbeitet durch User
von Lennard (lenn4rd)


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.

von Lennard (lenn4rd)


Lesenswert?

900ss schrieb:
> Mach dich gerne lustig, meine PIO statemachine macht was die soll :)

Dann sag mal wie ich einen Dutycycle von 50 % erreiche

von 900ss (900ss)


Lesenswert?

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.

von Andreas M. (amesser)


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.

von Mi N. (msx)


Lesenswert?

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

von Lennard (lenn4rd)


Lesenswert?

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 :(

von Lennard (lenn4rd)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.