Quantcast
Channel: JH7UBCブログ
Viewing all articles
Browse latest Browse all 440

MPLABX XC8 PIC16F84 例題2

$
0
0
 MPLABX XC8環境で、PIC16F84を使った例題2です。

 RA0に接続したスイッチを押すたびにRB0に接続したLEDが点灯/消灯を繰り返すプログラムです。

 回路図です。例題1との違いは、RA0が10kΩでプルダウンされています。

イメージ 1

ブレッドボードです。

イメージ 2

 プログラムです。

 実は、このプログラムは、Aeduinoの入門書「Arduinoをはじめよう」の41ページのスケッチを移植したものです。

 Arduino言語もC言語に準拠した言語ですから、このいおうにArduinoのプログラムを移植することが可能です。

/*
 * PIC16F84 EX2
 * RA0のスイッチが押される度に、RB0のLEDをON/OFFする。
 */
#include <xc.h>
#include <pic16f84.h>
#define _XTAL_FREQ 10000000
#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)
int val = 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
        }
    }
         
}

今回のトラブルシューティング
1 スイッチを押すとLEDが点灯したのですが、数秒するとLEDが消えてしまいました。

 プログラムを見直したのですが、論理的におかしいところはみあたりません。

 もう一度見直して、見つけました。

 CONFIGにおいてWDTE = ONになっていました。

 WDTE = OFF にして、解決。

Viewing all articles
Browse latest Browse all 440

Trending Articles