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
This commit is contained in:
		
							parent
							
								
									64280423fa
								
							
						
					
					
						commit
						f50a14ccef
					
				@ -17,17 +17,15 @@
 | 
			
		||||
 | 
			
		||||
// Global variable declaration
 | 
			
		||||
uint16_t boost_frequency = 2000;		// 2kHz frequency
 | 
			
		||||
uint16_t signalOutput_time = 200;		// 200ms
 | 
			
		||||
 | 
			
		||||
uint8_t boost_enable	=	0;
 | 
			
		||||
uint8_t boost_highVoltage_nextHigh	=	1;
 | 
			
		||||
uint16_t boost_highVoltage_nextTick	=	0;
 | 
			
		||||
 | 
			
		||||
// Todo [CRITICAL]: Clock does not exist! Use timer.
 | 
			
		||||
 | 
			
		||||
uint8_t signalOutput_enable	=	0;
 | 
			
		||||
uint8_t signalOutput_nextHigh	=	1;
 | 
			
		||||
uint16_t signalOutput_nextTick	=	0;
 | 
			
		||||
 | 
			
		||||
uint8_t timer1_prescaler = 256;
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
@ -59,42 +57,34 @@ int main()
 | 
			
		||||
	// Endless loop
 | 
			
		||||
    while (1) 
 | 
			
		||||
    {
 | 
			
		||||
		// HighVoltage boosting
 | 
			
		||||
		if(boost_enable == 1)
 | 
			
		||||
		{
 | 
			
		||||
			if(TCNT1 >= boost_highVoltage_nextTick)	// If we are on or after the tick it should be executed
 | 
			
		||||
		/*
 | 
			
		||||
		 * HighVoltage boosting
 | 
			
		||||
		 */
 | 
			
		||||
		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
 | 
			
		||||
				if(boost_highVoltage_nextHigh == 1)		// Set it high
 | 
			
		||||
			if(boost_highVoltage_nextHigh == 1)		
 | 
			
		||||
			{
 | 
			
		||||
				// Set it high
 | 
			
		||||
				PORTD |= (1 << PORTD4);
 | 
			
		||||
				boost_highVoltage_nextHigh = 0;	// Next is low
 | 
			
		||||
			}
 | 
			
		||||
				else  								// Set it low
 | 
			
		||||
			else  								
 | 
			
		||||
			{
 | 
			
		||||
				// Set it low
 | 
			
		||||
				PORTD |= (0 << PORTD4);
 | 
			
		||||
				boost_highVoltage_nextHigh = 1;	// Next is high
 | 
			
		||||
			}
 | 
			
		||||
				
 | 
			
		||||
			// 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
 | 
			
		||||
			}
 | 
			
		||||
		}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;
 | 
			
		||||
			}
 | 
			
		||||
			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
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		// Signal output
 | 
			
		||||
		if(signalOutput_enable)
 | 
			
		||||
		{
 | 
			
		||||
			if(TCNT1 >= signalOutput_nextTick)	// If we are on or after the tick it should be executed
 | 
			
		||||
		/*
 | 
			
		||||
		 * Signal output
 | 
			
		||||
		 */
 | 
			
		||||
		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
 | 
			
		||||
			if(signalOutput_nextHigh == 1)		// Set it high
 | 
			
		||||
@ -109,37 +99,51 @@ int main()
 | 
			
		||||
				PORTD |= (0 << PORTD6);
 | 
			
		||||
				signalOutput_nextHigh = 1;	// Next is high
 | 
			
		||||
				
 | 
			
		||||
					signalOutput_enable = 0;	// Disable signalOutput
 | 
			
		||||
				signalOutput_nextTick = 0;	// Disable signalOutput
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			// 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()
 | 
			
		||||
{
 | 
			
		||||
	// set up timer with prescaler = 256
 | 
			
		||||
	// set up timer with speed: cpu-clock / prescaler
 | 
			
		||||
	switch(timer1_prescaler){		// [CS12	CS11	CS10]
 | 
			
		||||
		default:
 | 
			
		||||
		case 1:
 | 
			
		||||
			TCCR1B |= (1 << CS10);	// [0		0		1	]
 | 
			
		||||
			break;
 | 
			
		||||
		
 | 
			
		||||
		case 8:
 | 
			
		||||
			TCCR1B |= (1 << CS11);	// [0		1		0	]
 | 
			
		||||
			break;
 | 
			
		||||
		
 | 
			
		||||
		case 64:
 | 
			
		||||
			TCCR1B |= (1 << CS10);	// [0		1		1	]
 | 
			
		||||
			TCCR1B |= (1 << CS11);
 | 
			
		||||
			break;
 | 
			
		||||
		
 | 
			
		||||
		case 256:
 | 
			
		||||
			TCCR1B |= (1 << CS12);	// [1		0		0	]
 | 
			
		||||
			break;
 | 
			
		||||
			
 | 
			
		||||
		case 1024:
 | 
			
		||||
			TCCR1B |= (1 << CS10);	// [1		0		1	]
 | 
			
		||||
			TCCR1B |= (1 << CS12);
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// initialize counter
 | 
			
		||||
	TCNT1 = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ISR(TIMER1_COMPA_vect){
 | 
			
		||||
 | 
			
		||||
	//Code Kanal A Timer 1
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ISR(TIMER1_COMPB_vect){
 | 
			
		||||
 | 
			
		||||
	//Code Kanal B Timer 1
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Interrupt-handler
 | 
			
		||||
@ -152,12 +156,16 @@ ISR(INT0_vect)
 | 
			
		||||
	if(!(PIND & (1 << PORTD2)))	// Falling edge
 | 
			
		||||
	{	
 | 
			
		||||
		// Below ~400V, activate booster
 | 
			
		||||
		boost_enable = 1;
 | 
			
		||||
		boost_highVoltage_nextTick = 1;	//  Run as soon as possible
 | 
			
		||||
	}
 | 
			
		||||
	else					// Rising edge
 | 
			
		||||
	{
 | 
			
		||||
		// 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
 | 
			
		||||
@ -168,9 +176,7 @@ ISR(INT0_vect)
 | 
			
		||||
ISR(INT1_vect)
 | 
			
		||||
{
 | 
			
		||||
	// Tick detected, signalOutput
 | 
			
		||||
	signalOutput_enable = 1;
 | 
			
		||||
	// Execute immediately
 | 
			
		||||
	signalOutput_nextTick = 0;
 | 
			
		||||
	signalOutput_nextTick = 1;	//  Run as soon as possible
 | 
			
		||||
	
 | 
			
		||||
	reti();		// Exit interrupt-handler
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user