7セグ君を使ってPIC16F88の内蔵オシレーターのクロック切り替えのデモです。
PIC16F88の内蔵オシレーターを8MHz→ 4MHz→ 2MHz→ 1MHz→ 500kHz→ 250kHz→ 125kHz→ 31.25kHz→ 8MHz→… と切り替えています。
ポイント
内蔵オシレーターを使うためにHI-TECH Cでは__CONFIG
にINTIO
(15, 16ピンをI/Oとして使う)もしくはINTCLK
(15ピンにクロックを出力、16ピンはI/O?未確認)を指定します。
クロック数を指定するのはOSCCON
レジスタの6-4ビットで以下のように指定します。
000: 31.25kHz
001: 125kHz
010: 250kHz
011: 500kHz
100: 1MHz
101: 2MHz
110: 4MHz
111: 8MHz
ソースコード
#include <pic.h> __CONFIG(INTIO & MCLREN & PWRTEN & WDTDIS & BOREN & LVPDIS & UNPROTECT); __CONFIG(CCPRB3 & DEBUGEN); #define SEG7_A_PIN RA7 #define SEG7_B_PIN RA4 #define SEG7_C_PIN RA2 #define SEG7_D_PIN RA1 #define SEG7_E_PIN RB5 #define SEG7_F_PIN RA6 #define SEG7_G_PIN RB4 #define SEG7_DP_PIN RA3 void allOff() { SEG7_A_PIN = 1; // A SEG7_B_PIN = 1; // B SEG7_C_PIN = 1; // C SEG7_D_PIN = 1; // D SEG7_E_PIN = 1; // E SEG7_F_PIN = 1; // F SEG7_G_PIN = 1; // G SEG7_DP_PIN = 1; // DP RB0 = 0; RB1 = 0; RB2 = 0; } void selectLED(unsigned char sel) { switch (sel) { case 0: SEG7_A_PIN = 0; break; case 1: SEG7_B_PIN = 0; break; case 2: SEG7_C_PIN = 0; break; case 3: SEG7_D_PIN = 0; break; case 4: SEG7_E_PIN = 0; break; case 5: SEG7_F_PIN = 0; break; } } void main() { unsigned char sw = 0; unsigned char x = 0; unsigned char osc = 0x07; // 8MHz OSCCON = osc << 4; // クロック設定 TRISA = 0x21; TRISB = 0xC0; ANSEL = 0; while (1) { allOff(); selectLED(sw); RB0 = 1; RB1 = 1; RB2 = 1; sw++; if (sw > 5) { sw = 0; x++; } for (unsigned char z = 0; z < 255; z++) { } if (x == 4) { osc--; OSCCON = osc << 4; // クロック設定 if (osc == 0) { osc = 8; } x = 0; } } }
PIC16F88は内蔵オシレーターで動かせるので、部品数も減るし気楽に動かせて便利ですね。