PWM auf Pins 0 bis 20
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
; 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);
|
||||
}
|
||||
%}
|
||||
Reference in New Issue
Block a user