Maker Pro
Maker Pro

Two functions in the high priority interrupt.

maniac84

Jun 19, 2013
7
Joined
Jun 19, 2013
Messages
7
i guys, I'm using the PIC18F46k22 mcu and I'm using two function in my high priority interrupt routine:

#pragma code
#pragma code My_HiPrio_Int=0x0008
#pragma code
#pragma interrupt chk_isr

#pragma code
void My_HiPrio_Int(void)
{
_asm
GOTO chk_isr
_endasm
}

void chk_isr(void) /*Serial Interrupt*/
{
INTCONbits.GIE = 0;

if(INTCONbits.TMR0IF==1) //Timer routine
Timer0_ISR();

if(PIR1bits.RC1IF) //RS485 receiver
RC_ISR();

INTCONbits.GIE = 1;


}


void Timer0_ISR(void)
{
nTick0++;

if(pSet == 0) nTickSetPress++;
else nTickSetPress = 0;

if(pPlus == 0) nTickPlusPress++;
else nTickPlusPress = 0;

if(pMinus == 0) nTickMinusPress++;
else nTickMinusPress = 0;

if(pShift == 0) nTickShfPress++;
else nTickShfPress = 0;

if(pCountPlus == 0) nTickCount++;
else nTickCount = 0;

if(pReset == 0) nTickResetPress++;
else nTickResetPress = 0;

if(bCdlyStart == 1) nCdlyCount++;
if(nCdlyCount >= nTickCdly) bCdlyStart = 0;

if(bDisplayTime == 1) nDisplayTimeCount++;

if(bBlinkDigitFast == 1) nTickBlinkFast++;

TMR0H = TMR0HValue;
TMR0L = TMR0LValue;
INTCONbits.TMR0IF = 0;
}


void RC_ISR(void)
{
rxbuf485 = RCREG1;

if (rxbuf485 == 0)
{
return;
}

if (rxbuf485 == TOKEN)
{
b485RxToken = 1;
return;
}

if (b485RxComplete) return;

if (!b485SOH)
{
if (rxbuf485 != SOH) return;
b485SOH = 1;
n485RxDataPos = 0;
b485RxComplete = 0;
memset (RS485RXDATA, 0, sizeof(RS485RXDATA));
return;
}
else if (rxbuf485 == EOT)
{
b485SOH = 0;
b485RxComplete = 1;
return;
}
if (n485RxDataPos == 50)
n485RxDataPos = 50;

if (n485RxDataPos>=RS485RXSIZE)
n485RxDataPos--;

RS485RXDATA[n485RxDataPos++] = rxbuf485;
return;

}

void Timer0Init(void)
{
T0CON = 0x07;
TMR0H = TMR0HValue;
TMR0L = TMR0LValue;
T0CONbits.TMR0ON = 1;
INTCONbits.TMR0IE = 1;
nTick0 = 0;
nTickSetPress = 0;
nTickResetPress = 0;
nTickCdly = 0;
nTickBlinkFast = 0;
}

void RS485Init(void)
{
TRISCbits.TRISC7=1; // RX
TRISCbits.TRISC6=0; // TX

TXSTA1 = 0x00;
RCSTA1 = 0x90;
SPBRG1 = 30;
BAUDCON1 = 0x00;
PIE1bits.RC1IE = 1;
TRISCbits.TRISC3 = 0;
p485 = 0;

memset (RS485RXDATA, 0, sizeof(RS485RXDATA));
}


Can two routine be done in a high priority interrupt? Will there be any problem in long term?
This is because I'm trying to find out why my device always hang after running a few days...
 

(*steve*)

¡sǝpodᴉʇuɐ ǝɥʇ ɹɐǝɥd
Moderator
Jan 21, 2010
25,510
Joined
Jan 21, 2010
Messages
25,510
My guess would be that your device doesn't handle interrupts while you're in an interrupt routine well (or that it has limited stack space -- or limited depth of function calls)

If interrupts come in too quickly, or in an unfortunate order, you may end up either trying to interrupt the interrupt routine. This may blow out your limited stack, or just get missed.

Your serial interrupt seems to be calling some significant amount of code. I would recommend that you simply set a flag in this interrupt routine and poll that flag in your main code. Alternatively, try to make the interrupt code as efficient and as fast as possible.
 

BobK

Jan 5, 2010
7,682
Joined
Jan 5, 2010
Messages
7,682
Do not manipulate GIE in your interrupt routine. This is done automatically by the hardware. When you set GIE within the interrupt routine, you have allowed another interrupt to occur before you have returned from the first handler, causing perhaps a stack overflow if the interrupts are coming to fast.

Bob
 
Top