/* * 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 16000000UL // Clock speed: 16 MHz - Speed from onboard oscillator // Imports #include #include #include // Global variable declaration uint16_t boost_frequency = 2000; // 2kHz frequency uint8_t boost_enable = 0; uint8_t boost_highVoltage_nextHigh = 1; clock_t boost_highVoltage_nextTick = 0; // Todo [CRITICAL]: Clock does not exist! Use timer. uint8_t signalOutput_enable = 0; uint8_t signalOutput_nextHigh = 1; clock_t signalOutput_nextTick = 0; 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); DDRD |= (1 << PORTD5); DDRD |= (1 << PORTD6); // Interrupt for INT0 Pin-D2 High-voltage check EICRA |= (0 << ISC01)|(1 << ISC00); // On at any edge [Code: 01] EIMSK |= (1 << INT0); // Activate Interrupt INT0 // Interrupt for INT1 Pin-D3 Counter-click EICRA |= (1 << ISC11)|(1 << ISC10); // On 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 == 1) // 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 boost_highVoltage_nextTick = clock() + F_CPU * 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; } } // Signal output if(signalOutput_enable) { if(clock() >= 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 { PORTD |= (1 << PORTD5); PORTD |= (1 << PORTD6); signalOutput_nextHigh = 0; // Next is low } else // Set it low { PORTD |= (0 << PORTD5); PORTD |= (0 << PORTD6); signalOutput_nextHigh = 1; // Next is high signalOutput_enable = 0; // Disable signalOutput } // When the signal should stop signalOutput_nextTick = clock() + F_CPU * 0.2; // nextTick is in 0.2s } } } } /* * Interrupt-handler * ISR - Interrupt service routine */ // Address: 0x001 INT0 - On any edge [Code: 01] // Handles: Over/Below working voltage ISR(INT0_vect) { if(!(PIND & (1 << PORTD2))) // Falling edge { // Below ~400V, activate booster boost_enable = 1; } else // Rising edge { // Reached ~400V, deactivate booster boost_enable = 0; } reti(); // Exit interrupt-handler } // Address: 0x002 INT1 - On rising edge [Code: 11] // Handles: Counter tube "tick" ISR(INT1_vect) { // Tick detected, signalOutput signalOutput_enable = 1; // Execute immediately signalOutput_nextTick = 0; reti(); // Exit interrupt-handler }