#define _ISR_C #include #include "typedefs.h" #include "mcu_pic18f4550.h" #include "isr.h" #include "mul.h" #include "main.h" #include "disp.h" #include "heater.h" #include "iron.h" #include "PID.h" volatile UINT8 ISRStep=0; volatile UINT8 ADCStep=0; volatile UINT8 ISRTicks=1; //increased on every mains period volatile ADCDataS ADCData; volatile UINT8 I2CStep=0; volatile I2CDataS I2CData; volatile SUINT32 PWM; volatile UINT8 PHEATER; volatile SUINT16 CTemp; volatile SUINT16 CRTemp; volatile SUINT16 CTTemp; volatile SUINT16 TAvg; volatile SUINT16 TAvgF; volatile SUINT16 TBuff[8]; volatile UINT8 TBPos=0; volatile SUINT16 TSlope; volatile SUINT16 SlopeBuff[8]; volatile UINT8 SBPos=0; volatile SUINT16 TAvgS; volatile SUINT16 Delta[2]; volatile UINT8 Starting = 1; //volatile static UINT16 ADCData[5]={0,0,0,0,0}; void interrupt ISRHigh(){ static UINT8 b; static SUINT16 w; if(PIR1bits.TMR1IF){ ISRStep=0; TMR1H=T_PER.ui8[1]; TMR1L=T_PER.ui8[0]; PIR1bits.TMR1IF=0; } if(PIR2bits.CMIF && PIE2bits.CMIE){ if(!CMCONbits.C1OUT){ ISRStep=0; TMR1H=T_PER.ui8[1]; TMR1L=T_PER.ui8[0]; COMPREF=3; } else{ COMPREF=2; } b=CMCON; PIR2bits.CMIF=0; } switch(ISRStep){ case 0: PIE2bits.CMIE=0; ADCON1bits.VCFG=0b00; //ADC reference = Vdd TMR0H=(~_timer_us(100))>>8; TMR0L=(~_timer_us(100)) & 0x00FF; T0CONbits.TMR0ON=1; break; case 1: INTCONbits.TMR0IF=0; T0CONbits.TMR0ON=0; _readADC(ADCH_ID); break; case 2: ADCData.VID.ui16=ADCRESULT; PIR1bits.ADIF=0; ADCON1bits.VCFG=0b01; //ADC reference = Vref TMR0H=(~_timer_us(100))>>8; TMR0L=(~_timer_us(100)) & 0x00FF; T0CONbits.TMR0ON=1; break; case 3: INTCONbits.TMR0IF=0; T0CONbits.TMR0ON=0; _readADC(ADCH_RT); break; case 4: ADCData.VRT.ui16-=(ADCData.VRT.ui16>>2); ADCData.VRT.ui16+=ADCRESULT; PIR1bits.ADIF=0; TMR0H=(~_timer_us(800))>>8; TMR0L=(~_timer_us(800)) & 0x00FF; T0CONbits.TMR0ON=1; HEATER=0; break; case 5: //LATB3=0; INTCONbits.TMR0IF=0; T0CONbits.TMR0ON=0; _readADC(ADCH_TEMP); break; case 6: //LATB3=1; ADCData.VTEMP[ADCStep].ui16=ADCRESULT; PIR1bits.ADIF=0; if(ADCStep & 1){ PIR1bits.CCP1IF=1; //CCP1 interrupt is used to run PID from lower priority ISR } else{ PWM.ui32+=PIDDuty.ui32; PHEATER=(PWM.ui8[3]!=0); PWM.ui8[3]=0; } ADCStep++; ADCStep&=3; if((ADCStep & 2)==0){ //offset or TC measurement CBAND=1; I2CData.Current.ui16=0; I2CData.Offset.ui16=0; } if(ADCStep & 1){ //heater resistance measurement CHSEL=0; I2CData.Gain.ui16=HR_GAIN; if(ADCStep & 2){ CBAND=HR_CBAND; I2CData.Current.ui16=HR_CURRENT; I2CData.Offset.ui16=ADCData.VTEMP[1].ui16; //exclude offset from measurement } }else //TC or resistive sensor measurement { CHSEL=IronPars.Channel; I2CData.Gain.ui16=IronPars.Gain.ui16; if(ADCStep & 2){ CBAND=IronPars.CBand; I2CData.Current.ui16=IronPars.Current.ui16; I2CData.Offset.ui16=ADCData.VTEMP[0].ui16+IronPars.Offset.ui16; } } _I2CStart; HEATER=PHEATER; _showChar(1); TMR0H=C_PER.i8[1]; TMR0L=C_PER.i8[0]; T0CONbits.TMR0ON=1; break; case 7: INTCONbits.TMR0IF=0; T0CONbits.TMR0ON=0; _showChar(2); TMR0H=C_PER.i8[1]; TMR0L=C_PER.i8[0]; T0CONbits.TMR0ON=1; break; case 8: INTCONbits.TMR0IF=0; T0CONbits.TMR0ON=0; _showChar(0); _readADC(ADCH_VIN); break; case 9: ADCData.VIN.ui16=ADCRESULT; PIR1bits.ADIF=0; b=CMCON; PIR2bits.CMIF=0; PIE2bits.CMIE=1; _showChar(3); TMR0H=C_PER.i8[1]; TMR0L=C_PER.i8[0]; T0CONbits.TMR0ON=1; break; case 10: _showChar(0); INTCONbits.TMR0IF=0; T0CONbits.TMR0ON=0; break; } //if(PIR1bits.ADIF){ // ADRES=ADRES; //PIR1bits.ADIF=0; //} if(ISRStep<255)ISRStep++; } void interrupt low_priority ISRlow(){ volatile static SUINT16 w; volatile static SUINT32 dw; volatile static SUINT32 pdt; //LATB3=!LATB3; if(PIR1bits.SSPIF){ switch(I2CStep){ //Set current pot position case 0: SSPCON2bits.SEN=1; break; case 1: SSPBUF=CPOT; break; case 2: SSPBUF=I2CData.Current.ui8[1] & 1; break; case 3: SSPBUF=I2CData.Current.ui8[0]; break; case 4: SSPCON2bits.PEN=1; break; //Set gain pot position case 5: SSPCON2bits.SEN=1; break; case 6: SSPBUF=GAINPOT; break; case 7: SSPBUF=I2CData.Gain.ui8[1] & 1; break; case 8: SSPBUF=I2CData.Gain.ui8[0]; break; case 9: SSPCON2bits.PEN=1; break; //Set offset case 10: SSPCON2bits.SEN=1; break; case 11: SSPBUF=OFFADC; break; case 12: SSPBUF=0b01011000; break; case 13: w.ui16=I2CData.Offset.ui16; w.ui16<<=6; SSPBUF=w.ui8[1]; break; case 14: w.ui16=I2CData.Offset.ui16; w.ui16<<=6; SSPBUF=w.ui8[0]; break; case 15: SSPCON2bits.PEN=1; break; default: I2CStep--; break; } I2CStep++; PIR1bits.SSPIF=0; } if(PIR1bits.CCP1IF){ LATB3=0; PIR1bits.CCP1IF=0; /**** GET ROOM TEMPERATURE **********************************************************/ GIE=0; w.ui16=ADCData.VRT.ui16; GIE=1; w.i16>>=2; w.i16-=125; mul16s8u(dw,w,182); CRTemp.i16=dw.mi16; /************************************************************************************/ /**** GET AND NORMALISE IRON TEMPRATURE *********************************************/ if(IronPars.Type){ GIE=0; w.ui16=ADCData.VTEMP[2].ui16; GIE=1; } else { GIE=0; w.ui16=ADCData.VTEMP[0].ui16; GIE=1; } mul16s16u(dw,IronPars.SoftGain,w); dw.hi24>>=2; dw.mi16+=IronPars.SoftOffset.i16; if(IronPars.Type==0)dw.mi16+=CRTemp.i16; if(dw.mi16<0)dw.mi16=0; CTemp.ui16=dw.mi16; /************************************************************************************/ if(Starting){ TAvg.ui16=0; for(w.i8[0]=0;w.ui8[0]<4;w.ui8[0]++){ TAvg.ui16+=CTemp.ui16; TBuff[w.ui8[0]].ui16=CTemp.ui16; } TAvgF.ui16=TAvg.ui16; TSlope.ui16=TAvg.ui16>>2; for(w.i8[0]=0;w.ui8[0]<4;w.ui8[0]++){ SlopeBuff[w.ui8[0]].ui16=TSlope.ui16; } TSlope.ui16=0; Starting=0; } TAvg.ui16-=TBuff[TBPos].ui16; TAvg.ui16+=CTemp.ui16; TBuff[TBPos].ui16=CTemp.ui16; TBPos++; TBPos&=3; TAvgF.ui16-=TAvgF.ui16>>2; TAvgF.ui16+=CTemp.ui16; SlopeBuff[SBPos].ui16=TAvg.ui16>>2; SBPos++; SBPos&=3; w.i16=TSlope.i16; if(w.i16<0)w.i16=-w.i16; w.ui16>>=2; if(TSlope.i16<0)w.i16=-w.i16; TSlope.i16-=w.i16; TSlope.i16-=SlopeBuff[(SBPos-1)&3].i16; TSlope.i16+=SlopeBuff[SBPos].i16; w.i16=TSlope.i16; if(w.i16<0)w.i16=-w.i16; w.ui16>>=2; mul16u8u(dw,w,IronPars.PID_DGain); dw.lui24>>=2; if(TSlope.i16<0)dw.i16[0]=-dw.i16[0]; Delta[1].i16=Delta[0].i16; Delta[0].i16=CTTemp.i16; Delta[0].i16-=(TAvgF.i16>>2); Delta[0].i16-=dw.i16[0]; Delta[0].i16<<=2; pdt.ui32=PIDDuty.ui32; mul16s16u(dw, Delta[0], IronPars.PID_K1); pdt.i32+=dw.i32; mul16s16u(dw, Delta[1], IronPars.PID_K2); pdt.i32-=dw.i32; if(pdt.i32<0){ pdt.i32=0; } else{ if(pdt.ui32>0x00FFFFFF){ pdt.ui32=0x00FFFFFF; } w.i16=-(Delta[0].i16>>2); if(w.i16<=0){ if(w.i16<-200)pdt.ui32=0x00FFFFFF; } else{ w.i16<<=4; if(w.i16>255)w.ui8[0]=255; w.ui8[0]=~w.ui8[0]; if(pdt.ui8[2]>w.ui8[0]){ pdt.ui8[2]=w.ui8[0]; pdt.ui16[0]=0xFFFF; } } } GIE=0; PIDDuty.ui32=pdt.ui32; GIE=1; /* if(PWM.i32<0){ PWM.i32=0; PWMCNT.lui24=0; } else{ SUINT16 w; if(PWM.ui32>0x00FFFFFF){ PWM.ui32=0x00FFFFFF; } w.i16=FPAVGT.i16-PTT.i16; if(w.i16<0){ if(w.i16<-200)PWM.ui32=0x00FFFFFF; } else{ w.i16<<=4; if(w.i16>255)w.ui8[0]=255; w.ui8[0]=~w.ui8[0]; if(PWM.ui8[2]>w.ui8[0]){ PWM.ui8[2]=w.ui8[0]; PWM.ui16[0]=0xFFFF; } w.i16=FPAVGT.i16-PTT.i16; } if(CTTemp==0)PWM.ui32=0; PWMCNT.ui32+=PWM.ui32; PHEATER=(PWMCNT.ui8[3]!=0); if(w.i16>40)PHEATER=0; if(CTemp>460)PHEATER=0; } PWMCNT.ui8[3]=0; */ /* SUINT16 w; if(PWM.ui32>0x00FFFFFF){ PWM.ui32=0x00FFFFFF; } w.i16=FPAVGT.i16-PTT.i16; if(w.i16<0){ if(w.i16<-200)PWM.ui32=0x00FFFFFF; } else{ w.i16<<=4; if(w.i16>255)w.ui8[0]=255; w.ui8[0]=~w.ui8[0]; if(PWM.ui8[2]>w.ui8[0]){ PWM.ui8[2]=w.ui8[0]; PWM.ui16[0]=0xFFFF; } w.i16=FPAVGT.i16-PTT.i16; } if(CTTemp==0)PWM.ui32=0; PWMCNT.ui32+=PWM.ui32; PHEATER=(PWMCNT.ui8[3]!=0); if(w.i16>40)PHEATER=0; if(CTemp>460)PHEATER=0; */ /* FPAVGT.i16=PAVGT.i16+dw.i16[0]; Delta[1].i16=Delta[0].i16; Delta[0].i16=(PTT.i16-FPAVGT.i16); if(Delta[0].i16<0)Delta[0].i16=-Delta[0].i16; Delta[0].i16<<=2; if(PTT.i16>ADC_AVG; for(SBPos=1;SBPos<(1<>ADC_AVG); TempAVG2.ui16+=ADVal.Val; TBPos++; TBPos&=((1<>ADC_AVG; SBPos++; SBPos&=((1<>(ADC_AVG+1); w.i16=TSlope.i16; if(w.i16<0)w.i16=-w.i16; w.i16>>=2; if(TSlope.i16<0)w.i16=-w.i16; TSlope.i16-=w.i16; TSlope.i16+=SlopeBuff[(SBPos-1)&((1<>ADC_AVG; PAVGT.ui16=TempAVG2.ui16>>ADC_AVG; PTT.ui16=CTTemp; PTT.ui16<<=2; w.i16=TSlope.i16; if(w.i16<0)w.i16=-w.i16; w.i16>>=2; dw.ui16[1]=0; dw.ui16[0]=w.ui8[0]*PIDDGAIN; dw.mui16+=w.ui8[1]*PIDDGAIN; dw.lui24>>=2; if(TSlope.i16<0)dw.i16[0]=-dw.i16[0]; FPAVGT.i16=PAVGT.i16+dw.i16[0]; Delta[1].i16=Delta[0].i16; Delta[0].i16=(PTT.i16-FPAVGT.i16); if(Delta[0].i16<0)Delta[0].i16=-Delta[0].i16; Delta[0].i16<<=2; if(PTT.i160x00FFFFFF){ PWM.ui32=0x00FFFFFF; } w.i16=FPAVGT.i16-PTT.i16; if(w.i16<0){ if(w.i16<-200)PWM.ui32=0x00FFFFFF; } else{ w.i16<<=4; if(w.i16>255)w.ui8[0]=255; w.ui8[0]=~w.ui8[0]; if(PWM.ui8[2]>w.ui8[0]){ PWM.ui8[2]=w.ui8[0]; PWM.ui16[0]=0xFFFF; } w.i16=FPAVGT.i16-PTT.i16; } if(CTTemp==0)PWM.ui32=0; PWMCNT.ui32+=PWM.ui32; PHEATER=(PWMCNT.ui8[3]!=0); if(w.i16>40)PHEATER=0; if(CTemp>460)PHEATER=0; } PWMCNT.ui8[3]=0; } ISRTicks++; break; default: LATC=8; IND2=0; IND1=0; HEATER=0; break; } ISRStep++; }*/