安価なRISC-VマイコンCH32V003がArduino IDE で動くようになりました。
STM32に似ているとの事で,なるほどArduinoでもdigitalWriteFast()が使えます。
NeoPixelのRGBフルカラーLEDをつなぎたいので,今回は無理矢理ですが必要なデジタルパルスを作ってやってみました。
[NeoPixelのデータ転送様式]
NeoPixelのLEDは1個ごとにRGB各1バイトのデータが記憶でき,そこにシリアルにデータを送って点灯させます。
送るデータは"0"を300ns,"1"を600nsあたりのパルス幅で表現します。速さは必要ですが,案外大まかな定義ですね(^^;;;;;;。
![](https://stat.ameba.jp/user_images/20230723/21/pta55/95/c6/j/o0855049815316087356.jpg?caw=800)
(SK6812データシートより一部転載)
[デジタルパルスの作成]
digitalWriteFast()とポートのビットセットレジスタを使って必要な幅のパルスを作ります。
・digitalWriteFast():約500nsのパルス
・ビットセットレジスタ = 値の代入で約100nsのパルス
・ビットセットレジスタ |= 値の代入で約200nsのパルス (^^;;;
"0"は約200ns,"1"は約600ns (100+500)のHIGHパルスで表現できました。
LOWパルスはdigitalWriteFast()を使います。
![](https://stat.ameba.jp/user_images/20230723/22/pta55/a2/41/j/o1022023415316117876.jpg?caw=800)
以上,必要な出力パルスが作成できましたので,以前にATtiny202で作ったテストプログラムを出力関係部だけ変更して動かしてみました。
Neopixelは8x8LEDパネルをつないでいます。
![](https://stat.ameba.jp/user_images/20230723/22/pta55/77/a2/j/o0800031415316123481.jpg?caw=800)
[テストプログラム]
1. 設定とセットアップ
・出力ピンの"PD6"はポートDの第6ビットにあります。
・ポートDの出力ビットセットレジスタは0x40011410にあります。
・配列”aData”はLEDの個数分のバッファです。
・setup()ではPD6ピンを出力モードにし,全LEDをクリアしています。
![](https://stat.ameba.jp/user_images/20230723/23/pta55/e0/6f/j/o0760040515316131759.jpg?caw=800)
2. メインループ
テストプログラムなのでメインループはRGB値をバッファに入れて出力部を呼び出しているだけです(^^;;;;;。
![](https://stat.ameba.jp/user_images/20230723/23/pta55/98/e4/j/o0806076015316131760.jpg?caw=800)
3. 出力部
・allset()は全LEDを同色にセットします。全クリアにも使えます。
・D_STB = 0x0040 か D_STB |= 0x0040でポートDの第6ビットがセットされ,
D6ピンがHighになります。
・digitalWriteFast()のピン指定はピン名(PD6)ではなく,ピン番号(PD_6)で
指定します。
・シリアル送信中はインタラプタを停止しておかないと,表示が乱れます。
![](https://stat.ameba.jp/user_images/20230723/23/pta55/52/90/j/o0755072015316131764.jpg?caw=800)
ここ何日かCH32V003の入出力のコントロール部のレジスタをいくつか触ってみてはいるのですが,,うまくいきません(^^;;;;;。
どうも,それぞれの働きの意味やArduino IDE でデフォルト設定がどうされているのかなどをもっと知らないといけないようです。
ま,何とか私にできる範囲で無理矢理ではありますが Neopixel RGB LED がつなげました。次はI2Cとかですかね。ぼちぼちとですが。
STM32に似ているとの事で,なるほどArduinoでもdigitalWriteFast()が使えます。
NeoPixelのRGBフルカラーLEDをつなぎたいので,今回は無理矢理ですが必要なデジタルパルスを作ってやってみました。
[NeoPixelのデータ転送様式]
NeoPixelのLEDは1個ごとにRGB各1バイトのデータが記憶でき,そこにシリアルにデータを送って点灯させます。
送るデータは"0"を300ns,"1"を600nsあたりのパルス幅で表現します。速さは必要ですが,案外大まかな定義ですね(^^;;;;;;。
![](https://stat.ameba.jp/user_images/20230723/21/pta55/95/c6/j/o0855049815316087356.jpg?caw=800)
(SK6812データシートより一部転載)
[デジタルパルスの作成]
digitalWriteFast()とポートのビットセットレジスタを使って必要な幅のパルスを作ります。
・digitalWriteFast():約500nsのパルス
・ビットセットレジスタ = 値の代入で約100nsのパルス
・ビットセットレジスタ |= 値の代入で約200nsのパルス (^^;;;
"0"は約200ns,"1"は約600ns (100+500)のHIGHパルスで表現できました。
LOWパルスはdigitalWriteFast()を使います。
![](https://stat.ameba.jp/user_images/20230723/22/pta55/a2/41/j/o1022023415316117876.jpg?caw=800)
以上,必要な出力パルスが作成できましたので,以前にATtiny202で作ったテストプログラムを出力関係部だけ変更して動かしてみました。
Neopixelは8x8LEDパネルをつないでいます。
![](https://stat.ameba.jp/user_images/20230723/22/pta55/77/a2/j/o0800031415316123481.jpg?caw=800)
[テストプログラム]
1. 設定とセットアップ
・出力ピンの"PD6"はポートDの第6ビットにあります。
・ポートDの出力ビットセットレジスタは0x40011410にあります。
・配列”aData”はLEDの個数分のバッファです。
・setup()ではPD6ピンを出力モードにし,全LEDをクリアしています。
![](https://stat.ameba.jp/user_images/20230723/23/pta55/e0/6f/j/o0760040515316131759.jpg?caw=800)
2. メインループ
テストプログラムなのでメインループはRGB値をバッファに入れて出力部を呼び出しているだけです(^^;;;;;。
![](https://stat.ameba.jp/user_images/20230723/23/pta55/98/e4/j/o0806076015316131760.jpg?caw=800)
3. 出力部
・allset()は全LEDを同色にセットします。全クリアにも使えます。
・D_STB = 0x0040 か D_STB |= 0x0040でポートDの第6ビットがセットされ,
D6ピンがHighになります。
・digitalWriteFast()のピン指定はピン名(PD6)ではなく,ピン番号(PD_6)で
指定します。
・シリアル送信中はインタラプタを停止しておかないと,表示が乱れます。
![](https://stat.ameba.jp/user_images/20230723/23/pta55/52/90/j/o0755072015316131764.jpg?caw=800)
ここ何日かCH32V003の入出力のコントロール部のレジスタをいくつか触ってみてはいるのですが,,うまくいきません(^^;;;;;。
どうも,それぞれの働きの意味やArduino IDE でデフォルト設定がどうされているのかなどをもっと知らないといけないようです。
ま,何とか私にできる範囲で無理矢理ではありますが Neopixel RGB LED がつなげました。次はI2Cとかですかね。ぼちぼちとですが。