超ローコスト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
前へ
次へ
ホームページトップへ戻る