It seems to be working. Lots of tinkering.

gpstest
roman 2023-11-07 03:07:42 +03:00
rodzic c732e83402
commit 37fc9d4da0
5 zmienionych plików z 90 dodań i 37 usunięć

Wyświetl plik

@ -55,7 +55,7 @@
/****************************************************************************
* RPi pico specific defs.
****************************************************************************/
#define CLK_FREQ 48000000L /* pico's ADC clock is 48M. */
#define CLK_ADC_FREQ 48000000L /* pico's ADC clock is 48M. */
#define GPIO(x) (x) /* pico GPIO number to address. */
#define PLL_SYS_MHZ 250 /* system clock. */

Wyświetl plik

@ -1,17 +1,36 @@
.program dco
set x, 0
.wrap_target
pull ifempty // 1
out y, 8 // load 8-bit delay value in terms of cycles. 2
LOOP0:
jmp y-- LOOP0 // do accurate delay. 3+t
set pins, 1 // set pins = 1. 4+t.
out x, 8 // load 8-bit delay value in terms of cycles. 1
LOOPH:
jmp x-- LOOPH // do accurate delay. 2+x
set pins, 1 // set pins = 1. 3+x.
out x, 8 // load 8-bit delay value in terms of cycles. 4+y
LOOPL:
jmp x-- LOOPL // 5+y
set pins, 0 // 6+y
// CLK/6 max, ~250MHz/6 = 41.666(6)MHz output max frq
pull ifempty // 5+t
out y, 8 // load 8-bit delay value in terms of cycles. 6+t
LOOP1:
jmp y-- LOOP1 // 7+t
set pins, 0 // 8+t
// CLK/8 max, 250MHz/8 = 31.25 MHz output max frq.
// CLK/(255+8) min, 250MHz/263 = 950 kHz min frq.
// So, it covers 3..30 MHz HF band + 160 meter band.
pull ifempty
out y, 8
LOOP2:
jmp y-- LOOP2
set pins, 1
pull ifempty
out y, 8
LOOP3:
jmp y-- LOOP3
set pins, 0
.wrap
% c-sdk {
@ -21,7 +40,7 @@ static inline void dco_program_init(PIO pio, uint sm, uint offset, uint pin)
sm_config_set_out_pins(&c, pin, 1);
pio_gpio_init(pio, pin);
sm_config_set_out_shift(&c, false, true, 32);
sm_config_set_out_shift(&c, false, true, 8); // Autopull.
sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);
pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true);
@ -34,14 +53,14 @@ static inline void dco_program_init(PIO pio, uint sm, uint offset, uint pin)
//
static inline void dco_program_puts(PIO pio, uint sm, const uint32_t *s)
{
pio_sm_put(pio, sm, s[0]);
pio_sm_put(pio, sm, s[1]);
pio_sm_put(pio, sm, s[2]);
pio_sm_put(pio, sm, s[3]);
pio_sm_put(pio, sm, s[4]);
pio_sm_put(pio, sm, s[5]);
pio_sm_put(pio, sm, s[6]);
pio_sm_put(pio, sm, s[7]);
pio_sm_put_blocking(pio, sm, s[0]);
pio_sm_put_blocking(pio, sm, s[1]);
pio_sm_put_blocking(pio, sm, s[2]);
pio_sm_put_blocking(pio, sm, s[3]);
pio_sm_put_blocking(pio, sm, s[4]);
pio_sm_put_blocking(pio, sm, s[5]);
pio_sm_put_blocking(pio, sm, s[6]);
pio_sm_put_blocking(pio, sm, s[7]);
}
%}

Wyświetl plik

