Hi guys,
Im currently using Darrels DT_HID include file to control the USB aspects of my project and it works great and I am also using his DT_INTS-18 include and have setup my PWM routine in an INT_INT interupt and it works but with 1 slight thing that I cant for the life of me figure out.
Whats happening is that my project can set the pwm down to 1 millisecond and im using both channels for the pwm (its to control 2 DC powerheads for a marine reef tank) and have hooked up 2 LEDS to the pins (RC1 & RC2) and they flash away happily but they dont keep a constant rate, you can see them slow down for any period of time from a fraction of a second to maybe a second.
I have tried changing to different interupts and either they dont swap over or when I tried TMR0 (I think it was) they ran about 10 times faster than they should and I got errernous twitching on port A 1 & 2.
Im using an 18F2455 with a 4Mhz xtal and have a dallas DS18S20+ temp probe constantly reading the temp and displaying the info on an LCD screen (Hence why I used the interupt for the pwm routines otherwise because of the LCD and its pauses it needs etc, it ran way too slow)
Here are my settings for the ports etc.
Code:
ADCON0 = 0 'Set ADCON0
ADCON1 = %00001111 'Set D i/o
CMCON = 7 'Disable Comparators
CCP1CON = %00001100 'set pwm
CCP2CON = %00001100 'set pwm
TRISA = %00000000 'set PORTA as all output
TRISB = %00000000 'set PORTB as all output
TRISC = %00000000 'set PORTC as all output
PR2 = 63
T2CON = %00000110 ' Start Timer2, Prescaller 1:16
and here is the interupt setup using Darrels routines.
Code:
INCLUDE "DT_INTS-18.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP-18.bas"
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler USB_Handler
INT_Handler INT_INT, _Do_WaveMakers, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
endasm
My wavemaker code is a bit long winded looking but it works (probably an easier way to do it, but this is the way I could figure it out etc, and it dosnt take long to execute because its using case's so it only does 1 section per powerhead at a time)
Code:
Do_WaveMakers:
if PHWAVEBOX = 0 then 'No wavebox mode so we ramp up and down the power
select case PH1PHASE
case 0 'Ramp up the powerhead
PH1TIMER = PH1TIMER +1
if PH1TIMER >= 100 then '10th of a second count
PH1TIMER = 0
PH1PWR = PH1PWR + (ramp_step/10) 'now add calculated step value
endif
if PH1PWR > PHMAX then
PH1PWR = PHMAX
PH1PHASE = 1
endif
case 1 'At MAX power so hold there for duration
if PH1TIME < PHSECS then
if PH1TIME = (PHSECS/2) -2 and PHOVER = 2 then
PH2PWR = PHMIN
PH2PHASE = 0
PH2TIME = 0
endif
PH1TIMER = PH1TIMER + 1
if PH1TIMER = 1000 then
PH1TIME = PH1TIME + 1
PH1TIMER = 0
endif
else
PH1TIMER = ramp_step
PH1TIME = 0
PH1PHASE = 2
endif
case 2 'Ramp down the power to MIN value
PH1TIMER = PH1TIMER - 1
if PH1TIMER <= 0 then
PH1TIMER = 100
PH1PWR = PH1PWR - (ramp_step/10)
endif
if PH1PWR < PHMIN or PH1PWR > PHMAX then 'Need to have the > PHMAX as it can go below 0 which is higher than the MAX ;)
PH1PWR = PHMIN
PH1PHASE = 3
endif
case 3 'At MIN power so hold again
if PH1TIME < PHSECS AND PHOVER = 1 then 'Unless we are using the together mode (3) then we dont wait
PH1TIMER = PH1TIMER + 1
if PH1TIMER = 1000 then
PH1TIME = PH1TIME + 1
PH1TIMER = 0
endif
elseif PH1TIME < PHMSECS and PHOVER = 0 then
PH1TIMER = PH1TIMER + 1
if PH1TIMER = 1000 then
PH1TIME = PH1TIME + 1
PH1TIMER = 0
endif
elseif PH1TIME < PHSECS and PHOVER = 2 then
PH1TIMER = PH1TIMER + 1
if PH1TIMER = 1000 then
PH1TIME = PH1TIME + 1
PH1TIMER = 0
endif
else
PH1TIMER = 0
PH1TIME = 0
PH1PHASE = 0
endif
end select
select case PH2PHASE
case 0 'Ramp up the powerhead
PH2TIMER = PH2TIMER +1
if PH2TIMER >= 100 then '10th of a second count
PH2TIMER = 0
PH2PWR = PH2PWR + (ramp_step/10) 'now add calculated step value
endif
if PH2PWR > PHMAX then
PH2PWR = PHMAX
PH2PHASE = 1
endif
case 1 'At MAX power so hold there for duration
if PH2TIME < PHSECS then
PH2TIMER = PH2TIMER + 1
if PH2TIMER = 1000 then
PH2TIME = PH2TIME + 1
PH2TIMER = 0
endif
else
PH2TIMER = ramp_step
PH2TIME = 0
PH2PHASE = 2
endif
case 2 'Ramp down the power to MIN value
PH2TIMER = PH2TIMER - 1
if PH2TIMER <= 0 then
PH2TIMER = 100
PH2PWR = PH2PWR - (ramp_step/10)
endif
if PH2PWR < PHMIN or PH2PWR > PHMAX then 'Need to have the > PHMAX as it can go below 0 which is higher than the MAX ;)
PH2PWR = PHMIN
PH2PHASE = 3
PH2TIME = 0
endif
case 3 'At MIN power so hold again
if PHOVER = 2 and PH1PHASE = 3 then
PH1PWR = PHMIN
PH1PHASE = 0
PH1TIME = 0
endif
if PH2TIME < PHSECS AND PHOVER = 1 then 'Unless we are using the together mode (3) then we dont wait
PH2TIMER = PH2TIMER + 1
if PH2TIMER = 1000 then
PH2TIME = PH2TIME + 1
PH2TIMER = 0
endif
elseif PH2TIME < PHMSECS and PHOVER = 0 then
PH2TIMER = PH2TIMER + 1
if PH2TIMER = 1000 then
PH2TIME = PH2TIME + 1
PH2TIMER = 0
endif
elseif PH2TIME < PHMSECS and PHOVER = 2 then
PH2TIMER = PH1TIMER + 1
if PH2TIMER = 1000 then
PH2TIME = PH2TIME + 1
PH2TIMER = 0
endif
else
PH2TIMER = 0
PH2TIME = 0
PH2PHASE = 0
endif
end select
else 'Wavebox mode
select case PH1PHASE
case 0
if PH1TIME < PHMSECS then
PH1TIME = PH1TIME + 1
else
PH1PHASE = 1
PH1TIME = 0
PH1PWR = PHMIN
endif
case 1
if PH1TIME < PHMSECS then
PH1TIME = PH1TIME + 1
else
PH1PHASE = 0
PH1TIME = 0
PH1PWR = PHMAX
endif
end select
select case PH2PHASE
case 0
if PH2TIME < PHMSECS then
PH2TIME = PH2TIME + 1
else
PH2PHASE = 1
PH2TIME = 0
PH2PWR = PHMIN
endif
case 1
if PH2TIME < PHMSECS then
PH2TIME = PH2TIME + 1
else
PH2PHASE = 0
PH2TIME = 0
PH2PWR = PHMAX
endif
end select
endif
CCPR1L = PH1PWR >>2
CCP1CON.5 = PH1PWR.1
CCP1CON.4 = PH1PWR.0
CCPR2L = PH2PWR >>2
CCP2CON.5 = PH2PWR.1
CCP2CON.4 = PH2PWR.0
@ INT_RETURN
Ive tried using DISABLE and ENABLE at each end, and even INTCON.6 = 0,INTCON = 1 to try to stop anything that could be possibly interferring with the routine when its executed etc, but didnt seem to make any difference.
The main loop basically just calls the temp sensor to see if its alive, then if it is, reads the temp and sets a couple of pins depending on some settings, displays the temp on the screen, and then if the plugged flag is true using Darrels HID routine calls the USB but only when its plugged in.
Hope someone can shed some light onto my problem as im out of ideas on what else I can try.
It couldnt be anything to it been on a breadboard could it? as I remember reading somewhere about breadboards not been brilliant for certain things etc.
Many thanks in advance,
Mark.
Bookmarks