Fixed execution prior to tick, because of nextTick overflow before timer-overflow
This commit is contained in:
		
							parent
							
								
									e81bda822e
								
							
						
					
					
						commit
						ccda41769f
					
				@ -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);
 | 
			
		||||
				
 | 
			
		||||
			// 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
 | 
			
		||||
				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
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
    }
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user