閲覧総計:17858  (本日:3  昨日:1)

PICをボタン電池で駆動させる場合、PICが動作していない時の電力を最小におさえる事は
有用である。
今回、PICをスリープ状態にする手法とスリープ状態から復帰させる手法をXC8で確認
したので記録に残しておく。 2013/10/06

【ポイント】
・PICをスリープ状態にする
while(1) {
  SLEEP(); //PICをスリープ状態にする
  NOP(); //sleepから復帰後、必ず1命令実行されるダミー命令
}

・PICをスリープ状態から復帰させる
RB0/INT割り込みで復帰させる。

TS3V0003.JPG16F628Aピンデザイン画像.jpg


XC8のプログラム

/* 
 * File:   sleep_main.c
 * Author: 管理人
 *
 * Created on 2013/10/06, 12:06
 */

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

#pragma config BOREN = OFF, CPD = OFF, FOSC = INTOSCIO, MCLRE = OFF, WDTE = OFF, CP = OFF,  LVP = OFF, PWRTE = ON

/*PICをスリープにする手法と復帰させる手法の確認
 * RB0/INT割込みによりPICをスリープ状態から復帰させる手法
 * 16F628A    XC8 v1.20
 * RA1:LED, RB0:スイッチ
 */
int main(int argc, char** argv) {
    PORTA = 0b00000000; //PORTAの中身をきれいにする
    PORTB = 0b00000000; //PORTBの中身をきれいにする
    TRISA = 0b00110000; //PORTAのRA5,RA4は1:入力に、他は0:出力に設定
    TRISB = 0b00011001; //PORTBのRB4,RB3,RB0は1:入力に、他は0:出力に設定
    CMCON = 0b00000111; //PORTAのコンパレータ機能は使用しない
    OPTION_REGbits.nRBPU = 0; //0:PORTBの内部ウィークプルアップを使用
    OPTION_REGbits.INTEDG = 0; //0:RB0/INT立下りエッジで割り込み

    INTCONbits.INTF = 0; //RB0/INT割込みフラグクリア
    INTCONbits.INTE = 1; //RB0/INT割り込み許可
    INTCONbits.GIE = 1; //全体割込み許可

    while(1) {
        //RB0/INT割込みによりPICをスリープ状態から復帰させる手法
        SLEEP(); //PICをスリープ状態にする
        NOP(); //sleepから復帰後、必ず1命令実行されるダミー命令
    }
    return (EXIT_SUCCESS);
}

static void interrupt isr(void) {
    INTCONbits.INTE = 0; //RB0/INT割り込み禁止
    INTCONbits.GIE = 0; //全体割込み禁止

    if(INTCONbits.INTF == 1) { //割込み種がRB0/INT割込みの場合
        if(PORTAbits.RA1 == 1) { //RA1LEDが点灯していた場合
            PORTAbits.RA1 = 0; //RA1をLowに
        }
        else { //RA1LEDが消灯していた場合
            PORTAbits.RA1 = 1; //RA1をHigtに
        }
    }
    INTCONbits.INTF = 0; //RB0/INT割込みフラグクリア
    INTCONbits.INTE = 1; //RB0/INT割り込み許可
    INTCONbits.GIE = 1; //全体割込み許可
}



★この情報は役に立ちましたか?

選択肢 投票
はい 59  
普通 34  
いいえ 36  

添付ファイル: fileTS3V0003.JPG 1564件 [詳細] file16F628Aピンデザイン画像.jpg 1606件 [詳細]