またまた、いいのがありました。XC8が使えるようになったので、PIC16F、18Fはなんでも使えるよになりましたね。USARTが2つついた低価格な18F MCUです。
●PIC18F25K22
このデバイスは28pinですが、低価格なのに、タイマやCCP、USARTなど、盛りだくさんです。RAM、ROMも大きいので、I/Oの数が足りれば、これ一つでたいていのことができます。
当初、ある目的のためにArduino MEGAを検討していました。これに使われているAVRはシリアルポートが4つあり、I/Oも多く多機能なのですが、MPU単体でも数千円するのでやめました。それにリソースが多すぎて、明らかに役不足です。UART2つ使いたいためにArduino MEGAを使うのはどう考えてももったいない。
●おもな注目点
- 秋月電子で@170
- EUSART x 2
- CCPが5つ
- 8ビットタイマTIMER2,4,6、16ビットタイマTIMER1,3,5あり
- CCP1~4(PWM)はTIMER2,4,6から任意に組み合わせ可能。
- CCP1~4(キャプチャ、コンペアモード)はTIMER1,3,5から任意に組み合わせ可能。
- 内蔵クロック 16MHz(校正済み) PLL4X使用時はなんと64MHz!
クリック出力可能、その場合は1/4Fosc - プログラムROM 32KB / SRAM 1536B / EEPROM 256B
- MSSP x 2
- ADC 10bit 最大19ch
- アナログコンパレータ 2ch
- FVR 1.024V / 2.048V / 4.096V
- ハードウェアスタック 31レベル
クリスタルつけなくていいので、ICSP関係以外はほとんど何もつながなくても基本動作が可能です。クリスタルの端子はディジタルI/Oに使用できます。
CCPがたくさんついているのもいいです。タイマと自由に組み合わせができます。
たとえば、PWMモードで使う場合は、CCP1とTIMER4、CCP2とTIMER6のようにまた、キャプチャまたはコンペアモードでい使う場合は、CCP3とTIMER1、CCP4とTIMER5のように自由に組み合わせできます。CCP1とCCP2は実際はECCPですが、スタンダードなCCPとしても使用できます。
●XC8での注意
レジスタアクセスする際、ヘッダファイル”xc.h”をインクルードすれば、カレントPICのレジスタが使えるはずですが、どうも、誤って別のPICのを参照しているみたいで、あるはずのレジスタがアクセスできないものがありした。なので、直接”pic18f25k22.h”をインクルードしています。なお、”xc.h”もインクルードしておいたほがいいです。これがないと使えないものがあります。
それから、ポートアクセスに”RA1=1″や”RC2=0″のような表記ができますが、18F25K22ではコンパイルエラーになります。この場合は、ビットフィールドでつぎのように記述します。
PORTAbits.RA2 =1;
16F1823などでは”RA=1″のような表記が可能ですので、デバイスにより、ちぐはぐなところがあります。defineで次のようにすれば、隠ぺいできます。
#define LED1 PORTAbits.RA2
PORT以外にも、PICマニュアルのレジスタの説明にあるビット名でアクセスできないものが時々ありますが、それ以外はビット名でそのままアクセス可能です。たとえば、
TRISA0 = 1; TMR1ON = 1; C4TSEL1 = 0; C4TSEL0 = 0;
みたいな感じです。コンパイルエラーになる場合は、ヘッダファイルを調べて、ビットフィールドでアクセスする必要があります。
●コンフィギュレーションビット設定例
私がここのところ良く使っている設定例です。設定していないコンフィギュレーションワードは、コンパイル時に、デフォルト値を使う旨の警告が出ますが、変更する必要がなければ、無視してかまいません。
//#pragma config CONFIG1H FOSC=INTIO7 // INTRC CLKOUT=Fosc/4 #pragma config CONFIG1H FOSC=INTIO67 // INTRC I/O #pragma config CONFIG1H PLLCFG=OFF #pragma config CONFIG1H PRICLKEN=ON #pragma config CONFIG2L BOREN=ON #pragma config CONFIG2H WDTEN=OFF #pragma config CONFIG3H PBADEN = OFF, MCLRE=EXTMCLR, CCP2MX=PORTC1 #pragma config CONFIG4L LVP=OFF
●内蔵オシレータ 16MHz使用時のプログラム例
64MHzにする場合は、PLLEN=1にします。
// クロックソース INTOSC 16MHz HF SCS1 = 0; // SCS (00) SCS0 = 0; IRCF2 = 1; // 16MHz HF (111) IRCF1 = 1; // IRCF0 = 1; PLLEN = 0; // 16HHz // PLLEN = 1; // 64MHz
高周波数でもクリスタルなしで作れるのはいいですね。もう、16F886とか使う気しないですね。