割り込み処理に四苦八苦
これでもうまくいく。
/*
* CNC Power unit
*
* File: main.c
* Author: masato
*
* Created on 2017/02/05, 8:02
*/
// PIC12F615 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config IOSCFS = 8MHZ // Internal Oscillator Frequency Select (4 MHz)
#pragma config BOREN = ON // Brown-out Reset Selection bits (BOR enabled)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
static int val = 0;
static int odd = 0;
static int even = 0;
void interrupt ISR(void) {
if (INTCONbits.GPIF) {
if (odd) {
val ^= 1;
GP4 = val;
#if 0
GP4 = val;
GP4 = val;
GP4 = val;
#endif
}
#if 0
GP0 = even & 0x01;
GP1 = (even & 0x02) >> 1;
GP2 = (even & 0x04) >> 2;
even++;
#else
GP0 = 0;
#if 0
GP1 = 0;
GP2 = 0;
#endif
#endif
odd ^= 1;
INTCONbits.GPIF = 0; // 割り込みフラグクリア
}
}
void main(void) {
// レジスタセット
TRISIO = 0b00001000;
ANSEL = 0b00000000;
CMCON0 = 0b00000000;
IOCbits.IOC3 = 1;
INTCONbits.GPIE = 1; // GPIO変更割り込み許可
INTCONbits.GIE = 1; // グローバル割り込み許可
GP0 = 0;
GP1 = 0;
GP2 = 0;
GP4 = 0;
GP5 = 0;
while(1);
return;
}
異なる2つのGPIOポートに出力すると良いようだが、こんな解決方法は間違ってるよね。