2025.5.4
前へ
次へ
ホームページトップへ戻る


超ローコストPICWRITERの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「PICBASICコンパイラ」からスピンオフ!!
過去記事を参照することなどを考えて該当する過去記事は「PICBASICコンパイラ」のまま連載回もそのままとします。
以後は前回記事からの流れで[第236回]からとします。
「PICBASICコンパイラ」はなるべく早く連載を再開したいと考えています。
PICはローコスト、高機能で種類も豊富なお手軽マイコンですがプログラムを書き込むためのWRITERが必要です。
それをできるだけ安価に作ってしまおうというプロジェクトです。
最終的には製品化を考えています(組立キット、完成品)。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第275回]



●PIC16F1938(3)テストプログラム(2)内蔵クロック発振回路

PIC16F1938のテストは簡単にざっと済ませてしまうつもりでしたが。
ついCPUクロックにはまってちょいと深掘りすることになってしまいました。
まずは前回のテストプログラムについて。
実はLEDの表示周期をストップウォッチで計測することでCPUクロックを確認することを思いついたのですけれど(誰でも考えることです)。
テストに使ったLED表示ボードはもともとND80Z3.5の82C55出力を確認するためのものなのでA、B、Cの3ポート(各8ビット)の出力を受けています。
PIC16F1938にもA〜Cの3ポートがあって各ポートとも8ビットなのですがその全部はLED表示基板には接続されていません。
テストに使った基板(PICBS04)はPIC18F2550用の基板で26pinコネクタには一部のポート出力しか接続されていません([第263回])。
LED表示基板はその26pinコネクタに接続しています。
前回のテストプログラムでカウンタの値を出力しているPORTBは8ビット全部が配線されていますがPORTCはビット0〜2の3ビットしか配線されていません。
さらに言いますとPORTBは下位8ビットのカウンタ出力なので速過ぎて目視ではカウントできません。
上位カウンタも8ビットなのですがそのうちの下位3ビットしかLEDに出力されないのでやはり目視には不十分です。
動作していることがわかればいいだろうぐらいのいい加減な考えでプログラムをでっち上げてしまったのがいけなかったのでした。
そこでまずはプログラムのそのあたりのところを書き直すことから取り掛かりました。
下は前回のプログラムの一部を書き直して作成したテストプログラムPIC16F1938TESTB.ASMです。
;pic16f1938test from pic16f883test
;25/04/28 5/3
;
; internal 4MHz
        #include <p16f1938.inc>
        __CONFIG _CONFIG1,_WDTE_OFF & _MCLRE_ON & _IESO_OFF & _BOREN_OFF & _FOSC_INTOSC
        __CONFIG _CONFIG2,_WRT_OFF
;
cf=0
zf=2
f=1
w=0
;
cntr0 equ 20
cntr1 equ 21
cntr2 equ 22
;
     org 00
st0
     goto start
;
     org 05
start
        banksel ANSELA
        clrf ANSELA
        clrf ANSELB
        banksel OSCCON
        movlw 68;=4MHz
        movwf OSCCON
        clrf TRISB
        clrf TRISA
     banksel PORTB
;
loop
        movf cntr1,w
        movwf PORTA
        call t1ms
        incfsz cntr1
        goto loop
        incf cntr2
        movf cntr2,w
        movwf PORTB
        goto loop
;
t1ms
        movlw 0fa;=250
        movwf cntr0
t1ms2
        nop
        decfsz cntr0,f
        goto t1ms2
        return
;
     end
;

カウンタの下位8ビットをPORTAに出力し上位8ビットをPORTBに出力するように変更しました。
PORTAは6ビットしか配線されていませんがどうせ下位カウンタの値はまともに目視できませんから構わないとの判断です。
下はそのように変更したプログラムでテスト中の写真です。

このあともCPUクロックについてさらにテストを進めるためもともとの回路に実装していたクリスタルを外してソケットに換えました。
今回のテストプログラムは内蔵発振モードですから外付けのクリスタルは不要です。

