#include "main.h" #include "spi.h" #include "muxer.h" #include "i2c_simple.h" #include "mcp_adc.h" #include "debug.h" #include "filter.h" #include "offset.h" #include #include #include uint16_t timertmp; uint16_t temperatures[4]; /* pinout * - i2c: * C5 * C4 * - multiplexer: * C3: inhibit * C0-C2: muxer select * * amp 0 is on muxer channel 2 */ /* initializes the hardware */ void hardinit() { // enable softtimer isr TCCR1A = _BV(WGM10); TCCR1B = _BV(WGM12) | _BV(CS11); // clk/8 prescaler, 4kHz PWM-freq. TIMSK1 |= _BV(TOIE1); spi_init(); muxer_init(); i2c_init(); sei(); } void softinit() { dbg_init(); stdout = &mystdout; printf("======= starting logging\n"); mcpadc_init(ADC_GAIN_2|ADC_CONV_CONT|ADC_BITS_16); offset_init(); } int __attribute__((noreturn)) main(void) { hardinit(); softinit(); /*muxer_set(1); offset_measure_start(1); for(;;);*/ int16_t data; for(;;){ printf("====== loop iteration\n"); // measure temps 5*2 times for(uint8_t i=0; i<5; i++) { printf("====== now measuring temps\n"); for(uint8_t active_sensor=0; active_sensor<2; active_sensor++) { // only measuring two probes atm printf("=== active sensor: %i\n",active_sensor); muxer_set(active_sensor); _delay_ms(1000); while(!mcpadc_has_new_data()) _delay_ms(10); mcpadc_get_data(); // first data after switch to trash while(!mcpadc_has_new_data()) _delay_ms(10); data = mcpadc_get_data(); process_thermocouple_value(data,active_sensor); } } // measure 2 offsets for(uint8_t active_sensor=0; active_sensor<2; active_sensor++) if(offset_measure[active_sensor]) { printf("=== measuring offset, sensor: %i\n",active_sensor); muxer_set(active_sensor); while(!mcpadc_has_new_data()) _delay_ms(10); mcpadc_get_data(); // first data after switch to trash while(!mcpadc_has_new_data()) _delay_ms(10); offset_val[active_sensor] = mcpadc_get_data(); while(offset_measure[active_sensor]) { offset_val[active_sensor] += mcpadc_get_data(); } } // measure ambient printf("====== now measuring ambient\n"); muxer_set(5); while(!mcpadc_has_new_data()) _delay_ms(10); mcpadc_get_data(); // first data after switch to trash while(!mcpadc_has_new_data()) _delay_ms(10); data = mcpadc_get_data(); process_ambient_value(data); } } ISR(TIMER1_OVF_vect,ISR_NOBLOCK){ timertmp=timer1_acc; timertmp++; /* the ATOMIC is acutally only needed if timer1_acc is never read from an ISR, which * is probably the case. * ATOMIC_FORCEON: the ISR_NOBLOCK sets sei() a few cycles before. */ ATOMIC_BLOCK(ATOMIC_FORCEON){ timer1_acc=timertmp; } }