• 追加された行はこの色です。
  • 削除された行はこの色です。
#freeze
 閲覧総計:&counter();  (本日:&counter(today);  昨日:&counter(yesterday);)
 
 【目次】(項目をクリックすると、そこに飛べます)
 #contents
 ~
 *トグルスイッチ [#w5775228]
 
 トグルスイッチ(toggle switch)とは、スイッチを押すたびにオン(ON)、オフ(OFF)の
 状態が入れ替わる動作をするスイッチの事です。
 
 トグルスイッチ機能を実現する為の定石プログラム記法がありますので紹介します。
   07/02/11
 HC8のプログラムを追加しました。 2013/10/06
 
 |&attachref(P1010293.JPG,zoom,150x150,button){新しい写真添付};|&attachref(16F628Aピンデザイン画像.jpg,zoom,150x150,button){新しい写真添付};|
 
 **MikroCのプログラム [#a1a518ca]
  /**
  * トグル スイッチ
  * (スイッチを押すたびにON、OFFを切り替え)
  *
  * PIC16F628A   内蔵4MHz
  * LED: RB3 スイッチ: RB4
  * 電源:乾電池3本(4.5V)
  *
  * Device Flags: _BODEN_OFF _BOREN_OFF _CP_OFF _PWRTE_ON _WDT_OFF
  *        _LVP_OFF _MCLRE_OFF _INTRC_OSC_NOCLKOUT
  * MikroC 2.1
  */
  void main() {
      //使用変数の定義
      unsigned short int oldstate;
  
      PORTB = 0b00000000; //PORTBの中身をきれいにする
      TRISB = 0b00010000; //RB4を1:入力、他は0:出力に設定
      OPTION_REG.NOT_RBPU = 0; //PORTBを内部プルアップ
  
      //LED初期点灯状態の設定
      PORTB.F3 = 1; //RB3 ON
      oldstate = 0;
  
      do {
          if(Button(&PORTB, 4, 1, 1)) oldstate = 1;
          if(oldstate && Button(&PORTB, 4, 1, 0)) { //RB4スイッチ状態の判別
              PORTB.F3 = ~PORTB.F3; //RB3状態の反転
              oldstate = 0;
          }
      }while(1);
  }
 
 Button関数
 |構文|unsigned short Button(unsigned short *port, unsigned short pin, unsigned short time, unsigned short active_state);|
 |戻り値|0〜255の整数を返します。|
 |説明|・この関数はボタンのチャタリング現象の影響を除去します。  ・*port:ボタンが設置したポート情報、pin:ボタンを設置したピン番号(0..7)、time:チャタリング除去時間(ミリ秒)、active_state:0か1を設定する。ボタンがアクティブか?どうか?の判別設定?parameter active_state can be either 0 or 1, and it determines if the button is active upon logical zero or logical one.|
 |要求事項|ボタンピンは「入力」に設定されていなければならない。|
 
 ★この情報は役に立ちましたか?
 #vote(はい[9],普通[4],いいえ[5])
 #vote(はい[9],普通[4],いいえ[6])
 
 #comment_nospam
 ~
 
 **XC8のプログラム [#s1833dee]
 
 |&attachref(TS3V0004.JPG,zoom,200x200,button){新しい写真添付};|&attachref(16F628Aピンデザイン画像.jpg,zoom,200x200,button){新しい写真添付};|
 
 2013/10/06追加(スイッチのチャタリング防止ロジック入り)
  #include <xc.h>
  
  #pragma config BOREN = OFF ,CPD = OFF , FOSC = INTOSCIO , MCLRE = OFF , WDTE = OFF , CP = OFF , LVP = OFF , PWRTE = ON
  
  //__delay_us(), __delay_ms()へのクロック情報の設定
  #define _XTAL_FREQ 4000000 //PICのクロックをHzで設定(4MHz)
  
  /*トグルスイッチ(スイッチのチャタリング防止手法の確認)
   * PIC16F628A  XC8 v1.20
   * LED:RA1,RA2に接続
   * Switch:RB4に接続
   */
  int main(void) {
      //利用変数の定義
      char swMode; //スイッチが押された判断フラグ 1:押された 0:押されていない
      char detect; //スイッチPORTの状態発見フラグ 1:押されたかも? 0:押されていない
  
      PORTA = 0b00000000; //PORTAの中身をきれいにする
      PORTB = 0b00000000; //PORTBの中身をきれいにする
      TRISA = 0b00110000; //PORTAのRA5,RA4は1:入力に、他は0:出力に設定
      TRISB = 0b00011000; //PORTBのRB4,RB3は1:入力に、他は0:出力に設定
      CMCON = 0b00000111; //PORTAのコンパレータ機能は使用しない
      OPTION_REGbits.nRBPU = 0; //0:PORTBの内部ウィークプルアップを使用
  
      PORTAbits,RA2 = 1; //パワーオンを示すLED点灯
      //変数の初期化
      swMode = 0;
      detect = 0;
      //メイン処理
      while(1) { //2013/10/05 20:00正常稼働確認。
          if(swMode == 0) { //スイッチが押されていない状態なら
              if(PORTBbits.RB4 == 0) { //RB4スイッチdownなら
                  detect = 1; //スイッチが押されたかも?フラグを立てる
              }
              __delay_ms(10); //10ミリ秒待つ(待ち時間(1〜20ミリ秒位)は状況に合わせて変更)
              if((PORTBbits.RB4 == 0) && (detect == 1)) { //スイッチ状態がdownなら
                  swMode = 1; //スイッチが押された判断フラグを立てる
                  if(PORTAbits.RA1 == 1) { //RA1LEDが点灯状態なら
                      PORTAbits.RA1 = 0; //RA1LEDを消灯
                  }
                  else { //RA1LEDが消灯状態なら
                      PORTAbits.RA1 = 1; //RA1LEDを点灯
                  }
              }
          }
          if(PORTBbits.RB4 == 1) { //RB4スイッチがup状態なら
              swMode = 0; //スイッチが押された判断フラグをクリアー
              detect = 0; //スイッチが押されたかも?フラグをクリアー
          }
      }
  }
 
 
 【参考】スイッチのチャタリング現象で動作が不安定なトグルスイッチのプログラム
 
  #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
  
  /*トグルスイッチ(スイッチのチャタリング現象でスイッチ動作不安定のプログラム)
   * PIC16F628A  XC8 v1.20
   * LED:RA1,RA2に接続
   * Switch:RB4に接続
   */
  int main(int argc, char** argv) {
      PORTA = 0b00000000; //PORTAの中身をきれいにする
      PORTB = 0b00000000; //PORTBの中身をきれいにする
      TRISA = 0b00110000; //PORTAのRA5,RA4は1:入力に、他は0:出力に設定
      TRISB = 0b00011000; //PORTBのRB4,RB3は1:入力に、他は0:出力に設定
      CMCON = 0b00000111; //PORTAのコンパレータ機能は使用しない
      OPTION_REGbits.nRBPU = 0; //0:PORTBの内部ウィークプルアップを使用
  
      PORTAbits.RA2 = 1; //パワーオンを示すLED点灯
      while(1){
          if(PORTBbits.RB4 == 0) {
              if(PORTAbits.RA1 == 1) {
                  PORTAbits.RA1 = 0;
              }
              else {
                  PORTAbits.RA1 = 1;
              }
          }
      }
      return (EXIT_SUCCESS);
  }
 ~
 【参考としたページ】
 モメンタリースイッチによるLED ON/OFF
 http://www.ys-labo.com/pic/pic%20chips/pic%20chips%20contets/060406a%20Led%20MomSw%20OnOff.html
 ~
 ★この情報は役に立ちましたか?
 #vote(はい[0],普通[0],いいえ[1])
 #vote(はい[1],普通[0],いいえ[1])
 
 #comment_nospam