You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
3.0 KiB

#include "main.h"
#include "spi.h"
15 years ago
#include "muxer.h"
#include "i2c_simple.h"
#include "mcp_adc.h"
#include "debug.h"
#include "filter.h"
#include "offset.h"
#include <math.h>
15 years ago
#include <util/delay.h>
#include <stdio.h>
uint16_t timertmp;
uint16_t temperatures[4];
15 years ago
/* 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();
15 years ago
muxer_init();
i2c_init();
15 years ago
sei();
}
void softinit() {
mcpadc_init(ADC_GAIN_2|ADC_CONV_CONT|ADC_BITS_16);
dbg_init();
stdout = &mystdout;
15 years ago
printf("======= starting logging\n");
}
int __attribute__((noreturn)) main(void) {
hardinit();
softinit();
15 years ago
/*muxer_set(1);
offset_measure_start(1);
for(;;);*/
15 years ago
int16_t data;
for(;;){
15 years ago
printf("====== loop iteration\n");
15 years ago
// measure temps 5*2 times
for(uint8_t i=0; i<5; i++) {
15 years ago
printf("====== now measuring temps\n");
for(uint8_t active_sensor=0; active_sensor<2; active_sensor++) { // only measuring two probes atm
15 years ago
printf("=== active sensor: %i\n",active_sensor);
15 years ago
muxer_set(active_sensor);
15 years ago
_delay_ms(1000);
while(!mcpadc_has_new_data()) _delay_ms(10);
15 years ago
mcpadc_get_data(); // first data after switch to trash
while(!mcpadc_has_new_data()) _delay_ms(10);
15 years ago
data = mcpadc_get_data();
process_thermocouple_value(data,active_sensor);
}
}
15 years ago
// 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
15 years ago
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);
15 years ago
}
}
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;
}
}