Added comments
Split signalOutput to piezo- and led-part
This commit is contained in:
		
							parent
							
								
									246ccc8d5f
								
							
						
					
					
						commit
						e81bda822e
					
				@ -15,22 +15,28 @@
 | 
				
			|||||||
#include <avr/interrupt.h>
 | 
					#include <avr/interrupt.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Global variable declaration
 | 
					/*
 | 
				
			||||||
 | 
					 * Global variable declaration
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					// Set frequencys and general stuff
 | 
				
			||||||
uint16_t boost_frequency		= 2000;		// 2kHz frequency
 | 
					uint16_t boost_frequency		= 2000;		// 2kHz frequency
 | 
				
			||||||
uint16_t signalOutput_time = 200;		// 200ms
 | 
					uint16_t signalOutput_piezo_time	= 200;		// 200ms
 | 
				
			||||||
 | 
					uint16_t signalOutput_led_time		= 200;		// 200ms
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint8_t boost_highVoltage_nextHigh	=	1;
 | 
					// Used for execution-timing (with timer)	[0 = disabled,	>0 = nextTimerTick]	(1 is next avaible execution)
 | 
				
			||||||
uint16_t boost_highVoltage_nextTick	=	1;
 | 
					uint16_t boost_highVoltage_nextTick		=	1;	// Execute at start
 | 
				
			||||||
 | 
					uint16_t signalOutput_piezo_nextTick	=	0;
 | 
				
			||||||
 | 
					uint16_t signalOutput_led_nextTick		=	0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint8_t signalOutput_nextHigh	=	1;
 | 
					// Prescaling of timer [timer-speed: cpu-clock / prescaler]
 | 
				
			||||||
uint16_t signalOutput_nextTick	=	0;
 | 
					// Modes: [1, 8, 64, 256, 1024]
 | 
				
			||||||
 | 
					uint8_t timer1_prescaler = 256;
 | 
				
			||||||
uint8_t timer1_prescaler = 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t test = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main()
 | 
					int main()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Init
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
	// Inputs
 | 
						// Inputs
 | 
				
			||||||
    DDRD &= (0 << PORTD2);					// Activate input PD2
 | 
					    DDRD &= (0 << PORTD2);					// Activate input PD2
 | 
				
			||||||
    DDRD &= (0 << PORTD3);					// Activate input PD3
 | 
					    DDRD &= (0 << PORTD3);					// Activate input PD3
 | 
				
			||||||
@ -44,40 +50,29 @@ int main()
 | 
				
			|||||||
	DDRD |= (1 << PORTD6);
 | 
						DDRD |= (1 << PORTD6);
 | 
				
			||||||
	DDRB |= (1 << PORTB5);	// Onboard-Led
 | 
						DDRB |= (1 << PORTB5);	// Onboard-Led
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	// Interrupt for INT0	Pin-D2	High-voltage check
 | 
						// Interrupts
 | 
				
			||||||
 | 
						// for INT0	Pin-D2	High-voltage check
 | 
				
			||||||
    EICRA |= (0 << ISC01)|(1 << ISC00); // On at any edge		[Code: 01]
 | 
					    EICRA |= (0 << ISC01)|(1 << ISC00); // On at any edge		[Code: 01]
 | 
				
			||||||
    EIMSK |= (1 << INT0);				// Activate Interrupt INT0
 | 
					    EIMSK |= (1 << INT0);				// Activate Interrupt INT0
 | 
				
			||||||
    
 | 
						// for INT1	Pin-D3	Counter-click
 | 
				
			||||||
	// Interrupt for INT1	Pin-D3	Counter-click
 | 
					 | 
				
			||||||
    EICRA |= (1 << ISC11)|(1 << ISC10);	// On rising edge		[Code: 11]
 | 
					    EICRA |= (1 << ISC11)|(1 << ISC10);	// On rising edge		[Code: 11]
 | 
				
			||||||
    EIMSK |= (1 <<INT1);				// Activate Interrupt INT1
 | 
					    EIMSK |= (1 <<INT1);				// Activate Interrupt INT1
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	// Init timer1
 | 
						// Init timer1
 | 
				
			||||||
	timer1_init();
 | 
						timer1_init();
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
    sei();		// Activate global interrupts
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	// Endless loop
 | 
						// Endless loop
 | 
				
			||||||
    while (1) 
 | 
					    while (1) 
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
							cli();		// Deactivate global interrupts (before checks)
 | 
				
			||||||
 | 
									
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * HighVoltage boosting
 | 
							 * 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 && (uint16_t)TCNT1 >= boost_highVoltage_nextTick)	// If we are on or after the tick it should be executed
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			// Set pin according to next exec
 | 
								// Flip pin state
 | 
				
			||||||
			if(boost_highVoltage_nextHigh == 1)		
 | 
								PORTD ^= (1 << PORTD4);
 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				// Set it high
 | 
					 | 
				
			||||||
				PORTD |= (1 << PORTD4);
 | 
					 | 
				
			||||||
				boost_highVoltage_nextHigh = 0;	// Next is low
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			else  								
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				// Set it low
 | 
					 | 
				
			||||||
				PORTD |= (0 << PORTD4);
 | 
					 | 
				
			||||||
				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 = (uint16_t)TCNT1 + F_CPU/timer1_prescaler * 1/(boost_frequency/2);		// Half of time it should be high/low
 | 
								boost_highVoltage_nextTick = (uint16_t)TCNT1 + F_CPU/timer1_prescaler * 1/(boost_frequency/2);		// Half of time it should be high/low
 | 
				
			||||||
@ -87,29 +82,41 @@ int main()
 | 
				
			|||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * Signal output
 | 
							 * Signal output
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		if(signalOutput_nextTick > 0 && (uint16_t)TCNT1 >= signalOutput_nextTick)	// If we are on or after the tick it should be executed
 | 
							// Piezo
 | 
				
			||||||
 | 
							if(signalOutput_piezo_nextTick > 0 && (uint16_t)TCNT1 >= signalOutput_piezo_nextTick)	// If we are on or after the tick it should be executed
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			// Set pin according to next exec
 | 
								// Flip pin state
 | 
				
			||||||
			if(signalOutput_nextHigh == 1)		// Set it high
 | 
								PORTD ^= (1 << PORTD5);
 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				PORTD |= (1 << PORTD5);
 | 
					 | 
				
			||||||
				PORTD |= (1 << PORTD6);
 | 
					 | 
				
			||||||
				signalOutput_nextHigh = 0;	// Next is low
 | 
					 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
				// When the signal should stop
 | 
								if(!(PIND & (1 << PORTD5)))
 | 
				
			||||||
				signalOutput_nextTick = (uint16_t)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
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			else  								// Set it low
 | 
					 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				PORTD |= (0 << PORTD5);
 | 
									// We are on low (again), disable further execution
 | 
				
			||||||
				PORTD |= (0 << PORTD6);
 | 
									signalOutput_piezo_nextTick = 0;
 | 
				
			||||||
				signalOutput_nextHigh = 1;	// Next is high
 | 
								}
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
				signalOutput_nextTick = 0;	// Disable signalOutput
 | 
								// 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
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// 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
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						sei();		// Activate global interrupts (after checks) [when an interrupt was fired, it will now be executed]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* 
 | 
					/* 
 | 
				
			||||||
@ -149,7 +156,6 @@ void timer1_init()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Interrupt-handler
 | 
					 | 
				
			||||||
 * ISR - Interrupt service routine
 | 
					 * ISR - Interrupt service routine
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
// Address: 0x001	INT0	-	On any edge		[Code: 01]
 | 
					// Address: 0x001	INT0	-	On any edge		[Code: 01]
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user