31 lines
885 B
Plaintext
31 lines
885 B
Plaintext
; Klassisches PIO-PWM (Vorlage aus pico-examples).
|
|
; Pro Periode: pull noblock holt den neuen Level aus dem FIFO
|
|
; (oder recycelt den letzten aus X, wenn das FIFO leer ist).
|
|
; Y zaehlt von Periode runter auf 0; sobald X == Y wird der Pin per side-set hoch.
|
|
; Beim naechsten pull wird er wieder auf 0 gezogen.
|
|
|
|
.program pio_pwm
|
|
.side_set 1 opt
|
|
|
|
pull noblock side 0
|
|
mov x, osr
|
|
mov y, isr
|
|
countloop:
|
|
jmp x!=y noset
|
|
jmp skip side 1
|
|
noset:
|
|
nop
|
|
skip:
|
|
jmp y-- countloop
|
|
|
|
% c-sdk {
|
|
static inline void pio_pwm_program_init(PIO pio, uint sm, uint offset, uint pin, float clkdiv) {
|
|
pio_gpio_init(pio, pin);
|
|
pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true);
|
|
pio_sm_config c = pio_pwm_program_get_default_config(offset);
|
|
sm_config_set_sideset_pins(&c, pin);
|
|
sm_config_set_clkdiv(&c, clkdiv);
|
|
pio_sm_init(pio, sm, offset, &c);
|
|
}
|
|
%}
|