2016-05-28 1 views
0

Je souhaite configurer PIC24F32KA302 pour passer en mode Veille et se réveiller par interruption RTC. Cependant, après le réveil, mon programme s'exécute à nouveau depuis le début. La fiche technique mentionne que: - Si la priorité affectée à l'interruption est inférieure ou égale à la priorité CPU actuelle, l'équipement se réveille et continue l'exécution du code à partir de l'instruction suivant l'instruction PWRSAV qui a initié le mode Veille. - Si le niveau de priorité attribué à la source d'interruption est supérieur à la priorité actuelle de l'UC, l'appareil se réveille et le processus d'exception de l'UC commence. L'exécution du code continuera à partir de la première instruction de l'ISR. J'ai essayé les deux configurations mais les résultats sont les mêmes. Mon code est ci-dessous:PIC24F32KA302 Mode veille

int main(void) { 
SYS_Init(); 
while(1){ 
    __delay_ms(400); 
    Sleep(); 
} 
return 0;} 

void __attribute__ ((interrupt, no_auto_psv)) _RTCCInterrupt(void) { 
IFS3bits.RTCIF = 0; 
//To do: 
Total_Pulse += TMR1; 
TMR1 = 0; 
LED = ~LED;} 

void InterruptPriority_Init(void) { 
INTCON1bits.NSTDIS = 1; 
INTCON2bits.ALTIVT = 0; 
SRbits.IPL = 1; 
IPC15bits.RTCIP = 6;//6 
_U2RXIP = 5; 
_T1IP = 4; 
_U1RXIP = 2; 
_HLVDIP = 3;} 

La fonction SYS_Init() initialise interruption, RTC et d'autres modules périphériques. Cette fonction est toujours exécutée lorsque l'appareil sort du mode Veille. Avez-vous une idée ou un conseil pour moi? Merci

Répondre

0

Il se peut très bien qu'il se produise des erreurs qui provoquent la réinitialisation de votre appareil.

Avez-vous ajouté les routines d'interruption? Si non, ajoutez ce code et voyez si vous entrez dans un de ces pièges.

Assurez-vous également que votre circuit ne subit aucune chute de courant et que votre broche de réinitialisation ne génère pas de bruit. Vous pouvez ajouter un condensateur de 100nF entre la broche de réinitialisation et la masse (bien sûr) .

/******************************************************************************/ 
/* Files to Include               */ 
/******************************************************************************/ 

/* Device header file */ 
#if defined(__XC16__) 
    #include <xc.h> 
#elif defined(__C30__) 
    #if defined(__PIC24E__) 
     #include <p24Exxxx.h> 
    #elif defined (__PIC24F__)||defined (__PIC24FK__) 
    #include <p24Fxxxx.h> 
    #elif defined(__PIC24H__) 
    #include <p24Hxxxx.h> 
    #endif 
#endif 

#include <stdint.h>  /* Includes uint16_t definition */ 
#include <stdbool.h>  /* Includes true/false definition */ 

/******************************************************************************/ 
/* Trap Function Prototypes             */ 
/******************************************************************************/ 

/* <Other function prototypes for debugging trap code may be inserted here> */ 

/* Use if INTCON2 ALTIVT=1 */ 
void __attribute__((interrupt,no_auto_psv)) _OscillatorFail(void); 
void __attribute__((interrupt,no_auto_psv)) _AddressError(void); 
void __attribute__((interrupt,no_auto_psv)) _StackError(void); 
void __attribute__((interrupt,no_auto_psv)) _MathError(void); 

#if defined(__PIC24F__)||defined(__PIC24H__) 

/* Use if INTCON2 ALTIVT=0 */ 
void __attribute__((interrupt,no_auto_psv)) _AltOscillatorFail(void); 
void __attribute__((interrupt,no_auto_psv)) _AltAddressError(void); 
void __attribute__((interrupt,no_auto_psv)) _AltStackError(void); 
void __attribute__((interrupt,no_auto_psv)) _AltMathError(void); 

#endif 

/* Default interrupt handler */ 
void __attribute__((interrupt,no_auto_psv)) _DefaultInterrupt(void); 

#if defined(__PIC24E__) 

/* These are additional traps in the 24E family. Refer to the PIC24E 
migration guide. There are no Alternate Vectors in the 24E family. */ 
void __attribute__((interrupt,no_auto_psv)) _HardTrapError(void); 
void __attribute__((interrupt,no_auto_psv)) _DMACError(void); 
void __attribute__((interrupt,no_auto_psv)) _SoftTrapError(void); 

#endif 

/******************************************************************************/ 
/* Trap Handling                */ 
/*                   */ 
/* These trap routines simply ensure that the device continuously loops  */ 
/* within each routine. Users who actually experience one of these traps  */ 
/* can add code to handle the error. Some basic examples for trap code,  */ 
/* including assembly routines that process trap sources, are available at */ 
/* www.microchip.com/codeexamples            */ 
/******************************************************************************/ 

/* Primary (non-alternate) address error trap function declarations */ 
void __attribute__((interrupt,no_auto_psv)) _OscillatorFail(void) 
{ 
     INTCON1bits.OSCFAIL = 0;  /* Clear the trap flag */ 
     while(1); 
} 

void __attribute__((interrupt,no_auto_psv)) _AddressError(void) 
{ 
     INTCON1bits.ADDRERR = 0;  /* Clear the trap flag */ 
     while (1); 
} 
void __attribute__((interrupt,no_auto_psv)) _StackError(void) 
{ 
     INTCON1bits.STKERR = 0;   /* Clear the trap flag */ 
     while (1); 
} 

void __attribute__((interrupt,no_auto_psv)) _MathError(void) 
{ 
     INTCON1bits.MATHERR = 0;  /* Clear the trap flag */ 
     while (1); 
} 

#if defined(__PIC24F__)||defined(__PIC24H__) 

/* Alternate address error trap function declarations */ 
void __attribute__((interrupt,no_auto_psv)) _AltOscillatorFail(void) 
{ 
     INTCON1bits.OSCFAIL = 0;  /* Clear the trap flag */ 
     while (1); 
} 

void __attribute__((interrupt,no_auto_psv)) _AltAddressError(void) 
{ 
     INTCON1bits.ADDRERR = 0;  /* Clear the trap flag */ 
     while (1); 
} 

void __attribute__((interrupt,no_auto_psv)) _AltStackError(void) 
{ 
     INTCON1bits.STKERR = 0;   /* Clear the trap flag */ 
     while (1); 
} 

void __attribute__((interrupt,no_auto_psv)) _AltMathError(void) 
{ 
     INTCON1bits.MATHERR = 0;  /* Clear the trap flag */ 
     while (1); 
} 

#endif 

/******************************************************************************/ 
/* Default Interrupt Handler             */ 
/*                   */ 
/* This executes when an interrupt occurs for an interrupt source with an  */ 
/* improperly defined or undefined interrupt handling routine.    */ 
/******************************************************************************/ 
void __attribute__((interrupt,no_auto_psv)) _DefaultInterrupt(void) 
{ 
     while(1); 
} 

#if defined(__PIC24E__) 

/* These traps are new to the PIC24E family. Refer to the device Interrupt 
chapter of the FRM to understand trap priority. */ 
void __attribute__((interrupt,no_auto_psv)) _HardTrapError(void) 
{ 
    while(1); 
} 
void __attribute__((interrupt,no_auto_psv)) _DMACError(void) 
{ 
    while(1); 
} 
void __attribute__((interrupt,no_auto_psv)) _SoftTrapError(void) 
{ 
    while(1); 
} 

#endif