pioasm_neopixel.py
1 # SPDX-FileCopyrightText: 2021 Scott Shawcroft, written for Adafruit Industries 2 # 3 # SPDX-License-Identifier: MIT 4 5 import time 6 import rp2pio 7 import board 8 import adafruit_pioasm 9 10 # NeoPixels are 800khz bit streams. Zeroes are 1/3 duty cycle (~416ns) and ones 11 # are 2/3 duty cycle (~833ns). 12 program = """ 13 .program ws2812 14 .side_set 1 15 .wrap_target 16 bitloop: 17 out x 1 side 0 [1]; Side-set still takes place when instruction stalls 18 jmp !x do_zero side 1 [1]; Branch on the bit we shifted out. Positive pulse 19 do_one: 20 jmp bitloop side 1 [1]; Continue driving high, for a long pulse 21 do_zero: 22 nop side 0 [1]; Or drive low, for a short pulse 23 .wrap 24 """ 25 26 assembled = adafruit_pioasm.assemble(program) 27 28 sm = rp2pio.StateMachine( 29 assembled, 30 frequency=800000 * 6, # 800khz * 6 clocks per bit 31 init=adafruit_pioasm.assemble("set pindirs 1"), 32 first_set_pin=board.D12, 33 first_sideset_pin=board.D12, 34 auto_pull=True, 35 out_shift_right=False, 36 pull_threshold=8, 37 ) 38 print("real frequency", sm.frequency) 39 40 for i in range(100): 41 sm.write(b"\x0a\x00\x00") 42 time.sleep(0.1) 43 print("writes done") 44 45 time.sleep(2)