Code:
'***************************************************************************
'* Name : USBLabX1_RH.pbp *
'* Author : Steve Monfette/Darrel Taylor/Demon *
'* Date : Jan 11 2012 *
'* Version : 3.0 *
'* Notes : This is a re-creation of mister-e's USBdemo for DT_HID *
'* : Meant to work with mister-e's GUI *
'* : Modified for Lab X1 *
'* Hardware : PIC 18F4550, 20mhz crystal *
'* : Lab X1 Experimental Board, 9.5V wall adapter *
'* : MeLabs U2 Programmer v4.32 *
'* Software : PIC Basic Pro v2.60C *
'* : MicroCode Studio Plus v2.2.1.1 *
'* : MPASM WIN Assembler v4.02 (mplab tools/MPASM Suite) *
'* PIC mods : plastic USB connector hot-glued onto top of PIC *
'* : D- wired to C4 (pin 23) directly to top of pins *
'* : D+ wired to C5 (pin 24) directly to top of pins *
'* : two 0.1uF ceramic caps in parallel across VUSB and VSS *
'***************************************************************************
'--- if you use these, you must comment the ones in the .inc file ---
@ __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_OFF_2H
@ __CONFIG _CONFIG3H, _CCP2MX_OFF_3H & _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_ON_3H
@ __CONFIG _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _ICPRT_OFF_4L & _XINST_OFF_4L
DEFINE OSC 48
CLEAR
DEFINE LCD_DREG PORTD ' Set LCD data port
DEFINE LCD_DBIT 4 ' Set starting data bit
DEFINE LCD_RSREG PORTE ' Set LCD register select port
DEFINE LCD_RSBIT 0 ' Set LCD register select bit
DEFINE LCD_EREG PORTE ' Set LCD enable port
DEFINE LCD_EBIT 1 ' Set LCD enable bit
DEFINE LCD_BITS 4 ' Set LCD bus size
DEFINE LCD_LINES 2 ' Set number of lines on LCD
DEFINE LCD_COMMANDUS 2000 ' Set command delay time in microseconds
DEFINE LCD_DATAUS 50 ' Set data delay time in microseconds
;--- Setup Interrupts ------------------------------------------------------
INCLUDE "DT_INTS-18.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ; PBP Re-entry for external interrupt
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler USB_Handler
INT_Handler INT_INT, _ToggleLED1, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
endasm
@ INT_ENABLE INT_INT ; enable external (INT) interrupts
;--- Setup USB -------------------------------------------------------------
INCLUDE "DT_HID260.pbp"
DEFINE USB_VENDORID 6017
DEFINE USB_PRODUCTID 2000
DEFINE USB_VERSION 1
DEFINE USB_VENDORNAME "Mr E/DT/RH"
DEFINE USB_PRODUCTNAME "USBLabX1"
DEFINE USB_SERIAL "001"
DEFINE USB_INSIZE 8 ; IN report is PIC to PC (8,16,32,64)
DEFINE USB_OUTSIZE 8 ; OUT report is PC to PIC
DEFINE USB_POLLIN 10 ; Polling times in mS, MIN=1 MAX=10
DEFINE USB_POLLOUT 10
; --- Each USB status LED is optional, comment them if not used ------------
; --- They can be assigned to any pin, and no further action is required ---
DEFINE USB_LEDPOLARITY 1 ; LED ON State [0 or 1] (default = 1)
DEFINE USB_PLUGGEDLED PORTD,0 ; LED indicates if USB is connected
DEFINE USB_TXLED PORTD,1 ; " " data being sent to PC
DEFINE USB_RXLED PORTD,2 ; " " data being received from PC
;--- Setup ADC -------------------------------------------------------------
DEFINE ADC_BITS 8 ; Number of bits in ADCIN result
TRISA = %00000011 ' Set port A pins to 6 output, 2 input
TRISB = %00001111 ' Set port B pins to 4 output, 4 input
' B0 = External Interrupt
TRISC = %00000000 ' Set all port C pins to output
TRISD = %00000000 ' Set all port D pins to output
TRISE = %00000000 ' Set all port E pins to output
;--- Variables -------------------------------------------------------------
Value0 VAR WORD : Value0 = 0
Value1 VAR WORD : Value1 = 0
DUTY1 VAR WORD
DUTY2 VAR WORD
LED1 VAR PORTD.3
WS_CHAR VAR BYTE
WS_BYTE VAR BYTE
WS_LOOPW VAR WORD
;--- Initialize ------------------------------------------------------------
ADCON2.7 = 0 ; left justify (Change this if ADFM in diff register)
ADCON1 = %00001101 ; AN0 & AN1 analog
INTCON2 = %00000000 ; Pull-up resistors, falling edge
PORTB = %00000000 ; Set output on keypad to prevent floating pins
LCDOUT $FE,1 ' Initiate first command to LCD
PORTD = 0 ' Clear LEDs from LCD operations
FOR WS_LOOPW = 0 to 1000 ' Wait for LCD to initalize
PAUSE 1
NEXT WS_LOOPW
LCDOUT $FE,1,"LabX1 18F4550 USB"
PORTD = 0 ' Clear LEDs from LCD operations
FOR WS_LOOPW = 0 to 1000 ' Wait for USB to initalize
PAUSE 1
NEXT WS_LOOPW
ARRAYWRITE USBTXBuffer, ["Lab X1 "]
IF Plugged THEN GOSUB DoUSBOut ; only send when USB is connected
;--- The Main Loop ---------------------------------------------------------
Main:
FOR WS_LOOPW = 0 to 1000 ; Check for incomming USB data while waiting
@ ON_USBRX_GOSUB _HandleRX
PAUSE 1
NEXT WS_LOOPW
ADCIN 0, Value0 ; Send A/D about once/sec
ADCIN 1, Value1
ARRAYWRITE USBTXBuffer, [Value0, Value1, PORTD.3, 0, 0, 0, 0, 0]
IF Plugged THEN GOSUB DoUSBOut ; only send when USB is connected
GOTO Main
end
;---- Receive incoming data PORTB LEDS and CCP PWM dutycycle ---------------
HandleRX:
ARRAYREAD USBRXBuffer,[WS_BYTE, DUTY1.LowByte, DUTY1.HighByte, _
DUTY2.LowByte, DUTY2.HighByte]
LCDOUT $FE,$C0,BIN WS_BYTE
PORTD = 0 ' Clear LEDs from LCD operations
return
'---[INT - interrupt handler]---------------------------------------------------
ToggleLED1:
TOGGLE LED1
ARRAYWRITE USBTXBuffer, ["Button "]
IF Plugged THEN GOSUB DoUSBOut ; only send when USB is connected
PORTB = 0 ' Set output on keypad to prevent floating pins
@ INT_RETURN
Sharing the USB NEG only seems to affect the LCD. If I unplug the programmer, Port B updates properly on the LCD, everything runs fine.
Bookmarks