#freeze 閲覧総計:&counter(); (本日:&counter(today); 昨日:&counter(yesterday);) PICをボタン電池で駆動させる場合、PICが動作していない時の電力を最小におさえる事は 有用である。 今回、PICをスリープ状態にする手法とスリープ状態から復帰させる手法をXC8で確認 したので記録に残しておく。 2013/10/06 【ポイント】 ・PICをスリープ状態にする while(1) { SLEEP(); //PICをスリープ状態にする NOP(); //sleepから復帰後、必ず1命令実行されるダミー命令 } ・PICをスリープ状態から復帰させる RB0/INT割り込みで復帰させる。 |&attachref(TS3V0003.JPG,zoom,150x150,button){新しい写真添付};|&attachref(16F628Aピンデザイン画像.jpg,zoom,150x150,button){新しい写真添付};| ~ *XC8のプログラム [#vc816c21] /* * 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; //全体割込み許可 } ~ ★この情報は役に立ちましたか? #vote(はい[5],普通[0],いいえ[0]) #comment_nospam