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