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 *
'* : 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 *
'* : wires soldered directly to top of pins *
'* : two 0.1uF ceramic caps in parallel across VUSB and VSS *
'* : D- wired to C4 (pin 23) *
'* : D+ wired to C5 (pin 24) *
'***************************************************************************
'--- 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_OFF_2L & _BOR_ON_2L & _BORV_46_2L & _VREGEN_ON_2L
@ __CONFIG _CONFIG2H, _WDT_OFF_2H
@ __CONFIG _CONFIG3H, _CCP2MX_ON_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
' Using only 4 bit bus to control LCD
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
;OUTPUT PORTC.1
;OUTPUT PORTC.2
;--- Initialize ------------------------------------------------------------
;CCPR1L = 0
;CCPR2L = 0
;CCP1CON = %00001100 ' CCP1, PWM mode
;CCP2CON = %00001100 ' CCP2, PWM mode
;PR2 = 249 ' 0-1000 duty range
;T2CON = %00000101 ' TMR2 on, prescaler 1:4
ADCON2.7 = 0 ; left justify (Change this if ADFM in diff register)
ADCON1 = %00001101 ; A/D Control
' Bit 7, 0 = n/a
' Bit 6, 0 = n/a
' Bit 5, Vref- Source
' 0 = VSS
' 1 = Vref- (AN2)
' Bit 4, Vref+ Source
' 0 = VSS
' 1 = Vref+ (AN3)
' Bit 3-0 1111 = All digital
' 1110 = All digital, AN0 analog
' 1101 = All digital, AN0 & AN1 analog
INTCON2 = %00000000
' Bit 7, 0 = enabled, Pull-up resistors
' Bit 6, 0 = falling edge, B0 interrupt
' Bit 5, 0 = falling edge, B1 interrupt
' Bit 4, 0 = falling edge, B2 interrupt
' Bit 3, 0 = n/a
' Bit 2, 0 = low priority, TMR0 interrupt
' Bit 1, 0 = n/a
' Bit 0, 0 = low priority, Port B on-change
;--- Variables -------------------------------------------------------------
Value0 VAR WORD : Value0 = 0
Value1 VAR WORD : Value1 = 0
DUTY1 VAR WORD
DUTY2 VAR WORD
'Old_PORTA VAR BYTE
'New_PORTA VAR BYTE
LED1 VAR PORTD.3
WS_CHAR VAR BYTE
WS_BYTE VAR BYTE
WS_LOOP VAR WORD
PORTB = %00000000 ' Set output on keypad
' to prevent floating pins
FOR WS_LOOP = 0 to 1000 ' Wait for PIC and LCD to stabilize
PAUSE 1
NEXT WS_LOOP
' LCDOUT $FE,1,"Initializing..."
' PORTD = 0 ' Clear LEDs from LCD operations
' FOR WS_LOOP = 0 to 500 ' Wait for LCD to initialize
' PAUSE 1
' NEXT WS_LOOP
LCDOUT $FE,1,"LabX1 18F4550 USB"
FOR WS_LOOP = 0 to 100 ' Short delay to process LCD operation
PAUSE 1
NEXT WS_LOOP
PORTD = 0 ' Clear LEDs from LCD operations
ARRAYWRITE USBTXBuffer, ["Lab X1 "]
IF Plugged THEN GOSUB DoUSBOut ; only send when USB is connected
FOR WS_LOOP = 0 to 500 ' Short delay to process USB operation
PAUSE 1
NEXT WS_LOOP
ARRAYWRITE USBTXBuffer, [Value0, Value1, PORTD.3, 0, 0, 0, 0, 0]
IF Plugged THEN GOSUB DoUSBOut ; only send when USB is connected
;--- The Main Loop ---------------------------------------------------------
Main:
FOR WS_LOOP = 0 to 1000 ; Check for incomming USB data while waiting
@ ON_USBRX_GOSUB _HandleRX
PAUSE 1
NEXT WS_LOOP
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
FOR WS_LOOP = 0 to 100 ' Short delay to process LCD operation
PAUSE 1
NEXT WS_LOOP
PORTD = 0 ' Clear LEDs from LCD operations
; CCP1CON.5=DUTY1.1 ' load CCP1 duty value
; CCP1CON.4=DUTY1.0 ' with Duty1
; CCPR1L=DUTY1>>2 '
;
; CCP2CON.5=DUTY2.1 ' load CCP2 duty value
; CCP2CON.4=DUTY2.0 ' with Duty2
; CCPR2L=DUTY2>>2 '
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
FOR WS_LOOP = 0 to 250 ' Very basic debounce for keypress
PAUSE 1
NEXT WS_LOOP
@ INT_RETURN
I hope the formattting doesn't get all screwed up.
Bookmarks