MPLABX XC8環境で、PIC16F84を使った例題2です。
RA0に接続したスイッチを押すたびにRB0に接続したLEDが点灯/消灯を繰り返すプログラムです。
回路図です。例題1との違いは、RA0が10kΩでプルダウンされています。
ブレッドボードです。
プログラムです。
実は、このプログラムは、Aeduinoの入門書「Arduinoをはじめよう」の41ページのスケッチを移植したものです。
Arduino言語もC言語に準拠した言語ですから、このいおうにArduinoのプログラムを移植することが可能です。
/*
* PIC16F84 EX2
* RA0のスイッチが押される度に、RB0のLEDをON/OFFする。
*/
* PIC16F84 EX2
* RA0のスイッチが押される度に、RB0のLEDをON/OFFする。
*/
#include <xc.h>
#include <pic16f84.h>
#include <pic16f84.h>
#define _XTAL_FREQ 10000000
#define LED PORTBbits.RB0
#define BUTTON PORTAbits.RA0
#define LED PORTBbits.RB0
#define BUTTON PORTAbits.RA0
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (Power-up Timer is abled)
#pragma config CP = OFF // Code Protection bit (Code protection disabled)
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (Power-up Timer is abled)
#pragma config CP = OFF // Code Protection bit (Code protection disabled)
int val = 0;
int old_val = 0;
int state = 0;
int old_val = 0;
int state = 0;
void main(void){
TRISA = 0b00011111; //RA0-RA4 INPUT
TRISB = 0b00000000; //RB0-RB7 OUTPUT
PORTB = 0;
while(1){
val = BUTTON; //buttonの状態をvalに入れる
if((val == 1) && (old_val ==0)){ //buttonの状態が0から1に変化したら
state = 1 - state; //stateを反転させる
__delay_ms(10); //チャタリング待ち
}
old_val = val; //現在のbuttonの状態をold_valに保存
if (state == 1){
LED = 1; //LED ON
}else{
LED = 0; //LED OFF
}
}
}
TRISA = 0b00011111; //RA0-RA4 INPUT
TRISB = 0b00000000; //RB0-RB7 OUTPUT
PORTB = 0;
while(1){
val = BUTTON; //buttonの状態をvalに入れる
if((val == 1) && (old_val ==0)){ //buttonの状態が0から1に変化したら
state = 1 - state; //stateを反転させる
__delay_ms(10); //チャタリング待ち
}
old_val = val; //現在のbuttonの状態をold_valに保存
if (state == 1){
LED = 1; //LED ON
}else{
LED = 0; //LED OFF
}
}
}
今回のトラブルシューティング
1 スイッチを押すとLEDが点灯したのですが、数秒するとLEDが消えてしまいました。
プログラムを見直したのですが、論理的におかしいところはみあたりません。
もう一度見直して、見つけました。
CONFIGにおいてWDTE = ONになっていました。
WDTE = OFF にして、解決。