OK
I managed to tweak the code to fit in the direct resistance from the mains without the need for the bridge. The problem of flickering is still there, though not a lot but is still noticeable. Is something wrong with the code? I want to control 2 channels minimum with 1 IC, so I have set timer0 interrupt to happen @ 340uS approximately. This gives me approximately 29 steps for a 10mS interval. I just toggle the trigger edge at every Zero Crossing.
I am using 16f676 and 4 x 4.7Meg from Mains - Direct to PortA.2.Code:DEFINE OSC 20 ' OSCCON defaults to 20MHz on reset DEFINE NO_CLRWDT 1 Include "modedefs.bas" #CONFIG ifdef PM_USED device pic16F676, intrc_osc_noclkout, wdt_on, mclr_on, protect_off else __CONFIG _HS_OSC & _WDT_OFF & _MCLRE_OFF & _BODEN & _CP & _CPD endif #ENDCONFIG '----------Other pins Declared Here-------------- Dimmer1 VAR PortA.0 ' dimmer channel 1 Dimmer2 VAR PortC.0 ' dimmer channel 2 '----------Variables declared here---------------- Dimmer var Byte[2] ' timer value for 4 dimmer channels Count var Byte ' Dimmer working variable define INTHAND _ISR Goto main ISR: asm ' Context saving happens here btfsc INTCON, INTF goto ZeroCrossingInt T0Over bcf INTCON, T0IF ; clear the timer overflow flag movlw 203 movwf TMR0 incf _Count ; Increment Count ; check if channel1 value is reached movf _Dimmer+0,w subwf _Count,w btfsc STATUS,C bsf _Dimmer1 ; check if channel2 value is reached movf _Dimmer+1,w subwf _DimrWork,w btfsc STATUS,C bsf _Dimmer2 goto EndInt Set_Bit bsf OPTION_REG,6 clrf STATUS Goto EndInt ZeroCrossingInt bcf INTCON, INTF ; clear the interrupt clrf _Count ; Dimmer Working variable movlw 0 bcf STATUS,Z addwf _Dimmer+0,w btfss STATUS,Z bcf _Dimmer1 movlw 0 bcf STATUS,Z addwf _Dimmer+1,w btfss STATUS,Z bcf _Dimmer2 bsf STATUS,RP0 btfss OPTION_REG,6 Goto Set_Bit bcf OPTION_REG,6 clrf STATUS EndInt ; Context Restore here retfie endasm main: '----------Processor Initialisation--------------- PAUSE 50 TRISA = %001100 TRISC = 0 CMCON = 7 ANSEL = 0 OPTION_REG = %10000100 PORTA=%001100 PORTC=0 INTCON= %10110000 ' Global interrupts enabled ' Timer0 interrupt enabled ' Zero Crossing interrupt enabled ' Flags are cleared DIMMER[0]=0 : DIMMER[1]=25 Pause 3000 Start: DIMMER[0]=DIMMER[0]+1 DIMMER[1]=DIMMER[1]-1 Pause 3000 If Dimmer[0]=25 then Dimmer[0]=0 : Pause 3000 : Endif If Dimmer[1]=0 then Dimmer[1]=25 : Pause 3000 : Endif Goto start END





Bookmarks