PDA

View Full Version : 18F45K50 usb problem



kik1kou
- 16th July 2014, 11:55
hello everybody,

I try to use PIC18F45K50 with internal usb module for communicate with my PC.
I don't use a external crystal but only the internal clock (may be my mistake?)

If I use only USBService in my loop program, my HID device works well
but if I include USBOut, my program crash, and the PC lost the HID device

may be somebody can help me to find my mistake



#CONFIG
CONFIG PLLSEL = PLL3X ;3x clock multiplier
CONFIG CFGPLLEN = ON ;PLL Enabled
CONFIG CPUDIV = NOCLKDIV ;CPU uses system clock (no divide)
CONFIG LS48MHZ = SYS48X8 ;System clock at 48 MHz, USB clock divider is set to 8
CONFIG FOSC = INTOSCIO ;Internal oscillator
CONFIG PCLKEN = OFF ;Primary oscillator shutdown firmware controlled
CONFIG FCMEN = OFF ;Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF ;Oscillator Switchover mode disabled
CONFIG nPWRTEN = ON ;Power up timer enabled
CONFIG BOREN = ON ;BOR controlled by firmware (SBOREN is enabled)
CONFIG BORV = 190 ;BOR set to 1.9V nominal
CONFIG nLPBOR = OFF ;Low-Power Brown-out Reset disabled
CONFIG WDTEN = ON ;WDT enabled in hardware (SWDTEN ignored)
CONFIG WDTPS = 512 ;1:512
CONFIG CCP2MX = RC1 ;CCP2 input/output is multiplexed with RC1
CONFIG PBADEN = OFF ;PORTB<5:0> pins are configured as digital I/O on Reset
CONFIG T3CMX = RC0 ;T3CKI function is on RC0
CONFIG SDOMX = RB3 ;SDO function is on RB3
CONFIG MCLRE = ON ;MCLR pin enabled; RE3 input disabled
CONFIG STVREN = ON ;Stack full/underflow will cause Reset
CONFIG LVP = OFF ;Single-Supply ICSP disabled
CONFIG XINST = OFF ;Instruction set extension and Indexed Addressing mode disabled
#ENDCONFIG

DEFINE OSC 48

USBBufferSizeMax con 16 ' maximum buffer size
USBBufferSizeTX con 16 ' PIC -> PC
USBBufferSizeRX con 16 ' PC -> PIC

USBBuffer Var Byte[USBBufferSizeMax]
USBBufferCount Var Byte

' include the HID descriptor
include "DESCUSBProject.bas"

OSCCON = %01110000 'OSCint = 16Mhz
OSCCON2 = %00010000 'PLL enable

TRISB = %11100001
ANSELB = %00000000 ' port B mode Digital

TRISC = %10111111
ANSELC = %00000000 ' port C mode digital

TRISD = %00001111
ANSELD = %00000000 ' port D mode digital

TRISE = %11111111
ANSELE = %00000000 ' port E mode digital

clear

usbinit ' initialise USB...
gosub DoUSBIn 'empty buffer

hserout ["reset",13]

ProgramStart:
clearwdt
'gosub DoUSBIn

USBBuffer[1] = 5
gosub DoUSBOut

goto ProgramStart

' ************************************************** **********
' * receive data from the USB bus *
' ************************************************** **********
DoUSBIn:
USBBufferCount = USBBufferSizeRX ' RX buffer size
USBService ' keep connection alive
USBIn 1, USBBuffer, USBBufferCount, DoUSBIn ' read data, if available
return

' ************************************************** **********
' * wait for USB interface to attach *
' ************************************************** **********
DoUSBOut:
USBBufferCount = USBBufferSizeTX ' TX buffer size
USBService ' keep connection alive
USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
return