• 追加された行はこの色です。
  • 削除された行はこの色です。
#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(はい[6],普通[0],いいえ[0])
 #vote(はい[7],普通[0],いいえ[0])
 
 #comment_nospam