I am unable to get the following code to work properly.
Full brightness and off work however in between the 7 1/2 watt test light bulb flickers in place of dimming.
A scope shows the half wave signal input on pin 3 is cycling between 0 and 4 VDC.
I have tried both a MOC3043 optoisolater and a CX240D5 solid state relay to directly drive the bulb.
What is wrong with this setup?
Norm
Code:' Lamp dimmer ' =========== ' ' File name : LampDim.bas ' Company : Mister E ' Programmer : Steve Monfette ' Date : 23-12-2004 ' Device : PIC12F675 ' ' ' This program is use to dim intensity of an AC line load ' like lamp, motor and other. Developped for 60 Hz line. ' ' This allow to increase or decrease intensity. ' If the user doesn't held at least 0.5 sec: ' 1. "Increase" : we will set the output for full brightness ' 2. "Decrease" : we will turn off the output ' ' ' The software need : ' 1. A full wave signal from the AC line on GP4 ' ' The software use : ' 1. TIMER1 overflow to check if pushbutton are hold for ' more than 0.5 Sec ' 2. Interrupt on GP4 (AcLine input) to synchronise Triac ' '<FL_PIC12F675>' '<FL_MPASM>' '<FL_PBPW>' '<FL_PREPBP3>' ' Device programming mode and hardware definition ' =============================================== ' Using Internal Clock, no clock out ' Enable Watch dog timer ' Disable MCLR pin ' Enable Power-up timer ' Enable Brown-out detect ' @ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _PWRTE_ON & _BODEN_ON ' ' TRISIO = %11111011 OPTION_REG.7=0 ' Enable pull-ups WPU=%00000011 ' Enable pull-ups on GP0, GP1 CMCON=7 ' Disable analog comparator ANSEL=0 ' Disable analog converter Pb_Inc var GPIO.0 ' Input for INCREMENT/ON push button Pb_Dec var GPIO.1 ' Input for DECREMENT/OFF push button Triac var GPIO.2 ' Output to TRIAC gate ACLine var GPIO.4 ' Input for the FullWave rectify AC line ' ' Software definition ' =================== ' ' ' MaxDelay var word TriacDelay var Word Debounce_AutoRepeatDelay var word FullBright var bit ' ' ' Interrupts definition ' ===================== ' ' ' INTCON=%10001000 ' Enable interrupt on GPIO change IOCB.4=1 ' Enable interrupt on GP4 change PIE1.0=0 ' disable TMR1 overflow interrupt T1CON=%00110100 ' Set TIMER1 ' prescaler 1:8 ' internal clock (Fosc/4) 1MHZ ' synchro internal ' we will use TIMER1 overflow ' $ffff * 8* (1/(4MHZ / 4)) = 0.524 Sec ON INTERRUPT GOTO ACDetect ' ' Hardware and variable initialisation ' ==================================== ' ' Maxdelay=6000 ' Set Maximum delay (set to 8000 for 50Hz) FullBright=0 ' disable Full Brightness flag triac=0 ' disable Triac Gate triacdelay=0 ' Set delay to minimum gosub ResetTimer1 ' reset Timer1 ' ' Main ' ==== ' Get entry from user to Increment of Decrement intensity ' ' start: ' ' Test Increment push button ' -------------------------- ' If hold more than .5 Sec, increment triac gate delay by 500 uSec ' case else Full brightness at output ' while Pb_inc=0 gosub TestTimer1 ' test status of TIMER1 while (Pb_inc==0) AND (PIR1.0==0) 'loop while holding push button 'and no TIMER1 overflow wend if PIR1.0==1 then ' If timer overflow (pushbutton hold for > 0.5 sec), T1CON.0=0 ' disable TMR1 gosub Debounce_AutoRepeat if (triacdelay<Maxdelay) then triacdelay=triacdelay+500 'increment Triac gate delay else triacdelay=maxdelay ' if triacDelay>MaxDelay, fullbright=1 ' set the full brightness Flag endif else triacdelay=maxdelay ' If pushButton was hold less than .5 sec Fullbright=1 ' Set the full brightness flag endif wend gosub ResetTimer1 ' ' Test Decrement push button ' -------------------------- ' If hold more than .5 Sec, increment triac gate delay by 500 uSec ' Case else, turn off output ' while Pb_dec=0 gosub TestTimer1 ' Test status of TIMER1 while (Pb_dec==0) AND (PIR1.0==0) 'loop while holding push button 'and no TIMER1 overflow wend if PIR1.0==1 then ' If timer overflow (pushbutton hold for > 0.5 sec), T1CON.0=0 ' disable TIMER1 gosub Debounce_AutoRepeat if (triacdelay>0) then Fullbright=0 ' Reset TRIAC always ON flag triacdelay=triacdelay-500 endif else Fullbright=0 ' Reset TRIAC always ON flag triacdelay=0 endif wend gosub ResetTimer1 goto start ' ' ' TestTimer1 ' ---------- ' ' Enable TIMER1 if : ' not enable and not in overflow ' TestTimer1: if (T1CON.0==0) AND (PIR1.0==0) then 'if TIMER1 not enable 'and TIMER1 not overflow T1CON.0=1 'enable TIMER1 endif return ' ' ' ResetTimer1 ' ----------- ' ' Subroutine to clear Timer1 ' 1. Overflow flag ' 2. Disable Timer ' 3. Clear counter ' ResetTimer1: PIR1.0=0 'clear timer overflow T1CON.0=0 'disable timer TMR1L=$00 'clear counter TMR1H=$00 ' return ' ' ' Debounce_AutoRepeat ' ------------------- ' ' Subroutine to debounce push button. ' Also provide kind of auto-repeat when push button ' are held down. ' ' each delay = 20 mSec ' Use of PAUSEUS to be sure getting ACLine interrupt ' Debounce_AutoRepeat: for Debounce_AutoRepeatDelay=1 to 2000 pauseus 10 next return ' ' ' ACDetect ' -------- ' ' Interrupt routine called by ACLine (GP4) pin state change ' disable ACDetect: if ACline==1 then ' Check for rising edge of AC signal if triacdelay > 0 then Triac=1 ' Activate TRIAC if FullBright==0 then ' In case Brightness flag is not set pauseus triacdelay ' do the selected delay triac=0 ' Disable TRIAC endif else triac=0 endif endif INTCON.0=0 ' Clear GPIF (interrupt on GP4 change) resume enable END






Bookmarks