From ccda41769f60beef4e2b01e409060787aad2b792 Mon Sep 17 00:00:00 2001 From: Alexander B Date: Fri, 8 Mar 2019 10:05:41 +0100 Subject: [PATCH] Fixed execution prior to tick, because of nextTick overflow before timer-overflow --- Geigerzaehler/main.c | 71 ++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/Geigerzaehler/main.c b/Geigerzaehler/main.c index a64f973..3711975 100644 --- a/Geigerzaehler/main.c +++ b/Geigerzaehler/main.c @@ -31,6 +31,7 @@ uint16_t signalOutput_led_nextTick = 0; // Prescaling of timer [timer-speed: cpu-clock / prescaler] // Modes: [1, 8, 64, 256, 1024] uint8_t timer1_prescaler = 256; +uint16_t timer1_overflow_value = (2^16) -1; // Just for info int main() { @@ -40,9 +41,6 @@ int main() // Inputs DDRD &= (0 << PORTD2); // Activate input PD2 DDRD &= (0 << PORTD3); // Activate input PD3 - //PORTD |= (1 << PORTD2); // Enable pull-up-resistor D2 - //PORTD |= (1 << PORTD3); // Enable pull-up-resistor D3 - // Todo [CRITICAL]: External pull-down resistors 10kOhm // Outputs DDRD |= (1 << PORTD4); @@ -69,50 +67,59 @@ int main() /* * HighVoltage boosting */ - if(boost_highVoltage_nextTick > 0 && (uint16_t)TCNT1 >= boost_highVoltage_nextTick) // If we are on or after the tick it should be executed + if(boost_highVoltage_nextTick > 0) // If there is a nextTick { - // Flip pin state - PORTD ^= (1 << PORTD4); - - // Calculate when next high/low should be set - boost_highVoltage_nextTick = (uint16_t)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 + if((uint16_t)TCNT1 >= boost_highVoltage_nextTick && ((uint16_t)TCNT1-boost_highVoltage_nextTick) < (timer1_overflow_value/2)) // If we are on or after the tick it should be executed + { + // Flip pin state + PORTD ^= (1 << PORTD4); + + // Calculate when next high/low should be set + boost_highVoltage_nextTick = (uint16_t)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 + } } /* * Signal output */ // Piezo - if(signalOutput_piezo_nextTick > 0 && (uint16_t)TCNT1 >= signalOutput_piezo_nextTick) // If we are on or after the tick it should be executed + if(signalOutput_piezo_nextTick > 0) // If there is a nextTick { - // Flip pin state - PORTD ^= (1 << PORTD5); - - if(!(PIND & (1 << PORTD5))) + if((uint16_t)TCNT1 >= signalOutput_piezo_nextTick && ((uint16_t)TCNT1-signalOutput_piezo_nextTick) < (timer1_overflow_value/2)) // If we are on or after the tick it should be executed { - // We are on low (again), disable further execution - signalOutput_piezo_nextTick = 0; + // Flip pin state + PORTD ^= (1 << PORTD5); + + if(!(PIND & (1 << PORTD5))) + { + // We are on low (again), disable further execution + signalOutput_piezo_nextTick = 0; + } + + // When the signal should next flip + signalOutput_piezo_nextTick = (uint16_t)TCNT1 + F_CPU/timer1_prescaler * signalOutput_piezo_time/1000; // Calculate nextTick based on time in ms + if(signalOutput_piezo_nextTick == 0) signalOutput_piezo_nextTick++; // If its 0, it stops, we dont want that } - - // When the signal should next flip - signalOutput_piezo_nextTick = (uint16_t)TCNT1 + F_CPU/timer1_prescaler * signalOutput_piezo_time/1000; // Calculate nextTick based on time in ms - if(signalOutput_piezo_nextTick == 0) signalOutput_piezo_nextTick++; // If its 0, it stops, we dont want that } // LED - if(signalOutput_led_nextTick > 0 && (uint16_t)TCNT1 >= signalOutput_led_nextTick) // If we are on or after the tick it should be executed + if(signalOutput_led_nextTick > 0) // If there is a nextTick { - // Flip pin state - PORTD ^= (1 << PORTD6); - - if(!(PIND & (1 << PORTD6))) + if((uint16_t)TCNT1 >= signalOutput_led_nextTick && ((uint16_t)TCNT1-signalOutput_led_nextTick) < (timer1_overflow_value/2)) // If we are on or after the tick it should be executed { - // We are on low (again), disable further execution - signalOutput_led_nextTick = 0; - } + // Flip pin state + PORTD ^= (1 << PORTD6); + + if(!(PIND & (1 << PORTD6))) + { + // We are on low (again), disable further execution + signalOutput_led_nextTick = 0; + } - // When the signal should next flip - signalOutput_led_nextTick = (uint16_t)TCNT1 + F_CPU/timer1_prescaler * signalOutput_led_time/1000; // Calculate nextTick based on time in ms - if(signalOutput_led_nextTick == 0) signalOutput_led_nextTick++; // If its 0, it stops, we dont want that + // When the signal should next flip + signalOutput_led_nextTick = (uint16_t)TCNT1 + F_CPU/timer1_prescaler * signalOutput_led_time/1000; // Calculate nextTick based on time in ms + if(signalOutput_led_nextTick == 0) signalOutput_led_nextTick++; // If its 0, it stops, we dont want that + } } }