//#include "pico/cyw43_arch.h"

/**
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <stdio.h>

#include "pico/stdlib.h"
#include "hardware/pio.h"
#include "hardware/clocks.h"
#include "adcclk.pio.h"
#include "ppsclk.pio.h"

const uint BUTTON_GPIO = 28;
const uint LED_GPIO = 3;
const uint TRIG_GPIO = 27;
const uint ONBOARD_LED_GPIO = 25;
const uint ADCCLKPIN = 2;

void adcclk_pin_forever(PIO pio, uint sm, uint offset, uint pin, uint pwidth, uint pperiod);
void ppsclk_pin_forever(PIO pio, uint sm, uint offset, uint pin, uint pdelay);

//Changed rep rate to see led toggle


//Define the 2 values below
#define  freq 1   //repeat rate
#define  pulse_width 100000 //in us
#define  adcoffset_width 2000 //in us
//Below 2 are then calculated
#define  pulse_period   ((clock_get_hz(clk_sys) /1000000) * (pulse_width) - 5) 
#define  repeat_period  (((clock_get_hz(clk_sys) / freq) - 7) - pulse_period) // needs to allow for all jumps(7) - then sub the pulse ones (3)
#define  adcoffset_period ((clock_get_hz(clk_sys) /1000000) * (adcoffset_width) - 5)
void on_pio0_irq0(void); 
uint offset;
uint offset1;

//---------------------------------------------------------------------------------------------
int main() 
//---------------------------------------------------------------------------------------------
{
  // Initialize the GPIO to blink the LED
  //
  gpio_init(BUTTON_GPIO);
  gpio_set_dir(BUTTON_GPIO, GPIO_IN);
  gpio_pull_up(BUTTON_GPIO);

  gpio_init(ONBOARD_LED_GPIO);
  gpio_set_dir(ONBOARD_LED_GPIO, GPIO_OUT);
  gpio_put(ONBOARD_LED_GPIO, 1);    

  gpio_init(LED_GPIO);
  gpio_set_dir(LED_GPIO, GPIO_OUT);
  gpio_put(LED_GPIO, 0);    

  gpio_init(TRIG_GPIO);
  gpio_set_dir(TRIG_GPIO, GPIO_OUT);
  gpio_put(TRIG_GPIO, 0); 

  gpio_init(ADCCLKPIN);
  gpio_set_dir(ADCCLKPIN, GPIO_OUT);
  gpio_put(ADCCLKPIN, 0); 


  setup_default_uart();
  printf("Begun\n");
  sleep_ms(250);  
  printf("Pulse Period %d\n", pulse_period);
  printf("Repeat Period %d\n", repeat_period);
  printf("Clock Freq %d\n",clock_get_hz(clk_sys) );
  
  PIO pio = pio0;
  offset = pio_add_program(pio, &adcclk_program);
  printf("Loaded ADC program at %d\n", offset);  
  
  // offset1 = pio_add_program(pio, &ppsclk_program);
  // printf("Loaded PPS program at %d\n", offset1);
	
	// Setup Interrupt
  // irq_set_exclusive_handler(PIO0_IRQ_0, on_pio0_irq0);
	// irq_set_enabled(PIO0_IRQ_0, true);
	
  
  // enable interrupt
	//pio_set_irq0_source_enabled( pio0, pis_interrupt0, true);

  // do it - sm is zero - means load it into StateMachine(sm)0
  uint sm = 0;
  uint adcpin = 2; 
  adcclk_pin_forever(pio, sm, offset, adcpin, pulse_period, repeat_period);
  
  uint ppspin = 28;
  // ppsclk_pin_forever(pio, sm+1, offset1, ppspin, adcoffset_period); 

  printf("Go Done\n");
  while(1) {
    // output pulse stream on GP27 which you can hook to GP28(PPS) in
    // to check operation on scope - see diagram..
    
    gpio_put(ONBOARD_LED_GPIO,1);  // break up time (127) to display led flash
    sleep_ms(100);
    gpio_put(ONBOARD_LED_GPIO,0);
    sleep_ms(27);
    gpio_put(TRIG_GPIO,1);
    sleep_ms(1);
    gpio_put(TRIG_GPIO,0);
  }
}

//---------------------------------------------------------------------------------------------
void adcclk_pin_forever(PIO pio, uint sm, uint offset, uint pin, uint pwidth, uint pperiod) {
//---------------------------------------------------------------------------------------------
  adcclk_pio_init(pio, sm, offset, pin);
  pio_sm_set_enabled(pio, sm, true);

  printf("Pulsing pin %d at ~%d us, every ~%d us\n", pin, (pwidth + 7)/(clock_get_hz(clk_sys)/1000000), (pwidth + pperiod + 7)/(clock_get_hz(clk_sys)/1000000));
	pio->txf[sm] = pperiod;  // Drop period into fifo
	pio->txf[sm] = pwidth;   // drop width into fifo

}

//---------------------------------------------------------------------------------------------
void ppsclk_pin_forever(PIO pio, uint sm, uint offset, uint pin, uint pdelay) {
//---------------------------------------------------------------------------------------------
  ppsclk_pio_init(pio, sm, offset, pin);
  pio_sm_set_enabled(pio, sm, true);
  printf("Monitor pin %d for PPS, delay %d\n", pin, pdelay);
	pio->txf[sm] = pdelay;  // Drop period into fifo

}

//---------------------------------------------------------------------------------------------
// pio0 interrupt handler
void on_pio0_irq0(void) 
//---------------------------------------------------------------------------------------------
{
#define I_PIO pio0
#define I_SM 0		
static int i = 0;

// this exec changes adcclk_pio PC if triggered from ppsclk_pio code- this proves its working 
  pio_sm_exec(I_PIO, I_SM, offset + 6); // where instruction is a force jump to begin pulse high
  pio_interrupt_clear (I_PIO, 0);
  //pio_sm_restart(I_PIO, I_SM);
  printf("ding %d\n",i++);
	 
}

//---------------------------------------------------------------------------------------------
void possible_interrupt_setup_code(void)
//---------------------------------------------------------------------------------------------
{
	pio_set_irq0_source_enabled( pio0, pis_interrupt0, true);
}	

// /*! \brief PIO interrupt source numbers for pio related IRQs
 // * \ingroup hardware_pio
 // */