@ -3,18 +3,32 @@
#include <string.h>
#include "../lib/assert.h"
int PioDCOInit(piodco *pdco, uint32_t ui32_clock_hz)
#include "build/dco.pio.h"
int PioDCOInit(PioDco *pdco, uint32_t ui32_clock_hz)
{
assert_(pdco);
memset(pdco, 0, sizeof(piodco));
memset(pdco, 0, sizeof(PioDco));
pdco->_clkfreq_hz = ui32_clock_hz;
pdco->_pio = pio0;
pdco->_gpio = 6;
pdco->_offset = pio_add_program(pdco->_pio, &dco_program);
pdco->_ism = pio_claim_unused_sm(pdco->_pio, true);
dco_program_init(pdco->_pio, pdco->_ism, pdco->_offset, pdco->_gpio);
pdco->_pio_sm = dco_program_get_default_config(pdco->_offset);
sm_config_set_set_pins(&pdco->_pio_sm, pdco->_gpio, 1);
pio_gpio_init(pdco->_pio, pdco->_gpio);
pio_sm_init(pdco->_pio, pdco->_ism, pdco->_offset, &pdco->_pio_sm);
pio_sm_set_enabled(pdco->_pio, pdco->_ism, true);
return 0;
}
int PioDCOSet(piodco *pdco, uint32_t ui32_frq_hz)
int PioDCOSet(PioDco *pdco, uint32_t ui32_frq_hz)
{
assert_(pdco);
assert(pdco->_clkfreq_hz);
@ -27,17 +41,17 @@ int PioDCOSet(piodco *pdco, uint32_t ui32_frq_hz)
return 0;
}
void PioDCOStart(piodco *pdco)
void PioDCOStart(PioDco *pdco)
{
}
void PioDCOStop(piodco *pdco)
void PioDCOStop(PioDco *pdco)
{
}
void PioDCOTick(piodco *pdco)
void PioDCOTick(PioDco *pdco)
{
}

Wyświetl plik

@ -6,32 +6,30 @@
#include "pico/stdlib.h"
#include "hardware/pio.h"
typedef struct
{
//bool _brun;
PIO _pio; /* Worker PIO on this DCO. */
int _gpio; /* Pico' GPIO for DCO output. */
pio_sm_config _pio_sm; /* Worker PIO parameter. */
int _ism; /* Index of state maschine. */
int _offset; /* Worker PIO u-program offset. */
uint32_t _phase_prompt; /* Last DCO phase val, [0...2PI). */
uint32_t _phase_increment; /* DCO phase increment, per 1 CLK. */
uint32_t _ui32_pioreg[8]; /* Shift register into PIO. */
uint32_t _ui32_pioreg[8]; /* Shift register to PIO. */
uint32_t _clkfreq_hz; /* CPU CLK freq, Hz. */
} piodco;
} PioDco;
int PioDCOInit(piodco *pdco, uint32_t ui32_clock_hz);
int PioDCOSet(piodco *pdco, uint32_t ui32_frq_hz);
int PioDCOInit(PioDco *pdco, uint32_t ui32_clock_hz);
int PioDCOSet(PioDco *pdco, uint32_t ui32_frq_hz);
void PioDCOStart(piodco *pdco);
void PioDCOStop(piodco *pdco);
void PioDCOStart(PioDco *pdco);
void PioDCOStop(PioDco *pdco);
void PioDCOTick(piodco *pdco);
void PioDCOTick(PioDco *pdco);
#endif

26
test.c
Wyświetl plik

@ -5,14 +5,35 @@
#include "build/dco.pio.h"
#include "hardware/vreg.h"
#include "./lib/assert.h"
#include "hwdefs.h"
#include "./dcoisr/dcoisr.h"
int main()
{
//vreg_set_voltage(VREG_VOLTAGE_1_25);
set_sys_clock_khz(270000, true);
PioDco DCO;
DcoIsrContext ISRC;
set_sys_clock_khz(PLL_SYS_MHZ * 1000L, true);
gpio_init(PICO_DEFAULT_LED_PIN);
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
assert_(0 == PioDCOInit(&DCO, PLL_SYS_MHZ * 1000000L));
//DcoIsrInit(&ISRC, &DCO);
uint32_t pval[8];
memset((char *)pval, 0x00, 32);
for(;;)
{
gpio_put(PICO_DEFAULT_LED_PIN, 0);
dco_program_puts(DCO._pio, DCO._ism, pval);
gpio_put(PICO_DEFAULT_LED_PIN, 1);
dco_program_puts(DCO._pio, DCO._ism, pval);
}
/*
const int offset = pio_add_program(pio0, &dco_program);
const int ism = pio_claim_unused_sm(pio0, true);
@ -37,6 +58,7 @@ int main()
gpio_put(PICO_DEFAULT_LED_PIN, 0);
//sleep_ms(1000);
}
*/
/*
pcb->c = bitdco_program_get_default_config(offset);
pcb->pio = pio;