##USARTの割り込みプログラムについて
受信割り込みでLEDを点灯させるプログラムを作成しています。
'X'を受信すると、割り込みが発生し、LEDが5回点滅するというプログラムです。
##困っていること
割り込みは発生するのですが、一度しか発生しません。
電源ON後、1回目の'X'受信では、確かにLEDが5回点滅しますが、
2回目の'X'受信では、割り込みプログラム(LED点滅)へ移行しません。
##プログラムコード
html
1#include <xc.h> 2 3// CONFIG1 4//(省略) 5 6// CONFIG2 7//(省略) 8 9#define LED1 LATCbits.LATC0 10#define _XTAL_FREQ 8000000 11#define __delay(X) _delay((unsigned long)((X))) 12#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))) //msec delay 13 14unsigned char rx_data; 15int rx_flg = 0; 16int i=1; 17 18void main(void) { 19 OSCCON=0x72; 20 ANSELA=0x04; 21 ANSELC=0x00; 22 TRISA=0x04; 23 TRISC=0x28; 24 LATC=0x00; 25 26 RXDTSEL = 0; 27 TXCKSEL = 0; 28 TXSTA = 0x24; 29 RCSTA = 0x90; 30 BAUDCON = 0x00; 31 SPBRGH = 0x00; 32 SPBRGL = 0x33; 33 34 RCIF = 0; 35 RCIE = 1; 36 PEIE = 1; 37 GIE = 1; 38 39 while(1){ 40LED1=1; 41 } 42} 43 44void interrupt Rx( void ) 45{ 46 if (RCIF == 1) { 47 RCIF = 0 ; 48 rx_data = RCREG ; 49 rx_flg = 1 ; 50 if(rx_data == 'X'){ 51 while(i<=5){ 52 LED1=1; 53 __delay_ms(100); 54 LED1=0; 55 __delay_ms(100); 56 i=i+1; 57 } 58 } 59 } 60}
##修正後(割り込みプログラム部)
html
1void interrupt Rx( void ) 2{ 3int i; 4GIE = 0; 5 if (RCIF == 1) { 6 RCIF = 0 ; 7 rx_data = RCREG ; 8 rx_flg = 1 ; 9 if(rx_data == 'X'){ 10 for(i=0;i<5;i++){ 11 LED1=1; 12 __delay_ms(100); 13 LED1=0; 14 __delay_ms(100); 15 i=i+1; 16 } 17 } 18 } 19GIE = 1; 20}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/16 08:50
2019/04/17 00:02
2019/04/17 03:22
2019/04/17 05:08
2019/04/17 05:14
2019/04/17 06:44
2019/04/17 06:49
2019/04/17 11:13
2019/04/17 12:16
2019/04/17 23:44