Added temperature conversion loop and Celsius display.
authorFredrik Tolf <fredrik@dolda2000.com>
Sat, 30 Jun 2007 18:29:45 +0000 (18:29 +0000)
committerFredrik Tolf <fredrik@dolda2000.com>
Sat, 30 Jun 2007 18:29:45 +0000 (18:29 +0000)
Makefile
kokare.c

index 03e831b..906c8f1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -21,7 +21,7 @@ program: kokare.hex
 #      avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 $< $@
 
 kokare.elf: kokare.o
-       avr-gcc $> -o $@ $(MLDFLAGS)
+       avr-gcc $> -o $@ $(MLDFLAGS) -lm
 
 .c.o:
        avr-gcc -c $(MCFLAGS) $< -o $@
index f63c642..12fbf9a 100644 (file)
--- a/kokare.c
+++ b/kokare.c
@@ -1,6 +1,7 @@
 #include <avr/io.h>
 #include <avr/interrupt.h>
 #include <inttypes.h>
+#include <math.h>
 
 #define SEGA 4
 #define SEGB 2
@@ -30,6 +31,7 @@ uint8_t font[16] = {
     SEGA | SEGE | SEGF | SEGG,
 };
 /* LED */
+#define LCDELAY 1000
 uint8_t dsp[2] = {0, 0};
 char leda = 0;
 char ledc = 0;
@@ -50,6 +52,9 @@ unsigned long tstart;
 unsigned long ttime;
 unsigned long ttimea = 10000;
 char tavgok = 0;
+/* Conversion loop */
+int tempk;
+volatile ktok = 0;
 /* Zero-cross detector*/
 volatile char zok = 0;
 unsigned long ztime;
@@ -142,7 +147,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;
@@ -193,6 +198,49 @@ void calcavg(void)
     }
 }
 
+void convcycle(void)
+{
+    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;
+       }
+    } 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;
+    }
+}
+
 void triaccycle(void)
 {
     if(trstate == 0) {
@@ -226,6 +274,7 @@ int main(void)
        ledcycle();
        tempcycle();
        calcavg();
+       convcycle();
        triaccycle();
 
 #if 1
@@ -234,21 +283,26 @@ int main(void)
         */
        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) {
@@ -265,10 +319,23 @@ int main(void)
            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
        /*