comparison modulator.c @ 17:a249e4727b01

Move SM reset & DMA reprogramming to DMA IRQ handler, only trigger in PWM IRQ handler. Otherwise we would collide with the setup in the main loop.
author Daniel O'Connor <darius@dons.net.au>
date Tue, 25 Feb 2025 13:40:57 +1030
parents 56a79dce90e9
children f1e44afb41a3
comparison
equal deleted inserted replaced
16:56a79dce90e9 17:a249e4727b01
100 void 100 void
101 dma_handler(void) { 101 dma_handler(void) {
102 // Clear the interrupt request. 102 // Clear the interrupt request.
103 dma_hw->ints0 = 1u << dac_dma_chan; 103 dma_hw->ints0 = 1u << dac_dma_chan;
104 104
105 // Disabled for now, manual trigger only 105 printf("DAC: transfers %lu\n", dma_channel_hw_addr(dac_dma_chan)->transfer_count);
106 #if 0 106 printf("DAC: transfers %lu\n", dma_channel_hw_addr(ctrl_dma_chan)->transfer_count);
107
107 // Reset DAQ & ctrl PIO SMs so they are waiting for a trigger 108 // Reset DAQ & ctrl PIO SMs so they are waiting for a trigger
108 pio_sm_exec(pulse_pio, dac_sm, pio_encode_jmp(dac_pio_sm_offset)); 109 pio_sm_exec(pulse_pio, dac_sm, pio_encode_jmp(dac_pio_sm_offset));
109 pio_sm_exec(pulse_pio, ctrl_sm, pio_encode_jmp(ctrl_pio_sm_offset)); 110 pio_sm_exec(pulse_pio, ctrl_sm, pio_encode_jmp(ctrl_pio_sm_offset));
110
111 // Setup next pulse data & ctrl DMA addresses
112 dma_channel_set_read_addr(dac_dma_chan, pulse_data, true);
113 dma_channel_set_read_addr(ctrl_dma_chan, pulse_ctrl, true);
114 #endif
115 }
116
117
118 void
119 pwm_wrap(void) {
120 pwm_clear_irq(slice_num);
121
122 // Reset DAQ & ctrl PIO SMs so they are waiting for a trigger
123 pio_sm_exec(pulse_pio, dac_sm, pio_encode_jmp(dac_pio_sm_offset));
124 pio_sm_exec(pulse_pio, ctrl_sm, pio_encode_jmp(ctrl_pio_sm_offset));
125
126 printf("DAC: transfers %lu\n", dma_channel_hw_addr(dac_dma_chan)->transfer_count);
127 printf("DAC: transfers %lu\n", dma_channel_hw_addr(ctrl_dma_chan)->transfer_count);
128 111
129 // Setup next pulse data & ctrl DMA addresses 112 // Setup next pulse data & ctrl DMA addresses
130 dma_channel_wait_for_finish_blocking(dac_dma_chan); 113 dma_channel_wait_for_finish_blocking(dac_dma_chan);
131 dma_channel_set_read_addr(dac_dma_chan, pulse_data, true); 114 dma_channel_set_read_addr(dac_dma_chan, pulse_data, true);
132 dma_channel_wait_for_finish_blocking(ctrl_dma_chan); 115 dma_channel_wait_for_finish_blocking(ctrl_dma_chan);
133 dma_channel_set_read_addr(ctrl_dma_chan, pulse_ctrl, true); 116 dma_channel_set_read_addr(ctrl_dma_chan, pulse_ctrl, true);
117 }
118
119
120 void
121 pwm_wrap(void) {
122 pwm_clear_irq(slice_num);
134 123
135 // Manually trigger DAQ SM (cleared by SM) 124 // Manually trigger DAQ SM (cleared by SM)
136 pio0->irq_force = 1 << 0; 125 pio0->irq_force = 1 << 0;
137 126
138 // 'scope trigger 127 // 'scope trigger