超ローコストPICWRITERの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「PICBASICコンパイラ」からスピンオフ!!
過去記事を参照することなどを考えて該当する過去記事は「PICBASICコンパイラ」のまま連載回もそのままとします。
以後は前回記事からの流れで[第236回]からとします。
「PICBASICコンパイラ」はなるべく早く連載を再開したいと考えています。
PICはローコスト、高機能で種類も豊富なお手軽マイコンですがプログラムを書き込むためのWRITERが必要です。
それをできるだけ安価に作ってしまおうというプロジェクトです。
最終的には製品化を考えています(組立キット、完成品)。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第277回]
●PIC16F1938(5)テストプログラム(4)4xPLL
前回はPICの水晶発振のテストで大きく2つの不可解な現象が発生しました。
その1つは水晶発振モードではなぜか4xPLLモードになってしまうらしいという現象です。
前回は訳がわからずなんだかクロック周波数がめちゃめちゃ高くなってしまうことに戸惑ってしまいました。
しかし落ち着いてよくよく考えてみますと20MHzクリスタルでの発振の場合逆算して求めたFoscがその4倍になることからおそらく4xPLL機能が働いているのではないかと推測されます。
しかしそれについてはテストプログラムでは使わない設定にしたはずです。
それなのに何故なのか?という問題です。
それともう1つは水晶発振モードのプログラムなのにクリスタルを外付けしなくても「ある周波数」でまともに動作してしまうという現象です。
それに加えて規定を超える周波数の32MHzクリスタルでもそれなりの発振周波数で動作するらしいという現象もありました。
今回は最初の4xPLLについて解明します。
前回のテストプログラムではCONFIG1で水晶発振モードを指定するとともにOSCCONでは4xPLLモードをOFFにしました。
下は前回のテストプログラムPIC16F1938TEST3.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_HS
__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
以下省略
|
OSCCONは先に行なった内蔵発振モードのテストプログラムの設定をそのまま使っています。
内蔵発振モードではFosc=4MHzを指定していますがCONFIG1の設定が優先されるのでここはそのままにしています。
同時にbit7=’0’にして4xPLLを使わない設定にしました
OSCCONは[第274回]と[第275回]でお見せしましたがもう一度下に再掲します。

[出典]Microchip Technology Inc.PIC16F193X DataSheet
実はOSCCONのbit7には例外規定がありました。
そのことについては[第275回]でちらりと書きましたがそこが重要だったのでした。
よくよく読みましたら。
Configuration Word1のPLLENが’1’のときはSPLLENは無視される(ignored)。
と書いてあります。
その場合には常に4xPLLが有効になる。
そういうことだったのでした。
あれ?
でもConfiguration Word1にPLLENなんてあったっけ?
Word2にありました。
ミスプリントのようです。

[出典]Microchip Technology Inc.PIC16F193X Memory Programming Specification
Config2のbit8にPLLENがありました。
Config2のPLLENは全く意識していませんでしたからWRTのみOFFにしたのでした。

[出典]Microchip Technology Inc.PIC16F193X Memory Programming Specification
WRTはWrite Protectです。
う。
Copy Protectと違うのか。
ならここは特に指定しなくてもよかったか。
あ。でも。
LVPをEnableにしたままだったから、やっぱりここは念のために_WRT_OFFにして正解だったかも。
CONFIG2はそれ以外は指定しなかったのでPLLENはデフォルトの’1’になって4xPLLが有効になったのでした。
やっと納得できました。
そういうことならば。
ということで下は前回のプログラムの一部を書き直して作成したテストプログラムPIC16F1938TEST5.ASMです。
CONFIG2に_PLLEN_OFFを追加しました。
;pic16f1938test from pic16f883test
;25/04/28 5/3
;
; internal 4MHz
#include <p16f1938.inc>
__CONFIG _CONFIG1,_WDTE_OFF & _MCLRE_ON & _IESO_OFF & _BOREN_OFF & _FOSC_HS
__CONFIG _CONFIG2,_WRT_OFF & _PLLEN_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
;
|
このように変更したプログラムを使って動作テストをしたのですが。
ここまで書いてきて再確認が必要になりました。
まだ説明の途中ですが今回は時間がなくなってしまいました。
次回に続きます。
超ローコストPICWRITERの製作[第277回]
2025.5.6 upload
前へ
次へ
ホームページトップへ戻る