202duino の SPI で NeoPixel [Arduino]
NTSCビデオ信号のドット幅がなかなかそろわず、SPIに手を出そうと、、。
SPIでデータを送る練習としてNeoPixelで実験。
以前に作ったのと同様にNeoPixel棒を光らせられました。
202duino で NeoPixel [Arduino]
https://hello-world.blog.ss-blog.jp/2023-07-15
スケッチサイズは582バイトと軽量に。
WS2812Bのデータシートには、
Data transfar Time
0 : High 220- 380ns / Low 580-1000ns
1 : High 580-1000ns / Low 580-1000ns
ってあるけと、どうやら Highの時間の長短で0/1を決めているみたいで、Lowの時間は厳密に守らなくてもいいみたい。
問題点は、ATtiny202は実質の有効ピンが5ピンにも関わらず、SPIを使うと、MOSIの他、MISO、SCK も使ってしまうので、他に使える残りのピンが2本になってしまい、あまり実用的ではないかも。
というわけで、NTSCビデオ計画はちょっと保留。
SPIでデータを送る練習としてNeoPixelで実験。
以前に作ったのと同様にNeoPixel棒を光らせられました。
202duino で NeoPixel [Arduino]
https://hello-world.blog.ss-blog.jp/2023-07-15
スケッチサイズは582バイトと軽量に。
// ATtiny202 SPI NeoPixel test (20MHz)
#define T0 (0b11100000) // T0H : 300ns @ 20MHz CLK2X DIV4
#define T1 (0b11111100) // T1H : 600ns @ 20MHz CLK2X DIV4
#define NUMPIXELS (12)
uint8_t pixels[NUMPIXELS * 3]; // GRBGRBGRB...
void setup() {
PORTA.DIRSET = _BV(1); // PA1(MOSI) OUTPUT (megaTinyCore:D2)
SPI0.CTRLA = SPI_MASTER_bm | SPI_CLK2X_bm | SPI_PRESC_DIV4_gc | SPI_ENABLE_bm;
SPI0.CTRLB = SPI_BUFEN_bm | SPI_BUFWR_bm | SPI_SSD_bm | SPI_MODE_1_gc;
}
void loop() {
for (uint8_t i = 0; i < NUMPIXELS; i++) {
for (uint8_t c = 0; c < 6; c++) {
pixels[ ((NUMPIXELS + i - c) * 3 + 2) % (NUMPIXELS * 3) ] = 31 >> c;
}
neoPixelShow();
delay(100);
}
}
void neoPixelShow() {
for(uint8_t i = 0; i < NUMPIXELS * 3; i++) {
for(uint8_t bm = 0b10000000; bm; bm >>= 1) {
SPI0.DATA = (pixels[i] & bm) ? T1 : T0;
while( !(SPI0.INTFLAGS & SPI_DREIF_bm) );
}
}
}
WS2812Bのデータシートには、
Data transfar Time
0 : High 220- 380ns / Low 580-1000ns
1 : High 580-1000ns / Low 580-1000ns
ってあるけと、どうやら Highの時間の長短で0/1を決めているみたいで、Lowの時間は厳密に守らなくてもいいみたい。
問題点は、ATtiny202は実質の有効ピンが5ピンにも関わらず、SPIを使うと、MOSIの他、MISO、SCK も使ってしまうので、他に使える残りのピンが2本になってしまい、あまり実用的ではないかも。
というわけで、NTSCビデオ計画はちょっと保留。
2023-11-11 02:01
nice!(0)
コメント(0)
コメント 0