X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=kokare.c;h=35e5a0107026c18432e2dee8413f50300a6f8941;hb=c77327664d2a8fd272e91c2c99b8803ad123beb3;hp=c475e80a1797a8617ef982e21372f6fc0a8077b4;hpb=8086be2927a8723f47e1fc5e46493185108d7af2;p=kokare.git diff --git a/kokare.c b/kokare.c index c475e80..35e5a01 100644 --- a/kokare.c +++ b/kokare.c @@ -1,15 +1,16 @@ #include #include #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, @@ -30,38 +31,49 @@ uint8_t font[16] = { SEGA | SEGE | SEGF | SEGG, }; /* LED */ +#define LCDELAY 1000 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; +/* Conversion loop */ +int tempk; +volatile ktok = 0; /* Zero-cross detector*/ -char zok = 0; -unsigned long ztime; +volatile char zok = 0; +volatile char ztime = 0; /* Triac */ char trstate = 0; char tron = 0; -unsigned long trtime; -unsigned short trdelay = 0; +volatile char trtime; +volatile char trdelay = 0; void init(void) { - /* Timer init */ + /* Timer init + * Timer 0 cycles timing sensitive subsystems + * Timer 1 is used for global timing + */ + OCR0A = 100; + TCCR0A = 2; + TCCR0B = 1; + TIMSK0 = 2; TCCR1A = 0; TCCR1B = 1; TIMSK1 = 1; @@ -142,7 +154,7 @@ void ledcycle(void) static uint16_t last = 0; uint8_t c, d, v; - if(TCNT1 - last > 500) { + if(TCNT1 - last > LCDELAY) { last = TCNT1; if(++leda >= 8) { leda = 0; @@ -161,8 +173,10 @@ void ledcycle(void) } else { c = d = 0; } + cli(); PORTC = c; PORTD = (PORTD & 0x0f) | d; + sei(); } } @@ -170,13 +184,17 @@ void tempcycle(void) { if(tstate == 0) { if((PIND & 8) && (tlock == 0)) { + cli(); PORTD |= 2; + sei(); tstart = mnow; tstate = 1; } } else if(tstate == 1) { if(mnow - tstart > 1000) { + cli(); PORTD &= ~2; + sei(); tstate = 0; tstart = mnow; } @@ -193,20 +211,47 @@ void calcavg(void) } } -void triaccycle(void) +void convcycle(void) { - if(trstate == 0) { - if(tron && zok && (mnow > ztime + trdelay)) { - PORTD |= 1; - zok = 0; - trstate = 1; - trtime = mnow; - } - } else if(trstate == 1) { - if(mnow > trtime + 500) { - PORTD &= ~1; - trstate = 0; + static char state = 0; + static unsigned long last = 0; + static float a, ra, l, t; + + /* + * Theoretically: + * t = RC * ln(2) => R = t / (C * ln(2)) + * R = A * exp(B / T) => T = B / ln(R / A) + * T = B / ln(R / (A * C * ln(2))) + * In the following: + * a = ttimea as float + * C = 1e6 / (A * C * ln(2)) + * ra = a * C + * l = ln(ra) + * t = B / l + * Note, temperature is in Kelvin + */ +#define C 9.792934 +#define B 4020.0 + if(state == 0) { + if((mnow - last > 200000) && tavgok) { + a = (float)ttimea; + state = 1; + tavgok = 0; + last = mnow; } + } else if(state == 1) { + ra = a * C; + state = 2; + } else if(state == 2) { + l = log(ra); + state = 3; + } else if(state == 3) { + t = B / l; + state = 4; + } else if(state == 4) { + tempk = (int)t; + ktok = 1; + state = 0; } } @@ -226,29 +271,34 @@ int main(void) ledcycle(); tempcycle(); calcavg(); - triaccycle(); + convcycle(); -#if 0 +#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; + if(ktok) { + ktok = 0; + if((tempk >= 273) && (tempk <= 372)) { + display(tempk - 273); } else { - display(ttimea / 1000); + dsp[0] = dsp[1] = SEGG; } } if(pval != 0) { state = 1; utime = mnow; } + if(sstate == 2) { + sstate = 0; + if(stime > 10) { + state = 2; + } else { + tron = !tron; + } + } } else if(state == 1) { /* Triac control */ if(pval != 0) { @@ -259,16 +309,29 @@ int main(void) if(cur > 99) cur = 99; display(cur); - trdelay = 10000 - ((unsigned short)cur * 100); + trdelay = 99 - cur; utime = mnow; } if(mnow - utime > 1000000) { state = 0; } - } - if(sstate == 2) { - tron = !tron; - sstate = 0; + if(sstate == 2) { + tron = !tron; + sstate = 0; + } + } else if(state == 2) { + if(ttimea < 20000) { + display((ttimea / 100) % 100); + dsp[0] |= SEGP; + if(ttimea >= 10000) + dsp[1] |= SEGP; + } else { + display(ttimea / 1000); + } + if(sstate == 2) { + state = 0; + sstate = 0; + } } #endif /* @@ -291,8 +354,7 @@ int main(void) display(ttimea / 1000); } #endif -#if 1 -#endif +#if 0 /* * ZVD debug */ @@ -302,6 +364,7 @@ int main(void) display(cur); zok = 0; } +#endif #if 0 /* Phony Triac control @@ -313,13 +376,17 @@ int main(void) if(cur > 99) cur = 99; display(cur); - trdelay = 10000 - ((unsigned short)cur * 100); + trdelay = 99 - cur; pval = 0; } if(sstate == 2) { tron = !tron; sstate = 0; } + if(tron) + dsp[1] |= SEGP; + else + dsp[1] &= ~SEGP; #endif #if 0 /* @@ -341,13 +408,15 @@ int main(void) } else { display(cur); } + if(PINB & 4) + dsp[1] |= SEGP; #endif } } ISR(SIG_INTERRUPT0) { - ztime = getticks(); + ztime = 0; zok = 1; } @@ -366,6 +435,24 @@ ISR(SIG_INTERRUPT1) } } +ISR(SIG_OUTPUT_COMPARE0A) +{ + if(trstate == 0) { + ztime++; + if(tron && (ztime >= trdelay)) { + PORTD |= 1; + trstate = 1; + trtime = 0; + } + } else if(trstate == 1) { + trtime++; + if(trtime >= 5) { + PORTD &= ~1; + trstate = 0; + } + } +} + ISR(SIG_OVERFLOW1) { of = 1; @@ -374,22 +461,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 { @@ -403,7 +490,7 @@ ISR(SIG_PIN_CHANGE0) pstate = 0; } } else { - if((PINB & 2) && (PINB & 4)) + if((PINB & 2) && (PINB & 1)) pstate = 0; } }