kopia lustrzana https://github.com/RPiks/pico-hf-oscillator
				
				
				
			It seems to be working. Lots of tinkering.
							rodzic
							
								
									c732e83402
								
							
						
					
					
						commit
						37fc9d4da0
					
				
							
								
								
									
										2
									
								
								hwdefs.h
								
								
								
								
							
							
						
						
									
										2
									
								
								hwdefs.h
								
								
								
								
							|  | @ -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. */ | ||||
| 
 | ||||
|  |  | |||
|  | @ -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]); | ||||
| } | ||||
| 
 | ||||
| %} | ||||
|  |  | |||
|  | @ -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) | ||||
| { | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -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
								
								
								
								
							
							
						
						
									
										26
									
								
								test.c
								
								
								
								
							|  | @ -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; | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 roman
						roman