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


超ローコストPICWRITERの製作

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

[第264回]



●PIC16F883(2)システムCLOCKの設定

今回はPIC16F883のシステムクロックについて書きます。
PICは水晶発振回路を内蔵していて外部にクリスタルを接続することでそれをシステムクロックとして使うことができます。
PIC16F883はそれ以外に外部にクリスタルを接続することなく内蔵発振回路による発振クロックをシステムクロックとして使うこともできます。
内部発振モードを使うときにはプログラムの中でOSCCONレジスタに必要な値を設定します。

[出典]Microchip Technology Inc. PIC16F883 Data Sheet

何回も書いておりますように当記事は私自身の備忘録を兼ねております。
こうして毎日のように書くことはそれなりに手間がかかりますがそうすることで気付かされることも多くあります。
ただプログラムを書くためだけにドキュメントを読んでいたならば深く読まずに過ぎてしまうことも多々あるかと思います。
今回もOSCCONについて書くために上記のドキュメントをあらためて読んでみて初めてそういうことかと気付くことがありました。
内蔵発振モードを選択する場合にはOSCCONレジスタのbit6−4のIRCF<2:0>に3ビットの値を設定します。
内蔵発振モードの発振周波数はIRCF<2:0>で指定します。
前回のプログラムは4MHzを設定しましたからOSCCONのbit6−4に”110”を指定することになります。
実はそれ以外の理解がちょいといいかげんであったことに気が付きました。
上記のほかにbit3=’0’、bit2=’1’、bit1=’0’が必要というところまでは理解していました。
しかしbit0のSCSはちょっと理解が及ばなかったことに気が付きました。
私はここで考え違いをしていてSCS=’0’にしていました。
この場合にはCONFIG1でシステムクロックの設定をすることになります。
前回のテストプログラムではそのようにしていたのですが。
もしもここでSCS=’1’にしたら。
CONFIG1でシステムクロックの設定は不要になるのでは?

そこで前回のプログラムをそのように変更して試してみました。
CONFIG1から_INTOSCIOを外してOSCCONのbit0を’1’にしました。
;pic16f883test
;25/04/16 4/18 4/19
;
; internal 4MHz
        #include <p16f883.inc>
        __CONFIG _CONFIG1,_WDT_OFF & _MCLRE_ON & _LVP_OFF
        __CONFIG _CONFIG2
;
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
        movlw 60;bk3
        movwf STATUS
        clrf ANSEL
        clrf ANSELH
        bcf STATUS,6;bk1
        movlw 65;=4MHz
        movwf OSCCON
        clrf TRISB
        clrf TRISC
     bcf STATUS,5 ;bank0
;
loop
        movf cntr1,w
        movwf PORTB
        call t1ms
        incfsz cntr1
        goto loop
        incf cntr2
        movf cntr2,w
        movwf PORTC
        goto loop
;
t1ms
        movlw 0fa;=250
        movwf cntr0
t1ms2
        nop
        decfsz cntr0,f
        goto t1ms2
        return
;
     end
;

私は今までCONFIGからシステムクロックの指定を外すことなど考えたこともなかったのですが上記のプログラムをPIC16F883に書いて実行したところ前回と全く同じように動作しました。
目からうろこでありました。

ところで前回の試作回路基板は12MHzのクリスタルを実装しています。
クリスタルを実装していても前回のプログラムや上記のプログラムのように内蔵発振モードを指定したときには外部に接続したクリスタルは無視されます。
今回はOSCCONに値を設定することでCONFIGのシステムクロックの設定が不要になることがわかりました。
それではシステムクロックとして外付けクリスタルの発振を使うときはどのようなプログラムを書けばよいのかということについてですが。
その場合にはCONFIGの設定は外せません。
下は前回のプログラムを外付けクリスタルの発振をシステムクロックにするように変更したプログラムリストです。
;pic16f883test
;25/04/16 4/18
;
; internal 4MHz
        #include <p16f883.inc>
        __CONFIG _CONFIG1,_WDT_OFF & _HS_OSC & _MCLRE_ON & _LVP_OFF
        __CONFIG _CONFIG2
;
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
        movlw 60;bk3
        movwf STATUS
        clrf ANSEL
        clrf ANSELH
        bcf STATUS,6;bk1
        movlw 64;=4MHz
        movwf OSCCON
        clrf TRISB
        clrf TRISC
     bcf STATUS,5 ;bank0
;
loop
        movf cntr1,w
        movwf PORTB
        call t1ms
        incfsz cntr1
        goto loop
        incf cntr2
        movf cntr2,w
        movwf PORTC
        goto loop
;
t1ms
        movlw 0fa;=250
        movwf cntr0
t1ms2
        nop
        decfsz cntr0,f
        goto t1ms2
        return
;
     end
;

