16F1938覚書

〔PICの動かせ方入門に戻る〕


忘れないうちにメモします。
ここでの記載はMPLAB X V2.15
MPLAB(R) XC8 C Compiler Version 1.32を使用しての内容です。 *2)
データシートはこちらです。日本語だよ〜ん
16F1933/16F1936についても同じ内容です。
16F1934/16F1937/16F1939についてはピン数(40ピン)が多いだけで内容は参考になるでしょう。

内蔵発振回路
PICの内部に付いているクロック周波数回路は4MHz/8MHz/16MHz/32MHzを利用できる。
また、32MHZにする場合は、内部・外部クロックとも8MHzにして内蔵PLL回路を通す必要がある。

内部クロックを利用する場合
コンフィギュレーションを
#pragma config PLLEN = OFF , FOSC = INTOSC
にして
OSCCONレジスターにて使用する周波数を設定します。
OSCCON = 0b01111010 ;赤い数字部分を変更する事により周波数を変更できます。
緑の数字部分が内部クロックを使用する時の設定です。
赤い数字部分を変更する事により周波数を変更できます。
それ以外の数字部分はそのまま使用する。
1111 16MHz
1110 8MHz
1101 4MHz
1100 2MHz
1011 1MHz
その他 500KHz/250KHz/125KHz 62.5KHz/31.25KHz/31KHz

内部クロック32MHzを利用する場合(4xPLLで動作)
コンフィギュレーションを PLLEN = ON , FOSC = INTOSC にして
OSCCON = 0b01110000 として 8MHz x 4倍 で動作させます。

外部クロック(プライマリ外部オシレータ)を利用する場合
コンフィギュレーションを FOSC = HS にして
OSCCON = 0b00000000 として動作させます。

また、プライマリとは別にセカンダリ外部オシレータとして、 外付けの32.768 kHz 水晶振動子を駆動出来ます、って事はRTC(リアルタイムクロック)が実現出来そうですね。

コンフィギュレーション *2)
#pragma config キーワード1 = 設定値 , キーワード2 = 設定値   の様に記述する。
#pragma config BOREN = ON , BORV = HI , FOSC = INTOSC  // 記述の例

CONFIG1
 FOSC         :オシレータ選択ビット
                    HS = 外部発振器で高い振動子を使用する
                    INTOSC= 内部クロックを使用し、CLKINピン(RA7)はデジタルピンとする
                    ほかにRCオシレータや外部クロック利用等有るが詳しくはデータシート参照。
 WDTE         :ウォッチドッグタイマの有無設定ビット
                    ON = ウォッチドッグタイマを有効にする
                    OFF= ウォッチドッグタイマを無効にする
                    NSLEEP = 動作時に有効、スリープ中に無効にする
                    SWDTEN= WDTCONレジスタのSWDTENビットで制御する
 PWRTE       :パワーアップタイマの有無設定ビット
                    ON = 電源ONから64ms後にプログラムを開始する
                    OFF= パワーアップタイマは無効とする
 MCLRE       :MCLR/VPP ピン機能選択ビット
                    ON = ピンはMCLR(外部リセットピン)として機能する
                    OFF= ピンはデジタル入力ピン(RE3)として機能する
                    LVP=ONの場合はこのビットは無視される。
 CP            :プログラムメモリー保護の有無設定ビット
                    ON = プログラムメモリーの保護を行う
                    OFF= プログラムメモリーの保護はしない
 CPD          :データメモリー保護の有無設定ビット
                    ON = データメモリーの保護を行う
                    OFF= データメモリーの保護はしない
 BOREN       :電源電圧がBORVより下がったらリセットを行うかの設定ビット
                    ON = 電源電圧降下常時監視機能は有効とする
                    OFF= 電源電圧降下常時監視機能は無効とする
                    NSLEEP = 動作時に有効、スリープ中に無効にする
                    SBODEN= BORCONレジスタのSBORENビットで制御する
 CLKOUTEN :クロック出力の有無設定ビット
                    ON = CLKOUTピンは有効とする
                    OFF= CLKOUTピンは無効、RA6ピンとして使用する
 IESO         :内部・外部クロック切り換えビット(2段階起動モード)
                    ON = 内部から外部クロックへの切替えで起動を行う
                    OFF= 内部から外部クロックへの切替えでの起動はしない
 FCMEN       :外部クロックの監視ビット
                    ON = 外部オシレータに障害が発生した場合に内部オシレータに切替えるか監視する
                    OFF= 外部クロックの監視はしない

