00001 /* FreeEMS - the open source engine management system 00002 * 00003 * Copyright 2009, 2010 Sean Keys, Fred Cooke 00004 * 00005 * This file is part of the FreeEMS project. 00006 * 00007 * FreeEMS software is free software: you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License as published by 00009 * the Free Software Foundation, either version 3 of the License, or 00010 * (at your option) any later version. 00011 * 00012 * FreeEMS software is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License 00018 * along with any FreeEMS software. If not, see http://www.gnu.org/licenses/ 00019 * 00020 * We ask that if you make any changes to this file you email them upstream to 00021 * us at admin(at)diyefi(dot)org or, even better, fork the code on github.com! 00022 * 00023 * Thank you for choosing FreeEMS to run your engine! 00024 */ 00025 00026 00048 #define LT1_360_8_C 00049 #include "inc/freeEMS.h" 00050 #include "inc/interrupts.h" 00051 #include "inc/DecoderInterface.h" 00052 #include "inc/LT1-360-8.h" 00053 00054 00055 unsigned short VCAS = 0; /* create our virtual Cam Angle Sensor */ 00056 00061 void LT1PTInit(void){ 00062 /* set pt1 to capture on rising and falling */ 00063 00064 } 00065 00066 00067 /* set overflow to 8 so that it will fire an interrupt on every 8th tooth, basically making it a 45tooth CAS */ 00072 void PrimaryRPMISR(void){ 00073 /* Clear the interrupt flag for this input compare channel */ 00074 TFLG = 0x01; 00075 00076 /* Save all relevant available data here */ 00077 // unsigned short codeStartTimeStamp = TCNT; /* Save the current timer count */ 00078 // unsigned short edgeTimeStamp = TC0; /* Save the edge time stamp */ 00079 unsigned char PTITCurrentState = PTIT; /* Save the values on port T regardless of the state of DDRT */ 00080 // unsigned short PORTS_BACurrentState = PORTS_BA; /* Save ignition output state */ 00081 00082 // unsigned char risingEdge; /* in LT1s case risingEdge means signal is high */ 00083 // if(fixedConfigs1.coreSettingsA & PRIMARY_POLARITY){ 00084 // risingEdge = PTITCurrentState & 0x01; 00085 // }else{ 00086 // risingEdge = !(PTITCurrentState & 0x01); 00087 // } 00088 00089 PORTJ |= 0x80; /* Echo input condition on J7 */ 00090 if(!isSynced){ /* If the CAS is not in sync get window counts so SecondaryRPMISR can set position */ 00091 if (PTITCurrentState & 0x02){ 00092 PrimaryTeethDuringHigh++; /* if low resolution signal is high count number of pulses */ 00093 }else{ 00094 PrimaryTeethDuringLow++; /* if low resolution signal is low count number of pulses */ 00095 } 00096 }else{ /* The CAS is synced and we need to update our 360/5=72 tooth wheel */ 00098 VCAS = VCAS + 10; /* Check/correct for 10deg of CAM movement */ 00100 } 00101 } 00102 00103 00110 void SecondaryRPMISR(void){ 00111 /* Clear the interrupt flag for this input compare channel */ 00112 TFLG = 0x02; 00113 00114 /* Save all relevant available data here */ 00115 // unsigned short codeStartTimeStamp = TCNT; /* Save the current timer count */ 00116 // unsigned short edgeTimeStamp = TC1; /* Save the timestamp */ 00117 unsigned char PTITCurrentState = PTIT; /* Save the values on port T regardless of the state of DDRT */ 00118 // unsigned short PORTS_BACurrentState = PORTS_BA; /* Save ignition output state */ 00119 unsigned char risingEdge; 00120 if(fixedConfigs1.coreSettingsA & PRIMARY_POLARITY){ 00121 risingEdge = PTITCurrentState & 0x01; 00122 }else{ 00123 risingEdge = !(PTITCurrentState & 0x01); 00124 } 00125 PORTJ |= 0x40; /* echo input condition */ 00126 00127 if (!isSynced & risingEdge){ /* If the CAS is not in sync get window counts and set virtual CAS position */ 00128 /* if signal is high that means we can count the lows */ 00129 switch (PrimaryTeethDuringLow){ 00130 case 23: /* wheel is at 0 deg TDC #1, set our virtual CAS to tooth 0 of 720 */ 00131 { 00132 VCAS = 0 ; 00133 changeSyncStatus((unsigned char) 1); 00134 break; 00135 } 00136 case 38: /* wheel is at 90 deg TDC #4, set our virtual CAS to tooth 180 of 720 */ 00137 { 00138 VCAS = 180; 00139 changeSyncStatus((unsigned char) 1); 00140 break; 00141 } 00142 case 33: /* wheel is at 180 deg TDC #6 set our virtual CAS to tooth 360 of 720 */ 00143 { 00144 VCAS = 360; 00145 changeSyncStatus((unsigned char) 1); 00146 break; 00147 } 00148 case 28: /* wheel is at 270 deg TDC #7 set our virtual CAS to tooth 540 of 720 */ 00149 { 00150 VCAS = 540; 00151 changeSyncStatus((unsigned char) 1); 00152 break; 00153 } 00154 default : 00155 { 00156 Counters.crankSyncLosses++; /* use crankSyncLosses variable to store number of invalid count cases while attempting to sync*/ 00157 break; 00158 } 00159 PrimaryTeethDuringLow = 0; /* In any case reset counter */ 00160 } 00161 } 00162 if(!isSynced & !risingEdge){/* if the signal is low that means we can count the highs */ 00163 switch (PrimaryTeethDuringHigh){ /* will need to additional code to off-set the initialization of PACNT since they are not 00164 evenly divisible by 5 */ 00165 case 7: /* wheel is at 52 deg, 7 deg ATDC #8 set our virtual CAS to tooth 104 of 720 */ 00166 { 00167 00168 break; 00169 } 00170 case 12: /* wheel is at 147 deg, 12 deg ATDC #3 set our virtual CAS to tooth 294 of 720 */ 00171 { 00172 00173 break; 00174 } 00175 case 17: /* wheel is at 242 deg, 17 deg ATDC #5 set our virtual CAS to tooth 484 of 720 */ 00176 { 00177 00178 break; 00179 } 00180 case 22: /* wheel is at 337 deg, 22 deg ATDC #2 set our virtual CAS to tooth 674 of 720 */ 00181 { 00182 00183 break; 00184 } 00185 default : 00186 { 00187 Counters.crankSyncLosses++; /* use crankSyncLosses variable to store number of invalid/default count cases while attempting to sync*/ 00188 break; 00189 } 00190 00191 } 00192 PrimaryTeethDuringHigh = 0; /* In any case reset counter */ 00193 } 00194 if(isSynced & risingEdge){ /* We are in sync and need to make sure our counts are good */ 00195 00196 /* System is synced so use adjusted count numbers to check sync */ 00198 } 00199 } 00200 // Counter.primaryTeethAfterSecondaryRise = 0; 00201 // Counter.primaryTeethAfterSecondaryFall = 0; 00202 00203 // unsigned char risingEdge; 00204 // if(fixedConfigs1.coreSettingsA & SECONDARY_POLARITY){ 00205 // risingEdge = PTITCurrentState & 0x02; 00206 // }else{ 00207 // risingEdge = !(PTITCurrentState & 0x02); 00208 // } 00209 00216 void changeSyncStatus(unsigned char synced){ 00217 if (synced != 1) { /* disable accumulator counter, so an ISR is fired on all 360 teeth */ 00218 PACTL = 0x00; /* disable PAEN and PBOIV */ 00219 /* (PACTL) 7 6 5 4 3 2 1 0 00220 PAEN PAMOD PEDGE CLK1 CLK0 PAOVI PAI */ 00221 }else{ /* enable accumulator so an ISR is only fired on every "5th tooth of the 360x track" */ 00222 // TIOS = TIOS & "0xCC0x83" WTF!?LOL!! 0x80; /* PT7 input */ 00223 // TCTL1 = TCTL1 & "0xCC0x83" WTF!?LOL!! 0xC0; /* Disconnect IC/OC logic from PT7 */ 00224 TIOS = TIOS & 0x80; /* PT7 input */ 00225 TCTL1 = TCTL1 & 0xC0; /* Disconnect IC/OC logic from PT7 */ 00227 PACN0 = 0xFB ; /* Calculation, $00 – $05 = $FB. This will overflow in 5 more edges. */ 00228 PACTL = 0x52; /* Enable PA in count mode, rising edge and interrupt on overflow 01010010 */ 00229 } 00230 }