ワンチップマイコンPICによる工作
PIC16F84A
フラッシュ:1Kワード
RAM:68バイト
EEPROM:64バイト
クロック:DC〜20MHz
少々古いICですが、皆が使っており情報が豊富。検索すればいくらでも出てきます。
初心者にはお勧めのICです。
コンピューターですからソフトが無ければ何もできません。書き込み機が必要です。
RCD PICの書込み機です。右はユニバーサル基板の試作品
05/08/07動きました。パターンは変更 もっと小さく出来そうです。
JDM PICの書込み機です。右はユニバー
サル基板の試作品
05/08/16 完成しました。 パターンは誤りあって作り直し。cncはいつでも作れてgoodです。
5桁Fカウンター 超小
型 XKPさんの設計のアイデアに感動です。こんなに簡単小型にFカウンターが出来るとは!!
基板の拡大図 7セグ部分の配線は半田付けの工夫でピン間1本の配線です。
05/08/07 一部パターン変更 動きました。古いLEDの為表示が暗いです。最新式の物は発光効率が良くて明るいと思います。
制限抵抗100Ωなんですが電流があまり流れていません。基板全体で50MA 25mA*7セグで200mA位流れて貰いたい。
16F84AのIO端子Hにしても電流を流すと電圧が落ってきます。抵抗直結で良いかもしてません。 部品面から見ると空きスペースだらけ半分くらいの大きさで出来そうです。
部品配置ももっと工夫できます。
7セグLEDへの配線は割り切って手作業。基板サイズ 42*55o
LED 6桁リグ周波数表示用カウンター を1/20ピッチの表面実装ICで設計してみました。
さすがCNC 小型のICでもぴったり使えます。下部スペースはLEDの取付部です。基板サイズ 30*50o
05/08/20 組み立てました。表面に部品がほとんど無くなってしまいました。物凄く簡単
プリスケーラーはMB501使用 したがってFは1GHzまでOK プログラムを変更しなくては!!
CRは裏にチップ部品で パターンの関係で16F84AのIO端子をオリジナルと変更しました。
パターンと使用部品に合わせてソフト変更。 再アセンブル時点で問題発生。
私手持ちのアセンブラー PAは Ver3.0 ですが、秋月のPAとバージョンが違うようでエラーが出ます。
仕方が無いので 帝3.33
を使用して逆アセンブラル 出てきたファイルを MPLAB
を使ってアセンブルしました。
でとりあえず動きました。ゼロサプレスもうまくいっています。F特性など未確認
2006.6.4PAVer3.0で
XKPさんのソフトを再アセンブルする方法が分かりました。
1 optionhは予約語のようでERRが出ますのでoption_regに変更します。更にファイル18f84.hもエディターを使って 「option_reg
equ 1 ; OPTION」に変更します。
2 変数名にdecやif等を先頭に含んだ名前は使えません他の名前に変更します。私は頭にbを追加しました。
PIC16F88等をアセンブルするには居酒屋ガレージの一番最 後に説明があります。
device.rcの変更とインクルードファイル16f88.hの作成が必要です。他のPICの追加もできます。
PICの書き込みですが、たまたま書けたり書けなかったり不安定です。
どうも電源が不足の様なので外部電源の方が良いようです。外部電源使用PIC書込機
基板設計もJWCADで行いました
次は●本格的周波数カウン
ター FREQUENCY COUNTER を作ってみたいと思います。
LCD版
7セグLED版
変換ルーチンなど
のソフトは参考にしました。
5桁7セグ用基板作成 チップTR使用 大きさ38mm*43mm
拡大してみました。穴は0.9ミリ 切削幅は0.3mm位でしょうか?
基準発信機 EPSON SG-11Cです。 1番GND2番OUT3番5Vです。100ppm
SL-1063-50(アノードコモン) 正面上の左側から数えて
A 13 12 11 10 9
K _2_ ___ ___ ___
4 /5_/ 3 /__/ ・3 /__/ /__/
8 /__/ 6 /__/ ・6 /__/ /__/ g 7
1
9-13pinで表示する桁を選択して、1-8で点灯する7セグを選択
とりあえず作ってみました。4桁のLEDしかないので1桁は横に並べましたが格好悪かったです。
裏の基板パターン
部品面です
格好悪かったので小型7セグLEDを5桁並べてみました。ついでにプリスケーラもつけました。
ICもPIC16F84AからPIC16F628に変更しました。プログラムも数行の変更でした。足が1本あまるので6桁も可能のようです。
基板パターンです。7セグ部分のピン間1本の配線もうまく言っています。
PIC16F648に変更 クロックも12.80000MHzに手持ち部品なので外形大きいです。
7セグは2桁用を3組使用
基板パターン 回路も6桁用に変更 プログラムは変更中です。
ICにより最高カウント周波数に差があります。選別した方がよさそうです。
08/09/24
PIC16F88 を使用して普通のカウンターを作って見ました。
回路図は 水魚堂の回路図エディタ
bsch3V を使って作成しています。
ビットマップファイル BMP で出力し更に ペイント で読み込み JPGファイルに変換して html ファイルを作っています。
カソードコモン7セグLEDに電流を流して見たかったのが目的です。
電流制限抵抗56オームです。
(5V(電源)-2V(LED)-0.5V(TR)-0.5V(PIC))/56オーム*7セグ=250mA
計算のとおり流れます。平均電流250mA
やはりこの位流すと昼間の明るい場所でも使用できます。
30オーム位の抵抗でもっと流しても良いと思います。
jwcad でプリント基板パターン設計
この後 NCVC を使ってGコードに変換(NCコード) NCVCではJWCADのファイルを直接そのまま読み込み出来ます。
551行 切削長 2.53m 時間23分です。
次に穴あけdata 作成 178行 穴数約170個 加工時間19分です。
最後に MACH3 で実際に CNC 加工を行ってプリント基板を作成します。
まずカッターで彫刻
次にドリルに交換して穴あけを行います。
テキストエディターは 秀丸 を使っています。
PIC用の強調表示を組み込んでコマンドは自動で色をつけています。
非常に使いやすくてお勧めです。
アセンブラーのリストが出来たらMPLABを使ってシュミレート 更にデバグして アセンブラーしてHEXファイルを作成します。
その後 PICKIT2 を使って実際にチップに書き込みます。
;2008/10/16 ja0bas VerUP
;
LIST P=PIC16F88 ; プロセッサの種別指定
INCLUDE <P16F88.INC> ; インクルードファイルの指定
__CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _CPD_OFF
& _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _WDT_OFF &
_EXTCLK & _PWRTE_ON
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
errorlevel -302 ; suppress message 302 from list
file
; -------------- adress 20&H
dec0 equ 20h ;100MHz 10進格納場所(10バイト)
dec1 equ 21h ;10MHz dec0が最上位桁でdec[9]が最下位桁です。
dec2 equ 22h ;1MHz
dec3 equ 23h ;100KHz
dec4 equ 24h ;10KHz
dec5 equ 25h ;1KHz
dec6 equ 26h ;100Hz
dec7 equ 27h ;10Hz
dec8 equ 28h ;1Hz
dec9 equ 29h ;
overf equ 2ah
vfo_m equ 2eh ; 一時余り格納場所(サブルーチンで使用)
; ------------- adress 30&H
vfo0 equ 31h ;PSAの値Lo(VFO)。
vfo1 equ 32h ;TMR0の値
vfo2 equ 33h ;TOIFによりインクリメントした値
Vfo3 equ 34h ;VFO(2)のオーバフローによりincした値
wait_cn equ 36h
cn equ 37h
MOVFF MACRO DST,SRC ;←MOVFF というマクロを登録、引数は SRC DST
MOVF DST,W
MOVWF SRC
ENDM
org 0
goto init
org 4
goto init
;----------------------------------------------------------------------------
init bsf STATUS,RP0 ;BANK1
MOVLW B'00000000' ;ポートデジタル
MOVWF ansel
MOVLW B'00000000'
MOVWF TRISB ; portbをOUTに
movlw B'01100111' ;prescaler 1/256 set ;portbプルアップ;立上カウント
movwf OPTION_REG
BCF STATUS,RP0 ;BANK0
clrwdt ;prescalerをクリア
clrf tmr0 ;TMR0をクリア
main
call c_main ;counter mein
call x4 ;4倍する
call dcmain ;16進->10進変換
clrf vfo0 ;変数クリヤ
clrf vfo1
clrf vfo2
clrf vfo3
goto main
; -------------------------------------------------------------------
c_main
clrf portb
clrf porta
bsf STATUS,RP0 ;BANK1
MOVLW B'00011000'
MOVWF TRISA ; porta.3 をinput mode=high impedance/TMR0の開始
BCF STATUS,RP0 ;BANK0
CLRWDT ;;temp 250 msec カウントの始点
clrf tmr0 ;カウンタTMR0をクリア
movlw D'50' ;時間調整
movwf wait_cn ;
decfsz wait_cn,F
goto $-1
NOP
NOP
movlw D'126' ;時間調整
movwf cn
cmain0 call display
decfsz cn,F
goto cmain0
cmain1 ; sleep ;
bsf STATUS,RP0 ;BANK1
MOVLW B'00010000'
MOVWF TRISA ;porta.3 をOUT TMR0の停止 250msecカウントの終点
BCF STATUS,RP0 ;BANK0
bcf portA,3
movff tmr0,vfo1 ;TMR0のdataをvfo1に
toggle bSf portA,3 ;porta4のトグル
bCf portA,3
decf vfo0,F
movf tmr0,W
subwf vfo1,w ;vfo1-TMR0=0であれば Z=1
btfsc STATUS,z
goto toggle
RETURN ;vfo0への prescaler値の取込完
;----------------------------------
display
movf dec1,W ;100KHz桁
call tablenum ;
movwf portb
bsf PORTB,4
call delay250
bcf PORTB,4
movf dec2,W ;10KHz桁
call tablenum ;
movwf portb
bsf PORTA,6
call delay250
bcf PORTA,6
movf dec3,W ;1KHz桁
call tablenum ;
movwf portb
bsf PORTA,2
call delay250
bcf PORTA,2
movf dec4,W ;0.1KHz桁
call tablenum ;
movwf portb
bsf PORTA,1
call delay250
bcf PORTA,1
movf dec5,W ;0.01KHz桁
call tablenum ;
movwf portb
bsf PORTA,0
call delay250
bcf PORTA,0
movlw D'3' ;時間調整
movwf wait_cn ;
decfsz wait_cn,F
goto $-1
RETURN
;2 (=4)
delay250 ;--------------;389steps=389usのルーチン------------
;TMR0のオーバフロー(TMR0IF)のCHK
movlw D'255' ;
movwf wait_cn ;
decfsz wait_cn,F
goto $-1
movff intcon,overf ;チェックした瞬間を保存
bcf status,c
btfsc overf,2 ;
incf vfo2,F ;
btfsc STATUS,c ;
incf vfo3,F ;
btfsc overf,2 ;
bcf intcon,tmr0if ; フラグクリヤ
RETURN ;
;-------------------------------------------------------------
tablenum
ANDLW B'00001111' ;下位4ビット有効
addwf pcL,F ;cycle3
; BAC-FGED 7segment のA〜F
retlw b'00000100' ;letter 0
retlw b'01001111' ;letter 1
retlw b'00101000' ;letter 2 A
retlw b'00001010' ;letter 3 ____
retlw b'01000011' ;letter 4 F | | B
retlw b'10000010' ;letter 5 |_G__|
retlw b'10000000' ;letter 6 E | | C
retlw b'00001111' ;letter 7 |____|
retlw b'00000000' ;letter 8 D
retlw b'00000010' ;letter 9
retlw b'10101011' ;letter U
retlw b'00001011' ;letter L
retlw b'01001011' ;letter C
retlw b'11101110' ;letter A
retlw b'01001110' ;letter F
retlw b'00000100' ;letter -
sleep
x4 BCF STATUS,c ;*2 250ms 計測値を4倍する
RLF vfo0,F
RLF vfo1,F
RLF vfo2,F
RLF vfo3,F
BCF STATUS,c ;*2
RLF vfo0,F
RLF vfo1,F
RLF vfo2,F
RLF vfo3,F
return
;---------------------------------------------------------
;32bitバイナリ→10進変換 変換後vfoは破壊
;vfoに32bitデータを置く。(vfo3:vfo2:vfo1:vfo0)
;decに答えが格納(dec0:dec1:...:dec8:dec[9])
dcmain MOVLW H'29'
MOVWF fsr ; 格納場所初期値
call devide ; 最下位変換
call devide ;10回繰り返し
call devide
call devide
call devide
call devide
call devide
call devide
call devide
call devide ; 最上位変換
RETURN
devide MOVLW D'32' ;÷10サブルーチン
MOVWF cn ; 32ビットくり返し
clrf vfo_m
devide0 BCF status,c
RLF vfo0,F
RLF vfo1,F
RLF vfo2,F
RLF vfo3,F
RLF vfo_m,F
movlw B'11110110'
addwf vfo_m,0
btfsc STATUS,c
movWF vfo_m
btfsc STATUS,c
incF vfo0,F
DECFSZ CN,F
GOTO devide0
decF fsr,F
MOVFF vfo_m,INDF ; 余り
RETURN
;
END
バグあったら訂正しますので連絡してください。
定電圧 IC7805
ジャンパー線いっぱい もっとパターンを考えないと!
MPLAB IDE V7.60 を使ってバグ取り
まずLogic Analyzer で桁出力を確認
次にブレークポイントをカウンターの始点(プリセレクターをクリヤーした瞬間)と終点(PORTA3をOUTに設定してPORTA4GNDにした瞬 間)に設定
Stopwath(ストップウオッチ) を使用して全サイクル数500000 250mS になるよう時間調整します。
プロセッサーのクロック周波数を変更した場合は必須です。
表示をMHzに変更 40.096MHzを測定中 ここら辺が測定可能最高周波数です。
反省
最近のPIC は28Pでクロックも早く値段も手ごろ IOが21本もあって 8桁位余裕を持って表示
最速クロック48MHzの
USB付の PIC18F2550
でも使った方が良いと思います。
最高測定周波数はどの位まで伸びているのか?実験して見たい!!
2009/06/12
PIC Fカウンターの最高周波数について色々の話があってもっと測れるとのこと
いじる所といってもRA3とRA4に繋がっている抵抗位で変更してみました。
マイクロチップ社のPICに関するAN592(アプリケーション・ノート)の参考回路のとおり今までは470オームを使っていました。
これをPICの限界ぎりぎりの200Ωに変更してみました。5V/0.025A=200Ω
これだけで60MHzまでカウントするようになりました。
同じ方式で100MHzまで使っている方がいるようなのでもっと研究しないといけません。
200Ωに並列に10PF位のCを入れると良いかも!!
C入れてみました。約10%UPの67.1MHzになりました。
どうもここら辺のゲートを工夫するともっといけそうです。
home CNCの構想 CNCの製作 CNCのSOFT CNCの作品 ゲストブック