2015年12月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

最近のトラックバック

PIC

2010年3月13日 (土)

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

ブレッドボードで点灯テスト

7seg5

7segd

7segf

回路図はこんな感じです。

Decoderfor7seg

 出来上がった物は大したことないですが、だいぶPICの勉強になりました。これはこれでよしとしましょう。

その他のカテゴリー