2016-07-08 6 views
0

PIC16LF1618의 RC7에서 인터럽트 중 변경을 사용 중입니다.실행 런타임 중 인터럽트 변경시

void I_O_C_Initialize (void) { 
    INTCONbits.IOCIF = 0; 
    IOCCFbits.IOCCF7 = 0; 
    INTCONbits.IOCIE = 1; 
    IOCCP = 0x80; 
} 

내가 RC7에 긍정적 인 트리거를 이용하여 파워 다운 모드 (SLEEP)에서 PIC를 깨울 수 있어요 : 여기 I-O-C에 사용하는 초기화 비트입니다. 그러나 RC7에 대한 긍정적 인 트리거가 PIC를 재설정하고 main() 함수의 첫 번째 줄로 이동해야하는 것처럼 실행 시간 동안이 트리거를 사용할 수있게하려고합니다.

이 방법에 대해 알려주십시오.

추신 : 가능한 한 빨리 리셋해야하고 실행 시간이 중요하기 때문에 RC7에서 긍정적 인 트리거를 확인하기 위해 주 함수 내에 여러 if 문을 추가 할 수 없습니다. 따라서 지연이나 함수 루프를 실행하는 경우에도 PIC를 다시 설정하는 인터럽트 옵션을 찾고 있습니다.

덕분에 대부분의 8 비트 PIC 장치에서

답변

0

문제가 해결되었습니다. 런타임 중에 IOC (Interrupt On Change)가 필요할 때마다 GIE 비트를 활성화 한 후 IOC는 절전 모드 (SLEEP)뿐 아니라 런타임 중에도 작동했습니다.

void interrupt ISR (void); 

void interrupt ISR (void) { 
    if (RC7==1) { 
     asm("pagesel foobar"); 
     asm("goto foobar"); 
    } 
    else 
     return; 
} 


asm("foobar:"); 
while (1) { 
    IOCCFbits.IOCCF7 = 0; 
    INTCONbits.GIE = 1; 

    . //Do the calculations here 
    . //Here if any Interrupt On Change happens for RC7, 
    . //the ISR routine would stop all calculations and 
    . //would return to the start of the loop without 
    . //resetting any of the registers. 

    INTCONbits.GIE = 0; 
    IOCCFbits.IOCCF7 = 0; 
    SLEEP(); 
} 
0

, 당신은 XC8를 사용하는 가정이 필요한 조립 명령을 호출하는 정의가 :

#define RESET() asm("reset") 

그래서, 당신의 인터럽트 핸들러에서, 다음 코드 줄을 삽입하십시오.

RESET(); 
+0

예, 저는 XC8을 사용하고 있습니다. 그러면 도움이 될만한 것이 있습니까? #define RESET() asm ("reset") 메인 루프 내부 : \t // 나는 SLEEP 함수를 호출하기 때문에 일반적으로 GIE 및 PEIE 비트를 비활성화해야합니다. \t INTCONbits.GIE = ​​1; \t INTCONbits.PEIE = 1; SLEEP 함수 전에 : // \t SLEEP 모드 \t INTCONbits.GIE = ​​0에서 일어나 위해 상기 GIE 및 PEIE 비트를 비활성화; \t INTCONbits.PEIE = 0; void 인터럽트 ISR (void) { if (RC7 == 1) { \t INTCONbits.GIE = ​​0; \t INTCONbits.PEIE = 0; \t IOCCF = ((IOCCF^0xFF) & IOCCF); \t RESET(); } } –

+0

@ArunKumar 그것은 이미 정의되었으므로 논리에서 당신이 필요로하는 곳이면 어디에서라도'RESET(); '을 사용하십시오 - 그 논리가 당신의 선택 일뿐입니다, 나는 당신에게 PIC의 하드웨어 리셋을 강제하는 방법을 알려줍니다 코드에서. 인터럽트에서는 관련 레지스터를 검사하여 방금 잠에서 깨어 났는지 여부를 확인할 수 있습니다. –

+0

RESET() 잘 작동합니다. 그러나, 그것은 완전한 소프트 재부팅을하고 나는 그것을 피하고 싶습니다. ISR 인터럽트에서 main() 내의 레이블로 점프하는 방법이 있습니까? –

관련 문제