2016-05-28 3 views
0

Я хочу настроить PIC24F32KA302 для перехода в спящий режим и просыпаться по прерыванию RTC. Однако после пробуждения моя программа запускается с самого начала. В техническом описании указано, что: - Если назначенный приоритет для прерывания меньше или равен текущему приоритету ЦП, устройство пробуждается и продолжает выполнение кода из инструкции, следующей за инструкцией PWRSAV, которая инициировала режим сна. - Если назначенный уровень приоритета для источника прерывания больше текущего приоритета ЦП, устройство начнет процесс пробуждения, и начнется процесс исключения ЦП. Исполнение кода будет продолжено с первой инструкции ISR. Я пробовал обе конфигурации, но результаты те же. Мой код ниже:PIC24F32KA302 Спящий режим

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;} 

Функция SYS_Init() инициализирует прерывания, RTC и другие периферийные модули. Эта функция всегда запускается после того, как устройство перейдет в спящий режим. У вас есть идеи или советы для меня? Спасибо

ответ

0

Возможно, произошли какие-то ошибки, вызвавшие перезагрузку вашего устройства.

Вы добавили процедуры ловушки? Если нет, добавьте этот код и посмотрите, попадете ли вы в одну из этих ловушек.

Также убедитесь, что у вас нет капли питания в вашей цепи, и что ваш сбросный контакт не получает какого-либо шума, вы можете добавить конденсатор 100 нФ между штифтом сброса и GND (конечно, держите pullup) ,

/******************************************************************************/ 
/* 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 
Смежные вопросы