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