PICのプログラムで一番困るのはCONFIGの書き方です。
ここがPICによって変わってしまうところが困るところです。
ときに試行錯誤を強いられます。
CONFIGのパラメータについてはMPLABをダウンロードしたときについてくるMPASM SUITEフォルダにあるINCファイルを参考にします。
PIC16F883ならばp16f883.incです。
下はそのなかのシステムクロックについての部分です。
前回のプログラムのCONFIG1に_HS_OSCを書くことでクリスタル発振が有効になります。
; The following is an assignment of address values for all of the
; configuration registers for the purpose of table reads
_CONFIG1         EQU  H'2007'
_CONFIG2         EQU  H'2008'

;----- CONFIG1 Options --------------------------------------------------
_FOSC_LP             EQU  H'3FF8'    ; LP oscillator: Low-power crystal on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
_LP_OSC              EQU  H'3FF8'    ; LP oscillator: Low-power crystal on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
_FOSC_XT             EQU  H'3FF9'    ; XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
_XT_OSC              EQU  H'3FF9'    ; XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
_FOSC_HS             EQU  H'3FFA'    ; HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
_HS_OSC              EQU  H'3FFA'    ; HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
_FOSC_EC             EQU  H'3FFB'    ; EC: I/O function on RA6/OSC2/CLKOUT pin, CLKIN on RA7/OSC1/CLKIN
_EC_OSC              EQU  H'3FFB'    ; EC: I/O function on RA6/OSC2/CLKOUT pin, CLKIN on RA7/OSC1/CLKIN
_FOSC_INTRC_NOCLKOUT EQU  H'3FFC'    ; INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
_INTRC_OSC_NOCLKOUT  EQU  H'3FFC'    ; INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
_INTOSCIO            EQU  H'3FFC'    ; INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
_FOSC_INTRC_CLKOUT   EQU  H'3FFD'    ; INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
_INTRC_OSC_CLKOUT    EQU  H'3FFD'    ; INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
_INTOSC              EQU  H'3FFD'    ; INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
_FOSC_EXTRC_NOCLKOUT EQU  H'3FFE'    ; RCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, RC on RA7/OSC1/CLKIN
_EXTRC_OSC_NOCLKOUT  EQU  H'3FFE'    ; RCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, RC on RA7/OSC1/CLKIN
_EXTRCIO             EQU  H'3FFE'    ; RCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, RC on RA7/OSC1/CLKIN
_FOSC_EXTRC_CLKOUT   EQU  H'3FFF'    ; RC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, RC on RA7/OSC1/CLKIN
_EXTRC_OSC_CLKOUT    EQU  H'3FFF'    ; RC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, RC on RA7/OSC1/CLKIN
_EXTRC               EQU  H'3FFF'    ; RC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, RC on RA7/OSC1/CLKIN


そこでさらに気がついたのですが。
上の方でお見せしたOSCCONの説明でbit0=’0’のときにはCONFIG1のFOSC<2:0>の指定が参照されると書いてあります。
その指定は上記p16f883.incの記述を指しています。

CONFIG1についてはPIC16F883のData Sheetには記載されていません。
PIC16F88X Memory Programming Specificationに記載されています。
そういうあたりがMicrochipのなかなかに困ったところです。

[出典]Microchip Technology Inc. PIC16F88X Memory Programming Specification


[出典]Microchip Technology Inc. PIC16F88X Memory Programming Specification

それはともかくとしてもう一度OSCCONの説明です。

[出典]Microchip Technology Inc. PIC16F883 Data Sheet

bit0のSCSはR/W−0となっています。
その下のLegend:を見ると−n=Value at POR(Power On Reset)と書いてあります。
それなら上のプログラムのOSCCONの設定はなくてもよいのでは?
そこでOSCCONのところを外したのが下のプログラムです。
;pic16f883test
;25/04/16 4/18 4/19
;
; internal 4MHz
        #include <p16f883.inc>
        __CONFIG _CONFIG1,_WDT_OFF & _HS_OSC & _MCLRE_ON & _LVP_OFF
        __CONFIG _CONFIG2
;
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
        movlw 60;bk3
        movwf STATUS
        clrf ANSEL
        clrf ANSELH
        bcf STATUS,6;bk1
        clrf TRISB
        clrf TRISC
     bcf STATUS,5 ;bank0
;
loop
        movf cntr1,w
        movwf PORTB
        call t1ms
        incfsz cntr1
        goto loop
        incf cntr2
        movf cntr2,w
        movwf PORTC
        goto loop
;
t1ms
        movlw 0fa;=250
        movwf cntr0
t1ms2
        nop
        decfsz cntr0,f
        goto t1ms2
        return
;
     end
;

このプログラムも正しく動作しました。

今回はシステムクロックの設定をちょっと深堀りしました。
私自身がちょいと勉強になりました。

超ローコストPICWRITERの製作[第264回]
2025.4.19 upload

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