18F25K22覚書
〔PICの動かせ方入門に戻る〕
忘れないうちにメモします。
ここでの記載はMPLAB X V2.15と
MPLAB(R) XC8 C Compiler Version 1.32を使用しての内容です。
データシートはこちらです。英語だけどね
PIC18F23K22/PIC18F24K22/PIC18F25K22/PIC18F26K22 ともに同じ内容です。
PICの内部に付いているクロック周波数回路は1/2/4/8/16MHz、32/64MHzを利用できる。
また、内部クロックで64(32)MHZにする場合は、16(8)MHzにして内蔵PLL回路を通す必要がある。
外部クロックは64MHzまでOKの様で、4xPLL使用する場合は4-16MHzのみOKです。
内部クロックを利用する場合
コンフィギュレーションを PLLCFG = OFF , FOSC = INTIO67 にして
OSCCONレジスターにて使用する周波数を設定します。
OSCCON = 0b01110010 ;
緑の数字部分が内部クロックを使用する時の設定です。
赤い数字部分を変更する事により周波数を変更できます。
それ以外の数字部分はそのまま使用する。
111 |
16MHz |
110 |
8MHz |
101 |
4MHz |
100 |
2MHz |
011 |
1MHz |
その他 |
500KHz/250KHz/31KHz |
内部クロック32MHzを利用する場合(4xPLLで動作)
コンフィギュレーションを PLLCFG = OFF , FOSC = INTIO67 にして
OSCTUNEレジスターのPLLEN = 1 とする。 *1)
OSCCON = 0b01100000 とし 8MHz x 4倍 で動作させます。
外部クロック(プライマリ外部オシレータ)を利用する場合
コンフィギュレーションを FOSC = HSMP(4-16MHz) か HSHP(16MHz以上) にして
OSCCON = 0b00000000 として動作させます。
(コンフィギュレーションのPRICLKEN=ONでOSCCON2レジスタのPRISD=1となっていないとだめですよ)
(尚、PLLCFG = ON とした場合は4xPLLが動作します) *1)
また、プライマリとは別にセカンダリ外部オシレータとして、
外付けの32.768 kHz 水晶振動子を駆動出来ます、って事はRTC(リアルタイムクロック)が実現出来そうですね。
#pragma config キーワード1 = 設定値 , キーワード2 = 設定値 の様に記述する。
#pragma config BOREN = NOSLP , BORV = 30 , PWRTEN = ON // 記述の例
オレンジ色の文字(設定値)がデフォルト値です。
CONFIG1H
IESO :内部オシレータで起動しその後外部オシレータで起動する2段階起動モードの使用許可
ON = 有効にする OFF = 無効にする
FCMEN :外部オシレータに障害が発生した場合に内部オシレータに切り替えるかモニターする
ON = 有効にする OFF = 無効にする
PRICLKEN:外部プライマリオシレータの有効無効を切替える場合に使用
ON = 有効にする OFF = 無効にする
内部クロック時はこれをOFFで、OSCCON2(PRISD=0)にした方が消費電力がへるらしい。
PLLCFG :外部プライマリオシレータの周波数を4倍で使用するしないの設定
ON = 使用する OFF = 使用しない(ソフト:PLLENで制御可能)
FOSC :オシレータ選択ビット
INTIO67 = 内部でCLKOUT使用しない INTIO7 = 内部でCLKOUT出力有り
HSMP = 外部で高い振動子(4-16MHz)を使用する
HSHP = 外部で高い振動子(16MHz以上)を使用する
ほかにRCオシレータや外部クロック利用等有るが詳しくはデータシート参照
CONFIG2L
BOREN :電源電圧が下がったらリセットを行うかの設定
OFF = 無効 ON = 有効(ソフトでも制御可能) SBORDIS = 有効(ソフトで制御不可)
NOSLP = 有効だがスリープ時は無効になる(ソフトで制御不可)
BORV :どの電圧まで電源が下がったらリセットするのぉ
190(1.90V)、220(2.20V)、250(2.50V)、285(2.85V)
PWRTEN:パワーアップ タイマ有効無効(電源ONから後65.5msにプログラムを開始する)
ON(0) = 有効にする OFF(1) = 無効にする
CONFIG2H
WDTEN:ウォッチドッグタイマ使用許可
ON = 有効 OFF = 無効(ソフトで制御不可)
SWON = WDTCONレジスタで制御する(レジスタは無効がデフォルト)
NOSLP = 有効だがスリープ時は無効になる(ソフトで制御不可)
WDTPS:ウォッチドッグタイマ有効時のタイマ値を設定する(設定値はデータシート参照)
CONFIG3H
MCLRE :MCLR ピンの有効無効を設定
EXTMCLR = 有効にする INTMCLR = 無効にする(RE3入力ピンを有効にする)
HFOFST:内部オシレータの高速起動有無を設定
ON = オシレータが安定するのを待たずにCPUへのクロック供給を開始する
OFF = オシレータが安定してからシステムクロックを供給する
P2BMX :ECCP2で利用するP2Bピンの割り当てを設定
PORTC0 = RC0ピンに割り当てる PORTB5 = RB5ピンに割り当てる
CCP2MX:ECCP2で利用するCCP2(P2A)ピンの割り当てを設定
PORTC1 = RC1ピンに割り当てる PORTB3 = RB3ピンに割り当てる
CCP3MX:ECCP3で利用するCCP3(P3A)ピンの割り当てを設定
PORTC6 = RC6ピンに割り当てる PORTB5 = RB5ピンに割り当てる
PBADEN:ANSELB(AN8-13)の初期レジスタ値を設定する
ON = 1でセットして、アナログとして構成する
OFF = 0でセットして、デジタルI/Oとして構成する
T3CMX :タイマー3のクロックを外部から入力する場合のピンを割り当てる
PORTC0 = RC0ピンに割り当てる PORTB5 = RB5ピンに割り当てる
CONFIG4L
DEBUG :バックグラウンド デバッガの有効無効を設定(ICD デバイスでのみ使用)
ON = 無効 OFF = 有効(RB6/RB7をデバッガに接続する)
LVP :低電圧ICSPプログラミングを使用するかの設定
ON = 使用する OFF = 使用しない
STVREN:スタックのアンダー・フルのオーバが発生した時にリセットを行うかの設定
ON = リセットする OFF = リセットしない
XINST :拡張命令セットのモードを設定
OFF = 拡張命令の無効、インデックスアドレッシングモード禁止(レガシーモード)
ON = 有効
CONFIG5L/CONFIG5H/CONFIG6L/CONFIG6H/CONFIG7L
メモリエリアの読み書き保護を設定するビット群だがデフォルトは全て保護しないとなっている
その他の詳しい内容は [ C:\Program Files\Microchip\xc8\v1.00\docs\pic18_chipinfo.html ] のファイルを参照。
delay関数を使用する場合は、
#define _XTAL_FREQ 4000000の行を追加するただしこれはクロックが4MHzの場合
__delay_us(197120) __delay_ms(197) クロック4MHzならこの値まで設定可能
ただし、( )の中は変数使用不可です、直接数値を入力、うんん...ちょっとぉいまいち!
197ms以上待たせたいなら、
for (i=0 ; i < 100 ; i++) __delay_ms(10) ; // 1秒待つ
という感じにします。
クロック 8MHz __delay_us(98560) __delay_ms(98)
クロック16MHz __delay_us(49280) __delay_ms(49)
クロック32MHz __delay_us(24640) __delay_ms(24)
クロック64MHz __delay_us(12320) __delay_ms(12)
Vpp
PICチップにプログラムを書込む時の、書込み電圧を負荷するピンという意味なので、
動作時には気にしなくて良い。
MCLR
外部リセット信号を入力する場合のピンとして使用。
リセット信号はLOW(0V:GND接続)でリセットが掛かります。
リセットスイッチを付けない場合は、内部でプルアップされているので端子はオープンでも構わない。
RE3
MCLRをDisable(禁止)にしI/OのRE3の入力端子とした方が良いでしょう。
__CONFIG(MCLRE_OFF)、__CONFIG(LVP_OFF) を記述すればDisableに出来ます。
但し、プルアップが無効になるので利用する場合は別途プルアップをONさせる必要が有ります。
CCP機能は、キャプチャ/コンペア/PWMを行うモジュールです。
キャプチャモードでは、外部イベントの発生時間を計測する事が出来ます。
コンペアモードでは、予め設定した時間が経過した時点で外部イベントをトリガする事が出来ます。
PWMモードでは、各種周波数とデューティサイクルのパルス幅変調信号を生成出来ます。
CCP機能は、CCP1/CCP2/CCP3/CCP4/CCP5で利用出来ます。
PWMモード
PWM機能に付いては下記の方に記載しています。
キャプチャモード
キャプチャモードの周波数発生源はTimer1/3/5です。
キャプチャ機能の話は、PIC16F1829での記事ですがこちらを参考にして下さい。
PIC16F1829と18F25K22のCCPピン割当てが異なります、18F25K22ではCCP4ピンは"RB0"となります。
コンペアモード
コンペアモードの周波数発生源はTimer1/3/5です。
コンペア機能の話は、PIC16F18313での記事ですがこちらを参考にして下さい。
18F25K22には、CCPxCONレジスタのCCPxMビットに”比較一致時に出力をトグルし、
タイマ−カウンターもクリアする”モードが有りません、自分で割り込み処理内でクリアさせる必要が
有ります。
16F18313では”PPSでRA4ピンをCCP1出力に割当てる”ですが、18F25K22のCCP1ピンは”RC2”となります。
PIC18F25K22はCCP4とCCP5の2個からPWMを出力できます。
CCP4とCCP5にはそれぞれTimer2/4/6の何れかを使用する様にします。
次の順番で使用します。
(CCP4を利用しTimer2を使用する例での記載です)
@ CCP4でどのタイマーを使用するのかを設定します。
CCPTMRS1 = 0b00000000 ;
赤数字部分がCCP5用設定で緑数字部分がCCP4用設定の場所です。
Timer2=00 , Timer4=01 , Timer6=10 この設定でCCP4はTimer2を使用です。
A PWM機能(PWMモード)を使用する事の宣言を行います。
CCP4CON = 0b00001100 ;
B TMR2プリスケーラ値の設定を行います。
T2CON = 0b00000010 ; この設定は16倍に設定
赤い数字部分にて設定します、1倍=00 4倍=01 16倍=10
C PWMの周期を設定します。
PR2 = 124 ; この設定はPWM周波数1000Hz(1KHz)で設定
D カウンターなどのレジスターを初期化します
CCPR4L = 0 ; // デューティ値は0で初期化
CCPR4H = 0 ;
TMR2 = 0 ; // タイマー2カウンターを初期化
E TMR2(PWM機能)のスタート要求を行います。
TMR2ON = 1 ;
F あとはデューティ値を(CCPR4L/CCP4CON)に設定します。
(PR2が255設定でないので、デューティ値解像度は10ビットの内8ビットのみ使用される)
※PR2の値を計算する(PWM周波数=1KHz)
PR2 = ( クロック周波数 / (PWM周波数 × 4 × TMR2プリスケール値) ) - 1
・PICのクロック周波数が8MHzとします。
PR2 = ( 8,000,000 / (PWM周波数 × 4 × TMR2プリスケール値) ) - 1
・PWM周波数を1000Hz(1KHz)にしたい場合です。
PR2 = ( 8,000,000 / (1000 × 4 × TMR2プリスケール値) ) - 1
・TMR2プリスケール値を1倍・4倍・16倍で計算します。
PR2 = 1999 = ( 8,000,000 / (1000 × 4 × 1) ) - 1
PR2 = 499 = ( 8,000,000 / (1000 × 4 × 4) ) - 1
PR2 = 124 = ( 8,000,000 / (1000 × 4 × 16) ) - 1
結果PR2の最大値は255までですので、16倍での124を選択します。
TMR2プリスケール値を16倍にしてPR2を124に設定します。
※デューティ値の設定方法
図のCCPR1L/CCP1CONはCCPR4L/CCP4CONと読み替えて下さい。
デューティ値は10ビット(0-1023)で
指定します。
CCPR4Lレジスターは8ビットなので、
CCPR4Lを上位8ビットとして、
下位2ビットをCCP4CONレジスター
の4-5ビット目を使用しセットします。
この様にセットするのは面倒なので、CCP4CONレジスターの4-5ビット目は0でセットして置き、
設定したいデューティ値を4で割り、その値をCCPR4Lレジスターにセットします。
※PWM周波数(1KHz)とデューティ値のPWM波形概要
但し、デューティ値10ビット(0-1023)はPR2が255の場合で、それ以外は10ビット以下になります。
(PWM制御についてのもう少し詳しい話はこちらのページを参考にして下さい。)
CCP4/CCP5のサンプルプログラムは「可変抵抗のツマミを回してLEDの明るさを可変します(1/2)」を参照して下さい。
PWMモード・シングルPWM機能
この機能についての説明とサンプルプログラムは
「可変抵抗のツマミを回してLEDの明るさを可変します(2/2)」を参照して下さい。
PWMモード・ハーフブリッジPWM機能
ECCP2/3を使用する。
PWMモード・フルブリッジPWM機能
ECCP1を使用する。
TIMER0機能は設定した時間毎に割込み処理を行うものです。
また、外部ピン入力からの信号でカウントする機能があります。
PIC12F/16Fシリーズでは8ビットタイマーでしたが、このタイマは8/16 ビットの切り替えが出来る
タイマです。(ここの記述は8ビットです)(16ビットは下記のTIMER1/3/5を参照)
外部クロックと内部クロック(Fosc/4)が選択できます。
起動時設定は外部クロック(6番ピン)からの8ビットカウンタモードになっています。
割込みとは?
たとえば、Aさんと電話していて、Bさんから割込みキャッチホンがはいれば、
Bさんと話して終わったらAさんと続きを話しますよね、これと同じ事です。
プログラムのmain()を処理中にTIMER0割込みがはいれば、main()を一時中断後
interrupt InterTimer()を処理して再びmain()の続きを再開します。
(InterTimerの関数名は変更できます)
割込み発生タイミング
TIMER0はTMR0L(8ビット)のレジスターをカウントアップして行きます、
256になった時点(オーバーフロー)で割込みを発生させます。
例えば、TMR0L=100と設定した場合は100から256までカウントアップして行きます、
256-100で156カウントした所でオーバーフローし割込み発生です。
(割込み発生したらTMR0Lはゼロになっています、TMR0L=100したいなら割込み処理の中で再設定)
ワンカウントの時間は?
PICのクロック周波数とプリスケーラ設定値できまります。
・ 例えばクロック周波数4MHzでプリスケーラ設定値が128なら
((1/システムクロック周波数) x 4) x プリスケーラ設定値
((1 / 4MHz) x 4) x 128 = 128μs → これがワンカウントの時間です。
これを256回カウントアップさせると 128x256=32768us(32.768ms)が、プリスケーラ値128での
最大割込み時間です。
・プリスケーラ設定方法は下記参照。
TIMER0の使い方は次の順番で行います
@ T0CONレジスターの設定を行う
T0CON = 0b11000110 ;
水色数字部分 1 = TIMER0を動作させる 0 = TIMER0を動作させない
赤色数字部分が8/16 ビット切替え、1 = 8ビット 0 = 16ビット
緑色数字部分 0=システムクロック周波数(Fosc/4)でカウントする 1=6番ピン入力でカウントする
青色数字部分でプリスケール値の設定を行う
000 |
001 |
010 |
011 |
100 |
101 |
110 |
111 |
1:2 |
1:4 |
1:8 |
1:16 |
1:32 |
1:64 |
1:128 |
1:256 |
A TMR0カウントアップレジスターの初期化を行う
カウントアップを256までカウントさせたいならTMR0 = 0です。
100カウントだけさせたいなら256 - 100 = 156だからTMR0 = 156です。
(ただし、TMR0=156の場合は割込み処理の中で再び初期化する必要があります)
B T0IFの割込みフラグを初期化します
T0IF = 0 ;
C 割込み機能を許可します
T0IE = 1 ; // TIMER0の割込みを許可する
GIE = 1 ; // 全体の割込み処理を許可する
割込み関数の書き方
void interrupt 割込み関数名( void )
{
if (T0IF == 1) { // タイマー0の割込み発生か?
TMR0 = 156 ; // タイマー0の再ど初期化(256までカウントアップさせるならこの行は必要ない)
T0IF = 0 ; // タイマー0割込フラグをリセット(再カウントアップ開始)
}
}
TIMER0のサンプルプログラムはこちらからダウンロードして下さい。
1秒がしりたい場合は?
はっきり言って1秒ピッタリは無理ですが、出来るだけ1秒に近づける場合算出方法
((1秒 / TIME0)/(プリスケーラ設定値 x(4 x 1000000 /クロック周波数)))
・クロック4MHzで1秒なら
((1000000/ TIME0)/(プリスケーラ設定値 x(4 x 1000000 /4000000)))
・TIME0=256カウントアップ プリスケーラ設定値=1:256
((1000000/256)/(256*(4*1000000/4000000))) = 15.25879 割込み回数を15回数えれば約1秒
・TIME0=195カウントアップ プリスケーラ設定値=1:128
((1000000/195)/(128*(4*1000000/4000000))) = 40.06410 割込み回数を40回数えれば約1秒
上の場合が15.25879で下の場合が40.06410ですが、誤差は上が.25879で下が.06410ですね。
この場合は下を採用した方がよさそうですね。
プリスケーラ値は1:128でTMR0は256-195=61をセットして、割込み回数を40回数えれば約1秒です。
って事で、TIME0とプリスケーラ設定値を適度に入れてみて計算して下さい。
Timer1/3/5 モジュールは 16 ビットのタイマ/カウンタで、タイマー動作の他に、CCPモジュールの
キャプチャ/コンペア機能でも使用されます。
また、Timer0からのオーバフロー・外部ピン・コンパレータ出力からの信号によるゲート制御機能が追加されています、
これによりパルスカウントやサイクル時間の測定が可能と思われますが、ここではこの機能には触れません。
割込み発生タイミング
TIMER1/3/5はTMR1/3/5(16ビット)のレジスターをカウントアップして行きます、
65536になった時点(オーバーフロー)で割込みを発生させます。
だからで割込み発生時点でTMR1/3/5は0(オーバーフロー)になっています。
ワンカウントの時間は?
PICのクロック周波数とプリスケーラ設定値できまります。
・タイマークロックソースがFOSC/4の場合
例えばクロック周波数4MHzでプリスケーラ設定値が8なら
((1/システムクロック周波数) x 4) x プリスケーラ設定値
((1 / 4MHz) x 4) x 8 = 8μs → これがワンカウントの時間です。
これを65536回カウントアップさせると 8x65536=524288us(524.288ms)が、プリスケーラ値8での
最大割込み時間です。 なら、
8x62500=500000us(500ms)にして、割込み回数を2回数えれば1000msだから、
プリスケーラ値1:8でTMR1:65536-62500=3036をセットして、割込み回数を2回数えたら1秒が出来ます
・タイマークロックソースがFOSCの場合
(1/システムクロック周波数) x プリスケーラ設定値
・プリスケーラ設定方法は下記を参照
TIMER1/3/5の使い方は次の順番で行います(TIMER1で記述)
@ T1CONレジスターの設定を行う
T1CON = 0b00000011 ;
青色数字部分でTimer1のクロックソースを選択します。
00 = Fosc/4 01 = Fosc 10 = 外部端子(TxCKI又はSOSCI/SOSCO)から入力
緑色数字部分でプリスケーラの設定を行います。
00 = 1:1 01 = 1:2 10 = 1:4 11 = 1:8
赤色数字部分 1 = TMR1レジスタを16bitで読書きする 0 = TMR1レジスタを8bitで読書きする
水色数字部分 1 = TIMER1を動作させる 0 = TIMER1を動作させない
A TMR1カウントアップレジスターの初期化を行う
カウントアップを65536までカウントさせたいならTMR1 = 0です。
62500カウントだけさせたいなら65536-62500=3036だからTMR1 = 3036です。
(ただし、TMR1=3036の場合は割込み処理の中で再び初期化する必要があります)
・TMR1のセット方法
TMR1Hに上位の8ビットをセットして、TMR1Lに下位の8ビットをセットします。
で、16ビットカウンターとなります。
TMR1H = (3036 >> 8) ;
TMR1L = (3036 & 0x00ff) ;
こんな感じでセットします。
・16ビットモードでレジスタを読み書きする場合は
TMR0L/TMR0Hへ書込む場合はTMR0HをセットしてからTMR0Lをセットする。
読込み時はTMR0Lを読込んでからTMR0Hを読み込む必要がある。
B TMR1IFの割込みフラグを初期化します
TMR1IF = 0 ;
C 割込み機能を許可します
TMR1IE = 1 ; // TIMER0の割込みを許可する
PEIE = 1 ; // 周辺装置割り込み有効
GIE = 1 ; // 全体の割込み処理を許可する
割込み関数の書き方
void interrupt 割込み関数名( void )
{
if (TMR1IF == 1) { // タイマー1の割込み発生か?
TMR1H = ???? ; // タイマー1(TMR1)の再ど初期化
TMR1L = ???? ; // (65536までカウントアップさせるならこの2行は必要ない)
TMR1IF = 0 ; // タイマー1割込フラグをリセット(再カウントアップ開始)
}
}
TIMER1/3/5のサンプルプログラムはこちらからダウンロードして下さい。
Timer2/4/6 モジュールは 8 ビットのタイマ/カウンタで、タイマー動作の他に、CCPモジュールの、PWMモード時の動作のタイム ベースとして使用されます。
タイマー動作機能は設定した時間毎に割込み処理を行うものです。
割込み発生タイミング
TIMER2/4/6 はTMR2/4/6(8ビット)のレジスターを0からカウントアップして行きます、
PR2/4/6 の周期レジスター値と比較して一致したら、次のカウントでTMR2/4/6 のレジスター値は
0に戻り、ポストスケーラを駆動させます。
ポストスケーラは指定した回数(1〜16)だけカウントしたら割込みを発生させます。
例えば、ポストスケーラの設定値が1:1であれば、レジスター値を比較して一致したその都度割込み
が発生し、1:10 なら、レジスター値を比較して一致した回数が10 回したら割込みを発生させます。
ワンカウントの時間は?
PICのクロック周波数とプリスケーラ設定値できまります。
・ 例えばクロック周波数16MHzでプリスケーラ設定値が 16 なら
((1/システムクロック周波数) x 4) x プリスケーラ設定値
((1 / 16MHz) x 4) x 16 = 4μs → これがワンカウントの時間です。
これを256回カウントアップさせると 4x256=1024us(1.024ms)が、プリスケーラ値16 での
最大割込み時間ですが、ポストスケーラが1:16倍なら16x1024us=16384usで割込みが発生する。
なら1秒は1000000/16384us=61.025回割り込みを数えればよさそう。
・ 1秒ピッタリは?
クロック周波数16MHz プリスケーラ 1:16 ポストスケーラ 1:10 カウントアップは250回
にして割込みを100回数える、PR2の周期レジスター設定値は250-1=249をセットする。
・プリスケーラ設定方法は下記参照。
TIMER2/4/6の使い方は次の順番で行います(TIMER2での例です)
@ タイマー制御レジスターの設定を行う
T2CON = 0b00000111 ;
青色数字部分でプリスケーラの設定を行います。
00 = 1:1 01 = 1:4 10/11 = 1:16
緑色数字部分 1 = TIMER2を動作させる 0 = TIMER2を動作させない
赤色数字部分でポストスケーラの設定を行います。
1:1 |
1:2 |
1:3 |
1:4 |
1:5 |
1:6 |
1:7 |
1:8 |
1:9 |
1:10 |
1:11 |
1:12 |
1:13 |
1:14 |
1:15 |
1:16 |
0000 |
0001 |
0010 |
0011 |
0100 |
0101 |
0110 |
0111 |
1000 |
1001 |
1010 |
1011 |
1100 |
1101 |
1110 |
1111 |
A 周期レジスター(PR2)の設定を行う
TMR2を何カウントアップさせるかの設定です、
PR2=249 とした場合は、TMR2は0から249までカウントアップし250カウントめで割込み発生です。
B TMR2カウントアップレジスターの初期化を行う
TMR2 = 0 ;
C TMR2IFのタイマー2割込みフラグを初期化します
TMR2IF = 0 ;
D 割込み機能を許可します
TMR2IE = 1 ; // TIMER2の割込みを許可する
PEIE = 1 ; // 周辺装置割り込み有効
GIE = 1 ; // 全体の割込み処理を許可する
割込み関数の書き方
void interrupt 割込み関数名( void )
{
if (TMR2IF == 1) { // タイマー0の割込み発生か?
TMR2IF = 0 ; // タイマー0割込フラグをリセット(再カウントアップ開始)
}
}
TIMER2/4/6のサンプルプログラムはこちらからダウンロードして下さい。
SPIについては、12F1822での記事ですがレジスタの使い方等は同じ様に利用出来ます、こちらを参考
にして下さい。(又は、16F1938用ですがこちらの日本語データシートが参考になります)
18F25K22(18F2xK22)にはSPIが2個有ります、SPIピンは以下の様に利用します。
SCK1:14番ピン(RC3) SDI1:15番ピン(RC4) SDO1:16番ピン(RC5)を使用します。(SPI1)
SCK2:22番ピン(RB1) SDI2:23番ピン(RB2) SDO2:24番ピン(RB3)を使用します。(SPI2)
スレーブ時は SS1:7番ピン(RA5) SS2:21番ピン(RB0)を使用します。
SDI1/2とSS1/SS2にはデジタル入力とします。
注意)SSP1とSSP2はレジスター名が少し異なるので以下の様にプログラムを変更します。
SPI1 |
SSP1STAT |
SSP1CON1 |
SSP1BUF |
SSP1IE |
SSP1IF |
SPI2 |
SSP2STAT |
SSP2CON1 |
SSP2BUF |
SSP2IE |
SSP2IF |
I2Cについては、12F1822での記事ですがレジスタの使い方等は同じ様に利用出来ます、こちらを参考
にして下さい。(又は、16F1938用ですがこちらの日本語データシートが参考になります)
18F25K22(18F2xK22)にはI2Cが2個有ります、I2Cピンは以下の様に利用します。
SCL1:14番ピン(RC3) SDA1:15番ピン(RC4)を使用します。(I2C1)
SCL2:22番ピン(RB1) SDA2:23番ピン(RB2)を使用します。(I2C2)
SCL/SDAはデジタル入力とします。
注意)I2C1とI2C2はレジスター名が少し異なるので以下の様にプログラムを変更します。
I2C1 |
SSP1STAT |
SSP1CON1 |
SSP1CON2 |
SSP1ADD |
SSP1MSK |
SSP1BUF |
SSP1IE |
SSP1IF |
BCL1IE |
BCL1IF |
I2C2 |
SSP2STAT |
SSP2CON1 |
SSP2CON2 |
SSP2ADD |
SSP2MSK |
SSP2BUF |
SSP2IE |
SSP2IF |
BCL2IE |
BCL2IF |
USARTについては、12F1822/16F628Aでの記事ですがレジスタの使い方等は同じ様に利用出来ます、
こちらを参考にして下さい。(又は、18F14K50用ですがこちらの日本語データシートが参考になります)
18F25K22(18F2xK22)にはUSARTが2個有ります、USARTピンは以下の様に利用します。
TX1[送信]:17番ピン(RC6) RX1[受信]:18番ピン(RC7)を使用します。(USART1)
TX2[送信]:27番ピン(RB6) RX2[受信]:28番ピン(RB7)を使用します。(USART2)
RX1とRX2にはデジタル入力とします。
注意)USART1とUSART2はレジスター名が少し異なるので以下の様にプログラムを変更します。
USART1 |
TXSTA1 |
RCSTA1 |
SPBRG1 |
USART2 |
TXSTA2 |
RCSTA2 |
SPBRG2 |
SPBRGレジスタの設定値とボーレートの関係はデータシートを参照して下さい。
18F14K50のデータシートはこちらの281-283ページを見て下さい。
SYNC=0、BRGH=1、BRG16=0で16MHzのクロック周波数で速度が9600ボーレートならSPBRG=103です。
- 電源電圧は2.3〜5.5Vで駆動可能、ピンにつなげられる電流は最大25mA(通常20mA以下)まで
20MHz以下(2.3-5.5V) 20MHz以上(2.7-5.5V/3.6V(18LF2xK22)) 2.5V以上なら2%の
周波数精度(3.0Vから使用した方が良いみたい)
- 初期値のピン割り当てがアナログ入力となっています
デジタル入力として使うときは ANSELA/ANSELB/ANSELC レジスタで指定します。
ANSELA/ANSELB/ANSELCの使い方はこちらを参照して下さい。
- 充電時間計測ユニット(CTMU)の機能でタッチセンサーはこちらの記事を参考にして下さい
- DAC(Digital-to-Analog Converter)モジュールの使い方はこちらを参照して下さい。
CCP機能で一部追記(*3) 2018/04/13
記事変更(*2) 2015/06/30
一部変更(*1) 2015/02/14
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.