ARGB_emulator/argb_tx.pio
2025-02-23 21:59:28 +01:00

44 lines
1.2 KiB
Plaintext

.program argb_tx
.side_set 1 opt
.wrap_target
pull ; Get data from FIFO
mov y, osr ; Store bit count in Y (lower 8 bits)
pull ; Get first data word
mov x, osr ; Store in X
set y, 24 ; Remaining bits in first word (32-8)
bit_loop:
out pins, 1 ; Shift 1 bit to pins (side-set 0)
jmp y--, delay ; Decrement Y, handle delay
pull ; Load new data when Y underflows
mov x, osr
set y, 31 ; Reset bit counter for new word
delay:
jmp x--, nobit ; Check if current bit is set [1]
nop ; [1] Align timing
; Bit=1 pattern (0.8µs high, 0.45µs low)
set pins, 1 [99] ; 1 + 99 = 100 cycles (0.8µs)
set pins, 0 [55] ; 1 + 55 = 56 cycles (0.448µs)
jmp end_bit
nobit:
; Bit=0 pattern (0.4µs high, 0.85µs low)
set pins, 1 [49] ; 50 cycles (0.4µs)
set pins, 0 [105] ; 106 cycles (0.848µs)
end_bit:
jmp bit_loop ; Total per bit: 156 cycles (1.248µs)
post_delay:
set pins, 0 ; 70µs low period
set y, 8749 ; (70µs / 8ns) - 1 = 8749 cycles
delay_loop:
jmp y--, delay_loop
irq 0 ; Signal completion
.wrap