作成2014.03.04
- STEP13_BinaryCounter
(1)STEP13_BinaryCounter
STEP13_BinaryCounterソースプログラムを以下に示します。
/*****************************
STEP13_BinaryCounter.c
*****************************/
#define _LEGACY_HEADERS
// インクルードファイルの読み込み
#include <pic.h>
// コンフィギュレーションワードの設定
__CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );
// プロトタイプ宣言
void WaitTime (int cnt);
// メイン関数
void main (void)
{
// 1,2,17,18端子を入出力端子に設定
CMCON = 0x07;
// 電圧レベルの初期設定
PORTA = 0xFF;
PORTB = 0xFF;
// 入出力設定
TRISA = 0b00101111;
TRISB = 0x00;
// 永久ループ
while(1)
{
// SW1がONの場合
if(RA0 == 0)
{
// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
WaitTime (500);
// SW1がONの間ループ
while( RA0 == 0 )
;
// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
WaitTime (500);
// PORTレジスタの値が0ではない場合
if(PORTB != 0b00000000)
{
// PORTBレジスタを1マイナスする
PORTB = PORTB - 1;
}
}
// SW2がONの間
else if(RA1 == 0)
{
// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
WaitTime (500);
// SW2がONの間ループ
while(RA1 == 0)
;
// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
WaitTime (500);
//
if(PORTB != 0b11111111)
{
// PORTBレジスタを1プラスする
PORTB = PORTB + 1;
}
}
// SW3がONの間
else if(RA2 == 0)
{
// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
WaitTime (500);
// SW3がONの間ループ
while(RA2 == 0)
;
// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
WaitTime (500);
// PORBレジスタをクリア
PORTB = 0b00000000;
}
// SW4がONの間
else if(RA3 == 0)
{
// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
WaitTime (500);
// SW4がONの間ループ
while(RA3 == 0)
;
// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
WaitTime (500);
// PORTBレジスタに255を代入
PORTB = 0b11111111;
}
}
}
// 待ち時間関数
void WaitTime ( int cnt )
{
while (cnt > 0)
cnt--;
}
(2)STEP13_BinaryCounterソースプログラムの実行
* SW1を1回押すとLEDの2進表示値が1だけ増加します。
*SW2を1回押すとLEDの2進表示値が1だけ減少します。
*SW3を押すとLEDの2進表示値が0b11111111となります。
*SW4を押すとLEDの2進表示値が0b00000000となります。
- STEP13_RisingEdgeFailed
(1)STEP13_RisingEdgeFailedソースプログラム
STEP13_RisingEdgeFailedソースプログラムを以下に示します。
/*****************************
STEP13_RisingEdgeFailed.c
*****************************/
#define _LEGACY_HEADERS
// インクルードファイルの読み込み
#include <pic.h>
// コンフィギュレーションワードの設定
__CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );
// メイン関数
void main (void)
{
// 1,2,17,18端子を入出力端子に設定
CMCON = 0x07;
// 電圧レベルの初期設定
PORTA = 0xFF;
PORTB = 0xFF;
// 入出力設定
TRISA = 0b00101111;
TRISB = 0x00;
// 永久ループ
while(1)
{
// SW1がONの場合
if( RA0 == 0 )
{
// SW1がONの間ループ
while( RA0 == 0 )
;
// LED1状態反転
RB0 = ~RB0;
}
}
}
(2)STEP13_RisingEdgeFailedソースプログラムの実行
*SW1入力信号のRA0の電圧変化とLED1出力信号のRB0の電圧変化を測定した結果を図11-1に示します。
図11-1からSW1のチャタリングによりLED1の出力が誤動作することが確認できます。
- STEP13_RisingEdgeSuccessful
(1)STEP13_RisingEdgeSuccessfulソースプログラム
STEP13_RisingEdgeSuccessfulソースプログラムを以下に示します。
/*****************************
STEP13_RisingEdgeSuccessful.c
*****************************/
#define _LEGACY_HEADERS
// インクルードファイルの読み込み
#include <pic.h>
// コンフィギュレーションワードの設定
__CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );
// プロトタイプ宣言
void WaitTime (int cnt);
// メイン関数
void main (void)
{
// 1,2,17,18端子を入出力端子に設定
CMCON = 0x07;
// 電圧レベルの初期設定
PORTA = 0xFF;
PORTB = 0xFF;
// 入出力設定
TRISA = 0b00100011;
TRISB = 0x00;
// 永久ループ
while(1)
{
// SW1がONの場合
if(RA0 == 0)
{
// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
WaitTime (500);
// SW1がONの間ループ
while (RA0 == 0)
;
// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
WaitTime (500);
//
RB0 = ~RB0;
}
}
}
// 待ち時間関数
void WaitTime ( int cnt )
{
while (cnt > 0)
cnt--;
}
(2)STEP13_RisingEdgeSuccessfulソースプログラムの実行
*SW1入力信号のRA0の電圧変化とLED1出力信号のRB0の電圧変化を測定した結果を図11-2に示します。
図11-2からSW1のチャタリングによるLED1出力の誤動作を約10msのディレイで防止することが確認できます。