CONFIG2
 WRT          :16KWのフラッシュメモリ自己書き込み保護ビット
                    OFF= 保護しない
                    BOOT= 000h-1FFhを書込み保護にし、200h-3FFFhをEECON制御によって変更可能
                    HALF= 000h-1FFFhを書込み保護にし、2000h-3FFFhをEECON制御によって変更可能
                    ALL= 000h-3FFFhを書込み保護にし、EECON制御によるアドレス変更を不可にする
 VCAPEN     :低ドロップアウト(LDO)電圧レギュレータの有無設定ビット
                    OFF= 低電圧レギュレータ用のキャパシタは使用しない
                    RA0= RA0ピンで低電圧レギュレータ用のキャパシタを有効にする
                    RA5= RA0ピンで低電圧レギュレータ用のキャパシタを有効にする
                    RA6= RA0ピンで低電圧レギュレータ用のキャパシタを有効にする
                     電源を3.3Vで使用する場合に、IO電源を5.0Vに対応させる為のLDOらしい。
 PLLEN       :4xPLLを動作させるかの有無設定ビット
                    ON = 動作させない
                    OFF= 動作させる(クロックを32MHzで動作させる場合に使用)
 STVREN     :スタックがオーバフローやアンダーフローしたらリセットを行うかの有無設定ビット
                    ON = リセットを行う
                    OFF= リセットを行なわない
 BORV         :電源電圧降下常時監視の電圧設定ビット
                    HI = リセット電圧(VBOR)のトリップポイントを高(2.5V)に設定する
                    LO = リセット電圧(VBOR)のトリップポイントを低(1.9V)に設定する
 LVP          :低電圧プログラミング機能の有無設定ビット
                    ON = 低電圧プログラミングを行う
                    OFF= 低電圧プログラミングは行わない

DEBUGはCONFIGで指定しない、IDEやデバッガから自動的にON/OFFされるらしい。

delay
delay関数を使用する場合は、
#define _XTAL_FREQ 4000000の行を追加するただしこれはクロックが4MHzの場合

__delay_us(50462464) __delay_ms(50462) クロック4MHzならこの値まで設定可能
ただし、( )の中は変数使用不可です、直接数値を入力、うんん...ちょっとぉいまいち!
例えば、50秒以上待たせたいなら、
for (i=0 ; i < 5000 ; i++) __delay_ms(10) ; // 50秒待つ
という感じにします。

クロック 8MHz __delay_us(25231232) __delay_ms(25231)
クロック16MHz __delay_us(12615616) __delay_ms(12615)
クロック32MHz __delay_us(6307808) __delay_ms(6307)
1番ピンの使い方(MCLR) *1)
Vpp
 PICチップにプログラムを書込む時の、書込み電圧を負荷するピンという意味なので、
 動作時には気にしなくて良い。

MCLR
 外部リセット信号を入力する場合のピンとして使用。
 リセット信号はLOW(0V:GND接続)でリセットが掛かります。
 リセットスイッチを付けない場合は、内部でプルアップされているので端子はオープンでも構わない。

RE3
 MCLRをDisable(禁止)にしI/OのRE3の入力端子とした方が良いでしょう。
 #pragma config MCLRE = OFF,LVP = OFF
 を記述すればDisableに出来ます。
 但し、プルアップが無効になるので利用する場合は別途プルアップをONさせる必要が有ります。

アナログピンの使い方
アナログの入力はポートAとポートBに有ります(下記表参照)、
アナログピンの設定はANSELA/ANSELBのレジスターで行います。
 ANSELA = 0b00000000 ;
     アナログ入力を行うピンA(RA0-RA3,RA5)の指定をします。
     赤数字右からAN0(2ピン),AN1(3ピン),AN2(4ピン),AN3(5ピン),AN4(7ピン)の順
     1でアナログ、0でデジタル、この設定はAN0-AN4を全てデジタルI/Oに割当
     緑文字部は容量検知機能でアナログ入力(CPS6:6ピン)する場合に使用します。
 ANSELB = 0b00000000 ;
     アナログ入力を行うピンB(RB0-RB5)の指定をします。
     赤数字右からAN12(21ピン),AN10(22ピン),AN8(23ピン),AN9(24ピン),
     AN11(25ピン),AN13(26ピン)の順
     この設定はAN8-AN13を全てデジタルI/Oに割当

 次にアナログ使用するピンは入力を設定します。
 TRISA = 0b00000000 ;
     この設定はAN0-AN4全て出力に設定するです。
     1で入力、0で出力
     右から順にAN0,AN1,AN2,AN3,AN4、残りはデジタルです。
 TRISB = 0b00000010 ; この設定はAN10のみ入力に設定するです
               右から順にAN12,AN10,AN8,AN9,AN11,AN13、残りはデジタルです。