// enum pio_interrupt_source {
    // pis_interrupt0 = PIO_INTR_SM0_LSB,
    // pis_interrupt1 = PIO_INTR_SM1_LSB,
    // pis_interrupt2 = PIO_INTR_SM2_LSB,
    // pis_interrupt3 = PIO_INTR_SM3_LSB,
    // pis_sm0_tx_fifo_not_full = PIO_INTR_SM0_TXNFULL_LSB,
    // pis_sm1_tx_fifo_not_full = PIO_INTR_SM1_TXNFULL_LSB,
    // pis_sm2_tx_fifo_not_full = PIO_INTR_SM2_TXNFULL_LSB,
    // pis_sm3_tx_fifo_not_full = PIO_INTR_SM3_TXNFULL_LSB,
    // pis_sm0_rx_fifo_not_empty = PIO_INTR_SM0_RXNEMPTY_LSB,
    // pis_sm1_rx_fifo_not_empty = PIO_INTR_SM1_RXNEMPTY_LSB,
    // pis_sm2_rx_fifo_not_empty = PIO_INTR_SM2_RXNEMPTY_LSB,
    // pis_sm3_rx_fifo_not_empty = PIO_INTR_SM3_RXNEMPTY_LSB,
// };

// /*! \brief  Enable/Disable a single source on a PIO's IRQ 0
 // *  \ingroup hardware_pio
 // *
 // * \param pio The PIO instance; either \ref pio0 or \ref pio1
 // * \param source the source number (see \ref pio_interrupt_source)
 // * \param enabled true to enable IRQ 0 for the source, false to disable.
 // */
// static inline void pio_set_irq0_source_enabled(PIO pio, enum pio_interrupt_source source, bool enabled);

// #include "pico/stdlib.h"
// #include "pico/cyw43_arch.h"

// int main() {
//     stdio_init_all();
//     if (cyw43_arch_init()) {
//         printf("Wi-Fi init failed");
//         return -1;
//     }
//     while (true) {
//         cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, 1);
//         sleep_ms(250);
//         cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, 0);
//         sleep_ms(250);
//     }
// }
Loading
pi-pico
D0D1D2D3D4D5D6D7GNDLOGIC