Hi Guys,
need some advice as I'm going crazy trying to figure out what I've screwed up in the code I'm using.
A good friend of mine wrote a very basic project to control some aquarium lights. His code basically uses four CASE statements per channel to set the on time for channel 1 & 2, the ramp up time for each channel, the duration both channels are on, and the fade down duration. So for example channel one could come on at 10:00, channel two on at 10:15, both then fade up to full brightness by 11:00, channel one then begin to fade down at 20:00, turning off at 21:00, with channel two fading between 20:30 and 22:00 for example. That part works fine.
To make life easy my friend wrote a small windows application so that the on / off, fade durations etc could all be set by sliders and then the values squirted to the chip, which was originally an 18f2550. As I need more pins as I am developing his project further (with his permission) I've opted for an 18F4550. I was originally using a 20Mhz Xtal and with the following settings
Code:
ASM ; 18F2550/4550, 20mhz crystal
__CONFIG _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
__CONFIG _CONFIG1H, _FOSC_HSPLL_HS_1H
__CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _VREGEN_ON_2L
__CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
__CONFIG _CONFIG3H, _PBADEN_OFF_3H
__CONFIG _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L
ENDASM
DEFINE OSC 48
CLEAR
The PC picks up the connection and the USB device was reported as being installed successfully. His application loads, and automatically reads the values from the PICs eprom settings and moves the sliders and displays the numbers as per the default values that are entered. However, if the sliders are changed and the "update" button is pressed the new values are not written back to the chip.
The code uses DT_HID260 which I'm guessing is something written by Darrel.
Code:
'****************************************************************
'Setup Interrupts
'****************************************************************
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 TMR1_INT, _MyTimer, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
endasm
T1CON = %10000001 ; free-running, 1:1 prescaler
@ INT_ENABLE TMR1_INT ; enable Timer1 interrupts
'****************************************************************
'Setup USB
'****************************************************************
INCLUDE "DT_HID260.pbp"
DEFINE USB_VENDORID 6017
DEFINE USB_PRODUCTID 1969
DEFINE USB_VERSION 1
DEFINE USB_VENDORNAME "CSL Designs"
DEFINE USB_PRODUCTNAME "Aqua-LED"
DEFINE USB_SERIAL "001"
DEFINE USB_INSIZE 64 ; IN report is PIC to PC (8,16,32,64)
DEFINE USB_OUTSIZE 64 ; OUT report is PC to PIC
DEFINE USB_POLLIN 10 ; Polling times in mS, MIN=1 MAX=10
DEFINE USB_POLLOUT 10
'****************************************************************
The actual bit that gets called to do the USB comms is
Code:
SendUSB:
for i = 0 to USBBufferCount - 1
read i,USBTXBuffer[i] 'Read the eeprom data and store in the outward bound buffer
next i
SendData:
USBOut 1, USBTXBuffer, USBBufferCount , SendDATA ' if bus available, transmit data
return
GetUSB:
USBin 1, USBRXBuffer, USBBufferCount, Timeout ' if bus available, receive data
if Firstsend = 0 then
for i = 0 to USBBufferCount - 1
write i,USBRXBuffer[i] 'Write the eeprom data received from the PC
next i
gosub Read_eeprom 'Read eeprom data into the variables
else
Firstsend = 0
endif
Timeout:
return
' If USB plugged display USB on the display
USB_Plugged:
if plugged = 0 then
lcdout $FE,$91," "
else
lcdout $FE,$91,"USB"
endif
return
I've tried removing the timeout option and substituting it for the getUSB so it loops and that didin't work, I've also tried using a 4Mhz resonator with the same fuse settings as the 2550 chip and that still fails to update
Code:
ASM
__CONFIG _CONFIG1L, _PLLDIV_1_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
; ; ; USB clock source comes from the 96 MHz PLL divided by 2
; ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
; No prescale (4 MHz oscillator input drives PLL directly)
__CONFIG _CONFIG1H, _FOSC_XTPLL_XT_1H & _IESO_OFF_1H
; ; ; Oscillator Switchover mode disabled
; ; Fail-Safe Clock Monitor disabled
; XT oscillator, PLL enabled, XT used by USB
__CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_ON_2L & _BORV_2_2L & _VREGEN_ON_2L
__CONFIG _CONFIG2H, _WDT_OFF_2H
__CONFIG _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_ON_3H
__CONFIG _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
endasm
DEFINE OSC 48
clear
I've also checked the settings for PORT.C to make sure it's not all set to output - still no joy.
I would welcome suggestions on things to try, or point me to where the problem may be.... My friend thinks it must be a timing issue, which when I was running with a 20 Mhz and a divide/5 prescaler I might of agreed (however I would of thought that if this was the case then windows would of reported a device not recognised error), but then even using the 4Mhz resonator (which doesn't seem to make the code run any slower, so I would be happy with that for the performance) still didn't work.
Thanks in advance...
Malcolm
Bookmarks