'**************************************************************** '* Name : ecu1.BAS * '* Author : Leigh Windridge * '* Notice : Copyright (c) 2004 Ten 4 Technology Ltd * '* : All Rights Reserved * '* Date : 18/04/2004 * '* Version : 1.5 * '* Notes : * '* : * '**************************************************************** DEFINE LOADER_USED 1 ' Optional, allows use of melabs Loader DEFINE HSER_TXSTA 20h DEFINE HSER_BAUD 4800 Define LCD_DREG PORTD Define LCD_DBIT 4 Define LCD_RSREG PORTE Define LCD_RSBIT 0 Define LCD_EREG PORTE Define LCD_EBIT 1 capture VAR PIR1.2 ' CCP1 capture flag overflow VAR PIR1.0 ' Timer1 overflow flag period VAR WORD ' Word variable that stores the value RPS var word RPM var word dummy var word uSDeg var byte RPMidx var byte RPMVal var word CAS var word ' Crank Angle Sensor pulse AFM var word ' AFM input AirTemp var word ' Air Temp Sensor Input ' Start onboard HPWM to simulate Tach input CAS = 250 'hpwm 0,97, CAS TRISA = %11111111 ' Set PORTA to all input ADCON1 = %00000010 ' Set PORTA analog and LEFT justify result CCP1CON = %00000110 ' Enable the CCP1 capture, every 4th falling edge T1CON = %00010001 ' TMR1 prescale=1:2 Low PORTE.2 ' LCD R/W line low (W) Pause 500 ' Wait for LCD to start up loop: IF (capture = 0) Then loop ' Wait here until captured period.lowbyte = CCPR1L ' Store the captured value in period.highbyte = CCPR1H ' period variable IF overflow = 0 Then ' Skip the output if the timer overflowed dummy = period rpm = 1000 rpm = rpm * rpm rpm = div32 dummy rpm = rpm * 60 rpm = div32 20 uSDEG = dummy/360 rps = rpm/60 EndIF capture = 0 ' Clear the capture flag ADCON0 = %11001001 ' Configure and turn on A/D Module Pauseus 5 ' Wait .5 second ADCON0.2 = 1 ' Start Conversion Air_Temp: If ADCON0.2 = 1 Then air_temp ' Wait for low on bit-2 of ADCON0, conversion finished airtemp=ADRESH ' Read 8-bit Result if airtemp>0 then airtemp=(5000/256)*airtemp ADCON0 = %11000001 ' Configure and turn on A/D Module Pauseus 5 ' Wait .5 second ADCON0.2 = 1 ' Start Conversion AirFlow: If ADCON0.2 = 1 Then AirFlow ' Wait for low on bit-2 of ADCON0, conversion finished AFM=ADRESH ' Read 8-bit Result if afm>0 then afm=(5000/256)*afm ' Perform lookup to nearest 100RPM lookdown2 rpm,<=[500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400,2500,2600,2700,2800,2900,3000,3100,3200,3300,3400,3500,3600,3700,3800,3900,4000,4100,4200,4300,4400,4500,4600,4700,4800,4900,5000,5100,5200,5300,5400,5500,5600,5700,5800,5900,6000,6100,6200,6300,6400,6500,6600,6700,6800,6900,7000,7100,7200,7300,7400,7500],rpmidx lookup2 rpmidx,[500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400,2500,2600,2700,2800,2900,3000,3100,3200,3300,3400,3500,3600,3700,3800,3900,4000,4100,4200,4300,4400,4500,4600,4700,4800,4900,5000,5100,5200,5300,5400,5500,5600,5700,5800,5900,6000,6100,6200,6300,6400,6500,6600,6700,6800,6900,7000,7100,7200,7300,7400,7500],rpmval Lcdout $fe, 1 Lcdout "R", #rpmval,",M:", #rpm lcdout $fe,$c0,"A:",#afm,",T:",#airtemp ' Output reset: IF (capture = 0) Then reset ' Wait for beginning of next period TMR1L = 0 ' Clear Timer1 low register TMR1H = 0 ' Clear Timer1 high register capture = 0 ' Clear capture flag overflow = 0 ' Clear overflow flag GoTo loop ' Do it forever