X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=kokare.c;h=f63c642df60e9f2f2c6bf78bb8d3c89f3f1273dd;hb=26e5097c9b34ab31d5acdc01a7d2751cb8b2c8ee;hp=3bc4c4bf8ece55ab8010bfade48ca315ce537b44;hpb=495bea0626dfc90021733b8c8224c8e5d6a00103;p=kokare.git diff --git a/kokare.c b/kokare.c index 3bc4c4b..f63c642 100644 --- a/kokare.c +++ b/kokare.c @@ -2,14 +2,14 @@ #include #include -#define SEGA 128 -#define SEGB 64 -#define SEGC 4 -#define SEGD 16 -#define SEGE 32 -#define SEGF 2 -#define SEGG 1 -#define SEGP 8 +#define SEGA 4 +#define SEGB 2 +#define SEGC 1 +#define SEGD 32 +#define SEGE 64 +#define SEGF 16 +#define SEGG 8 +#define SEGP 128 uint8_t font[16] = { SEGA | SEGB | SEGC | SEGD | SEGE | SEGF, @@ -34,23 +34,24 @@ uint8_t dsp[2] = {0, 0}; char leda = 0; char ledc = 0; /* Timer */ -char of = 0; -int oticks = 0; +volatile char of = 0; +volatile int oticks = 0; unsigned long mnow; /* Pulse counter */ -char pstate = 0; +volatile char pstate = 0; char pval = 0; /* Switch */ -char sstate = 0; +volatile char sstate = 0; int stime = 0; /* Temp sensor */ -char tstate = 0; -char tlock = 0; +volatile char tstate = 0; +volatile char tlock = 0; unsigned long tstart; unsigned long ttime; unsigned long ttimea = 10000; +char tavgok = 0; /* Zero-cross detector*/ -char zok = 0; +volatile char zok = 0; unsigned long ztime; /* Triac */ char trstate = 0; @@ -70,7 +71,7 @@ void init(void) * B3..5 = ISP * B6..7 = CLK */ - DDRB = 0x30; + DDRB = 0x38; PORTB = 0x07; PCMSK0 = 0x07; PCICR = 0x01; @@ -188,6 +189,7 @@ void calcavg(void) tlock = 2; ttimea = ((ttimea * 15) + ttime) >> 4; tlock = 0; + tavgok = 1; } } @@ -210,9 +212,11 @@ void triaccycle(void) int main(void) { - int cur; + int state, cur; + unsigned long utime; - cur = 0; + state = 0; + cur = 99; init(); sei(); display(0); @@ -224,6 +228,49 @@ int main(void) calcavg(); triaccycle(); +#if 1 + /* + * User interface + */ + if(state == 0) { + /* Display temperature */ + if(tavgok) { + tavgok = 0; + if(ttimea < 20000) { + display((ttimea / 100) % 100); + dsp[0] |= SEGP; + if(ttimea >= 10000) + dsp[1] |= SEGP; + } else { + display(ttimea / 1000); + } + } + if(pval != 0) { + state = 1; + utime = mnow; + } + } else if(state == 1) { + /* Triac control */ + if(pval != 0) { + cur += pval; + pval = 0; + if(cur < 0) + cur = 0; + if(cur > 99) + cur = 99; + display(cur); + trdelay = 10000 - ((unsigned short)cur * 100); + utime = mnow; + } + if(mnow - utime > 1000000) { + state = 0; + } + } + if(sstate == 2) { + tron = !tron; + sstate = 0; + } +#endif /* dsp[0] = bindisp((ttimea & 0xff00) >> 8); dsp[1] = bindisp(ttimea & 0x00ff); @@ -244,7 +291,18 @@ int main(void) display(ttimea / 1000); } #endif -#if 1 +#if 0 + /* + * ZVD debug + */ + if(zok) { + if(++cur > 99) + cur = 0; + display(cur); + zok = 0; + } +#endif +#if 0 /* Phony Triac control */ @@ -262,6 +320,10 @@ int main(void) tron = !tron; sstate = 0; } + if(tron) + dsp[1] |= SEGP; + else + dsp[1] &= ~SEGP; #endif #if 0 /* @@ -283,6 +345,8 @@ int main(void) } else { display(cur); } + if(PINB & 4) + dsp[1] |= SEGP; #endif } } @@ -316,22 +380,22 @@ ISR(SIG_OVERFLOW1) ISR(SIG_PIN_CHANGE0) { - if((sstate == 0) & ((PINB & 1) == 0)) { + if((sstate == 0) && !(PINB & 4)) { stime = oticks; sstate = 1; } - if((sstate == 1) & ((PINB & 1) == 1)) { + if((sstate == 1) && (PINB & 4)) { stime = oticks - stime; sstate = 2; } if(pstate == 0) { if((PINB & 2) == 0) { pstate = 1; - } else if((PINB & 4) == 0) { + } else if((PINB & 1) == 0) { pstate = 2; } } else if(pstate == 1) { - if((PINB & 4) == 0) { + if((PINB & 1) == 0) { pval++; pstate = 3; } else { @@ -345,7 +409,7 @@ ISR(SIG_PIN_CHANGE0) pstate = 0; } } else { - if((PINB & 2) && (PINB & 4)) + if((PINB & 2) && (PINB & 1)) pstate = 0; } }