2025.5.5
前へ

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


超ローコストPICWRITERの製作

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

[第276回]



●PIC16F1938(4)テストプログラム(3)外付水晶発振

前回は内蔵クロック発振回路を使ってみました。
今回は定番の外付水晶発振回路について書きます。
PICの場合水晶発振ができるのは当然のことなので外付けできる最高周波数のクリスタルを接続してテストをしてみます。
データシートを見ると配線パターンだとかコンデンサの容量だとかそれなりに細かいことが書いてありますが今までの経験では適当なクリスタルと適当なコンデンサを適当に配線して取り付けても確実に発振してくれます。
もっとも発振周波数の精度までこだわるということになると話は別になってきます。
しかしそもそも水晶の誤差自体一般に入手できる安価なものではそれなりにばらつきがありますし、温度によっても変化するはずですから余程特別な回路を想定しない限り気楽に構えて使うことができます。
私の場合水晶の周波数に依らず22pFのセラミックコンデンサをつけることが定番です。
昔はもっぱらごく普通のセラミックコンデンサを使っていましたが近年は積層セラミックコンデンサを使うことが多くなりました。
今回のテストに使っている回路については[第263回]に回路図がありますから参照してください。
もとの回路基板では12MHzのクリスタルを実装していますが前回書きましたようにそれを外して別のクリスタルを取り付け可能にするために丸ピンのICソケットを利用したソケットを取り付けています(前回に写真があります)。
水晶発振モードにするためにプログラムの一部を書き換えました。
下は前回のプログラムの一部を書き直して作成したテストプログラム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
        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
;

PICの場合一般に水晶発振モードの指定はCONFIGで行ないます。
何回も書いておりますようにCONFIGの設定は実にクセツヨで新しいPICをさわるたびに悩まされます。
はっきり言ってルールなどないに等しいという印象でもうチャランポランもいいところです。
PIC16F1938の場合CONFIG1に_FOSC_HSを書きます。
システムクロックはCONFIGの設定が優先されますからOSCCONの設定はもとのプログラムのままで構いません。

20MHzのクリスタルを実装して電源を投入しました。



前回と同じようにPORTBのbit0の出力をオシロスコープで観測しました。

あれれ?
何かおかしいです。
PORTBがなんと50μsでカウントアップしています!
???
えっと。
1000回の命令実行時間が50μsですから1回の命令実行時間は50ns!
するとクロックは20MHz…。
計算は合っています。
いやいやいや。
違うでしょう。
PICは1命令をシステムクロックの4クロックで実行します。
すると!
システムクロックは、ぬぁんと80MHz!!!
思わずのけぞってしまいました。
な、なにかよくないことが起きているのでは?

思わずクリスタルを外して、意味もなく(完全にパニクッております)電源を入れてしまいました。

えっ?
クリスタルを外しても動いている?
むむむむむ。
妖怪猫又じゃあ。
く、くびが無いのに歩いたぁ。

このときのオシロスコープの画像です。

PORTBがしっかり1msでカウントアップしています。
PICが妖怪になったあ。
なんじゃこりゃあ。

まま。
少し冷静になってきました。
とりあえず妖怪退治は後にやっつけることとしまして。
ひとつ試してみたいことがありました。
たまたま手元に32MHzのクリスタルがありました。
32MHz?
前回の8MHz→4xPLL→32MHzというやつです。
それは内蔵発振モードで実現した周波数です。
内蔵発振モードではなくて外部に32MHzのクリスタルをつけて使うことはできんのか?
それはできませんと書いてあります。


[出典]Microchip Technology Inc.PIC16F193X DataSheet

32MHzは水晶発振(Oscillator)ではなくてExternal CLKIN(外部入力クロック)です。
外付水晶発振としては最高で20MHzとなっています。
まあそういうことでしょうねえ。
でも。
ものはためしです。
やってみました。

手持ちの32MHzクリスタルを取り付けて電源を入れてみました。
おお。
ちゃんと動いたじゃありませんか。
もっとも先ほどの20MHzよりも少し速くなっただけです。


約40μsほどです。
それでも1命令の実行時間は40nsですからそれから逆算したFoscは、え?10ns?100MHz???
おいおい。
一体全体どうなってるのお?

謎を残したまま、次回に続きます。

超ローコストPICWRITERの製作[第276回]
2025.5.5 upload

前へ

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