From c77327664d2a8fd272e91c2c99b8803ad123beb3 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Mon, 2 Jul 2007 02:10:54 +0000 Subject: [PATCH] Run Triac cycle in Timer0 interrupt. Do port manipulation without interrupts. --- kokare.c | 63 ++++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/kokare.c b/kokare.c index 67324b1..35e5a01 100644 --- a/kokare.c +++ b/kokare.c @@ -57,16 +57,23 @@ 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 timing sensitive subsystems + * Timer 1 is used for global timing + */ + OCR0A = 100; + TCCR0A = 2; + TCCR0B = 1; + TIMSK0 = 2; TCCR1A = 0; TCCR1B = 1; TIMSK1 = 1; @@ -166,8 +173,10 @@ void ledcycle(void) } else { c = d = 0; } + cli(); PORTC = c; PORTD = (PORTD & 0x0f) | d; + sei(); } } @@ -175,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; } @@ -242,23 +255,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; @@ -276,7 +272,6 @@ int main(void) tempcycle(); calcavg(); convcycle(); - triaccycle(); #if 1 /* @@ -314,7 +309,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 +376,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 +416,7 @@ int main(void) ISR(SIG_INTERRUPT0) { - ztime = getticks(); + ztime = 0; zok = 1; } @@ -440,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; -- 2.11.0