アナログ変換情報設定
 ADCON0 = 0b00101001 ;
     この設定でAN10から読込めと指示しています。
     他のAN10以外から読込みたい場合は、赤数字の部分を変更します。
     AN0=00000,AN1=00001,AN2=00010,AN3=00011,AN4=00100
     AN8=01000,AN9=01001,AN10=01010,AN11=01011,AN12=01100,AN13=01101
     と変更して下さい。
     赤数字の部分以外の設定はこのまま使用して下さい。
     また、ADCON0の設定には5usほどかかります、delayを入れておきましょう。

 ADCON1 = 0b10010000 ;
     緑数字部分でA/D変換時のリファレンス電圧をどうするかの設定です。
     00:VDDのPIC電圧を使用する 10:2番ピン接続の外部VREFを使用する。
     11:PIC内蔵の固定電圧を使用する。
     赤数字部分でA/D変換を行う速度のクロックを設定します。
     000:FOSC/2 001:FOSC/8  010:FOSC/32
     100:FOSC/4 101:FOSC/16 110:FOSC/64
     また、それ以外の数字部分の設定は今回このまま使用して下さい。

ポートA
ピン番号 10
デジタル入出力ビット名 RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0
アナログ入力ピン名 AN4 AN3 AN2 AN1 AN0

ポートB
ピン番号 28 27 26 25 24 23 22 21
デジタル入出力ビット名 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
アナログ入力ピン名 AN13 AN11 AN9 AN8 AN10 AN12

サンプルプログラムは16F1827と同じなのでこちらを参考にして下さい。

CCP4/5(PWM)機能[標準CCP機能]
16F1938はCCP4とCCP5が標準CCP機能となっています、CCP4/CCP5からPWM出力する方法は、 16F1827と同じですのでこちらを参考にして下さい、但し16F1827ではCCP3/CCP4が標準CCP機能です。
また、CCP4の出力ピンは21番ピンのRB0で、CCP5の出力ピンは6番ピンのRA4です。

サンプルプログラムは16F1827の「可変抵抗のツマミを回してLEDの明るさを可変します(1/2)」を参考にして下さい。

ECCP1/2/3機能[拡張型CCP機能]
16F1938はCCP1とCCP2とCCP3が拡張型CCP機能となっています、CCP1/2/3からPWM出力する方法は、 16F1827と同じですので、この機能についての説明とサンプルプログラムは  「可変抵抗のツマミを回してLEDの明るさを可変します(2/2)」を参照して下さい、
但し16F1827ではCCP1/CCP2が標準CCP機能です。
また、CCP1がフルブリッジ機能で、CCP2/3はハーフブリッジ機能となります。

ポートB
ピン番号 28 27 26 25 24 23 22 21
デジタル入出力ビット名 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
PWM 出力ピン名 CCP3 CCP2
P3A/P2B P1D P2A P1B P1C
ポートC
ピン番号 18 17 16 15 14 13 12 11
デジタル入出力ビット名 RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0
PWM 出力ピン名 CCP3 CCP1 CCP2
P3B P3A P1A P2A P2B

CCP2/P2Aの出力ピン切替え
 CCP2SEL  = 0 ;  0:12番ピン(RC1) 1:24番ピン(RB3)
 PSTR2CON = 0b00000001 ; この設定でCCP2のPWM出力はP2Aのみ出力、P2BはOFF。
                 1:ON 0:OFF  右からそれぞれP2A/P2Bの順です。
 P2Bの切替えは、P2BSELで、0=11番ピン(RC0) 1=26番ピン(RB5)です。

CCP3/P3Aの出力ピン切替え
 CCP3SEL  = 0 ;  0:17番ピン(RC6) 1:26番ピン(RB5)
 PSTR3CON = 0b00000011 ; この設定でCCP3のPWM出力はP3AとP3Bから出力。
                 1:ON 0:OFF  右からそれぞれP3A/P3Bの順です。

CCP1/P1Aの出力ピン切替え
 PSTR1CON = 0b00000001 ; この設定でCCP1のPWM出力はP1Aのみ出力、P1B/C/DはOFF。
                 1:ON 0:OFF  右からそれぞれP1A/P1B/P1C/P1Dの順です。

