unsigned int vinSlopeCounter = 0; unsigned int posRefSlopeCounter = 0; unsigned int negRefSlopeCounter = 0; unsigned int vinBaseSlope = 2; // * 255 byte nextSlopeAction = 0; double accumulator = 0; // RES CLK = PORTD B7 // RST SW = PORTD B5 // SLOPEIN1 = PORTD B2 // SLOPEUP1 = PORTD B1 // SLOPEDN1 = PORTD B0 #define BLANKEDREG 0b00000000 #define ENABLEINT 0b00000001 #define SLOPESAMPLE 0b10000000 #define SLOPERST 0b00100000 #define SLOPEDN1 0b00000001 #define SLOPEUP1 0b00000010 #define SLOPEIN1 0b00000100 #define SLOPEHOLD1 0b00000011 void startConv() { PORTD = SLOPERST; //reset charge PORTD = BLANKEDREG; //release reset PORTD = SLOPESAMPLE; //sample residual charge PORTD = BLANKEDREG; EICRA = ENABLEINT; //enable interrupt for zerocrossing, pin D2 (INT0) TCCR1A = BLANKEDREG; TCCR1B = BLANKEDREG; //DataReg = tmpControlPinBank; //read charge value } void stopConv() { PORTD = BLANKEDREG; //release reset PORTD = SLOPESAMPLE; //sample residual charge PORTD = BLANKEDREG; //send clock to sample charge //DataReg = tmpControlPinBank; //read charge value EICRA = BLANKEDREG; //disable interrupt for zerocrossing, pin D2 (INT0) } ISR(TIMER1_COMPA_vect) { // if 16b timer1 match // Decide to slope up or down, takes n clocks if(PORTD & 0b1000000) // if comparator 1 (ADC could also be used) { nextSlopeAction = SLOPEDN1; }// slope down else { nextSlopeAction = SLOPEUP1; }// slope up PORTD = SLOPEHOLD1; // hold pattern EICRA = ENABLEINT; //interrupt for zerocrossing, pin D2 PORTD = nextSlopeAction; // set slope down or up vinSlopeCounter = TCNT1H >> 8 + TCNT1L + 7; } ISR(INT0_vect) { EICRA = BLANKEDREG; // no more interrupt for 0 cross PORTD = SLOPEHOLD1; // hold pattern PORTD = SLOPEIN1; // slope up/down to Vin for n clock // now it is sloping again, compensate the clocks the transition OCR1AH = OCR1AH + vinBaseSlope; // set next slope timer //timerreg = timerreg - x; } void setup() { startConv(); delay(10); stopConv(); } void loop() {}