そのようにプログラムを変更したのですがLED表示をストップウォッチで測るなんてのは実際にやってみると面倒で手間がかかります。
ここはやっぱりオシロスコープの出番でありましょう。
ということで。
下がオシロスコープで観測した写真です。
最初からこのようにするべきでした。

PORTBのビット0の出力を観測しました。
PORTBは1msecごとにカウントアップします。
オシロスコープで観測したところ、上の画像のようにその通りの結果が得られました。
なお前回はVdd=3Vでテストをしましたが、以後はクロックを高くして動作テストを進めるつもりなので念のためVddは+5Vでテストをすることにしました。
ここまでが前回の復習を兼ねた作業です。
ここからCPUクロックを深掘りしていきます。

前回はPIC16F1938には4xPLL機能があると書きました。
内蔵クロック発振モードでは8MHzのときのみ4xPLL回路に接続することができます。
今回はそれを確かめてみることにしました。
下はその目的で作成したテストプログラムPIC16F1938TEST2B.ASMです。
;pic16f1938test from pic16f883test
;pic16f1938test from pic16f883test
;25/04/28 5/3
;
; internal 4MHz
        #include <p16f1938.inc>
        __CONFIG _CONFIG1,_WDTE_OFF & _MCLRE_ON & _IESO_OFF & _BOREN_OFF & _FOSC_INTOSC
        __CONFIG _CONFIG2,_WRT_OFF
;
cf=0
zf=2
f=1
w=0
;
cntr0 equ 20
cntr1 equ 21
cntr2 equ 22
;
     org 00
st0
     goto start
;
     org 05
start
        banksel ANSELA
        clrf ANSELA
        clrf ANSELB
        banksel OSCCON
        movlw 0F0;=8MHzx4=32MHz
        movwf OSCCON
        clrf TRISB
        clrf TRISA
     banksel PORTB
;
loop
        movf cntr1,w
        movwf PORTA
        call t1ms
        incfsz cntr1
        goto loop
        incf cntr2
        movf cntr2,w
        movwf PORTB
        goto loop
;
t1ms
        movlw 0fa;=250
        movwf cntr0
t1ms2
        nop
        decfsz cntr0,f
        goto t1ms2
        return
;
     end
;

もとのプログラムPIC16F1938TESTB.ASMを書き換えました。
変更したのはプログラムの中ほどOSCCONに値を設定するところだけです。
OSCCONは前回お見せしましたが下に再掲します。


[出典]Microchip Technology Inc.PIC16F193X DataSheet

4xPLLを使うためbit7のSPLLENを’1’にします。
内蔵クロック発振を8MHzにしますからbit6−3を”1110”にします。
ということでOSCCONに”F0”をセットします。
実はbit7の説明には怪しげなことが書かれているのですがこの時点ではそのことには全く気がついていませんでした。
後になってPIC16F1938の異様な動作に混乱した挙句にやっとそのことに気がついたのでした。
それについては後で書くことになります。

プログラムを実行しました。
下がオシロスコープで観測した写真です。

先ほどと同様にPORTBのビット0の出力を観測しました。
先のプログラムではPORTBは1msecごとにカウントアップします。
そのときのCPUクロック(Fosc)は4MHzです。
今回はその8倍の32MHzになっているはずです。
すると1/8=0.125msecごとにカウントアップするはずです。
0.125msec=125μsです。
おお。
その通りになっています。
すごい!
ちゃんと内蔵発振でFosc=32MHzが得られました。
PICの1命令はその4クロックか8クロックで実行されますから32MHzの場合1命令が1/8μsか1/4μsで実行されるということです。
つまり1命令の実行時間は125nsか250nsです。
それが外付けクリスタルなしでできるのですから。
本当にすごいです。
ちなみに上のプログラムのサブルーチンt1msではマシン語の命令が1000回実行されています(最初のMOVWFのところやCALL、RETURNを除きます)。
そのサブルーチンの1回のCALLが125μsです。

さらに深掘りは続きますが今回はここまでです。
次回に続きます。

超ローコストPICWRITERの製作[第275回]
2025.5.4 upload

前へ
次へ
ホームページトップへ戻る