PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第199回]
●PIC16F1827(12)4xPLL(2)
納得がいかないこととか辻褄が合わないことがおきるとそれがクリアできるまで気持ちが落ち着きません。
これはあれだ。
きっとDataSheetが間違っているんだ。
うん。
そういうことにしよう。
そうしてしまえば気は晴れるのではと一時は思うのですが。
やっぱり自分の心はそうは簡単にごまかせないのですよねえ。
なんだか小骨が喉にひっかかっているようで実に嫌な気分です。
それでまたプログラムとDataSheetを見比べながら考え始めます。
短い冬の日はじきに暮れてしまいます。
なんとも因果な性分であります。
早朝から深夜まで繰り返し眺めていますと。
突然あの至福の時がやってきます。
わかったぞ!
そういうことだったんだ!
今回もそういうことでした。
ま。
しかし。
自分の至らなさを棚に上げておいて何なのですけれど。
ちょっと言わせてもらえば。
Microchipさまももう少し分かりやすく書いていただけませんでしょうかねえ。
下はPIC16F1827のオシレータ回路の説明です。
[出典]Microchip Technology Inc.PIC16F1827DataSheet
問題解決のカギとなったのはFIGURE5−1のブロック図でした。
今回は簡便な内蔵クロック発振モードを使います。
このモードを選択するとクリスタルを外付けしなくてもそれなりの精度のクロックが簡単に得られます。
内蔵発振モードでは最高16MHzのクロックが得られますが今回はそれをさらに4xPLL回路で4倍にしたいと思います。
上図の通りその場合には内蔵発振クロックは8MHzを選択することになります。
内蔵8MHzを4xPLL回路に通す選択スイッチは図によればFOSC<2:0>=100です。
FOSCはCONFIGで設定します。
下がCONFIG1のビット説明です。
[出典]Microchip Technology Inc.PIC16F1827DataSheet
[出典]Microchip Technology Inc.PIC16F1827DataSheet
FOSC<2:0>はCONFIG1のbit2−0です。
FOSC<2:0>=100は上から4番目にあります。
INTOSCです。
ところで内蔵発振モードの8MHzはどこで設定するのでしょうか?
下はその設定を行なうレジスタ(OSCCON)です。
[出典]Microchip Technology Inc.PIC16F1827DataSheet
そのbit6−3(IRCF<3:0>)で設定するようです。
8MHzは下から2番目にあります。
IRCF<3:0>=1110です。
それともうひとつSystem Clock Select bitsも設定が必要なようです。
ここで判断ミスをしてしまったのが4xPLLが働かなかった原因でした。
そら判断ミスをしてしまいますよお。
1x=Internal oscillator blockを選択しました。
ねえ。
そう思いますでしょう。
下が初めに書いたテストプログラムです。
;;;pic p16f1827 test ;25/1/3 1/4 ; #include<p16f1827.inc> ;cpuclock=32MHz(4xPLL),internal OSC ; __CONFIG _CONFIG1,_FOSC_INTOSC & _WDTE_OFF __CONFIG _CONFIG2,_PLLEN_ON ; w=0 f=1 c=0 z=2 ; cntr0=20 cntr2=21 testcntr=22 testcntr2=23 ; org 0 goto start ; org 5 start banksel ANSELA;BANK3 clrf ANSELA clrf ANSELB ; banksel TRISA;BANK1 clrf TRISA clrf TRISB movlw 0f3 movwf OSCCON ; banksel LATA;BANK2 ; testloop movf testcntr,w movwf LATA testloop2 call t1ms decfsz testcntr2 goto testloop2 decf testcntr goto testloop ; ;1msec timer t1ms movlw 0a;=10 movwf cntr2 t1ms2 call tm100micros decfsz cntr2 goto t1ms2 return ; tm100micros movlw 64;=100 movwf cntr0 tm100micros2;1micros nop nop nop movlw 0ff;1/8 xorwf LATB;1/8 decfsz cntr0;1/8 goto tm100micros2;2/8 return ; end ; |
このプログラムだと4xPLLは利きません。
CPUクロックは8MHzになります。
プログラムの中ほど
movlw 0f3
movwf OSCCON
と書いています。
これでは駄目だったのです。
下がそこを書き直したプログラムです。
;;;pic p16f1827 test ;25/1/3 1/4 1/6 ; #include<p16f1827.inc> ;cpuclock=32MHz(4xPLL),internal OSC ; __CONFIG _CONFIG1,_FOSC_INTOSC & _WDTE_OFF __CONFIG _CONFIG2,_PLLEN_ON ; w=0 f=1 c=0 z=2 ; cntr0=20 cntr2=21 testcntr=22 testcntr2=23 ; org 0 goto start ; org 5 start banksel ANSELA;BANK3 clrf ANSELA clrf ANSELB ; banksel TRISA;BANK1 clrf TRISA clrf TRISB movlw 0f0 movwf OSCCON ; banksel LATA;BANK2 ; testloop movf testcntr,w movwf LATA testloop2 call t1ms decfsz testcntr2 goto testloop2 decf testcntr goto testloop ; ;1msec timer t1ms movlw 0a;=10 movwf cntr2 t1ms2 call tm100micros decfsz cntr2 goto t1ms2 return ; tm100micros movlw 64;=100 movwf cntr0 tm100micros2;1micros nop nop nop movlw 0ff;1/8 xorwf LATB;1/8 decfsz cntr0;1/8 goto tm100micros2;2/8 return ; end ; |
movlw 0f0
movwf OSCCON
に変更しました。
SCS<1:0>=00 Clock determined by FOSC<2:0> in Configuration Word 1
です。
なんとまあわかりにくいこと。
最初の図をよくよく見ますと。
図の右のほうClock ControlのところにFOSC<2:0>とSCS<1:0>があります。
しかし。
それで理解せよって、ちょっと無理があるのじゃありませんか。
それはともかく。
そのようにプログラムを直したところ。
やっと1μsの出力パルスが得られました。
ちょっとなんだかなあという感がありますが。
ともあれ。
やっと。
一件落着です。
やれやれ。
疲れること。
PICBASICコンパイラ[第199回]
2025.1.16 upload
前へ
ホームページトップへ戻る