/* * 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 #include #include // Global variable declaration uint32_t currTick = 0; // Todo: Method/Interrupt to get the current-tick 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 [Code: 01] EIMSK |= (1 << INT0); // Activate Interrupt INT0 // Interrupt for INT1 Pin-D3 Counter-click EICRA |= (1 << ISC11)|(1 << ISC10); // Only at rising edge [Code: 11] EIMSK |= (1 <= 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(signal_Output_nextHigh) // Set it high { bit_set(PD5, 1); bit_set(PD6, 1); signal_Output_nextHigh = false; // Next is low } else // Set it low { bit_set(PD5, 0); bit_set(PD6, 0); signal_Output_nextHigh = true; // Next is high } // When the signal should stop signal_Output_nextTick = currTick + 101 // Todo: Add calculation for signalOutput low time } } } } /* * Interrupt-handler * ISR - Interrupt service routine */ // Address: 0x001 INT0 - Only at any edge [Code: 01] // Handles: Over/Below working voltage 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 } // Address: 0x002 INT1 - Only at rising edge [Code: 11] // Handles: Counter tube "tick" ISR(INT1_vect) { // Tick detected, signalOutput enable_signalOutput = true; // Execute immediately signal_Output_nextTick = 0; reti(); // Exit interrupt-handler }