Need some help here,
I have an 18F4520 which has the ability for multiple PWM outputs via CCP1 and CCP2 pins. The code I'm using originally came from a friend who had this working on an 18F2550, but for some reason when ported to an 18F4520 the output on PORTC.2 pulses at around twice per second whilst the output is set. The PWM is working as the pulses start very dim and increase in brightness as the value in the variable is increased and decreases as the variable value is reduced, rather than the LED remaining lit through out the settings. The output on PORTC.1 works fine, in that the LED starts off dim, fades up to full brightness and then fades down to zero.
I've looked at the data sheet (which could be written in Klingon for all I care), and think everything is set right as the LED does increase and decrease in brightness. But I'm at a loss as to what is causing the LED to flash. Here is the bulk of the cod, and would welcome some pointers.
Firstly the includes
and now the configs
and now the main part of the code
I have an 18F4520 which has the ability for multiple PWM outputs via CCP1 and CCP2 pins. The code I'm using originally came from a friend who had this working on an 18F2550, but for some reason when ported to an 18F4520 the output on PORTC.2 pulses at around twice per second whilst the output is set. The PWM is working as the pulses start very dim and increase in brightness as the value in the variable is increased and decreases as the variable value is reduced, rather than the LED remaining lit through out the settings. The output on PORTC.1 works fine, in that the LED starts off dim, fades up to full brightness and then fades down to zero.
I've looked at the data sheet (which could be written in Klingon for all I care), and think everything is set right as the LED does increase and decrease in brightness. But I'm at a loss as to what is causing the LED to flash. Here is the bulk of the cod, and would welcome some pointers.
Firstly the includes
Code:
'****************************************************************
' Include files and configure timers
DEFINE WRITE_INT 1
INCLUDE "DT_INTS-18.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP-18.bas"
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR1_INT, _MyTimer, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
endasm
T1CON = %00000001 ; free-running, 1:1 prescaler
@ INT_ENABLE TMR1_INT ; enable Timer1 interrupts
ENABLE DEBUG
'****************************************************************
Code:
'****************************************************************
'Port settings
CCP1CON = %00001100 '
CCP2CON = %00001100 '
TRISA = %00000111 'set PORTA as all output apart from 0,1,2
TRISB = %00000011 'set PORTB as all output apart from 0&1
TRISC = %01011111 '
SCLpin var PORTC.3 ' RTC pin - clk
SDApin var PORTC.4 ' RTC pin - data
'****************************************************************
Code:
'****************************************************************
;Initialization
init:
LCDOUT $FE,1:FLAGS=0:PAUSE 250:LCDOUT $FE,1:PAUSE 250 ' Initialize LCD
option=1
Blue_Day_Cycle = NIGHT
White_Day_Cycle = NIGHT
b_cnt = 0
w_cnt = 0
gosub read_eeprom 'Read in the data needed for the lighting periods
gosub Calc_Fade
'****************************************************************
;************ Main Program Loop *************
'****************************************************************
Main:
If SetButton=0 then ; jump to programming
goto mainmenu
endif
timeH=(RTCHour>>4) 'convert the BCD format of the hours register and store in variable timeH
timeH=(timeH &$03)*10
timeH=timeH+(RTCHour&$0F)
timeM=(RTCMin>>4)
timeM=(timeM &$07)*10
timeM=timeM+(RTCMin&$0F) 'convert the BCD format of the mins register and store in variable timeM
'if B_On_Time_H = timeH and B_On_Time_M = timeM then Blue_Day_Cycle = DAWN
'if W_On_Time_H = timeH and W_On_Time_M = timeM then White_Day_Cycle = DAWN
'if B_Off_Time_H = timeH and B_Off_Time_M = timeM then Blue_Day_Cycle = DUSK
'if W_Off_Time_H = timeH and W_Off_Time_M = timeM then Blue_Day_Cycle = DUSK
'if B_On_Time_H = timeH and B_On_Time_M = timeM then Blue_Day_Cycle = DAWN
gosub calc_fade
'*** Do BLUE daily cycle
select case Blue_Day_Cycle
case DAWN
lcdout $FE,$94,"BL: DAWN "
if b_cnt = B_Fadein_time and B_PWM < B_Max then
B_PWM = B_PWM + 1
b_cnt = 0
endif
if B_PWM = b_max then
Blue_Day_Cycle = DAY
endif
case DAY
lcdout $FE,$94,"BL: DAY "
if timeH = B_Off_Time_H and timeM = B_Off_Time_M then
Blue_Day_Cycle = DUSK
b_cnt = 0
endif
CASE DUSK
lcdout $FE,$94,"BL: DUSK "
if b_cnt >= B_Fadeout_time and B_PWM > B_Min then
B_PWM = B_PWM - 1
b_cnt = 0
endif
if B_PWM = b_min then
Blue_Day_Cycle = NIGHT
endif
case NIGHT
lcdout $FE,$94,"BL: NIGHT"
if timeH = B_On_Time_H and timeM = B_On_Time_M then
Blue_Day_Cycle = DAWN
b_cnt = 0
endif
end select
'*** Do WHITE daily cycle
select case White_Day_Cycle
case DAWN
lcdout $FE,$94+11,"WT: DAWN "
if w_cnt = w_Fadein_time and W_PWM < w_max then
W_PWM = W_PWM + 1
w_cnt = 0
endif
if W_PWM = W_max then White_Day_Cycle = DAY
case DAY
lcdout $FE,$94+11,"WT: DAY "
if timeH = W_Off_Time_H and timeM = W_Off_Time_M then
White_Day_Cycle = DUSK
w_cnt = 0
endif
CASE DUSK
lcdout $FE,$94+11,"WT: DUSK "
if w_cnt >= w_Fadeout_time and W_PWM > w_min then
W_PWM = W_PWM - 1
w_cnt = 0
endif
if W_PWM = W_min then White_Day_Cycle = NIGHT
case NIGHT
lcdout $FE,$94+11,"WT: NIGHT"
if timeH = W_On_Time_H and timeM = W_On_Time_M then
White_Day_Cycle = DAWN
w_cnt = 0
endif
end select
hpwm 1,W_PWM,1500
hpwm 2,B_PWM,1500
lcdout $FE,$80,"BLUES ",dec3 (B_PWM *100)/255,"%"
lcdout $FE,$C0,"WHITES ",dec3 (W_PWM *100)/255,"%"
OWOUT DQ, 1, [$CC, $44] ' Start temperature conversion
OWOUT DQ, 1, [$CC, $BE] ' Read the temperature
OWIN DQ, 0, [temperature.LOWBYTE, temperature.HIGHBYTE]
temperature = temperature */ 1600
lcdout $FE,$D4+11,"TEMP ",DEC(temperature / 100)," C"
I2CRead SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCWDay,RTCDay,RTCMonth,RTCYear,RTCCtrl] ; read DS1307 chip
If RTCHour.6=1 then
CounterA=(RTCHour>>4)&$01 ' Work-Out 12 or 24 hour Display for Hours
else
CounterA=(RTCHour>>4)&$03
endif
CounterA=CounterA*10+(RTCHour&$0F) ' Display Hours appropriately for 12 or 24 hour Mode
If RTCHour.6=1 then
LCDOut $FE,$D4,#CounterA
else
LCDOut $FE,$D4,#CounterA Dig 1,#CounterA Dig 0
endif
LCDOut ":",#(RTCMin>>4)&$0F,#RTCMin&$0F
GOTO Main
'****************************************************************
;************ Main Program Loop END *************
'****************************************************************
' Timer used to scale the PWM pulse
MyTimer:
Tick_Tmr = Tick_Tmr + 1
if Tick_Tmr >149 then ;179
Tick_Tmr = 0
b_cnt = b_cnt + 1
W_cnt = W_cnt + 1
endif
@ INT_RETURN
'****************************************************************