PIC 16F88のIOピン9本を使って7セグ
LED9桁を表示する
まずは回路図
9桁表示してもIOピンがまだ7本も余っています。
旋盤で作る天体機材の PIC・AVR 入門
掲示板の中でノンノさんが発言されたのに刺激を受けてゴールデンウィークに数日悩んで実験して見ました。
NKさん
が解説されています。
IOIOさんのHPで追試 されてCとAVRで動きまし
た。
私はPIC 16F88 で実験して見ました。
CNCで基板作成
秋月の10個100円のアノードコモンLEDを使いました。
部品は何もありません
悩むこと数日
やっと表示できました。
電流制限抵抗680オームですが電流20mA流れていません。300オーム位の方が良いかも!!
少々暗いです。
アセンブラーのリストは後日UPします。
とりあえず動いた報告です。
08/05/07
追記
シンクロで電流測定したところ各セグメント点灯時4mA流れています。平均では少なくなりますのでもう少し電流流せます。
470オーム位がベストか!!
だだし8を表示しDPも点灯させると4*8=32mA 25mAの規格オーバーします。消灯している時間もあるのでokだと思います。
フローラインから32mA流れ出て他のPORTから32mA流れ込みこの場合の総電流は+するのか相殺するのか?良くわかりません
最終的には各桁にTRを入れて電流upの必要を感じます。
配列変数(間接アドレッシング)
ユーザーが意識してRAMをいじる必要があります。
FSRにアドレスSETするとINDFに間接的にRAMの内容が出てきます。
movlw 20H
;RAMの先頭アドレス
addwf
K_POS,W ;K_POS分だけポインタを進める
movwf FSR
;アドレスをセット
movf INDF,W
;FSR番地からDATA取得
こんな感じで擬似的に配列操作できます。
繰返処理(FOR文)
movlw 5H
;回数SET
movwf
COUNT
LOOP
処理
DECFSZ COUNT、F
goto LOOP
今回のSOTFで悩んだこと
当初 (PORTBの0ビットを1にする)
KPOS EQU 30H
MOVLW 0H
MOVWF KPOS
BSF PORTB,KPOS
実行するとerrです。このような使い方は誤りです。
BSF PORTB,0 では無く BSF PORTB,30H
が実行されてしまいます。中身ではなく定義値がセットされます。
仕方なくBITセットには IORWF を使いました。
フロービットの確認には ANDWF を使って他のビットをマスクして確認しました。
08/05/15
PIC 16F88 を使用した 9ピンで9桁表示 アノードコモン7セグLED用 08/05/06
list
p=16F88
#include <p16F88.inc>
__CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _CPD_OFF
&
_LVP_OFF & _BODEN_OFF & _MCLR_OFF & _WDT_OFF &
_INTRC_IO & _PWRTE_ON
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
DI0
EQU 20H ;9桁7seg データ
DI1
EQU 21H
DI2
EQU 22H
DI3
EQU 23H
DI4
EQU 24H
DI5
EQU 25H
DI6
EQU 26H
DI7
EQU 27H
DI8 EQU 28H
S_DAT EQU 29H
K_POS EQU
2AH ;桁位置
K_BP EQU 2BH
TW EQU 2CH
FL EQU
0H ;floating line PORTA,0
org 0
goto start
org 4
goto start
TABLE ;K_POS値をPCLに+しでJMP,データを持ってretする
ANDLW
B'00001111' ;下位4ビット
ADDWF PCL,F
RETLW b'00111111'
;0 3F C0
RETLW
b'00000110' ;1 06
RETLW
b'01011011' ;2 5A
RETLW
b'01001111' ;3 4F
A
RETLW
b'01100110' ;4 66
F B
RETLW
b'01101101' ;5 6D
G
RETLW
b'01111101' ;6 7D
E C
RETLW
b'00000111' ;7 07
D
RETLW
b'01111111' ;8 7F
RETLW
b'01101111' ;9 6F
90
RETLW
B'01110111' ;Code A
RETLW
B'01111100' ;Code b
RETLW
B'00111001' ;Code C
RETLW
B'01011110' ;Code d
RETLW
B'01111001' ;Code E
RETLW
B'01110001' ;Code F
start goto init_
init_
movlw D'2' ;TEST
0-9まで試験表示
movwf DI0
movlw D'3'
movwf DI1
movlw D'4'
movwf DI2
movlw D'5'
movwf DI3
movlw D'6'
movwf DI4
movlw D'7'
movwf DI5
movlw D'8'
movwf DI6
movlw D'9'
movwf DI7
movlw D'0'
movwf DI8
bsf STATUS,RP0
;BANK1
MOVLW
b'01110000' ;内蔵クロック 8MHz
MOVWF OSCCON
clrf ANSEL
;デジタル
movlw
b'00000111' ;コンパレーターoff
movwf CMCON
MOVLW
b'11111111' ;初期設定入力 all in
MOVWF TRISA
MOVWF TRISB
BCF STATUS,RP0
;BANK0
MOVLW
b'00000001' ;0桁目の位置
MOVWF K_BP
CLRF K_POS
WAIT
MOVLW 0FFh
MOVWF TW
DECFSZ TW,F
;TW-1
GOTO $-1
LEDof
;規定値 全IN 全消灯
CLRF PORTB
bsf STATUS,RP0
;BANK1
movlw
b'11111111' ;1=inMODE LEDoff
movwf TRISB
bsf TRISA,FL
;RA0 1=INにする LEDoff
BCF STATUS,RP0
;BANK0
MOVF K_POS,W
KETA SUBLW D'8'
;8桁目か
BTFSC STATUS,Z
GOTO K_8
;8桁目のみfloat lineを使わない別処理
K_ETC
movlw 20H
;DATAの先頭アドレス
addwf K_POS,W
;K_POS分だけポインタを進める
movwf FSR
;アドレスをセット
movf INDF,W
;FSR番地から表示DATA取得
CALL
TABLE ;7SEG DATA に変換
MOVWF S_DAT
;7SEG DATA 保管
MOVF K_BP,W
;float lineの位置
ANDWF S_DAT,W
;フロービット確認
BTFSS STATUS,Z
;必要ならfloat lineをLowにする
GOTO PASET
;発光
OUT_SEG
MOVF K_BP,W
;
IORWF PORTB,F
;発光桁をon アノード側をHiに
IORWF S_DAT,F
;発光桁をon Hiにするポートを出力に設定する
COMF S_DAT,W
;反転 消灯するポートを入力、無接続(Hiインピーダンス)に設定
bsf STATUS,RP0
;BANK1
MOVWF TRISB
;SEG DATA SET
BCF STATUS,RP0
;BANK0
MOVF K_POS,W
;DP を点灯
SUBLW D'0'
;0桁目DPを点灯
BTFSC STATUS,Z
GOTO DP
SUBLW D'3'
;3桁目DPを点灯
BTFSC STATUS,Z
GOTO DP
SUBLW D'6'
;6桁目DPを点灯
BTFSC STATUS,Z
GOTO DP
NE
INCF K_POS
;桁+1
BCF STATUS,C
RLF K_BP
;桁位置+1
GOTO WAIT
DP
bsf STATUS,RP0
;BANK1
BCF TRISB,7
;DP SEG をOUT SET 点灯
BCF STATUS,RP0
;BANK0
GOTO NE
PASET
;float lineを発光させる処理
BCF PORTA,FL
;RA0=L
bsf STATUS,RP0
;BANK1
BCF TRISA,FL
;RA0 0=OUT 発光
BCF STATUS,RP0
;BANK0
GOTO OUT_SEG
K_8
movf 28h,W
;28h番地から8桁目の表示DATA取得
CALL
TABLE ;7SEG DATA に変換
MOVWF S_DAT
;一時保管 8桁目はfloating lineをつかわない
CLRF PORTB
;BはL出力
BSF PORTA,FL
;RA0 発光桁をon 8桁目のアノードをHiにする
bsf STATUS,RP0
;BANK1
BCF TRISA,FL
;RA0 OUT
BCF STATUS,RP0
;BANK0
COMF S_DAT,W
;反転 消灯するポートを入力無接続(Hiインピーダンス)に設定
bsf STATUS,RP0
;BANK1
MOVWF TRISB
;SEG DATA SET
BCF STATUS,RP0
;BANK0
CLRF K_POS
;NEXT 0桁
MOVLW
b'00000001' ;0桁目の位置
MOVWF K_BP
GOTO WAIT
;NEXT
end
プログラムにバグがあった場合は連絡お願いします。
08/05/16
PORTBの8ピンのみを使用し8桁表示 カソードコモン7セグLED用
PORTAは全てフリーです。
Fカウンターなどを作るときに楽になります。
回路は同じようなものですが、PORTBの8ピンのみを使用して8桁表示です。
秋
月の7セグLED 赤色2文字(アノードコモン)(4個入)100円
の様な2文字のタイプを表示機に使用する場合は偶数桁のほうが設計しやすいと思います。
ただし片面基板ではパターン設計が難しくジャンパーだらけになってしまいます。
仕方なくラッピングで配線しました。
基板をCNCで作成 100*50o
組み立て完了 部品はPIC 16F88 カソードコモン7セグLED
電流制限抵抗470オーム 発光効率も良くだいぶ明るくなりました。
6の数字のBがうっすらと点灯しています。?何が原因か
ソフトにバグが残っているかも!!
少々脱線
100円ショップ ダイソーから購入した物 2個で105円です。
CNCに固定するのにちょうど良いパーツです。
08/05/17
バグ取りました。総電流30mA AからFも表示できます。
意味はありませんがデモ用に1からFまで流れるように表示するようにしました。
室内はokですが、屋外使用も考えるとtrを入れて電流増やした方が良いと思います。
; 8-Digit 8-Pin Kカソードコモン LED 08/05/18 JA0BAS 流れ16進表示
list p=16F88
#include <p16F88.inc>
__CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _CPD_OFF
&
_LVP_OFF & _BODEN_OFF & _MCLR_OFF & _WDT_OFF &
_INTRC_IO & _PWRTE_ON
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
S_DAT EQU 30H
K_POS EQU
31H ;桁位置
K_BP EQU 32H
O_DAT EQU 33H
TC EQU 34H
TW EQU 35H
W_TEMP EQU 36H
ST_TEMP EQU 37H
WT EQU 38H
org 0
goto start
org 4
goto INTR
;Initialize
TABLE ;K_POS値をPCLに+しでJMP,データを持ってretする
ANDLW
B'00001111' ;下位4ビット
ADDWF PCL,F
RETLW b'00111111'
;0 3F C0
RETLW
b'00000110' ;1 06
RETLW
b'01011011' ;2 5A
RETLW
b'01001111' ;3 4F
A
RETLW
b'01100110' ;4 66
F B
RETLW
b'01101101' ;5 6D
G
RETLW
b'01111101' ;6 7D
E C
RETLW
b'00000111' ;7 07
D
RETLW
b'01111111' ;8 7F
RETLW
b'01101111' ;9 6F
90
RETLW
B'01110111' ;A
RETLW
B'01111100' ;b
RETLW
B'01011000' ;C
RETLW
B'01011110' ;d
RETLW
B'01111001' ;E
RETLW
B'01110001' ;F
start goto init_
init_
CALL DSET
bsf STATUS,RP0
;BANK1
MOVLW
b'01100000' ;内蔵クロック 4MHz
MOVWF OSCCON
clrf ANSEL
;デジタル
movlw
b'00000111' ;コンパレーターoff
movwf CMCON
MOVLW
b'11111111' ;初期設定入力 all in
MOVWF TRISB
BSF PIE1,TMR1IE ;TMRオーバーフロー割込許可
BCF STATUS,RP0
;BANK0
MOVLW b'00110000'
MOVWF T1CON ;T
CONレジスタ プリスケーラ1:8
BCF T1CON,T1OSCEN
BCF T1CON,TMR1CS
;int osc
BSF INTCON,PEIE ;周辺割込の許可
BSF INTCON,GIE ;全体割込の許可
BSF T1CON,TMR1ON ;TMRのTMR
ONビットをセット カウント開始
MOVLW
b'00000001' ;0桁目の位置
MOVWF K_BP
CLRF K_POS
WAIT
DECFSZ TW,F
;TW-1
GOTO $-1
LEDof
;規定値 全IN 全消灯
bsf STATUS,RP0
;BANK1
movlw
b'11111111' ;1=inMODE LEDoff
movwf TRISB
BCF STATUS,RP0
;BANK0
CLRF PORTB
CLRF O_DAT
MOVF K_POS,W
SUBLW D'7'
;7桁目か
BTFSC STATUS,Z
GOTO K_7
;7桁目のみfloat lineを使わない別処理
K_ETC
movlw 20H
;DATAの先頭アドレス
addwf K_POS,W
;K_POS分だけポインタを進める
movwf FSR
;アドレスをセット
movf INDF,W
;FSR番地から表示DATA取得
CALL
TABLE ;7SEG DATA に変換
MOVWF S_DAT
;7SEG DATA 保管
MOVF K_BP,W
;float lineの位置
IORWF O_DAT,F
;発光桁を強制的に1にするon K側をLに
COMF O_DAT,F
ANDWF S_DAT,W
;1の部分素通りマスク
BTFSS STATUS,Z
;必要ならfloat lineをHにする
BSF S_DAT,7
;RB7 0=OUT 発光
MOVF K_BP,W
;float lineの位置
IORWF S_DAT,F
COMF S_DAT,F
;反転させ
MOVF O_DAT,W
MOVWF PORTB
MOVF S_DAT,W
bsf STATUS,RP0
;BANK1
MOVWF TRISB
;SEG DATA SET
BCF STATUS,RP0
;BANK0
INCF K_POS
;桁+1
BCF STATUS,C
RLF K_BP
;桁位置+1
GOTO WAIT
K_7
movf 27h,W
;27h番地から7桁目の表示DATA取得
CALL
TABLE ;7SEG DATA に変換
MOVWF S_DAT
;7SEG DATA 保管
BSF O_DAT,7
;発光桁を強制的に1にするon K側をLに
COMF O_DAT,7
BSF S_DAT,7
;RB7 0=OUT 発光
COMF S_DAT,F
;反転させ
MOVF O_DAT,W
MOVWF PORTB
MOVF S_DAT,W
bsf STATUS,RP0
;BANK1
MOVWF TRISB
;SET
BCF STATUS,RP0
;BANK0
CLRF K_POS
;NEXT 0桁
MOVLW
b'00000001' ;0桁目の位置
MOVWF K_BP
GOTO WAIT
;NEXT
INTR ;割込処理
PUSH MOVWF W_TEMP
;Wレジスタ待避
SWAPF STATUS,W
;STATUS取出
MOVWF ST_TEMP
;STATUS待避
BCF PIR1,TMR1IF
;オーバーフローフラグのクリア
BSF STATUS,RP0
;BANK1
BSF PIE1,TMR1IE
;オーバーフロー割込許可
BCF STATUS,RP0
;BANK0
CALL DSET
pop SWAPF
ST_TEMP,W ;STATUSを戻す
MOVWF STATUS
SWAPF W_TEMP,F
;Wレジスタを戻す
SWAPF W_TEMP,W
RETFIE
;割込を許可してリターン
DSET
movlw 20H
;DATAの先頭アドレス
MOVWF FSR
;
MOVF INDF,W
;20Hの内容
MOVWF WT
;退避
L2
MOVLW 0FH
;MAX 0FH
SUBWF WT,W
BTFSC STATUS,C
CLRF WT
INCF WT,F
MOVF WT,W
MOVWF INDF
MOVLW 28H
;MAX 28H
SUBWF FSR,W
BTFSC STATUS,C
RETURN
INCF FSR,F
GOTO L2
end
各セグメントは10分の1の時間しか発光していないので電流100mA位流せば超高輝度になりますが
PICのポートの電流制限25mAですのでそこで我慢すると
3V/0.025=120オームになります。
全体で0.025*7=0.175mA
電流制限抵抗120オームにして作りましょう!
08/05/18
もっと明るく光らせたくカソードにTRを入れて見ました。
電流制限抵抗は100オームです。
組み立てて下記です。
写真ではわかり難いですが、明るくはなっています。
500mAのTRを付けたのですが、総電流50mAしか流れません。
200mA流れてもらいたいのですが、計算が合いません?
そこでシンクロでPIC 16f88 のピン電圧を見て見ました。
シンクロ画面の写真は始めて取ったのでぼけていますが、露出は手動設定にしないと!!
縦軸目盛1Vです。一番下のラインが0V発光桁の時です。
中間のラインが発光時のセグメント出力電圧1.5V位しかありません。
電流制限抵抗不要です。0オームでok
PICはピンから電流を取出すと急激に電圧が下がるようです。
と言うことは明るくするためにはアノードコモンのLEDを使ってPICピンは吸込みで設計しないと高輝度にはできない結論でした。
実験して見ないとわかりません。吸込ませたら電圧上がったりして!!!
08/05/19
電流を取出した場合の状況です。
25mA流すと最大1.5Vまで電圧が下がります。
普通LEDは1.9V位の電圧ありますから電流制限抵抗付けなくても適当な電流に収束します。
電流を吸込ませた場合の状況
こちらはまあまあ使えそうです。
上記はVDD 5Vの場合です。
3Vで使用の場合は非常に悪くなります。
これでは10mA位しか流れ出てきません。
HIOUT端子をグランドにショートしても破壊されない!!
ところで上記の回路の例では電源電圧2.4Vでも正常に動いています。
電流は50mAから3mAに減少 LEDは暗いところでないと見えません。
home
CNCの構想
CNCの製作 CNCのSOFT
CNCの作品
ゲストブック