Removed check if state is set, instead now it will use nextTick itself

Added switch-case to set timer1-bits according to prescaler
Fixed calculations for nextTick to match chaned code
master
Railz 6 years ago
parent 64280423fa
commit f50a14ccef

@ -17,17 +17,15 @@
// Global variable declaration // Global variable declaration
uint16_t boost_frequency = 2000; // 2kHz frequency uint16_t boost_frequency = 2000; // 2kHz frequency
uint16_t signalOutput_time = 200; // 200ms
uint8_t boost_enable = 0;
uint8_t boost_highVoltage_nextHigh = 1; uint8_t boost_highVoltage_nextHigh = 1;
uint16_t boost_highVoltage_nextTick = 0; uint16_t boost_highVoltage_nextTick = 0;
// Todo [CRITICAL]: Clock does not exist! Use timer.
uint8_t signalOutput_enable = 0;
uint8_t signalOutput_nextHigh = 1; uint8_t signalOutput_nextHigh = 1;
uint16_t signalOutput_nextTick = 0; uint16_t signalOutput_nextTick = 0;
uint8_t timer1_prescaler = 256;
int main() int main()
{ {
@ -59,42 +57,34 @@ int main()
// Endless loop // Endless loop
while (1) while (1)
{ {
// HighVoltage boosting /*
if(boost_enable == 1) * HighVoltage boosting
{ */
if(TCNT1 >= boost_highVoltage_nextTick) // If we are on or after the tick it should be executed if(boost_highVoltage_nextTick > 0 && TCNT1 >= boost_highVoltage_nextTick) // If we are on or after the tick it should be executed
{ {
// Set pin according to next exec // Set pin according to next exec
if(boost_highVoltage_nextHigh == 1) // Set it high if(boost_highVoltage_nextHigh == 1)
{ {
// Set it high
PORTD |= (1 << PORTD4); PORTD |= (1 << PORTD4);
boost_highVoltage_nextHigh = 0; // Next is low boost_highVoltage_nextHigh = 0; // Next is low
} }
else // Set it low else
{ {
// Set it low
PORTD |= (0 << PORTD4); PORTD |= (0 << PORTD4);
boost_highVoltage_nextHigh = 1; // Next is high boost_highVoltage_nextHigh = 1; // Next is high
} }
// Calculate when next high/low should be set // Calculate when next high/low should be set
boost_highVoltage_nextTick = TCNT1 + F_CPU/256 * 1/(boost_frequency/2); // Half of time it should be high/low boost_highVoltage_nextTick = TCNT1 + F_CPU/timer1_prescaler * 1/(boost_frequency/2); // Half of time it should be high/low
if(boost_highVoltage_nextTick == 0) boost_highVoltage_nextTick++; // If its 0, it stops, we dont want that
} }
}else
{
if(boost_highVoltage_nextTick > 0) // If boosting is deactivated, but the nextTick was not reset yet
{
// Reset boost-state
PORTD |= (0 << PORTD4);
boost_highVoltage_nextHigh = 1;
boost_highVoltage_nextTick = 0;
}
}
// Signal output /*
if(signalOutput_enable) * Signal output
{ */
if(TCNT1 >= signalOutput_nextTick) // If we are on or after the tick it should be executed if(signalOutput_nextTick > 0 && TCNT1 >= signalOutput_nextTick) // If we are on or after the tick it should be executed
{ {
// Set pin according to next exec // Set pin according to next exec
if(signalOutput_nextHigh == 1) // Set it high if(signalOutput_nextHigh == 1) // Set it high
@ -109,35 +99,49 @@ int main()
PORTD |= (0 << PORTD6); PORTD |= (0 << PORTD6);
signalOutput_nextHigh = 1; // Next is high signalOutput_nextHigh = 1; // Next is high
signalOutput_enable = 0; // Disable signalOutput signalOutput_nextTick = 0; // Disable signalOutput
} }
// When the signal should stop // When the signal should stop
signalOutput_nextTick = TCNT1 + F_CPU/256 * 0.2; // nextTick is in 0.2s signalOutput_nextTick = TCNT1 + F_CPU/timer1_prescaler * signalOutput_time/1000; // nextTick is in signalOutput_time in ms
} if(signalOutput_nextTick == 0) signalOutput_nextTick++; // If its 0, it stops, we dont want that
} }
} }
} }
/*
* Init timer1 (16-bit) in "normal mode"
*/
void timer1_init() void timer1_init()
{ {
// set up timer with prescaler = 256 // set up timer with speed: cpu-clock / prescaler
TCCR1B |= (1 << CS12); switch(timer1_prescaler){ // [CS12 CS11 CS10]
default:
case 1:
TCCR1B |= (1 << CS10); // [0 0 1 ]
break;
// initialize counter case 8:
TCNT1 = 0; TCCR1B |= (1 << CS11); // [0 1 0 ]
} break;
ISR(TIMER1_COMPA_vect){ case 64:
TCCR1B |= (1 << CS10); // [0 1 1 ]
TCCR1B |= (1 << CS11);
break;
//Code Kanal A Timer 1 case 256:
TCCR1B |= (1 << CS12); // [1 0 0 ]
break;
case 1024:
TCCR1B |= (1 << CS10); // [1 0 1 ]
TCCR1B |= (1 << CS12);
break;
} }
ISR(TIMER1_COMPB_vect){ // initialize counter
TCNT1 = 0;
//Code Kanal B Timer 1
} }
@ -152,12 +156,16 @@ ISR(INT0_vect)
if(!(PIND & (1 << PORTD2))) // Falling edge if(!(PIND & (1 << PORTD2))) // Falling edge
{ {
// Below ~400V, activate booster // Below ~400V, activate booster
boost_enable = 1; boost_highVoltage_nextTick = 1; // Run as soon as possible
} }
else // Rising edge else // Rising edge
{ {
// Reached ~400V, deactivate booster // Reached ~400V, deactivate booster
boost_enable = 0; boost_highVoltage_nextTick = 0;
// reset state
PORTD |= (0 << PORTD4); // pin on low
boost_highVoltage_nextHigh = 1; // next is high
} }
reti(); // Exit interrupt-handler reti(); // Exit interrupt-handler
@ -168,9 +176,7 @@ ISR(INT0_vect)
ISR(INT1_vect) ISR(INT1_vect)
{ {
// Tick detected, signalOutput // Tick detected, signalOutput
signalOutput_enable = 1; signalOutput_nextTick = 1; // Run as soon as possible
// Execute immediately
signalOutput_nextTick = 0;
reti(); // Exit interrupt-handler reti(); // Exit interrupt-handler
} }

Loading…
Cancel
Save