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(リアルタイムクロック)が実現出来そうですね。
#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関数を使用する場合は、
#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)
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
ピン番号 |
9 |
10 |
7 |
6 |
5 |
4 |
3 |
2 |
デジタル入出力ビット名 |
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と同じなのでこちらを参考にして下さい。
16F1938はCCP4とCCP5が標準CCP機能となっています、CCP4/CCP5からPWM出力する方法は、
16F1827と同じですのでこちらを参考にして下さい、但し16F1827ではCCP3/CCP4が標準CCP機能です。
また、CCP4の出力ピンは21番ピンのRB0で、CCP5の出力ピンは6番ピンのRA4です。
サンプルプログラムは16F1827の「可変抵抗のツマミを回してLEDの明るさを可変します(1/2)」を参考にして下さい。
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 モジュールは 8 ビットのタイマ/カウンタです。
TIMER0のサンプルプログラムはこちらからダウンロードして下さい。
また、概要は12F675での記事ですがこちらを参考にして下さい。
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 モジュールは 8 ビットのタイマ/カウンタです。
CCPモジュールのPWM機能でも利用されます。
TIMER2のサンプルプログラムはこちらからダウンロードして下さい。
また、概要は16F1827での記事ですが、こちらを参考にして下さい。
I2Cについては、12F1822での記事ですが同じ様に利用出来ます、こちらを参考にして下さい。
16F1938のI2Cピンは以下の様に利用します。
SCL:14番ピン(RC3) SDA:15番ピン(RC4)を使用します。
TRISC = 0b00011000 ; // ピン(RC3/4)を入力に割当てる
注意)12F1822とレジスター名が少し異なるので以下の様にプログラムを変更しないとだめです。
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については、12F1822/16F628Aでの記事ですが同じ様に利用出来ます、こちらを参考にして下さい。
16F1938のUSARTピンは以下の様に利用します。
TX:17番ピン(RC6) RX:18番ピン(RC7)を使用します。
TRISC = 0b10000000 ; // ピン(RC7)を入力に割当てる
また、RXDTSEL/TXCKSELのレジスターは有りません。
SPBRGレジスタの設定値とボーレートの関係はデータシートを参照して下さい。
16F1938のデータシートはこちらの229-230ページを見て下さい。
- 電源電圧は1.8〜5.5Vで駆動可能、ピンにつなげられる電流は最大25mA(通常20mA以下)まで
16MHz以下(1.8V-5.5V) 16MHz以上(2.5V-5.5V/3.6V(16LF1827)) 2.5V以上なら2%の
周波数精度(2.5Vから使用した方が良いみたい)
- 初期値のピン割り当てがアナログ入力となっています
デジタル入力として使うときは ANSELA/ANSELB レジスタで指定します。
ANSELA/ANSELBの使い方はこちらを参照して下さい。
- 容量検知(CPS:mTouch)モジュールの機能はこちらの記事を参考にして下さい
- DAC(Digital-to-Analog Converter)モジュールの使い方はこちらを参照して下さい。
MPLAB X用に記事変更(*2) 2015/10/02
記事変更(*1) 2015/06/30
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.