X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=kokare.c;h=8d151dfab08f9705bac3276a2500f83ff31a56e4;hb=cd17a21182462dcb2944ea2fe23ee3b833e4dae2;hp=b2c523715739dc16c79a17e6a0317b484842169e;hpb=882c9ed28852a4d774f40e9c7a71dff82105a074;p=kokare.git diff --git a/kokare.c b/kokare.c index b2c5237..8d151df 100644 --- a/kokare.c +++ b/kokare.c @@ -147,9 +147,36 @@ void disphex(unsigned char num) dsp[1] = font[num & 0x0f]; } +/* + * This version is used outside interrupts. + * It spins until no overflow has happened. + */ unsigned long getticks(void) { - return(TCNT1 + (((unsigned long)oticks) << 16)); + uint16_t v; + unsigned long r; + + do { + v = oticks; + r = TCNT1 + (((unsigned long)oticks) << 16); + } while(v != oticks); + return(r); +} + +/* + * This version is used in interrupts + */ +unsigned long getticks2(void) +{ + uint16_t v; + unsigned long r; + + v = TCNT1; + r = v + (((unsigned long)oticks) << 16); + if((TIFR1 & 0x01) && !(v & 0x8000)) + return(r + 0x10000); + else + return(r); } void ledcycle(void) @@ -254,11 +281,12 @@ void convcycle(void) int main(void) { - int state, cur; + int state, cur, run; unsigned long utime; state = 0; - cur = 99; + cur = 100; + run = 0; init(); sei(); display(0); @@ -283,39 +311,42 @@ int main(void) dsp[0] = dsp[1] = SEGG; } } - 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; } + if(run) + dsp[1] |= SEGP; + else + dsp[1] &= ~SEGP; } 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; + if(cur < 100) + display(cur); + else + dsp[0] = dsp[1] = SEGG; utime = mnow; } - if(mnow - utime > 1000000) { + if(mnow - utime > 1000000) state = 0; - } if(sstate == 2) { - tron = !tron; + run = !run; sstate = 0; } } else if(state == 2) { + /* Display raw temp time reading */ if(ttimea < 20000) { display((ttimea / 100) % 100); dsp[0] |= SEGP; @@ -329,6 +360,30 @@ int main(void) sstate = 0; } } + /* + * Set Triac to match temperature + */ + if(run) { + if(tempk - 273 < cur) { + tron = 1; + if(cur - (tempk - 273) > 5) { + /* For some reason, the Triac currently doesn't + * trigger on one of the AC half-cycles below 0.7 + * ms. */ + trdelay = 7; + } else if(cur - (tempk - 273) >= 3) { + trdelay = 20; + } else if(cur - (tempk - 273) >= 2) { + trdelay = 40; + } else { + trdelay = 70; + } + } else { + tron = 0; + } + } else { + tron = 0; + } #endif /* dsp[0] = bindisp((ttimea & 0xff00) >> 8); @@ -420,7 +475,7 @@ ISR(SIG_INTERRUPT1) { unsigned long now; - now = getticks(); + now = getticks2(); if(tstate == 0) { tstate = 1; if(tlock != 2)