/ examples / pioasm_neopixel.py
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)