//#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
pi-pico