Quantcast
Channel: Raspberry Pi Forums
Viewing all articles
Browse latest Browse all 7610

SDK • PIO and Interrupts

$
0
0
I'm trying to use a PIO to output a step pulse for 4 motors. The PIO routine sets IRQ0, but the interrupt handler is never called. The RP2350 is new to me and I have been looking for examples as well as searching the forums. This function is the result of that effort. Since it's not working, I must have left something out and/or misunderstood how things work. If someone can explain what I've done wrong I would appreciated it.

void pio_step_init(PIO pio, uint sm, uint prog_offs)

My environment:
Windows 10
Arduino IDE 2.3.5
Raspberry Pi Pico C/C++ SDK 4.5.1

Here's the code. Thanks in advance

Code:

// -------------------------------------------------- //// This file is autogenerated by pioasm; do not edit! //// -------------------------------------------------- //#pragma once#if !PICO_NO_HARDWARE#include "hardware/pio.h"#endif// ----------- //// pio_stepper //// ----------- //#define pio_stepper_wrap_target 0#define pio_stepper_wrap 8#define pio_stepper_pio_version 0static const uint16_t pio_stepper_program_instructions[] = {            //     .wrap_target    0x80a0, //  0: pull   block                          0x6034, //  1: out    x, 20                          0x6004, //  2: out    pins, 4                        0x6044, //  3: out    y, 4                           0x0084, //  4: jmp    y--, 4                         0x6004, //  5: out    pins, 4                        0x0046, //  6: jmp    x--, 6                         0xc000, //  7: irq    nowait 0                       0x0000, //  8: jmp    0                                      //     .wrap};#if !PICO_NO_HARDWAREstatic const struct pio_program pio_stepper_program = {    .instructions = pio_stepper_program_instructions,    .length = 9,    .origin = -1,    .pio_version = 0,#if PICO_PIO_VERSION > 0    .used_gpio_ranges = 0x0#endif};static inline pio_sm_config pio_stepper_program_get_default_config(uint offset) {    pio_sm_config c = pio_get_default_sm_config();    sm_config_set_wrap(&c, offset + pio_stepper_wrap_target, offset + pio_stepper_wrap);    return c;}#endif// ----------- //// pio_set_dir //// ----------- //#define pio_set_dir_wrap_target 0#define pio_set_dir_wrap 2#define pio_set_dir_pio_version 0static const uint16_t pio_set_dir_program_instructions[] = {            //     .wrap_target    0x80a0, //  0: pull   block                          0x6004, //  1: out    pins, 4                        0x0000, //  2: jmp    0                                      //     .wrap};#if !PICO_NO_HARDWAREstatic const struct pio_program pio_set_dir_program = {    .instructions = pio_set_dir_program_instructions,    .length = 3,    .origin = -1,    .pio_version = 0,#if PICO_PIO_VERSION > 0    .used_gpio_ranges = 0x0#endif};static inline pio_sm_config pio_set_dir_program_get_default_config(uint offset) {    pio_sm_config c = pio_get_default_sm_config();    sm_config_set_wrap(&c, offset + pio_set_dir_wrap_target, offset + pio_set_dir_wrap);    return c;}#endif/*************************************C++ File : PIO_Stepper.cc*************************************/#include <Adafruit_TinyUSB.h>#include "hardware/clocks.h"#include "hardware/structs/pll.h"#include "hardware/structs/clocks.h"#include "hardware/gpio.h"#include "hardware/pio.h"#include "PIO_Stepper.h"#include "Step_IO.hh"#define pin_step 2#define pin_dir 6 PIO pio_s; uint sm_s; uint offset_s; PIO pio_d; uint sm_d; uint offset_d; uint8_t Dir = 0;uint f_clk_sys;float pio__clkdiv;void Do_Step(uint32_t Step_Width, uint8_t Step_Pulse, uint8_t Pins)// Up to 4 axes{  //  //  |----|----|----|----.----.----.----.----|  //  zero Pulse Pins       Step_Width  //  Step_Pulse = Step_Pulse & 0x0F;  Step_Width = (Step_Width & 0x000FFFFF) - Step_Pulse;  Pins = Pins & 0x0F;  Step_Width = Step_Width | (Pins << 20) | (Step_Pulse << 24);  // Serial.printf(" %8x \r \n", Step_Width);  pio_sm_put_blocking(pio_s, sm_s, Step_Width);}void IRQ_Handler_Stepper(void) {  //  Serial.printf("IRQ: %02x, PIO %02x, CRTL: %02x \r\n", pio_s->irq, pio_s->inte0, pio_s->ctrl);  pio_interrupt_clear(pio_s, 0);  Dir++;  Dir &= 15;  pio_set_direction(Dir);  Do_Step(500000, 10, 15);}void pio_step_init(PIO pio, uint sm, uint prog_offs) {  pio_sm_config c = pio_stepper_program_get_default_config(prog_offs);  for (int i = 0; i < 4; i++)    pio_gpio_init(pio, pin_step + i);  sm_config_set_out_pins(&c, pin_step, 4);  pio_sm_set_consecutive_pindirs(pio, sm, pin_step, 4, true);  sm_config_set_clkdiv(&c, pio__clkdiv);  pio_sm_init(pio, sm, prog_offs, &c);  pio_sm_set_enabled(pio, sm, true);  // setup irq  pio_set_irq0_source_enabled(pio, pis_interrupt0, true);  irq_set_exclusive_handler(PIO0_IRQ_0, IRQ_Handler_Stepper);  irq_set_enabled(PIO0_IRQ_0, true);} void pio_dir_init(PIO pio, uint sm, uint prog_offs) {  pio_sm_config c = pio_set_dir_program_get_default_config(prog_offs);  for (int i = 0; i < 4; i++)    pio_gpio_init(pio, pin_dir + i);    sm_config_set_out_pins(&c, pin_dir, 4);  pio_sm_set_consecutive_pindirs(pio, sm, pin_dir, 4, true);  sm_config_set_clkdiv(&c, pio__clkdiv);  pio_sm_init(pio, sm, prog_offs, &c);  pio_sm_set_enabled(pio, sm, true);}void pio_load_step(void) {  f_clk_sys = frequency_count_khz(CLOCKS_FC0_SRC_VALUE_CLK_SYS);  bool success = pio_claim_free_sm_and_add_program_for_gpio_range(    &pio_stepper_program,    &pio_s,    &sm_s,    &offset_s,    pin_step,    4,    true);  hard_assert(success);  pio__clkdiv = 150.0f;  pio_step_init(pio_s, sm_s, offset_s);  Serial.printf("IRQ: %02x, PIO %02x, CRTL: %02x \r\n", pio_s->irq, pio_s->inte0, pio_s->ctrl);  return;}void pio_load_dir(void) {  f_clk_sys = frequency_count_khz(CLOCKS_FC0_SRC_VALUE_CLK_SYS);  bool success = pio_claim_free_sm_and_add_program_for_gpio_range(    &pio_set_dir_program,    &pio_d,    &sm_d,    &offset_d,    pin_dir,    4,    true);  hard_assert(success);  pio__clkdiv = 1.0;  pio_dir_init(pio_d, sm_d, offset_d);  return;}void pio_set_direction(uint8_t dir_pins) {  pio_sm_put_blocking(pio_d, sm_d, dir_pins);}

Statistics: Posted by jag63 — Mon Apr 14, 2025 7:21 pm



Viewing all articles
Browse latest Browse all 7610

Trending Articles