KeitetsuWorks
KeitetsuWorks

16F88 XC8開発例 - LEDを蛍のように点灯させる(CCPモジュールのPWM機能)

はじめに

本ページでは,PIC16F88とMPLAB XC8 C Compilerを使用した開発例として,LEDを蛍のように点灯させる方法を紹介します. LEDの輝度制御には,PIC16F88に搭載されているCCPモジュールのPWM機能を使用しています. 今回はPIC16F88を使用していますが,一部を変更することで,同様のCCPモジュールが搭載されているPIC12FおよびPIC16Fシリーズでも下記のプログラムを使用できると思います.

下記の環境で動作を確認しておりますが,動作を保証するものではありません. 掲載情報は自己責任の上でご利用ください.

PIC 16F88-I/P
MPLAB X IDE MPLAB X IDE v2.15
MPLAB XC8 MPLAB XC8 C Compiler v1.32
PICkit 2 MPLAB X IDEを使用して書込み

回路

回路図

今回はブレッドボード上に回路を組むことにしました. PICkit 2によるICSP (In Circuit Serial Programming)と電源供給を行うことし,回路部品数を必要最低限に抑えています.

回路図
回路部品

上記の回路図中で使用している回路部品のリストです. 参考単価は,特に記載がない限り,秋月電子通商で購入した場合のものです.

番号 部品名 型番 数量 参考単価
U1 PICマイコン Microchip 16F88-I/P 1 200円
LED1 LED 各社 各色 1 10円
R1 炭素皮膜抵抗 各社 1/4W 10kΩ 1 1円
R2 炭素皮膜抵抗 各社 1/4W 330Ω 1 1円
その他 リード線など 適量

プログラム

このプログラムはMPLAB XC8 C Compiler向けです.Cコンパイラの種類にご注意ください.

下記はソースファイル「main.c」です.


#include <xc.h>

#define _XTAL_FREQ 8000000      // 8MHz

#define PR2_DATA 0xFF           // PR2 設定データ
#define T2_DIV_BY_1 0b00000000  // T2CON 設定データ
#define CCP_PWM 0b00001100      // CCP1CON 設定データ

// 16F88
// CONFIG1
#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CCPMX = RB3
#pragma config CP = OFF

// CONFIG2
#pragma config FCMEN = OFF
#pragma config IESO = OFF

// プロトタイプ宣言
void initPWM1(unsigned char pr2, unsigned char t2ckps);
void setPWM1Duty(unsigned int duty);

void main()
{
    int duty;

    OSCCON = 0b01110000;    // 内蔵クロックの周波数を8MHzに設定

    PORTA = 0x00;           // PORTAを初期化
    PORTB = 0x00;           // PORTBを初期化

    TRISA = 0x00;           // PORTAの入出力設定
    TRISB = 0x00;           // PORTBの入出力設定

    ANSEL = 0x00;           // A/D変換を無効化
    ADCON0 = 0x00;
    ADCON1 = 0x00;

    initPWM1(PR2_DATA, T2_DIV_BY_1);    // CCP1をPWMモードに設定

    while(1){
        for (duty = 0; duty <= 1023; duty++) {  // 暗 -> 明
            setPWM1Duty((unsigned int)duty);    // デューティ比を設定
            __delay_ms(4);
        }
        for (duty = 1023; duty >= 0; duty--) {  // 明 -> 暗
            setPWM1Duty((unsigned int)duty);    // デューティ比を設定
            __delay_ms(4);
        }
    }
}

void initPWM1(unsigned char pr2, unsigned char t2ckps)
{
    PR2 = pr2;
    CCP1CON = CCP_PWM;
    setPWM1Duty(0);
    T2CON = t2ckps;
    T2CON |= 0x04;
}

void setPWM1Duty(unsigned int duty)
{
    CCPR1L = duty >> 2;
    CCP1CON &= 0b11001111;
    CCP1CON |= 0b00110000 & (duty << 4);
}

__delay_ms関数にエラーマークが表示されるときは

文法や関数の利用方法に問題がなくコンパイルが成功するにも関わらず, __delay_ms関数や__delay_us関数にエラー(警告)マークが表示される場合,下記の記事をご一読ください.

更新履歴

日付 内容
2014/10/14 コンフィグレーションビットの設定を変更
2014/10/13 公開開始