2017-03-31 3 views
-2

Ich bin neu in PIC-Programmierung und ich verwende MPLAB. Ich habe eine Frage bezüglich Unterbrechung. So was ich tun möchte, wenn ich einen Knopf drücke, dann möchte ich LED 0 einschalten, und wenn ich den Knopf loslasse, dann schalte LED 1 an. Ich dachte, der Code, den ich geschrieben habe, macht Sinn aber es hat nicht funktioniert.PIC Programmierung Interrupt Fehlfunktion.

Hier ist was passiert. Nehmen wir an, der Anfangszustand des Interrupt-Pins ist niedrig (0), wenn eine Taste gedrückt wird. Dann leuchtet die LED 0 und wenn ich die Taste loslasse, leuchtet die LED 1. Wenn ich den Knopf erneut drücke, erwarte ich, dass LED 0 an ist, aber LED 1 bleibt an und ändert nie den Zustand.

Ich habe letzte Zeile hinzugefügt, um den Status des Interrupt-Pin zu sehen, und sobald der Interrupt hoch ist, ändert es nie zu niedrig .. Können Sie mir bitte beraten, was ist mein Missverständnis?

Vielen Dank im Voraus!

Hier ist mein Code:

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)' in einem Interrupt-Hanlder ist eine ** sehr ** schlechte Idee. – Olaf

+0

Ich verstehe, dass ich keinen Interrupt schreiben sollte, der lange Verarbeitungstyp hat. Der Zweck dieses Programms ist, ich versuche zu verstehen, wie der Interrupt funktioniert, also schrieb ich visuelle Präsentationsausgabe (LEDs). Dies ist ein interruptgesteuerter Code, und die Hauptfunktion ist im Grunde leer. Ich würde mich freuen, wenn Sie mir einen Vorschlag machen können. –

Antwort

0

Sie müssen den Interrupt-Flag in der ISR-Funktion zum Zurücksetzen oder es wird Auslösung nur halten. Bitte lesen Sie das Datenblatt, es sollte erwähnen, wenn dies notwendig ist. Also füge einfach INTCONbits.INTF = 0 hinzu; an die ISR und es sollte wie erwartet funktionieren.

Wenn Sie ein Peripheriegerät oder eine Funktion des MCU einrichten, sollten Sie das Datenblatt durchgehen und die Beschreibung der Register und deren Einstellungen verwenden. Sie müssen auch vorsichtig mit analogen Ports sein, die häufig auf analog statt digital eingestellt sind, was dazu führt, dass der Interrupt nicht wie erwartet ausgelöst wird oder unerwartete Interrupts verursacht. Es empfiehlt sich, zuerst die MCU-Konfigurationsbits einzurichten, die TRIS- und analogen Auswahlregister (ANSELx oder ANSELAx usw.) und dann die Register für jedes Peripheriegerät festzulegen, das Sie verwenden möchten. Stellen Sie dann die Interrupts ein, setzen Sie immer alle Interrupt-Flags zurück, die Sie verwenden werden, um mit einem bekannten Status zu beginnen.

Sie setzen auch TMR0IE = 1, die dasselbe tun wird, einen Interrupt auslösen. Wenn Sie das TMR0-Flag nicht zurücksetzen, wird es weiterhin ausgelöst, wodurch Ihr MCU gesperrt oder verlangsamt wird.