SSブログ
English Version

中華製マトリックスLEDキットでLチカ [PIC]

 ebayで16x32 Dot Matrix DIY Kit Red Green Dual-Color Control LED Display Moduleの名称で売られていた32x16の2色のドットマトリックスLEDキットを購入してみました。
 8x8の2色LED単体で2百円程度はするのではないかと思いますがそれが8個も入ったキットが9百円弱なのでお買い得感がありますね^^

 LED基板の部品構成はシリパラ変換(ラッチ付き)の74HC595 x 8個と縦16ラインのセレクト用に74HC138 x 2個以外はドライバ用のトランジスタとパスコン及び電源用電解コンのみです。

 ネット上では下記のようなボケた回路図しか見当たりませんでしたが、上記の部品構成から回路は容易に想像できますね。

マトリックスLEDキットの回路


 組立後にPICと接続した状態が下の写真です。PICはいつものようにpicleコンパイラを使って制御しています。
 また、OneBitLoaderをUARTでの2線式に対応させて入れています。

PICに接続した状態


 マトリックスLED基板自体の背面は下の写真のような感じです。LEDを半田付け後に点灯しないピクセルが発生すると嫌なのと、基板の取付穴を後で利用できるように(写真では判りませんが)LEDを直付けせずに別途ebayで購入した丸ピンソケットを使って接続しています。

マトリックスLED基板の背面


 制御方法は上記の部品構成から次のようになります。(74シリーズIC規格表で595を確認すると良くわかります)
 赤及び緑それぞれで1ライン分(32bit)のデータをラッチでき、A-Dで指定したラインに表示されます。
 最初のラインの先頭のシリアルビットがLED基板の左上のピクセルに対応します。

Sig Namememo
A - D138 でデコードされるライン情報
G Green serial input
R Red serial input
CK G/R clock(positive edge)
SRB 595 paralel data latch(positive edge)
OE/ 595 pararel data output(low active)


 PICとの接続は次のようにしました。

Sig NamePIC pinPin No.
A RA0 2
B RA1 3
C RA2 9
D RA310
CKRA412
G RB0 4
R RB1 5
SRBRB2 6
OE/ RB3 7


 ほとんどPIC単体の回路ですが、PICとマトリックスLEDの接続回路は以下のとおりです。
 シリアル通信の速度は38400bpsです。

マトリックスLED基板とPICの接続回路図


 マトリックスLED側のシリアル入力はRedとGreenの2bit入力なため、SPIは使えないのでソフトでシリアライズしています。
 今回は1ライン表示処理を約1ms間隔で呼び出し、1画面表示を16ms(62.5fps)で処理しています。

 ロジアナで確認した1周期分(16ライン分)の信号が下記になります。

1周期分の制御信号


 1ライン分の範囲に拡大したものが下図です。

1ライン分の制御信号


 更に1bit送信部分を拡大したものが下図です。

1bit送信分の制御信号


 マトリックスLED制御用に作成したpicleライブラリのソースが下記です。
 1ライン表示用の処理とfontデータをVRAMへ展開する処理を作成しました。フォントについてはフリーなものを少し探しましたが変換処理が必要そうだったので数も少ないことからフォントデータを自分で作成しました。
 フォントデータをメモリ上の固定アドレスに書き込んでいますが、PICの開発環境であるMPLABX環境でメモリの一部だけに書きこむにはリンカスクリプトの変更が必要そうだったのでCP/MのM80/L80環境でHEXファイルを作成し、OneBitLoaderで書き込みました。

 また、VRAMはスクロール処理用に右端と下側に8bit分をLEDパネルサイズ外の範囲まで持っています。
 フォント展開処理(SetFont)ではバイト境界を意識せず、VRAM上の任意の位置にfontデータを展開できるようにしています(但し、範囲チェックはしていない)

