X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=kokare.c;h=131015de548faeb025f4953ccc57840686c394f4;hb=8c536798197a233e09c8d146581b434cb7c954e5;hp=67324b1a7a02c5c25c27f01f6cfc188261467763;hpb=9ac074a90fa79ae7619a9fd91a160ce8d5535c98;p=kokare.git diff --git a/kokare.c b/kokare.c index 67324b1..131015d 100644 --- a/kokare.c +++ b/kokare.c @@ -31,7 +31,6 @@ uint8_t font[16] = { SEGA | SEGE | SEGF | SEGG, }; /* LED */ -#define LCDELAY 1000 uint8_t dsp[2] = {0, 0}; char leda = 0; char ledc = 0; @@ -57,19 +56,31 @@ int tempk; volatile ktok = 0; /* Zero-cross detector*/ volatile char zok = 0; -unsigned long ztime; +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 the Triac + * Timer 1 is used for global timing + * Timer 2 cycles the LED display + */ + OCR0A = 100; + TCCR0A = 2; + TCCR0B = 1; + TIMSK0 = 2; TCCR1A = 0; TCCR1B = 1; TIMSK1 = 1; + OCR2A = 16; + TCCR2A = 2; + TCCR2B = 4; + TIMSK2 = 2; /* * B0..2 = Pulse sensor @@ -144,44 +155,44 @@ unsigned long getticks(void) void ledcycle(void) { - static uint16_t last = 0; uint8_t c, d, v; - if(TCNT1 - last > LCDELAY) { - 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; + 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 = d = 0; + c = 0; + d = 0x10 << (leda - 6); } - PORTC = c; - PORTD = (PORTD & 0x0f) | d; + d |= ledc?0x40:0x80; + } else { + c = d = 0; } + PORTC = c; + PORTD = (PORTD & 0x0f) | d; } 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; } @@ -242,23 +253,6 @@ void convcycle(void) } } -void triaccycle(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; - } - } -} - int main(void) { int state, cur; @@ -272,11 +266,9 @@ int main(void) while(1) { mnow = getticks(); - ledcycle(); tempcycle(); calcavg(); convcycle(); - triaccycle(); #if 1 /* @@ -314,7 +306,7 @@ 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) { @@ -381,7 +373,7 @@ int main(void) if(cur > 99) cur = 99; display(cur); - trdelay = 10000 - ((unsigned short)cur * 100); + trdelay = 99 - cur; pval = 0; } if(sstate == 2) { @@ -421,7 +413,7 @@ int main(void) ISR(SIG_INTERRUPT0) { - ztime = getticks(); + ztime = 0; zok = 1; } @@ -440,6 +432,29 @@ 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_OUTPUT_COMPARE2A) +{ + ledcycle(); +} + ISR(SIG_OVERFLOW1) { of = 1;