Two functions in the high priority interrupt.

Thread Starter

ahgan84

Joined Dec 19, 2011
55
Hi guys, I'm using the PIC18F46k22 mcu and I'm using two function in my high priority interrupt routine:

Code:
#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...
 
Last edited by a moderator:

ErnieM

Joined Apr 24, 2011
8,377
No. There should not be any routines called in the ISR since once you make even a single call then C assumes you need many more resources then you really do, and the routine isno longer fast and tight.

You can service many sources of interrupts, but don't use a call, use another structure such as if...else.

And don't touch the global interrupt flag inside the routine. The compiler will take care of that for you without fail.
 

ErnieM

Joined Apr 24, 2011
8,377
I can't show an example of NOT doing something.

You have three functions here: My_HiPrio_Int, Timer0_Irs, andRs485Init. Merge the code from the last two functions into the first.
 

MrChips

Joined Oct 2, 2009
30,806
Remove chk_isr(void).

There is no need to check which interrupt occurred. The two interrupts are independent and are handled by their own ISR.
 

ErnieM

Joined Apr 24, 2011
8,377
chk_isr(void) is certainly essential so leave that.

I also notice the memset function being called... write the code to remove that call too.
 
Top