Files
pico/pico1w/ampel/pio_pwm.pio
T
2026-07-04 02:44:36 +02:00

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);
}
%}