#include "inc/freeEMS.h"
#include "inc/interrupts.h"
#include "inc/LT1-360-8.h"
Go to the source code of this file.
Defines | |
#define | LT1_360_8_C |
Functions | |
void | LT1PTInit (void) |
void | PrimaryRPMISR (void) |
void | SecondaryRPMISR (void) |
Use the rising and falling edges................... | |
void | changeSyncStatus (unsigned char synced) |
Change the accumulator mode to overflow every 5 inputs on PT0 making our 360 tooth wheel interrupt like a 72 tooth wheel. | |
Variables | |
unsigned short | VCAS = 0 |
Uses PT1 to interrupt on rising and falling events of the 8x cam sensor track. A certain number of 360x teeth will pass while PT1 is in a high or low state. Using that uniquek count we can set the positing of your Virtual CAS clock. After VCAS's position is set set PT7 to only interrupt on every 5th tooth, lowering the amount of interrupts generated, to a reasonable level.
Definition in file LT1-360-8.c.
#define LT1_360_8_C |
Definition at line 48 of file LT1-360-8.c.
void changeSyncStatus | ( | unsigned char | synced | ) |
Change the accumulator mode to overflow every 5 inputs on PT0 making our 360 tooth wheel interrupt like a 72 tooth wheel.
PT0 Accumulator Mode
Definition at line 215 of file LT1-360-8.c.
References PACN0, PACTL, TCTL1, and TIOS.
Referenced by SecondaryRPMISR().
00215 { 00216 if (synced != 1) { /* disable accumulator counter, so an ISR is fired on all 360 teeth */ 00217 PACTL = 0x00; /* disable PAEN and PBOIV */ 00218 /* (PACTL) 7 6 5 4 3 2 1 0 00219 PAEN PAMOD PEDGE CLK1 CLK0 PAOVI PAI */ 00220 }else{ /* enable accumulator so an ISR is only fired on every "5th tooth of the 360x track" */ 00221 // TIOS = TIOS & "0xCC0x83" WTF!?LOL!! 0x80; /* PT7 input */ 00222 // TCTL1 = TCTL1 & "0xCC0x83" WTF!?LOL!! 0xC0; /* Disconnect IC/OC logic from PT7 */ 00223 TIOS = TIOS & 0x80; /* PT7 input */ 00224 TCTL1 = TCTL1 & 0xC0; /* Disconnect IC/OC logic from PT7 */ 00226 PACN0 = 0xFB ; /* Calculation, $00 – $05 = $FB. This will overflow in 5 more edges. */ 00227 PACTL = 0x52; /* Enable PA in count mode, rising edge and interrupt on overflow 01010010 */ 00228 } 00229 }
void LT1PTInit | ( | void | ) |
Setup PT Capturing so that we can decode the LT1 pattern
Definition at line 60 of file LT1-360-8.c.
void PrimaryRPMISR | ( | void | ) |
Primary RPM ISR
Definition at line 71 of file LT1-360-8.c.
References isSynced, PORTJ, PrimaryTeethDuringHigh, PrimaryTeethDuringLow, PTIT, TFLG, and VCAS.
00071 { 00072 /* Clear the interrupt flag for this input compare channel */ 00073 TFLG = 0x01; 00074 00075 /* Save all relevant available data here */ 00076 // unsigned short codeStartTimeStamp = TCNT; /* Save the current timer count */ 00077 // unsigned short edgeTimeStamp = TC0; /* Save the edge time stamp */ 00078 unsigned char PTITCurrentState = PTIT; /* Save the values on port T regardless of the state of DDRT */ 00079 // unsigned short PORTS_BACurrentState = PORTS_BA; /* Save ignition output state */ 00080 00081 // unsigned char risingEdge; /* in LT1s case risingEdge means signal is high */ 00082 // if(fixedConfigs1.coreSettingsA & PRIMARY_POLARITY){ 00083 // risingEdge = PTITCurrentState & 0x01; 00084 // }else{ 00085 // risingEdge = !(PTITCurrentState & 0x01); 00086 // } 00087 00088 PORTJ |= 0x80; /* Echo input condition on J7 */ 00089 if(!isSynced){ /* If the CAS is not in sync get window counts so SecondaryRPMISR can set position */ 00090 if (PTITCurrentState & 0x02){ 00091 PrimaryTeethDuringHigh++; /* if low resolution signal is high count number of pulses */ 00092 }else{ 00093 PrimaryTeethDuringLow++; /* if low resolution signal is low count number of pulses */ 00094 } 00095 }else{ /* The CAS is synced and we need to update our 360/5=72 tooth wheel */ 00097 VCAS = VCAS + 10; /* Check/correct for 10deg of CAM movement */ 00099 } 00100 }
void SecondaryRPMISR | ( | void | ) |
Use the rising and falling edges...................
Secondary RPM ISR
Definition at line 109 of file LT1-360-8.c.
References changeSyncStatus(), fixedConfig1::coreSettingsA, Counters, Counter::crankSyncLosses, fixedConfigs1, isSynced, PORTJ, PRIMARY_POLARITY, PrimaryTeethDuringHigh, PrimaryTeethDuringLow, PTIT, TFLG, and VCAS.
00109 { 00110 /* Clear the interrupt flag for this input compare channel */ 00111 TFLG = 0x02; 00112 00113 /* Save all relevant available data here */ 00114 // unsigned short codeStartTimeStamp = TCNT; /* Save the current timer count */ 00115 // unsigned short edgeTimeStamp = TC1; /* Save the timestamp */ 00116 unsigned char PTITCurrentState = PTIT; /* Save the values on port T regardless of the state of DDRT */ 00117 // unsigned short PORTS_BACurrentState = PORTS_BA; /* Save ignition output state */ 00118 unsigned char risingEdge; 00119 if(fixedConfigs1.coreSettingsA & PRIMARY_POLARITY){ 00120 risingEdge = PTITCurrentState & 0x01; 00121 }else{ 00122 risingEdge = !(PTITCurrentState & 0x01); 00123 } 00124 PORTJ |= 0x40; /* echo input condition */ 00125 00126 if (!isSynced & risingEdge){ /* If the CAS is not in sync get window counts and set virtual CAS position */ 00127 /* if signal is high that means we can count the lows */ 00128 switch (PrimaryTeethDuringLow){ 00129 case 23: /* wheel is at 0 deg TDC #1, set our virtual CAS to tooth 0 of 720 */ 00130 { 00131 VCAS = 0 ; 00132 changeSyncStatus((unsigned char) 1); 00133 break; 00134 } 00135 case 38: /* wheel is at 90 deg TDC #4, set our virtual CAS to tooth 180 of 720 */ 00136 { 00137 VCAS = 180; 00138 changeSyncStatus((unsigned char) 1); 00139 break; 00140 } 00141 case 33: /* wheel is at 180 deg TDC #6 set our virtual CAS to tooth 360 of 720 */ 00142 { 00143 VCAS = 360; 00144 changeSyncStatus((unsigned char) 1); 00145 break; 00146 } 00147 case 28: /* wheel is at 270 deg TDC #7 set our virtual CAS to tooth 540 of 720 */ 00148 { 00149 VCAS = 540; 00150 changeSyncStatus((unsigned char) 1); 00151 break; 00152 } 00153 default : 00154 { 00155 Counters.crankSyncLosses++; /* use crankSyncLosses variable to store number of invalid count cases while attempting to sync*/ 00156 break; 00157 } 00158 PrimaryTeethDuringLow = 0; /* In any case reset counter */ 00159 } 00160 } 00161 if(!isSynced & !risingEdge){/* if the signal is low that means we can count the highs */ 00162 switch (PrimaryTeethDuringHigh){ /* will need to additional code to off-set the initialization of PACNT since they are not 00163 evenly divisible by 5 */ 00164 case 7: /* wheel is at 52 deg, 7 deg ATDC #8 set our virtual CAS to tooth 104 of 720 */ 00165 { 00166 00167 break; 00168 } 00169 case 12: /* wheel is at 147 deg, 12 deg ATDC #3 set our virtual CAS to tooth 294 of 720 */ 00170 { 00171 00172 break; 00173 } 00174 case 17: /* wheel is at 242 deg, 17 deg ATDC #5 set our virtual CAS to tooth 484 of 720 */ 00175 { 00176 00177 break; 00178 } 00179 case 22: /* wheel is at 337 deg, 22 deg ATDC #2 set our virtual CAS to tooth 674 of 720 */ 00180 { 00181 00182 break; 00183 } 00184 default : 00185 { 00186 Counters.crankSyncLosses++; /* use crankSyncLosses variable to store number of invalid/default count cases while attempting to sync*/ 00187 break; 00188 } 00189 00190 } 00191 PrimaryTeethDuringHigh = 0; /* In any case reset counter */ 00192 } 00193 if(isSynced & risingEdge){ /* We are in sync and need to make sure our counts are good */ 00194 00195 /* System is synced so use adjusted count numbers to check sync */ 00197 } 00198 }
unsigned short VCAS = 0 |