const byte cam_pin = 2; //Interrupt pin for camshaft position (pin3) [datarange 0-255]
const byte tdc_pin = 3; //Interrupt pin for camshaft reference (pin2) [datarange 0-255]
const byte ign_pin = 13; //Interrupt pin for ignition (pin28) [datarange 0-255]
const byte led = 16;
const byte coil1=8;
const byte coil2=9;
const byte coil3=17;
const byte coil4=19;
volatile int out_count = 0;
volatile bool sync_achieve = 0, ign_on = 0;
void setup() {
// put your setup code here, to run once:
pinMode(led, OUTPUT);
pinMode(cam_pin, INPUT_PULLUP);
pinMode(tdc_pin, INPUT_PULLUP);
pinMode(ign_pin, INPUT_PULLUP);
pinMode(coil1, OUTPUT);
pinMode(coil2, OUTPUT);
pinMode(coil3, OUTPUT);
pinMode(coil4, OUTPUT);
all_off();
attachInterrupt(digitalPinToInterrupt(tdc_pin), tdc_detect, RISING);
}
void loop() {
while (sync_achieve == 0) {
digitalWrite(led, !digitalRead(led));
delay(300);
}
delay(500);
}
void tdc_detect() {
if (digitalRead(tdc_pin) == 1) {
sync_achieve = 1;
out_count = 3;
detachInterrupt(digitalPinToInterrupt(tdc_pin));
delayMicroseconds(500);
attachInterrupt(digitalPinToInterrupt(ign_pin), ign_detect, CHANGE);
}
}
void ign_detect() {
if (digitalRead(ign_pin) == 1 && ign_on == 0) {
ign_on = 1;
} else if (digitalRead(ign_pin) == 0 && ign_on == 1) {
ign_on = 0;
out_count += 1;
if (out_count > 3)
out_count = 0;
coil_out(out_count);
}
}
void all_off(){
digitalWrite(coil1,0);
digitalWrite(coil2,0);
digitalWrite(coil3,0);
digitalWrite(coil4,0);
}
void coil_out(int val){
all_off();
if(val==0)
digitalWrite(coil1,1);
else if(val==1)
digitalWrite(coil3,1);
else if(val==2)
digitalWrite(coil4,1);
else if(val==3)
digitalWrite(coil2,1);
digitalWrite(led, !digitalRead(led));
}