71円で16進7セグデコーダを作る
久々のブログ更新になりましたが、プロジェクトは色々進行中です。
とりあえず、リハビリを兼ねて軽いネタからご紹介いたします。
汎用ロジックICで7セグLEDを点灯させたいとき、定番のICは74HC47とか74HC4511とかですね。これらのICで0~9までの表示はできますが、残念なことに16進数で使うA~Fの表示には対応していません。そこで、なんらかのマイコンを使って代わりになる物を作ろうと思っていました。
そこでマイコンチップの選択ですが、汎用ロジックICの置き換えなので、なるべく安くあげたいのが第一、また出来る限りピン数は少ない方が基板の実装面積を減らせると思いました。マイコンを使い始めてから今まで(といってもほんの1年ちょっとですが)一番いじってきたのはAtmelのAVRマイコンです。ならば候補はATTiny2313でしょう。秋月で100円と非常に安価な定番マイコンです。まぁこれを使っても良いのですが、これよりも条件が良い物がないかと探してみたところ、ありました。MicrochipのPICマイコン16F54が18ピンでなんと60円です。これしかないな、と思って買い置きしてありました。
さて、このPIC16F54を買ってから実際に7セグデコーダを作ろうと思うまでにはしばらく間があったのですが、ようやく着手。以前にPIC16F88で使ったMikroCでプロジェクトを作ろうとしたところ、あら、16F54が選択肢にありません。ここに来てはじめて16F54のスペックをチェック。プログラムメモリ512ワード、RAM25バイト?!これでCは厳しいですね。
しょうがないので、ターゲットを16F88にしておいて、アセンブラコードを16F54に流用しようとCでプログラムを組み始めました。まぁポートAの4ビットの読んで、その数値に対応する字形になるデータをポートBに書くだけなので、ほどなく完成。コンパイルして.asmファイルをMPLABに持ち込みます。
が、ここでも一筋縄ではいきません。コンフィグビットのキーワードが違うとか、16F88にあって、16F54にない命令(ADDLW,RETURNなど)があるとか、MikroCとMPLABで16進数定数の表現が違うとか、色々失敗しつつそのつどデータシートにあたりながら、なんとかビルドに成功、これでチップに焼けばテスト回路でのチェックへ進めます。
コードを修正しているときはコンフィグビットは適当にビルドに通ればいいやとやっていましたが、書き込みソフトの画面を見て、さてどれを選べばいいのかとデータシートを見てみると・・・・内蔵オシレータが無い?せっかくピン数を減らすようにこのチップを選んだのに、外付け部品がいるなんてorz これも仕方ないです、とりあえずはセラミック発振子(セラロック)で動作をチェック。4MHzのセラロックなら秋月で20円。まぁこれでもTiny2313よりは安いですけど、もう一声行きたいところ。で、RCオシレータをテスト、タイミングにシビアな用途ではないですし、計ってみると1.4MHzくらいは出ているようなので、たとえ複数桁のダイナミック点灯に使っても問題はないでしょう。というわけで、セラミックコンデンサ10円+カーボン抵抗1円の追加部品に決定。しめて71円の16進7セグデコーダの出来上がりです。
当初はカソードコモンLED専用にコードを書いていましたが、 ポートBの7ビット目が余っているので、ここをコモンタイプ選択入力に使う事にしました。起動時にこのピンを読み取り、Highならアノードコモン、Lowならカソードコモンの出力をするように修正しました。7セグLEDのつながる側と同じ方に選択入力をつなげばOKです。これで74HC47や74HC4511にはない機能が増えました。
以下にアセンブルリストをあげます。
; decorder for 7segment ; by maris 2010/03/13 LIST P=16F54 INCLUDE "P16F5X.INC" __CONFIG _RC_OSC & _WDT_OFF & _CP_OFF PIN7 EQU H'80' FSRMSK EQU H'E0' FONT EQU H'08' NFNTS EQU H'10' ORG 1FF GOTO start ORG 0 c_common: MOVLW b'00111111' MOVWF FONT MOVLW b'00000110' MOVWF FONT+1 MOVLW b'01011011' MOVWF FONT+2 MOVLW b'01001111' MOVWF FONT+3 MOVLW b'01100110' MOVWF FONT+4 MOVLW b'01101101' MOVWF FONT+5 MOVLW b'01111101' MOVWF FONT+6 MOVLW b'00000111' MOVWF FONT+7 MOVLW b'01111111' MOVWF FONT+8 MOVLW b'01101111' MOVWF FONT+9 MOVLW b'01110111' MOVWF FONT+H'0A' MOVLW b'01111100' MOVWF FONT+H'0B' MOVLW b'00111001' MOVWF FONT+H'0C' MOVLW b'01011110' MOVWF FONT+H'0D' MOVLW b'01111001' MOVWF FONT+H'0E' MOVLW b'01110001' MOVWF FONT+H'0F' RETLW 0 start: MOVLW H'1F' TRIS PORTA MOVLW 0 MOVWF PORTB MOVLW PIN7 TRIS PORTB CALL c_common MOVF PORTB,W ANDLW PIN7 BTFSC STATUS, Z GOTO main MOVLW FONT MOVWF FSR revloop: MOVLW FONT+NFNTS+FSRMSK SUBWF FSR, W BTFSC STATUS, C GOTO main COMF INDF, F INCF FSR, 1 GOTO revloop main: loop: MOVLW FONT ADDWF PORTA, W MOVWF FSR MOVF INDF, W MOVWF PORTB GOTO loop END
ブレッドボードで点灯テスト
回路図はこんな感じです。
出来上がった物は大したことないですが、だいぶPICの勉強になりました。これはこれでよしとしましょう。
« MTM04終了しました。 | トップページ | Arduinoにスーパーファミコンのパッドをつなぐ »
「PIC」カテゴリの記事
- 71円で16進7セグデコーダを作る(2010.03.13)
この記事へのコメントは終了しました。
コメント