; vim: set ft=asm : vi ~/.vimrc + # set modeline
; ---------------------------------------------------------------------------- ;
;; \file rc-switch.pio
;; \author Sebastien Beaugrand
;; \sa http://beaugrand.chez.com/
;; \copyright CeCILL 2.1 Free Software license
;; \note https://hoperf.com/uploads/
;; AN112_CMT2150A_Configuration_Guideline_1695629627.pdf page 11
;; 3 Symbols/Bit __ _____
;; | |__|__| | | |__|
;; 4 Symbols/Bit __ ________
;; | |__|__|__| | | | |__|
;; 5 Symbols/Bit _____ ________
;; | | |__|__|__| | | | |__|__|
; ---------------------------------------------------------------------------- ;
.pio_version 0
.program rc_switch
.define public LEN 25
.wrap_target
pull
set x, (LEN - 1)
bitloop:
; Theorical value for 150us per bit with 3 symbols
set pins, 1 [12] ; 9 = 10 - 1
out pins, 1 [12] ; 9 = 10 - 1
set pins, 0 [ 2] ; 8 = 10 - 2
jmp x-- bitloop
.wrap
% c-sdk {
#include "hardware/clocks.h"
static inline void
rc_switch_program_init(PIO pio, uint sm, uint offset, uint pin, uint freq) {
pio_gpio_init(pio, pin);
pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true);
pio_sm_config c = rc_switch_program_get_default_config(offset);
sm_config_set_out_shift(&c,
/* right = */ false,
/* autopull = */ false,
rc_switch_LEN);
sm_config_set_out_pins(&c, pin, 1);
sm_config_set_set_pins(&c, pin, 1);
sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);
float div = (float) clock_get_hz(clk_sys) / freq;
sm_config_set_clkdiv(&c, div);
pio_sm_init(pio, sm, offset, &c);
pio_sm_set_enabled(pio, sm, true);
}
%}