Initial commit.
authorFredrik Tolf <fredrik@pc8.dolda2000.com>
Mon, 11 Jun 2007 19:34:27 +0000 (19:34 +0000)
committerFredrik Tolf <fredrik@pc8.dolda2000.com>
Mon, 11 Jun 2007 19:34:27 +0000 (19:34 +0000)
Makefile [new file with mode: 0644]
fuses [new file with mode: 0644]
kokare.c [new file with mode: 0644]
tempdata [new file with mode: 0644]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..6de3057
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,28 @@
+# Hardware definitions
+PART=atmega88
+FREQ=1000000
+
+CFLAGS=-Os
+
+MLDFLAGS=$(LDFLAGS) -mmcu=$(PART)
+MCFLAGS=$(CFLAGS) -DF_CPU=$(FREQ)UL -mmcu=$(PART)
+
+default: kokare.hex # kokare.ehex
+
+program: kokare.hex
+       avrdude -q -p m88 -U flash:w:kokare.hex
+
+%.hex: %.elf
+       avr-objcopy -O ihex -R .eeprom $< $@
+
+%.ehex: %.elf
+       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)
+
+%.o: %.c
+       avr-gcc -c $(MCFLAGS) $< -o $@
+
+clean:
+       rm -f *.o *.elf *.hex *.ehex
diff --git a/fuses b/fuses
new file mode 100644 (file)
index 0000000..6335252
--- /dev/null
+++ b/fuses
@@ -0,0 +1,6 @@
+efuse: 0000 0001
+hfuse: 1101 1111
+lfuse: 1111 1011
+
+Example:
+       avrdude -p m88 -U lfuse:w:0xfb:m
diff --git a/kokare.c b/kokare.c
new file mode 100644 (file)
index 0000000..18379e9
--- /dev/null
+++ b/kokare.c
@@ -0,0 +1,299 @@
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <inttypes.h>
+
+#define SEGA 128
+#define SEGB 64
+#define SEGC 4
+#define SEGD 16
+#define SEGE 32
+#define SEGF 2
+#define SEGG 1
+#define SEGP 8
+
+uint8_t font[16] = {
+    SEGA | SEGB | SEGC | SEGD | SEGE | SEGF,
+    SEGB | SEGC,
+    SEGA | SEGB | SEGD | SEGE | SEGG,
+    SEGA | SEGB | SEGC | SEGD | SEGG,
+    SEGB | SEGC | SEGF | SEGG,
+    SEGA | SEGC | SEGD | SEGF | SEGG,
+    SEGA | SEGC | SEGD | SEGE | SEGF | SEGG,
+    SEGA | SEGB | SEGC,
+    SEGA | SEGB | SEGC | SEGD | SEGE | SEGF | SEGG,
+    SEGA | SEGB | SEGC | SEGD | SEGF | SEGG,
+    SEGA | SEGB | SEGC | SEGE | SEGF | SEGG,
+    SEGC | SEGD | SEGE | SEGF | SEGG,
+    SEGA | SEGD | SEGE | SEGF,
+    SEGB | SEGC | SEGD | SEGE | SEGG,
+    SEGA | SEGD | SEGE | SEGF | SEGG,
+    SEGA | SEGE | SEGF | SEGG,
+};
+/* LED */
+uint8_t dsp[2] = {0, 0};
+char leda = 0;
+char ledc = 0;
+/* Timer */
+char of = 0;
+int oticks = 0;
+/* Pulse counter */
+char pstate = 0;
+char pval = 0;
+/* Switch */
+char sstate = 0;
+int stime = 0;
+/* Temp sensor */
+char tstate = 0;
+char tlock = 0;
+unsigned long tstart;
+unsigned long ttime;
+unsigned long ttimea = 10000;
+/* Zero-cross detector*/
+/* Triac */
+
+void init(void)
+{
+    /* Timer init */
+    TCCR1A = 0;
+    TCCR1B = 1;
+    TIMSK1 = 1;
+    
+    /*
+     * B0..2 = Pulse sensor
+     * B3..5 = ISP
+     * B6..7 = CLK
+     */
+    DDRB = 0x00;
+    PORTB = 0x07;
+    PCMSK0 = 0x07;
+    PCICR = 0x01;
+    /*
+     * C0..5 = LEDA0..5
+     * C6 = /RESET
+     * C7 = NC
+     */
+    DDRC = 0x3f;
+    PORTC = 0x00;
+    /*
+     * D0 = Triac
+     * D1 = NTC FET
+     * D2 = ZCD (INT0)
+     * D3 = NTC Op-amp (INT1)
+     * D4..5 = LEDA6..7
+     * D6..7 = LEDC0..1
+     */
+    DDRD = 0xf3;
+    PORTD = 0x00;
+    EICRA = 0x0d;
+    EIMSK = 0x03;
+}
+
+unsigned char bindisp(unsigned char num)
+{
+    unsigned char ret;
+    
+    ret = 0;
+    if(num & 1)
+       ret |= SEGA;
+    if(num & 2)
+       ret |= SEGB;
+    if(num & 4)
+       ret |= SEGC;
+    if(num & 8)
+       ret |= SEGD;
+    if(num & 16)
+       ret |= SEGE;
+    if(num & 32)
+       ret |= SEGF;
+    if(num & 64)
+       ret |= SEGG;
+    if(num & 128)
+       ret |= SEGP;
+    return(ret);
+}
+
+void display(char num)
+{
+    dsp[0] = font[(num / 10) % 10];
+    dsp[1] = font[num % 10];
+}
+
+void disphex(unsigned char num)
+{
+    dsp[0] = font[(num & 0xf0) >> 4];
+    dsp[1] = font[num & 0x0f];
+}
+
+unsigned long getticks(void)
+{
+    return(TCNT1 + (((unsigned long)oticks) << 16));
+}
+
+void ledcycle(void)
+{
+    static uint16_t last = 0;
+    uint8_t c, d, v;
+    
+    if(TCNT1 - last > 500) {
+       last = TCNT1;
+       if(++leda >= 8) {
+           leda = 0;
+           if(++ledc >= 2)
+               ledc = 0;
+       }
+       if(dsp[ledc] & (1 << leda)) {
+           if(leda < 6) {
+               c = 1 << leda;
+               d = 0;
+           } else {
+               c = 0;
+               d = 0x10 << (leda - 6);
+           }
+           d |= ledc?0x40:0x80;
+       } else {
+           c = d = 0;
+       }
+       PORTC = c;
+       PORTD = (PORTD & 0x0f) | d;
+    }
+}
+
+void tempcycle(void)
+{
+    unsigned long now;
+    
+    now = getticks();
+    if(tstate == 0) {
+       if((PIND & 8) && (tlock == 0)) {
+           PORTD |= 2;
+           tstart = now;
+           tstate = 1;
+       }
+    } else if(tstate == 1) {
+       if(now - tstart > 1000) {
+           PORTD &= ~2;
+           tstate = 0;
+           tstart = now;
+       }
+    }
+}
+
+void calcavg(void)
+{
+    if(tlock == 1) {
+       tlock = 2;
+       ttimea = ((ttimea * 15) + ttime) >> 4;
+       tlock = 0;
+    }
+}
+
+int main(void)
+{
+    int cur;
+    
+    cur = 0;
+    init();
+    sei();
+    display(0);
+    while(1) {
+       ledcycle();
+       tempcycle();
+       calcavg();
+
+       /*
+         dsp[0] = bindisp((ttimea & 0xff00) >> 8);
+         dsp[1] = bindisp(ttimea & 0x00ff);
+       */
+       /*
+         disphex((ttimea & 0xff000) >> 12);
+       */
+       if(ttimea < 20000) {
+           display((ttimea / 100) % 100);
+           dsp[0] |= SEGP;
+           if(ttimea >= 10000)
+               dsp[1] |= SEGP;
+       } else {
+           display(ttimea / 1000);
+       }
+
+       /*
+       cur += pval;
+       pval = 0;
+       if(sstate == 2) {
+           cur = stime;
+           sstate = 0;
+       }
+       if(cur > 99)
+           cur = 99;
+       if(cur < -99)
+           cur = -99;
+       if(cur < 0) {
+           display(-cur);
+           dsp[0] |= SEGP;
+       } else {
+           display(cur);
+       }
+       */
+    }
+}
+
+ISR(SIG_INTERRUPT0)
+{
+}
+
+ISR(SIG_INTERRUPT1)
+{
+    unsigned long now;
+    
+    now = getticks();
+    if(tstate == 0) {
+       tstate = 1;
+       if(tlock != 2)
+           ttime = now - tstart;
+       tstart = now;
+       PORTD |= 2;
+       tlock = 1;
+    }
+}
+
+ISR(SIG_OVERFLOW1)
+{
+    of = 1;
+    oticks++;
+}
+
+ISR(SIG_PIN_CHANGE0)
+{
+    if((sstate == 0) & ((PINB & 1) == 0)) {
+       stime = oticks;
+       sstate = 1;
+    }
+    if((sstate == 1) & ((PINB & 1) == 1)) {
+       stime = oticks - stime;
+       sstate = 2;
+    }
+    if(pstate == 0) {
+       if((PINB & 2) == 0) {
+           pstate = 1;
+       } else if((PINB & 4) == 0) {
+           pstate = 2;
+       }
+    } else if(pstate == 1) {
+       if((PINB & 4) == 0) {
+           pval++;
+           pstate = 3;
+       } else {
+           pstate = 0;
+       }
+    } else if(pstate == 2) {
+       if((PINB & 2) == 0) {
+           pval--;
+           pstate = 3;
+       } else {
+           pstate = 0;
+       }
+    } else {
+       if((PINB & 2) && (PINB & 4))
+           pstate = 0;
+    }
+}
diff --git a/tempdata b/tempdata
new file mode 100644 (file)
index 0000000..16c3e2e
--- /dev/null
+++ b/tempdata
@@ -0,0 +1,13 @@
+Temp   Delay
+----------------
+100    7.5-7.7
+95     8.0
+90     8.8-9.0
+85     10.0-10.2
+80     11.0-11.5
+75     12.9-13.2
+70     14.9-15.1
+65     15.9-16.6
+60     18.5-19.8
+55
+50