SyntaxHighlighter

2015年4月29日水曜日

WS2812をいじってわかったこと

WS2812をPICから点灯させようとした結果。
俗に言われる、シリアルLED、シリアルRGBLED、テープLED、LEDリングと呼ばれるもの
(自分が購入したのは、NeoPixel Ring - 12連フルカラーシリアルLED)

1.データシートによってタイミングはバラバラだが、以下のサイトの値がちょうどいい感じだった。

秋月でWS2812B買ってしまったので動かないかも知れないけれど作ってみた
http://www.mars.dti.ne.jp/~m7030/pic_room/ws2812b/index.html

確かに、Hの時間が重要で、Lの時間が長い文には問題ないらしい


2.起動一発目の通信は必ずバグるっぽい
 全部0にしているのに緑が点灯したりするが、ほっといて二周目以降の通信は正常になる。
 (これにだいぶハマった)

3.MPLABXのシミュレートサイクルは、供給クロックではなく、命令サイクル
 つまり、32MHzで動作させているのなら8MHzに設定する。
 よく読むと書いてあるが、これまたハマった。
 時間調整にstopWatch機能を使用したため

4.当然だが、バイト-バイト間の時間が50uSを超えるとリセットされる。

5.光り方が変なときは、電源電流を疑え(特に、点灯数が増えるに連れ赤っぽくなる時)

6.MPASMで使えたMOVFWとかは使えない。なぜかSTATUS,Zの指定もできない(Z=2)

X8Cで、16F1705を32MHzで動作させた場合のサンプルを置いておく。
エディタではエラー表示が大量に出るが、コンパイルは問題なく通る。
asm_testが1つのLEDにデータを送る処理となる。

static volatile char cnt;
static volatile char TMP;
static volatile char asmR;
static volatile char asmG;
static volatile char asmB;
void asm_test(char R,char G,char B)
{
    asmR = R;
    asmG = G;
    asmB = B;
#asm
    MOVF _asmG,W
    call SEND

    MOVF _asmR,W
    call SEND

    MOVF _asmB,W
    call SEND
    goto EXIT

SEND:
    MOVWF _TMP

    MOVLW 8
    MOVWF _cnt

LP_R:
    MOVF _TMP,W
    RLF  _TMP,f
    ANDLW 0x80
    BTFSC STATUS,2
    goto BIT_LOW
    goto BIT_HIGH

LP_B:
    DECFSZ  _cnt
    goto LP_R

    return
         
 BIT_LOW:
    bsf LATC,0 //125ns
    nop //125ns
    nop //125ns
    bcf LATC,0
    goto LP_B
BIT_HIGH:
    bsf LATC,0 //125ns
    nop //125ns
    nop //125ns
    nop //125ns
    nop //125ns
    bcf LATC,0
    goto LP_B

EXIT:
    nop
#endasm
}
void send_led(char R[],char G[],char B[])
{
    __delay_us(50); //ある程度高速に送ってやらないとダメ。
    asm_test(R[0],G[0],B[0]);
    asm_test(R[1],G[1],B[1]);
    asm_test(R[2],G[2],B[2]);
    asm_test(R[3],G[3],B[3]);
    asm_test(R[4],G[4],B[4]);
    asm_test(R[5],G[5],B[5]);
    asm_test(R[6],G[6],B[6]);
    asm_test(R[7],G[7],B[7]);
    asm_test(R[8],G[8],B[8]);
    asm_test(R[9],G[9],B[9]);
    asm_test(R[10],G[10],B[10]);
    asm_test(R[11],G[11],B[11]);
    asm_test(R[12],G[12],B[12]);
}

0 件のコメント:

コメントを投稿