Added execution for highVoltage and signalOutput Added highVoltage boosting Added signal output
		
			
				
	
	
		
			146 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * geigerzaehler.c
 | 
						|
 *
 | 
						|
 * Created			:	28.02.2019 09:07:22
 | 
						|
 * Author			:	John Ditgens, Alexander Brandscheidt
 | 
						|
 * Git-Repository	:	https://gitea.Railduction.eu/JohnD/Geigerzaehler.git
 | 
						|
 *
 | 
						|
 * MController		:	AtMega328P
 | 
						|
 * Board			:	Arduino Nano
 | 
						|
 */ 
 | 
						|
#define F_CPU 20000000UL 				// Clock speed: 20 MHz	- Maximum of AtMega328P
 | 
						|
 | 
						|
// Macros
 | 
						|
#define bit_get(p,m) ((p) & (m))
 | 
						|
#define bit_set(p,m) ((p) |= (m))
 | 
						|
#define bit_clear(p,m) ((p) &= ~(m))
 | 
						|
#define bit_flip(p,m) ((p) ^= (m))
 | 
						|
#define bit_write(c,p,m) (c ? bit_set(p,m) : bit_clear(p,m))
 | 
						|
#define BIT(x) (0x01 << (x))
 | 
						|
#define LONGBIT(x) ((unsigned long)0x00000001 << (x))
 | 
						|
 | 
						|
// Imports
 | 
						|
#include <avr/io.h>
 | 
						|
#include <avr/interrupt.h>
 | 
						|
#include <stdint.h>
 | 
						|
 | 
						|
// Global variable declaration
 | 
						|
uint32_t currTick = 0;
 | 
						|
 | 
						|
bool enable_boost = false;
 | 
						|
bool boost_highVoltage_nextHigh = true;
 | 
						|
uint32_t boost_highVoltage_nextTick = 0;
 | 
						|
 | 
						|
bool enable_signalOutput = false;
 | 
						|
bool signal_Output_nextHigh = true;
 | 
						|
uint32_t signal_Output_nextTick = 0;
 | 
						|
 | 
						|
 | 
						|
int main()
 | 
						|
{
 | 
						|
    DDRD &= ~(1<<2); 					// Activate PD2
 | 
						|
    DDRD &= ~(1<<3);					// Activate PD3
 | 
						|
										
 | 
						|
	PORTD |= (1<<2);					// Enable pull-up-resistor Pin-D2
 | 
						|
	PORTD |= (1<<3);					// Enable pull-up-resistor Pin-D3
 | 
						|
	
 | 
						|
	// Interrupt for INT0	Pin-D2	High-voltage check
 | 
						|
    EICRA |= (0 << ISC01)|(1 << ISC00); // Only at any edge		[0|1]
 | 
						|
    EIMSK |= (1 << INT0);				// Activate Interrupt INT0
 | 
						|
    
 | 
						|
	// Interrupt for INT1	Pin-D3	Counter-click
 | 
						|
    EICRA |= (1 << ISC11)|(1 << ISC10);	// Only at rising edge		[1|1]
 | 
						|
    EIMSK |= (1 <<INT1);				// Activate Interrupt INT1
 | 
						|
	
 | 
						|
    sei();		// Activate global interrupts
 | 
						|
	
 | 
						|
	// Endless loop
 | 
						|
    while (1) 
 | 
						|
    {
 | 
						|
		// HighVoltage boosting
 | 
						|
		if(enable_boost)
 | 
						|
		{
 | 
						|
			if(currTick >= 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)		// Set it high
 | 
						|
				{
 | 
						|
					bit_set(PD4, 1);
 | 
						|
					boost_highVoltage_nextHigh = false;	// Next is low
 | 
						|
				}
 | 
						|
				else  								// Set it low
 | 
						|
				{
 | 
						|
					bit_set(PD4, 0);
 | 
						|
					boost_highVoltage_nextHigh = true;	// Next is high
 | 
						|
				}
 | 
						|
				
 | 
						|
				// Calculate when next high/low should be set
 | 
						|
				boost_highVoltage_nextTick = currTick + 101		// Todo: Add calculation for pin high/low time
 | 
						|
			}
 | 
						|
		}else
 | 
						|
		{
 | 
						|
			if(boost_highVoltage_nextTick > 0)		// If boosting is deactivated, but the nextTick was not reset yet
 | 
						|
			{
 | 
						|
				// Reset boost-state
 | 
						|
				bit_set(PD4, 0);
 | 
						|
				boost_highVoltage_nextHigh = true;
 | 
						|
				boost_highVoltage_nextTick = 0;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		
 | 
						|
		
 | 
						|
		// Signal output
 | 
						|
		if(enable_signalOutput)
 | 
						|
		{
 | 
						|
			if(currTick >= signal_Output_nextTick)	// If we are on or after the tick it should be executed
 | 
						|
			{
 | 
						|
				// Set pin according to next exec
 | 
						|
				if(boost_highVoltage_nextHigh)		// Set it high
 | 
						|
				{
 | 
						|
					bit_set(PD5, 1);
 | 
						|
					bit_set(PD6, 1);
 | 
						|
					boost_highVoltage_nextHigh = false;	// Next is low
 | 
						|
				}
 | 
						|
				else  								// Set it low
 | 
						|
				{
 | 
						|
					bit_set(PD5, 0);
 | 
						|
					bit_set(PD6, 0);
 | 
						|
					boost_highVoltage_nextHigh = true;	// Next is high
 | 
						|
				}
 | 
						|
				
 | 
						|
				// When the signal should stop
 | 
						|
				boost_highVoltage_nextTick = currTick + 101		// Todo: Add calculation for pin high/low time
 | 
						|
			}
 | 
						|
		}
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Interrupt-handler
 | 
						|
 * ISR - Interrupt service routine
 | 
						|
 */
 | 
						|
// Address: 0x001	INT0
 | 
						|
ISR(INT0_vect)
 | 
						|
{
 | 
						|
	if(PIND&0x20 == 0x00)	// Falling edge
 | 
						|
	{	
 | 
						|
		// Below ~400V, activate booster
 | 
						|
		enable_boost = true;
 | 
						|
	}
 | 
						|
	else					// Rising edge
 | 
						|
	{
 | 
						|
		// Reached ~400V, deactivate booster
 | 
						|
		enable_boost = false;
 | 
						|
	}
 | 
						|
	
 | 
						|
	reti();		// Exit interrupt-handler
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
ISR(INT1_vect)
 | 
						|
{
 | 
						|
	// Tick detected, signalOutput
 | 
						|
	enable_signalOutput = true;
 | 
						|
	
 | 
						|
	reti();		// Exit interrupt-handler
 | 
						|
} |