ワンチップマイコン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の作品    ゲストブック