マトリックスLED制御ライブラリ(picle言語)
#LibMatrix v0.02 2020/02/14 skyriver # 8x8 x 8, 2colors Dot Matrix driver # Signal connection # LED PIC # A-D : RA0 2 # RA1 3 # RA2 9 # RA3 10 # # CK : RA4 12 # # Red : RB0 4 # Grn : RB1 5 # SRB : RB2 6 # OE : RB3 7 var LATA,LATB,ArIdx,_Bit; var _Rpat,_Gpat,_Font; func Alloc( size ) { return=Array_(ArIdx); ArIdx=ArIdx+size; } # # clear VRAM # proc Vcls() { var i; for (i=0;i<5*24;i=i+1) { _Rpat[i]=0; _Gpat[i]=0; } } proc Init() { var ad1pcfg,pr1,i,pat; ad1pcfg = $032c; ad1pcfg[0]=$ffff; # set digital mode pr1=$102; pr1[0]=$003d; # 270:10ms -> 3D:1ms LATA=$02c4; LATB=$02cc; LATA[-1]=$ffef; # ck:low LATB[-1]=$fffb; # srb:low LATA[-2]=$0000; LATB[-2]=$f300; # RB8,9:serial Rx,Tx _Bit=Alloc(4); _Rpat=Alloc(5*12); _Gpat=Alloc(5*12); _Font=$f800; pat=1; for (i=7;i>=0;i=i-1) { _Bit[i]=pat; pat=pat+pat; } Vcls(); } # display # ln<- line No. # x <- start x(0..7) # Y <- 0..15+1 # <- _Rpat,_Bpat proc Disp(ln,x,y) { var bcnt,_rpnt,_gpnt,rpat,gpat,lata,latb,tmp,xbit; xbit=x; tmp=(ln+y)*5; _rpnt=_Rpat+tmp; _gpnt=_Gpat+tmp; lata=LATA[0]; rpat=_rpnt[0]; gpat=_gpnt[0]; for (bcnt=4*8;bcnt;bcnt=bcnt-1) { if (xbit>7) { xbit=0; _rpnt=_rpnt+1; _gpnt=_gpnt+1; rpat=_rpnt[0]; gpat=_gpnt[0]; } latb=3; if (rpat&_Bit[xbit]) { latb=2; } if (gpat&_Bit[xbit]) { latb=latb&$fd; } LATB[0]=latb; LATA[0]=lata | $10; # ck positive edge LATA[0]=lata; xbit=xbit+1; } LATB[0]=$0c; # OE inactive and SRB edge(positive) LATA[0]=ln; LATB[0]=0; # RB3 OE active } # set vram with ascii code # _plane <- _Rpat or _Gpat # badr <- VRAM bit adrs from plane # line <- line No. # code <- ASCII codfe proc SetFont(_plane,badr,line,code) { var i,_fadr,fdat,_vadr,_vast,fbit,vbit,vbst; _fadr=_Font+(code-' ')*7; _vast=_plane+5*line+badr/8; _vadr=_vast; vbst=Modulo_; vbit=Modulo_; fbit=0; fdat=_fadr[0]; for (i=7*6;i;i=i-1) { if (fbit>5) { fbit=0; _fadr=_fadr+1; fdat=_fadr[0]; _vast=_vast+5; _vadr=_vast; vbit=vbst; } if (vbit>7) { vbit=0; _vadr=_vadr+1; } if (fdat&_Bit[fbit]) { _vadr[0]=_vadr[0]|_Bit[vbit]; } else { _vadr[0]=_vadr[0]&~_Bit[vbit]; } fbit=fbit+1; vbit=vbit+1; } }
★2020/02/14 変更 最新版にアップデート

 今回は久々にYouTubeに動画をアップしたので貼っておきます。
 カメラで撮影する場合、周りが暗いと赤色と橙色の差が判り辛くなったので結構明るいところで撮影しています。このため動画ではLEDがうす暗いように見えますが、実際には十分な明るさです。

 もっと明るくしたい場合には5V電源をLEDボード側に給電し、PICは5Vからレギュレータで降圧した3.3Vで動かすという手もあります。
 この場合、PIC側の3.3VとLEDボード側の5Vが短絡しないように注意してください。
 LEDボード側のICはHCシリーズなので問題ないはずですし、PIC側は出力だけなので5Vトレラントなピンを使う必要もありません。




 最後に今回作成したデモプログラムを自動起動状態に設定したPIC24FJ64GA002のヘキサファイルは以下からダウンロード可能です。
 商用利用以外であれば自由に使用可です。(自分のための覚書という意味もあるw)
 自動起動になっていますがエスケープキーでプログラムを中断できます。

PIC24FJ64GA002_LedMatrix_20200212.zip
★2020/02/12 最新版にアップデート


