2025-04-18 17:22:50 +02:00

69 lines
2.3 KiB
C++

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() {}