X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=kokare.c;h=b2c523715739dc16c79a17e6a0317b484842169e;hb=882c9ed28852a4d774f40e9c7a71dff82105a074;hp=12fbf9a10d131526e9bc1356354eea1fe98827ea;hpb=2f37b902748b3fc3d0f14fe8ba4937d84ea2517e;p=kokare.git diff --git a/kokare.c b/kokare.c index 12fbf9a..b2c5237 100644 --- a/kokare.c +++ b/kokare.c @@ -31,12 +31,10 @@ 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 */ -volatile char of = 0; volatile int oticks = 0; unsigned long mnow; /* Pulse counter */ @@ -57,19 +55,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 +154,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; } @@ -224,6 +234,7 @@ void convcycle(void) a = (float)ttimea; state = 1; tavgok = 0; + last = mnow; } } else if(state == 1) { ra = a * C; @@ -241,23 +252,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; @@ -271,11 +265,9 @@ int main(void) while(1) { mnow = getticks(); - ledcycle(); tempcycle(); calcavg(); convcycle(); - triaccycle(); #if 1 /* @@ -313,7 +305,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) { @@ -380,7 +372,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) { @@ -420,7 +412,7 @@ int main(void) ISR(SIG_INTERRUPT0) { - ztime = getticks(); + ztime = 0; zok = 1; } @@ -439,9 +431,31 @@ 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; oticks++; }