■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が点滅します。
▲トップページ
>
マイコンなど