閲覧総計:13892  (本日:1  昨日:1)

【目次】(項目をクリックすると、そこに飛べます)


トグルスイッチ

トグルスイッチ(toggle switch)とは、スイッチを押すたびにオン(ON)、オフ(OFF)の
状態が入れ替わる動作をするスイッチの事です。

トグルスイッチ機能を実現する為の定石プログラム記法がありますので紹介します。
  07/02/11
HC8のプログラムを追加しました。 2013/10/06

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

MikroCのプログラム

/**
* トグル スイッチ
* (スイッチを押すたびに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.
要求事項ボタンピンは「入力」に設定されていなければならない。

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

選択肢 投票
はい 21  
普通 15  
いいえ 17  


XC8のプログラム

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

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


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

選択肢 投票
はい 1  
普通 0  
いいえ 1  

添付ファイル: fileTS3V0004.JPG 928件 [詳細] file16F628Aピンデザイン画像.jpg 935件 [詳細] fileP1010293.JPG 2202件 [詳細]