Mercurial > ~darius > hgwebdir.cgi > tempctrl
diff tempctrl.c @ 46:fb272cb82bcb
Add watchdog reset to timer IRQ.
Swap heat and cool bits by default.
Init to INT32_MIN so we don't get odd behaviour at startup.
Print out mode in tc list.
Silence compiler warning regarding PROGMEM pointers.
author | darius@Inchoate |
---|---|
date | Mon, 20 Oct 2008 22:21:21 +1030 |
parents | f219538d6ea7 |
children | 91e06007fe23 |
line wrap: on
line diff
--- a/tempctrl.c Mon Oct 20 22:11:18 2008 +1030 +++ b/tempctrl.c Mon Oct 20 22:21:21 2008 +1030 @@ -32,6 +32,7 @@ #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <avr/eeprom.h> +#include <avr/wdt.h> #include <util/crc16.h> #include "cons.h" @@ -103,8 +104,8 @@ .minheatontime = 60, .minheatofftime = 60, .mode = TC_MODE_AUTO, - .coolbits = _BV(7), - .heatbits = _BV(6), + .coolbits = _BV(6), + .heatbits = _BV(7), .idlebits = 0x00, .check_interval = 10, .stale_factor = 3 @@ -114,7 +115,7 @@ volatile static time_t now; /* Local function prototypes */ -static int gettemp(const PROGMEM char *name, uint8_t *ROM, int16_t *temp, uint8_t last); +static int gettemp(const char *name, uint8_t *ROM, int16_t *temp, uint8_t last); static void tempctrl_load_or_init_settings(void); static void tempctrl_default_settings(void); static void tempctrl_write_settings(void); @@ -154,6 +155,8 @@ */ ISR(TIMER0_COMP_vect) { + wdt_reset(); + now.usec += 8000; /* 1000000 * 1 / F_CPU / 1024 / 125 */ while (now.usec > 1000000) { now.usec -= 1000000; @@ -172,18 +175,18 @@ tempctrl_update(void) { /* State variables */ static int32_t checktime = 0; // Time of next check - static int32_t lastdata = -100000; // Last time we got data + static int32_t lastdata = INT32_MIN; // Last time we got data static int16_t fermenter_temp = 0; // Fermenter temperature static int16_t fridge_temp = 0; // Fridge temperature static int16_t ambient_temp = 0; // Ambient temperature - // These are inited like this so we will still heat/cool when - // now < settings.minheatofftime - static int32_t lastheaton = -100000; // Last time the heater was on - static int32_t lastheatoff = -100000; // Last time the heater was off - static int32_t lastcoolon = -100000; // Last time the cooler was on - static int32_t lastcooloff = -100000; // Last time the cooler was off + static int32_t lastheaton = INT32_MIN; // Last time the heater was on + static int32_t lastheatoff = INT32_MIN;// Last time the heater was off + static int32_t lastcoolon = INT32_MIN; // Last time the cooler was on + static int32_t lastcooloff = INT32_MIN;// Last time the cooler was off static char currstate = 'i'; // Current state + /* We init to times to INT32_MIN so that things function properly when + * now < settings.minheat/cool/on/offtime */ /* Temporary variables */ int32_t t; @@ -314,7 +317,7 @@ * Returns 1 if it was valid, 0 otherwise */ static int -gettemp(const PROGMEM char *name, uint8_t *ROM, int16_t *temp, uint8_t last) { +gettemp(const char *name, uint8_t *ROM, int16_t *temp, uint8_t last) { int16_t tmp; tmp = OWGetTemp(ROM); @@ -472,7 +475,7 @@ printf_P(PSTR("Fermenter ROM ID %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\r\n" "Fridge ROM ID %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\r\n" "Ambient ROM ID %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\r\n" - "Target - %d, Hystersis - %d\r\n" + "Mode - %c, Target - %d, Hystersis - %d\r\n" "Min heat overshoot - %d, Min cool overshoot - %d\r\n" "Min cool on time - %d, Min cool off time - %d\r\n" "Min heat on time - %d, Min heat off time - %d\r\n"), @@ -482,7 +485,7 @@ settings.fridge_ROM[4], settings.fridge_ROM[5], settings.fridge_ROM[6], settings.fridge_ROM[7], settings.ambient_ROM[0], settings.ambient_ROM[1], settings.ambient_ROM[2], settings.ambient_ROM[3], settings.ambient_ROM[4], settings.ambient_ROM[5], settings.ambient_ROM[6], settings.ambient_ROM[7], - settings.target_temp, settings.hysteresis, + settings.mode, settings.target_temp, settings.hysteresis, settings.minheatovershoot, settings.mincoolovershoot, settings.mincoolontime, settings.minheatontime, settings.minheatontime, settings.minheatofftime);