[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

PICkit3でコネクトエラー [PIC]

 久々にPICkit3で PIC24FJ64GA004 に書き込みを行おうとしたら

The target circuit may require more power than the debug tool can provide. An external power supply might be necessary. Connection Failed.

のエラーが出て接続できず・・・・
電源はPICkit3から供給していますが接続されているのはPIC単体のみに近い状態なので電流不足は考えにくい状況なのですが・・

 このエラーは以前も何度か出ていましたが PICkit3 からの供給電圧を 3.15Vに下げることで問題回避できていました。
 今回は電圧を下げても状況が変わらず、予備のPICkit3に変えたり、 PICを PIC24FJ64GA002 に変更しても変化なし・・orz

 しばらく悩んだけど MPLAB IPE を立ち上げてからPICkit3をパソコンに接続したらPICにコネクトできました ^^
 尚、IPEのバージョンは3.35です。

 なんなんでしょうねぇ~

タグ:IPE PIC24FJ Pickit3
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

I2Cロガーの製作 [PIC]

 I2Cで接続される複数のセンサのデータを連続的に保存したいことからI2Cロガーを作ってみました。
 パソコンにUSBケーブルで接続し、スクリプトで制御可能な市販されているI2Cインターフェースボックスがありますが、サンプリング周期を一定にして連続してデータを取得するのが困難であることから、このI2Cインターフェースボックスの中身をPIC24FJ64を使った簡単なボードに入れ替えます。

 PIC24FJ上ではpicleコンパイラも動作するのでスクリプト感覚でデータ取得処理を記述できます。
 ファイルへの保存はTeraTermのマクロで実現する予定です。
 回路図は下図のとおりでUSBシリアル変換は安易に市販の変換基板(FT232RL)を使い必要最小限の信号をコネクタに出しています。

回路図


 この程度の回路であれば片面基板で対応可能でCNCルーターでPCB基板を作成しました。ガラエポの両面基板と比べれば難易度はかなり低いですが、後述のように手抜きしてジャンパー接続することに ^^;

 今回もいつものように DesignSparkPCB でパターンを作成しました。

DesignSparkPCBでパターン作成


 次にDesingSparkPCBで出力したガーバーデータを FlatCAM に読ませて、CNC用のNCファイルを作成します。

FlatCAMでのNCファイル作成


 PCB作成の最後の工程として作成したNCファイルを使ってCNCルーターで生基板を切削し、ホームメイドのプリント基板を作ります。

CNCルーターでの生基板の切削


 CNCで切削後の導通チェックではOKでしたが、ソルダーレジスト塗布後、グランドとショート状態のパターンがあったのでパターンカットし、ジャンパーで接続しました^^;
 今回はベーク版の片面基板ということで手抜きしてCNCでの切削後のヤスリ掛け工程を省略してしまったため、レジスト塗布時に切削した溝に残っていた銅層の切りくずでショートしてしまったようです(今後気を付けねば)。
 まぁ、これくらいの回路であれば、PCB製造業者に依頼して何週間か待つよりは、CNCでサクッと作れるので便利です。^^
(汎用基板で作った方が早いけどそれは言わない約束ということで・・・w)

★2019/11/17 追記
 ソルダーレジスト塗布方法を記載した記事へのリンク追加

PCB半田面


 部品面は下の写真のとおりです。後述するようにケースがアルミ製なのでケースとの接触防止のためにUSBコネクタの上にマスキングテープを張っています。
 また、OneBitLoaderはコンソール接続用のシリアル通信に対応させた2線式のものを入れています。

PCB部品面


 冒頭で書いたようにケースはI2Cインターフェースボックスのものを流用することにして、コネクタ部とUSB&LED部のキャップを3Dプリンタで作成しました。

コネクタ側のキャップ


USB&LED側のキャップ


 ケースに収めた外観が下の写真です。

ケースに収納した写真


 おまけとして、I2Cでアドレス出力しACK応答の有無で接続されているI2Cセンサのアドレスをスキャンした結果を付けておきます。
 接続しているのは「I2C通信実験 照度センサー」の記事で書いた照度センサです。

I2Cスキャン実行例
:\\ +B000-B670 # Life Game in picle language +B800-BEA5 # I2C check +C000-CAD1 # I2C test Light Sensor(BH1750) :\<$b800 1701 :run 00 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 10 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20 : -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- -- 30 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- :


★追記 2022/01/27
 出力ピン数を多くしたもっと汎用性の高いPic24ジェネラルボックス制作関連の記事が下記になります。


[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

PIC24FJ64GAでGAME言語(その9) [PIC]

 PIC24FJでちょっとした実験などを行う時は、最近ではGAME言語ではなく、picle言語(セルフコンパイラ)を使っていますが、久々にGAME言語ネタです。

 昔の本とかを少し整理していたところ、GAME言語をハンド逆アセンブルしていた時のメモが出てきました・・懐かしぃ

 C9のニーモニック欄がそのまま「C9」になっているところがある・・頭の中ではRETもC9も等価で区別が無かったのでしょうw

 最後の方は条件ジャンプ等、ちょっと紛らわしい部分だけニーモニックを書いていて頭の中ではニーモニックと等価な命令にはニーモニックすら書いてない・・w
 あれ、8640H部分、ちょっと間違えてますねぇw でもマシン語部分から脳内ではニーモニック化できているので問題ないでしょうw

 因みにKEIOのデータシート用紙を使っていますが、この頃はある理由によりこの紙の入手性が良かったためで、私はKEIOの関係者ではございません。

GAME言語ハンドディスアセンブル


★2019/08/15 追記
3チップ構成Pic24CPMマイコン(その7)GAMEコンパイラ」の記事でCP/M-80版のGAMEインタプリタ&コンパイラについて記載しました。


[TOP] [ 前へ ] 連載記事 >[ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

独自言語 picle のコンパイラ化(その13)asm_()対応 [PIC]

 picleコンパイラをアップデートしました。
 今回は修正2件と機能追加1件です。

  1. 修正内容
     修正は次の2件です。

    • 単項演算子'+'の処理修正
       絶対値を求める単項演算子が正数の変数に対して負の値を返していました。^^;;
       原因はMSBをチェックしスキップ命令を生成している箇所で使ったBTSC命令のマクロ定義で bit4 が最大(0x0f)の場合、符号拡張され上位ビットがすべて1になっていました・・

       #define BTSC_Ws_bit4(Ws,bit4) COND {DISP2("BTSC W%d,#%d",Ws,bit4); COND2 ¥  
               FWRITE(0xa70000|(bit4<<12)|ADRS_SMODE_DIR|Ws); COND3
      

       bit4が 8 より小さい場合は正常に動くので厄介です・・
       対処としては bit4 の前に long のキャストを付けました。

    • "else if ("構文
       "else if ("の次の文字がスペース以外の場合、エラーになるので、スペースを入れなくてもエラーにならないように修正しました。


  2. 機能追加
     外部関数宣言機能を追加済みですが、レジスタロック解除のような数命令を追加する場合でも、アセンブラで記述後HEXファイルを作成するのは面倒なのでマシン語をpicleソースに埋め込むための asm_() という組込み処理を追加しました。

     引数はニーモニックではなく、マシン語の直値なので code_() のような処理名にすべきかもしれませんが覚えやすいように asm_() にしましたw
     また、この処理のみ、特例として引数が long(4バイト)になっています。

     使い方としては asm_( $fe4001 ); のようになります(この例はCPUのモードをアイドルモードに移行するマシン語の埋め込み例)
     マシン語を埋め込むとソースの可読性が落ちるため、大量のマシン語を埋め込むことは想定していないので1回の asm_ でマシン語を1ワードのみ埋め込めるようにしています。


 上記の対応を行った picle コンパイラは「独自言語 picle compiler on PIC24FJ」の記事からダウンロードできます。


★2017/11/26 追記
 上のasm_()の説明で「直値」という単語を使っていますが、「即値」との違いは??
IT用語辞典で確認してみると即値=イミディエイト、直値=リテラルということのようです。
  • 即値
     即値とは、アセンブリ言語や機械語で、命令が扱う対象となるデータ(オペランド)としてコード中に直に書き込まれた数値のこと。メモリやレジスタなどから読み出した値ではなく、コード中で命令語の直後に置かれている値であることからこのように呼ばれる。
  • 直値
     リテラルとは、コンピュータプログラムのソースコードなどで、特定のデータ型による値を直接表記する際の書式。また、そのような書式に従って記載された値。

 高水準言語でソースコード中に直に書き込まれたデータのことや、そのようなデータの記述形式を即値ということがあるが、こちらは「リテラル」(literal)と呼ぶのが一般的である。

ということなので「直値」で間違っていないようです(picleが高水準言語か否かは別としてw)。


[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー