■PIC10F222のピン変化によるウェイクアップ

マイコンがSleepしてからのピン変化での復帰なのですが、SLEEPで次の行からの復帰ではなくて、プログラムが先頭から走り始める復帰です。
そこで、起動後にGPWUF ビットを見て、スリープからの復帰なのかリセットによる起動なのか判断する必要があります。

PICマイコンのポートにスイッチを取り付けてそれによりウェイクアップさせたいと思います。
まずは、LEDを点滅させるで使った基盤を改造して空いているポートに押しボタンスイッチを取り付けました。
スイッチ自体のプルアップはPICの弱プルアップ機能を使います。


#include<stdio.h>
#include<stdlib.h>

#pragma config IOSCFS = 8MHZ    // Internal Oscillator Frequency Select bit (8 MHz)
#pragma config MCPU = OFF        // Master Clear Pull-up Enable bit (Pull-up enabled)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config CP = OFF         // Code protection bit (Code protection off)
#pragma config MCLRE = OFF      // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)

#include<xc.h>
#define _XTAL_FREQ 8000000 //クロック周波数 __delay_ms()に必要

int main(int argc, char** argv) {
    OSCCAL = 0b00000000;
    OPTION = 0B00000000; //GP0 GP1 GP3の弱プルアップ有効、ピン変化によるウェイクアップ有効
    ADCON0 = 0B00001100;
    TRISGPIO = 0b00001000;
    if (GPWUF) {
        //ピン変化によるSleepからの復帰
        while (1) {
            GPIO = 0b00000000; //GPIOに出力
            __delay_ms(500); // 0.5秒ウエイト
            GPIO = 0b00000111;
            __delay_ms(500);
        }
    }
    GPIO = 0b00000111; //GPIOに出力
    __delay_ms(1000); // 1秒ウエイト
    GPIO = 0b00000000;
    while (1) {
        if (GP3 == 1) {//GP3のスイッチがOFFの場合にスリープ プルアップしてあるため論理が逆
            SLEEP();
        }
    }
    return (EXIT_SUCCESS);
}
このプログラムでは電源ON後に1秒間LEDが点灯しSLEEPします。
ボタンを押すと復帰し、0.5秒毎にLEDが点滅します。


▲トップページ > マイコンなど