TIMER0
Timer0 モジュールは 8 ビットのタイマ/カウンタです。

TIMER0のサンプルプログラムはこちらからダウンロードして下さい。
また、概要は12F675での記事ですがこちらを参考にして下さい。

TIMER1
Timer1 モジュールは 16 ビットのタイマ/カウンタで、タイマー動作の他に、 CCPモジュールのキャプチャ/コンペア機能と容量検知オシレータ機能でも使用されます。
また、Timer0からのオーバフロー・外部ピン・コンパレータ出力からの信号によるゲート制御機能が追加されています、 これによりパルスカウントやサイクル時間の測定が可能と思われますが、ここではこの機能には触れません。

TIMER1のサンプルプログラムはこちらからダウンロードして下さい。
また、概要は12F675での記事ですが、こちらを参考にして下さい。
ただ、T1CONの設定とワンカウントの時間計算が少し異なります。

T1CONの設定
 T1CON = 0b00000001 ;
 青数字部分でTimer1のクロックソースを選択します。
  00 = Fosc/4  01 = Fosc  10 = 外部入力  11 = 内蔵の容量検知オシレータ (CAPOSC)
 緑数字部分でプリスケーラの設定を行います。
  00 = 1:1  01 = 1:2  10 = 1:4  11 = 1:8
 赤数字部分 1=TIMER1を動作させる 0=TIMER1を動作させない

ワンカウントの時間計算
システムクロックが4MHzとする場合での計算
・クロックソースが 00 = Fosc/4 でプリスケーラの設定が 11 = 1:8 なら
  ((1/4MHz)x 4)x8 = 8us
・クロックソースが 01 = Fosc でプリスケーラの設定が 11 = 1:8 なら
  (1/4MHz)x 8 = 2us

TIMER2/4/6
Timer2/4/6 モジュールは 8 ビットのタイマ/カウンタです。
CCPモジュールのPWM機能でも利用されます。
TIMER2のサンプルプログラムはこちらからダウンロードして下さい。
また、概要は16F1827での記事ですが、こちらを参考にして下さい。

C(MSSP)
I2Cについては、12F1822での記事ですが同じ様に利用出来ます、こちらを参考にして下さい。

16F1938のI2Cピンは以下の様に利用します。
 SCL:14番ピン(RC3) SDA:15番ピン(RC4)を使用します。
 TRISC = 0b00011000 ; // ピン(RC3/4)を入力に割当てる

注意)12F1822とレジスター名が少し異なるので以下の様にプログラムを変更しないとだめです。
FIG1

SPI(MSSP)
SPIについては、12F1822での記事ですが同じ様に利用出来ます、こちらを参考にして下さい。

16F1938のSPIピンは以下の様に利用します。
 SCK:14番ピン(RC3) SDI:15番ピン(RC4) SDO:16番ピン(RC5)を使用します。
 TRISC = 0b00010000 ; // ピン(RC4)を入力に割当てる(マスター設定時)
 TRISC = 0b00011000 ; // ピン(RC4/3)を入力に割当てる(スレーブ設定時)
 また、SSピンは2番ピン(RA0)と7番ピン(RA5)のどちらかで SSSEL レジスターで選択します。
 SSSEL 0=RA5 1=RA0
 尚、12F1822ではSDOSELレジスターが在りますが16F1938では必要ないです。

注意)12F1822とレジスター名が少し異なるので以下の様にプログラムを変更しないとだめです。
12F1822 SSP1STAT SSP1CON1 SSP1BUF SSP1IE SSP1IF
16F1938 SSPSTAT SSPCON1 SSPBUF SSPIE SSPIF


USART(EUSART)(非同期モード)
USARTについては、12F1822/16F628Aでの記事ですが同じ様に利用出来ます、こちらを参考にして下さい。

16F1938のUSARTピンは以下の様に利用します。
 TX:17番ピン(RC6) RX:18番ピン(RC7)を使用します。
 TRISC = 0b10000000 ; // ピン(RC7)を入力に割当てる
 また、RXDTSEL/TXCKSELのレジスターは有りません。

SPBRGレジスタの設定値とボーレートの関係はデータシートを参照して下さい。
16F1938のデータシートはこちらの229-230ページを見て下さい。

その他



MPLAB X用に記事変更(*2) 2015/10/02
記事変更(*1) 2015/06/30


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.