■RB0/INT割り込み
古いデバイスであるPIC16F84を使い、RB0/INT割り込みを試してみます。
回路は、LEDを点滅させるの回路を使用しRB0とプラス端子をショートさせることにより割り込みを発生させます。
PIC16F1827での同じ動きをするプログラムを下の方に載せておきますが内容は全く同じです、違うのはconfigの設定だけです。
#include <stdio.h>
#include <stdlib.h>
#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 enabled)
#pragma config CP = OFF // Code Protection bit (Code protection disabled)
#include <xc.h>
#define _XTAL_FREQ 10000000 //クロック周波数 __delay_ms()に必要
volatile unsigned int i;
int main(int argc, char** argv) {
TRISA = 0b00000000; //portAを1:入力、0:出力 全てを出力に設定
TRISB = 0b00000001; //portBを1:入力、0:出力 RB0を入力に設定
PORTA = 0b00000000; //portAに出力
PORTB = 0b00000000;
INTEDG = 1; // RB0/INT ピンの立ち上がりエッジにより割り込み
INTF = 0; // RB0/INT割り込みフラグをリセット
INTE = 1; // RB0/INT 割り込み発生を許可する
GIE = 1; // 割り込み許可
while (1) { // 無限ループ
if (i) {
PORTA = 0b00000000; //portAに出力
PORTB = 0b00000000;
__delay_ms(500); // 0.5秒ウエイト
PORTA = 0b11111111;
PORTB = 0b11111111;
__delay_ms(500);
}
}
return (EXIT_SUCCESS);
}
void __interrupt() isr(void) {
if (INTF) { // RB0/INT割り込みフラグ
INTF = 0; // RB0/INT割り込みフラグをリセット
i = !i;
}
}
上の赤文字部分でRB0/INTの割り込み設定をして、下の赤文字部分は割り込みハンドラです。
プログラムを実行させてVssとRB0をショートさせると割り込みが発生し、割り込みハンドラ内が実行されます。
▼PIC16F84でのスリープからの復帰
RB0/INTへの入力によりスリープから復帰してみます。
#include <stdio.h>
#include <stdlib.h>
#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 enabled)
#pragma config CP = OFF // Code Protection bit (Code protection disabled)
#include <xc.h>
#define _XTAL_FREQ 10000000 //クロック周波数 __delay_ms()に必要
int main(int argc, char** argv) {
TRISA = 0b00000000; //portAを1:入力、0:出力 全てを出力に設定
TRISB = 0b00000001; //portBを1:入力、0:出力 RB0を入力に設定
PORTA = 0b00000000; //portAに出力
PORTB = 0b00000000;
INTEDG = 1; // RB0/INT ピンの立ち上がりエッジにより割り込み
INTF = 0; // RB0/INT割り込みフラグをリセット
INTE = 1; // RB0/INT 割り込み発生を許可する
GIE = 0; // 割り込み停止
CLRWDT();//ウオッチドックタイマーのクリア
SLEEP();//ここで停止する
NOP();//復帰すると1命令が実行されるため
while (1) { // 無限ループ
PORTA = 0b00000000; //portAに出力
PORTB = 0b00000000;
__delay_ms(500); // 0.5秒ウエイト
PORTA = 0b11111111;
PORTB = 0b11111111;
__delay_ms(500);
}
return (EXIT_SUCCESS);
}
プログラムを走らせて、RB0とプラス端子をショートさせることによりSLEEP命令で停止したPICが復帰します。
■PIC16F1827でのRB0/INT割り込み
#include <stdio.h>
#include <stdlib.h>
// CONFIG1
#pragma config FOSC = HS // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = HI // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), high trip point selected.)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
#include <xc.h>
#define _XTAL_FREQ 10000000 //クロック周波数 __delay_ms()に必要
volatile unsigned int i;
int main(int argc, char** argv) {
TRISA = 0b00000000; //portAを1:入力、0:出力 全てを出力に設定
TRISB = 0b00000001; //portBを1:入力、0:出力 RB0を入力に設定
PORTA = 0b00000000; //portAに出力
PORTB = 0b00000000;
INTEDG = 1; // RB0/INT ピンの立ち上がりエッジにより割り込み
INTF = 0; // RB0/INT割り込みフラグをリセット
INTE = 1; // RB0/INT 割り込み発生を許可する
GIE = 1; // 割り込み許可
while (1) { // 無限ループ
if (i) {
PORTA = 0b00000000; //portAに出力
PORTB = 0b00000000;
__delay_ms(500); // 0.5秒ウエイト
PORTA = 0b11111111;
PORTB = 0b11111111;
__delay_ms(500);
}
}
return (EXIT_SUCCESS);
}
void __interrupt() isr(void) {
if (INTF) { // RB0/INT割り込みフラグ
INTF = 0; // RB0/INT割り込みフラグをリセット
i = !i;
}
}
■PIC16F1827でのスリープからの復帰
#include <stdio.h>
#include <stdlib.h>
// CONFIG1
#pragma config FOSC = HS // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = HI // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), high trip point selected.)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
#include <xc.h>
#define _XTAL_FREQ 10000000 //クロック周波数 __delay_ms()に必要
int main(int argc, char** argv) {
TRISA = 0b00000000; //portAを1:入力、0:出力 全てを出力に設定
TRISB = 0b00000001; //portBを1:入力、0:出力 RB0を入力に設定
PORTA = 0b00000000; //portAに出力
PORTB = 0b00000000;
INTEDG = 1; // RB0/INT ピンの立ち上がりエッジにより割り込み
INTF = 0; // RB0/INT割り込みフラグをリセット
INTE = 1; // RB0/INT 割り込み発生を許可する
GIE = 0; // 割り込み停止
CLRWDT();//ウオッチドックタイマーのクリア
SLEEP();//ここで停止する
NOP();//復帰すると1命令が実行されるため
while (1) { // 無限ループ
PORTA = 0b00000000; //portAに出力
PORTB = 0b00000000;
__delay_ms(500); // 0.5秒ウエイト
PORTA = 0b11111111;
PORTB = 0b11111111;
__delay_ms(500);
}
return (EXIT_SUCCESS);
}
▲トップページ
>
マイコンなど