差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 | |||
mp_ws2812b [2021/10/07 23:28] gongyusu [1. 数据输入和数据输出] |
mp_ws2812b [2021/10/07 23:36] (当前版本) gongyusu [2. 一个真实的例子] |
||
---|---|---|---|
行 86: | 行 86: | ||
### 2. 一个真实的例子 | ### 2. 一个真实的例子 | ||
- | 前面的示例有点做作,所以让我们通过一个实际示例来看看使用PIO的方法。WS2812B led(有时也被称为NeoPixels)是一种包含三个led(一个红、一个绿、一个蓝)和一个小微控制器的光。它们是由一根数据线控制的,该数据线有一个时间依赖协议,很难对数据进行实时控制。 | + | 前面的示例有点做作,所以让我们通过一个实际示例来看看使用PIO的方法。WS2812B led(有时也被称为NeoPixels)是一种包含三个led(一个红、一个绿、一个蓝)和一个小微控制器的发光管。它们是由一根数据线控制的,该数据线有一个时间依赖协议,很难对数据进行实时控制。 |
- | LED条的布线很简单,如图C-1所示。取决于你的LED带的制造商,你可能已经有电线连接,你可能有一个插座,你可以推动头部电线,或你可能需要焊接他们自己。 | + | |
- | 你需要知道的一件事是潜在的电流吸引。虽然你可以在你的Pico上添加几乎无穷无尽的新像素系列,但你可以从Pico上的5v引脚获得的功率是有限的。在这里,我们将使用8个led,这是非常安全的,但如果你想使用更多的led,你需要了解其局限性,可能需要添加一个单独的电源。你可以把长条切成长度,led之间应该有切线,告诉你在哪里切。在hsmag.cc/neopixelpower上有关于各种问题的很好的讨论。 | + | 让我们看看如何用PIO来控制它: |
- | + | ||
- | 现在我们已经把led连接起来了,让我们看看如何用PIO来控制它: | + | |
<code python> | <code python> | ||
import array, utime | import array, utime | ||
行 99: | 行 96: | ||
# Configure the number of WS2812 LEDs. | # Configure the number of WS2812 LEDs. | ||
- | NUM_LEDS = 10 | + | NUM_LEDS = 12 |
@asm_pio(sideset_init=PIO.OUT_LOW, out_shiftdir=PIO.SHIFT_LEFT, autopull=True, pull_thresh=24) | @asm_pio(sideset_init=PIO.OUT_LOW, out_shiftdir=PIO.SHIFT_LEFT, autopull=True, pull_thresh=24) | ||
行 105: | 行 102: | ||
T1 = 2 | T1 = 2 | ||
T2 = 5 | T2 = 5 | ||
- | T3 = 3 label("bitloop") | + | T3 = 3 |
+ | label("bitloop") | ||
out(x, 1) .side(0) [T3 - 1] | out(x, 1) .side(0) [T3 - 1] | ||
jmp(not_x, "do_zero") .side(1) [T1 - 1] | jmp(not_x, "do_zero") .side(1) [T1 - 1] | ||
行 120: | 行 118: | ||
</code> | </code> | ||
- | 数据进入状态机有两个阶段。第一个是称为先进先出(FIFO)的存储器。这是我们的主Python程序发送数据的地方。第二个是输出移位寄存器(OSR)。这是out()指令获取数据的地方。这两个是由pull指令连接的,从FIFO取数据,并把它放在OSR。然而,由于我们的程序设置autopull启用阈值为24,每次我们从OSR读取24位,它将从FIFO重新加载。 | + | 数据进入状态机有两个阶段。第一个是称为先进先出(FIFO)的存储器。这是我们的主Python程序发送数据的地方。第二个是输出移位寄存器(OSR),这是out()指令获取数据的地方。这两个是由pull指令连接的,从FIFO取数据,并把它放在OSR。然而,由于我们的程序设置autopull启用阈值为24,每次我们从OSR读取24位,它将从FIFO重新加载。 |
指令out(x,1)从OSR获取一位数据,并将其放入名为x的变量中(在PIO中只有两个可用变量:x和y)。 | 指令out(x,1)从OSR获取一位数据,并将其放入名为x的变量中(在PIO中只有两个可用变量:x和y)。 |