#include <avr/io.h>
#include <avr/interrupt.h>
+#include <avr/eeprom.h>
#include <inttypes.h>
#include <math.h>
return(ret);
}
-void display(char num)
+void display(char num, char d0, char d1)
{
- dsp[0] = font[(num / 10) % 10];
- dsp[1] = font[num % 10];
+ dsp[0] = font[(num / 10) % 10] | (d0?SEGP:0);
+ dsp[1] = font[num % 10] | (d1?SEGP:0);
}
void disphex(unsigned char num)
unsigned long getticks(void)
{
- return(TCNT1 + (((unsigned long)oticks) << 16));
+ uint16_t v;
+ unsigned long r;
+
+ cli();
+ v = TCNT1;
+ r = v + (((unsigned long)oticks) << 16);
+ if((TIFR1 & 0x01) && !(v & 0x8000))
+ r += 0x10000;
+ sei();
+ return(r);
}
void ledcycle(void)
* t = B / l
* Note, temperature is in Kelvin
*/
-#define C 9.792934
+#define C 9.361168
#define B 4020.0
if(state == 0) {
if((mnow - last > 200000) && tavgok) {
int main(void)
{
- int state, cur;
+ int state, cur, run, rstate, delta;
unsigned long utime;
- state = 0;
- cur = 99;
+ state = 1;
+ cur = eeprom_read_byte(0);
+ if(cur < 0)
+ cur = 0;
+ if(cur > 100)
+ cur = 100;
+ run = 0;
+ rstate = 0;
+ utime = getticks();
init();
sei();
- display(0);
+ if(cur < 100)
+ display(cur, 0, 0);
+ else
+ dsp[0] = dsp[1] = SEGG;
while(1) {
mnow = getticks();
if(ktok) {
ktok = 0;
if((tempk >= 273) && (tempk <= 372)) {
- display(tempk - 273);
+ display(tempk - 273, 0, run);
} else {
- dsp[0] = dsp[1] = SEGG;
+ dsp[0] = SEGG;
+ dsp[1] = SEGG | (run?SEGP:0);
}
}
- if(pval != 0) {
+ if(pval != 0)
state = 1;
- utime = mnow;
- }
if(sstate == 2) {
sstate = 0;
- if(stime > 10) {
+ if(stime > 10)
state = 2;
- } else {
- tron = !tron;
- }
+ else
+ run = !run;
}
} else if(state == 1) {
- /* Triac control */
+ /* Temp setting */
if(pval != 0) {
cur += pval;
pval = 0;
if(cur < 0)
cur = 0;
- if(cur > 99)
- cur = 99;
- display(cur);
- trdelay = 99 - cur;
+ if(cur > 100)
+ cur = 100;
utime = mnow;
}
- if(mnow - utime > 1000000) {
+ if(mnow - utime > 2000000) {
state = 0;
+ eeprom_write_byte(0, cur);
}
if(sstate == 2) {
- tron = !tron;
+ run = !run;
sstate = 0;
}
+ if(cur < 100) {
+ display(cur, 0, run);
+ } else {
+ dsp[0] = SEGG;
+ dsp[1] = SEGG | (run?SEGP:0);
+ }
} else if(state == 2) {
+ /* Display raw temp time reading */
if(ttimea < 20000) {
- display((ttimea / 100) % 100);
- dsp[0] |= SEGP;
- if(ttimea >= 10000)
- dsp[1] |= SEGP;
+ display((ttimea / 100) % 100, 1, ttimea >= 10000);
} else {
- display(ttimea / 1000);
+ display(ttimea / 1000, 0, 0);
}
if(sstate == 2) {
state = 0;
sstate = 0;
}
}
+ /*
+ * Set Triac to match temperature
+ */
+ if(run) {
+ delta = cur - (tempk - 273);
+ if(rstate == 0) {
+ if(delta > 0) {
+ tron = 1;
+ if(delta > 8) {
+ /* For some reason, the Triac currently doesn't
+ * trigger on one of the AC half-cycles below 0.7
+ * ms. */
+ trdelay = 7;
+ } else {
+ trdelay = 75 - (delta * 5);
+ }
+ } else {
+ tron = 0;
+ rstate = 1;
+ }
+ } else if(rstate == 1) {
+ tron = 0;
+ if(delta >= 2)
+ rstate = 0;
+ }
+ } else {
+ tron = 0;
+ }
#endif
/*
dsp[0] = bindisp((ttimea & 0xff00) >> 8);