# HG changeset patch # User kripperger@CL-SEC241-09.cedarville.edu # Date 2013-04-10 18:07:19 # Node ID 29db24a20666ca8706935cac9a2f7c6a5c07e8eb # Parent 9ccd48e6d82c4e6bdaeb6caf47c00cf15d7c46c5 Geiger CPM averaging diff --git a/slave/slave/lib/geiger.c b/slave/slave/lib/geiger.c --- a/slave/slave/lib/geiger.c +++ b/slave/slave/lib/geiger.c @@ -12,23 +12,36 @@ #include "../config.h" #include #include "geiger.h" +#include "loopTimer.h" volatile uint8_t seconds; // Counts Seconds from Timer2 interrupt volatile uint16_t counts; // Counts the pulses -volatile uint16_t cpm; // Counts per minuite - +volatile uint16_t CPM; // Counts per Minuite +volatile uint32_t countStart = 0; +volatile uint8_t CPS[30]; // Counts per Second +volatile uint8_t i; ISR(TIMER2_OVF_vect) // Timer 2 overflow interrupt handler { // This executes every second. Update real-time clocks. // Used only in Geiger module + + // The following is a 30 second moving average of the CPS seconds++; if (seconds>=30) { - cpm = (counts*2); + CPM = 0; + for (i=0;i<30;i++) + { + CPM = CPM + CPS[i]; + } + CPM = CPM * 2; seconds = 0; - counts = 0; } + + CPS[seconds] = counts; + counts = 0; + } ISR(PCINT0_vect) // Interrupt on PA0 @@ -37,15 +50,19 @@ ISR(PCINT0_vect) // Interrupt on PA0 { // Interrupts when pulse received from Geiger tube counts++; // Increment counter. - led_toggle(2); - _delay_ms(5); + countStart = time_millis(); + + led_on(1); + io_piezoOn(); + + _delay_us(50); } } uint16_t geiger_getCpm() { - return cpm; + return CPM; } uint8_t geiger_getCount() //DEBUG @@ -53,6 +70,11 @@ uint8_t geiger_getCount() //DEBUG return counts; } +uint32_t geiger_getCountStart() +{ + return countStart; +} + void geiger_on() { // Turn the Flyback Transformer on diff --git a/slave/slave/lib/geiger.h b/slave/slave/lib/geiger.h --- a/slave/slave/lib/geiger.h +++ b/slave/slave/lib/geiger.h @@ -10,7 +10,8 @@ #define GEIGER_H_ uint16_t geiger_getCpm(); -uint8_t geiger_getCount(); //DEBUG +uint8_t geiger_getCount(); +uint32_t geiger_getCountStart(); void geiger_on(); void geiger_refresh(); diff --git a/slave/slave/lib/inputOutput.c b/slave/slave/lib/inputOutput.c --- a/slave/slave/lib/inputOutput.c +++ b/slave/slave/lib/inputOutput.c @@ -80,6 +80,16 @@ int8_t moduleID; // Slave Module ID from PORTB &= ~(1 << PB4); //OFF } + void io_piezoOn() + { + PORTA |= (1 << PA2); //ON + } + + void io_piezoOff() + { + PORTA &= ~(1 << PA2); //OFF + } + uint8_t io_heaterStatus() { uint8_t state; diff --git a/slave/slave/lib/inputOutput.h b/slave/slave/lib/inputOutput.h --- a/slave/slave/lib/inputOutput.h +++ b/slave/slave/lib/inputOutput.h @@ -16,6 +16,8 @@ uint8_t io_getModuleId(); // Gets ID and void io_heaterOn(); void io_heaterOff(); +void io_piezoOn(); +void io_piezoOff(); uint8_t io_heaterStatus(); void io_regulateTemp(); // Gets board temperature and enables heater if below threshold diff --git a/slave/slave/modules.c b/slave/slave/modules.c --- a/slave/slave/modules.c +++ b/slave/slave/modules.c @@ -90,8 +90,9 @@ void modules_geiger_setup() { // Pin setup - DDRA &= ~(1 << DDA0); // PA0 is an input - DDRA |= (1 << DDA1); // PA1 is an output + DDRA &= ~(1 << DDA0); // PA0 is an input for count interrupt + DDRA |= (1 << DDA1); // PA1 is an output for HV control + DDRA |= (1 << DDA2); // PA2 is an output for piezo geiger_on(); // Turn on HV supply @@ -144,11 +145,18 @@ // No data gatering function needed for geiger daughter board // This is taken care of in interrupt (See geiger.c) - //lastRefresh = time_millis(); - //if ((time_millis() - lastRefresh) > 1000000) - //{ - // geiger_refresh(); //Refreshes every 1000sec (16min) - //} + //lastRefresh = time_millis(); + //if ((time_millis() - lastRefresh) > 1000000) + //{ + // geiger_refresh(); //Refreshes every 1000sec (16min) + //} + + if ((time_millis() - geiger_getCountStart()) > 50) + { + led_off(1); + io_piezoOff(); + } + } diff --git a/slave/slave/slave.c b/slave/slave/slave.c --- a/slave/slave/slave.c +++ b/slave/slave/slave.c @@ -94,7 +94,7 @@ int main(void) io_regulateTemp(); // Gets board temperature and enables heater if below threshold - snprintf(buff,128,"|ModuleID: %u |BoardTemp: %i |Millis: %lu |Lux: %lu |Press: %lu |Altitude: %lu |Batt: %u |spiTemp: %i |Humidity: %u \r\n ",io_getModuleId(),sensors_getBoardTemp(),time_millis(),sensors_getLux(),sensors_getPressure(),sensors_getAltitude(),sensors_getBatt(),sensors_getSpiTemp(),sensors_getHumid()); //DEBUG + snprintf(buff,128,"|ModuleID: %u |BoardTemp: %i |Millis: %lu |Lux: %lu |Press: %lu |Altitude: %lu |Batt: %u |spiTemp: %i |CPM: %u \r\n ",io_getModuleId(),sensors_getBoardTemp(),time_millis(),sensors_getLux(),sensors_getPressure(),sensors_getAltitude(),sensors_getBatt(),sensors_getSpiTemp(),geiger_getCount()); //DEBUG serial1_sendString(buff); //DEBUG led_off(0);