Ich verwende Interrupt-On-Change auf RC7 von PIC16LF1618. Hier ist die Initialisierung Bit, das ich für I-O-C:Interrupt-On-Change während der Laufzeit
void I_O_C_Initialize (void) {
INTCONbits.IOCIF = 0;
IOCCFbits.IOCCF7 = 0;
INTCONbits.IOCIE = 1;
IOCCP = 0x80;
}
Ich kann den PIC von einem Power-Down-Modus (SLEEP) mit einem positiven Trigger auf RC7 wecken. Allerdings möchte ich diesen Trigger auch während der Ausführungszeit verfügbar haben, so als ob irgendein positiver Trigger auf RC7 den PIC zurücksetzen und in die erste Zeile der main() -Funktion gehen sollte.
Könnten Sie mir bitte Bescheid geben, wie Sie dies erreichen?
P.S: Da das Zurücksetzen so schnell wie möglich erfolgen muss und für die Ausführungszeit entscheidend ist, kann ich nicht mehrere if-Anweisungen innerhalb der Hauptfunktion hinzufügen, um nach dem positiven Trigger auf RC7 zu suchen. Daher suche ich nach einer Interrupt-Option zum Zurücksetzen des PIC, auch wenn es eine Verzögerung oder Funktionsschleifen ausführt.
Dank
Ja, ich benutze XC8. Würde so etwas helfen? #define RESET() asm ("reset") Innerhalb der Hauptschleife: \t // Da ich die SLEEP-Funktion anrufe, sollten die GIE- und PEIE-Bits normalerweise deaktiviert sein. \t INTCONbits.GIE = 1; \t INTCONbits.PEIE = 1; Vor SLEEP-Funktion: \t // Deaktivieren der GIE- und PEIE-Bits, um vom SLEEP-Modus aufzuwachen \t INTCONbits.GIE = 0; \t INTCONbits.PEIE = 0; void interrupt ISR (void) { if (RC7 == 1) { \t INTCONbits.GIE = 0; \t INTCONbits.PEIE = 0; \t IOCCF = ((IOCCF^0xFF) & IOCCF); \t RESET(); } } –
@ArunKumar Es sollte bereits definiert sein, also benutze 'RESET();' wo immer du in deiner Logik bist - diese Logik ist deine Wahl, ich lasse dich wissen, wie man einen Hardware-Reset des PIC erzwingt aus dem Code. In Ihrem Interrupt können Sie das entsprechende Register überprüfen, um festzustellen, ob Sie gerade aus dem Schlaf aufgewacht sind oder nicht. –
Das RESET() funktioniert gut. Es macht jedoch einen kompletten sanften Neustart und ich möchte das vermeiden. Gibt es eine Möglichkeit, zu einem Label innerhalb des main() vom ISR-Interrupt zu springen? –