2017-03-31 15 views
-2

저는 PIC 프로그래밍을 처음 접했고 MPLAb를 사용하고 있습니다. 나는 인터럽트에 대한 질문 .. 나는 다음 버튼을 누르면 그래서 내가하고 싶은 것은, 내가 0 LED를 켜려고 있고, 내가 버튼을 놓으면 그때 나는 감각을 쓴 코드를 생각 1. LED를 켜 그러나 그것은 작동하지 않았다.PIC 프로그래밍 인터럽트 오작동.

여기 일 것입니다. 버튼을 누르면 인터럽트 핀의 초기 상태가 로우 (0)라고 가정 해 보겠습니다. 그러면 LED 0이 켜지고 버튼을 놓으면 LED 1이 켜집니다. 버튼을 다시 누르면 LED 0이 켜지지만 LED 1은 켜져 있고 절대로 상태를 변경하지 않을 것으로 예상됩니다.

나는 인터럽트 핀의 상태를 볼 수있는 마지막 줄을 추가하고, 인터럽트가 높은되면, 그것은 당신이 내 오해 뭔지를 알려 주시기 바랍니다 수 있습니다 .. 저로 변경하지?

미리 감사드립니다. 당신은 ISR 함수에서 인터럽트 플래그를 재설정해야하거나 그냥 트리거 계속됩니다

void interrupt ISR(void) 
{ 

if(INTCONbits.INTF) 
{ 
     nextLED = 1; 
     LATC = Output_Code_Buffer[nextLED]; 
     __delay_ms(250); 
} 

else 
{ 
     nextLED = 0; 
     LATC = Output_Code_Buffer[nextLED]; 
     __delay_ms(250); 
} 

nextLED = INTCONbits.INTF + 2; 

LATC = Output_Code_Buffer[nextLED]; 
__delay_ms(250); 
} 

// Interrupt Enable settings 
INTCONbits.INTE = 1; 
INTCONbits.TMR0IE = 1;   // Enable TMR0 interrupts 
INTCONbits.TMR0IF = 0;   // Clear TMR0 interrupt flag 
INTCONbits.GIE = 1;    // Enable global interrupts 
+1

'__delay_ms (250)'인터럽트 hanlder에 ** 매우 ** 나쁜 생각입니다. – Olaf

+0

긴 처리 유형의 인터럽트를 작성하면 안된다는 것을 알고 있습니다. 이 프로그램의 목적은 인터럽트가 어떻게 작동하는지 이해하려고하기 때문에 시각적 프리젠 테이션 출력 (LEDs)을 작성했습니다. 이것은 인터럽트 구동 코드이며, 주요 기능은 기본적으로 비어 있습니다. 네가 나 한테 제안 할 수 있으면 고맙겠다. –

답변

0

:

여기 내 코드입니다. 데이터 시트를 읽으십시오. 필요한 경우 언급해야합니다. 그래서 INTCONbits.INTF = 0; ISR과 예상대로 작동해야합니다. 는 MCU의 모든 주변이나 기능을 설정할 때

, 당신은 데이터 시트를 통해 이동하고 레지스터의 설명과 무엇을 설정을 사용해야합니다. 또한 아날로그 포트는 디지털 포트가 아닌 아날로그 포트가 기본 포트가되기 때문에 예상대로 작동하지 않거나 예기치 않은 인터럽트가 발생하지 않도록 조심해야합니다. 먼저 MCU 구성 비트를 설정하고 TRIS 및 아날로그 선택 레지스터 (ANSELx 또는 ANSELAx 등)를 설정 한 다음 사용할 주변 장치에 대한 레지스터를 설정하는 것이 가장 좋습니다. 그런 다음 인터럽트를 설정하고 항상 알 수있는 상태로 시작할 때 사용할 인터럽트 플래그를 모두 재설정하십시오.

은 또한, 같은 일을 인터럽트를 트리거하는 TMR0IE = 1을 설정합니다. TMR0 플래그를 재설정하지 않으면 트리거가 계속 실행되어 mcu가 잠기거나 속도가 느려집니다.