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は内蔵オシレーターで動かせるので、部品数も減るし気楽に動かせて便利ですね。