Code:
'
' RCUSB ; Edited 'USBDEMO' from Steve and Darrel
' =======
'
' File name : RCUSBCOMM_INT.pbp
' Company : Rytech Computing
' Programmer : Steve Monfette, Darrel Taylor, Ryan Barrett
' Date : November 23, 2008
' Device : PIC18F4550 & 20MHZ crystal
'
'
' USB I/O
'
' Hardware:
' ---------
' ACTLED PORTB.1
' INTERNAL DEBUG LEDS PORTD.0-3
' 5v Logic A/D Monitor AN0 USB/Max756/7805 output
' Max756v AA/AAA input A/D Monitor AN1 5v max
' 12v voltage/4 divider A/D Monitor AN2 20v max 7805C input
' Max4172 LOAD A/D Monitor AN3 5A max
' Max4172 CHARGE A/D Monitor AN4 2A max
' USB Sense PORTB.0 USB Active High
' 20 MHZ crystal & all the usual USB stuff
' Internal button PORTB.4
'
'
'
' Pic Configuration
' =================
asm
__CONFIG _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
__CONFIG _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
__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 & _ICPRT_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
endasm
DEFINE OSC 48
DEFINE LOADER_USED 1
DEFINE RESET_ORG 800h
Define ADC_BITS 8
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 100
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
DEFINE CCP2_REG PORTC
DEFINE CCP2_BIT 1
'
' Hardware configuration
' ======================
'
' I/O and PORTs
' -------------
PORTB = 0
PORTC = 0
PORTD = 0
PORTE = 0
TRISB = %00010001
TRISC = 0
TRISA = %11111111
TRISD = %00000000
TRISE = 0
'
' A/D converter
' -------------
ADCON0 = %00000001
ADCON1 = %00001000
ADCON2 = %00000111
'
' CCP/PWM
' -------
' CCP1CON = %00001100 ' CCP1, PWM mode
' CCP2CON = %00001100 ' CCP2, PWM mode
' PR2 = 249 ' 12khz PWM Freq
' T2CON = %00000101 ' TMR2 on, prescaler 1:4
'
' USB module
' ----------
' UCFG var byte EXT ' include UCFG register... Yeah Melabs didn't :o(
ucfg = %00010100 ' enable internal USB pull-up, Full speed USB
'
' Interrupt definition
' ====================
' USB interrupt used to keep USB connection alive
INCLUDE "DT_INTS-18.bas" ' Base Interrupt System
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler USB_INT, _DoUSBService, ASM, yes
endm
INT_CREATE ; Creates the interrupt processor
endasm
'
' Variables & constants definition
' ================================
USBBufferSizeTX con 16 ' input
USBBufferSizeRX con 16 ' output
USBBufferCount Var Byte '
USBBufferIn var byte[16] ' store incomming USB data
USBBufferOut Var Byte[16] ' store outgoing USB data
DataToSend var byte[16] ' store ADCs & pushButton data to send to USB
usb_device_state var byte EXT
CONFIGURED_STATE CON EXT
String1 var byte[16] ' hold 'USB DEMO' string
string1[0]="R"
string1[1]="C"
string1[2]="U"
string1[3]="S"
string1[4]="B"
string1[5]="C"
string1[6]="O"
string1[7]="M"
String1[8]="M"
String1[9]="_"
String1[10]="V"
String1[11]="1"
string1[12]="a"
string1[13]=" "
string1[14]=" "
string1[15]=" "
adval Var Byte[8]
pwmduty var BYTE[4]
PKTSUM var byte
QUAL con 229
ACTLED var PORTB.1
spout var PORTB.7
DLED1 VAR PORTD.0
DLED2 VAR PORTD.1
DLED3 VAR PORTD.2
DLED4 VAR PORTD.3
USBCONNECTED var PORTB.0
' Constants definition
' ====================
GoDone var ADCON0.1 ' ADC conversion
'
' Macro(s) definition
' ===================
asm
SendUSB macro array
; Use to Copy an specific array to USBBufferOut AND send it
; to USB bus
variable i=0
while i<16
MOVE?BB (array+i),(_USBBufferOut+i)
i+=1
endw
L?CALL _DoUSBOut
endm
endasm
'
' Software/Hardware initialisation
' ================================
SwHwInit:
HIGH DLED1
Pause 490
LOW DLED1
Pause 500
HIGH DLED1
Pause 500
LOW DLED1
Pause 500
HIGH DLED1
Pause 500
LOW DLED1
Pause 500
HIGH DLED1
adval[0]= 0
adval[1]= 0
adval[2]= 0
adval[3]= 0
adval[4]= 0
adval[5]= 0
adval[6]= 0
adval[7]= 0
pwmduty[0]= 0
pwmduty[1]= 0
pwmduty[2]= 0
pwmduty[3]= 0
gosub DoUSBinit:
'
' Main program start
' ==================
Start:
'
' ------------------------------------------------------------
if (PORTB.4)!=0 then
@ SendUSB _String1
TOGGLE DLED2
endif
toggle actled
'GOSUB GetAD:
'GOSUB toLCD:
datatosend[0] = "A"
DataToSend[1] = "V"
DataToSend[2] = "B"
Datatosend[3] = adval[0]
Datatosend[4] = "C"
Datatosend[5] = adval[2]
Datatosend[6] = "D"
Datatosend[7] = adval[3]
Datatosend[8] = "E"
Datatosend[9] = adval[4]
DataToSend[10]= "F"
Datatosend[11]= "Z"
Datatosend[12]= "G"
Datatosend[13]= "Y"
Datatosend[14]= "Z"
Datatosend[15]= "Z"
@ SendUSB _DataToSend
gosub dousbin:
GOTO START:
'
' Subroutines area
' ================
'
'
DoUSBIn:
'
' Check and receive data from the USB bus
' =======================================
@ INT_DISABLE USB_INT
USBBufferCount = USBBufferSizeRX ' RX buffer size
USBService ' keep connection alive
USBIn 1, USBBufferin, USBBufferCount, Timeout ' read data, if available
Timeout: '
@ INT_ENABLE USB_INT
pwmduty[0] = USBBUFFERIN[0] ' output to PORTB
pwmduty[1] = USBBufferin[1]
pwmduty[2] = USBBufferIn[2]
pwmduty[3] = USBBufferIn[3]
return
'
'
'
DoUSBOut:
'
' Send data to the USB bus & Wait for USB interface to attach
' ===========================================================
@ INT_DISABLE USB_INT
WaitPC: '
USBBufferCount = USBBufferSizeTX ' TX buffer size
USBService ' keep connection alive
USBOut 1, USBBufferOut, USBBufferCount, Waitpc ' if bus available, transmit data
@ INT_ENABLE USB_INT
return
;_____________________________________________________________________________
;_______________________________________________________________________________________________________
DoUSBinit:
pause 500
usbinit ' initialise USB...
repeat ' kick-start it
usbservice
until usb_device_state = CONFIGURED_STATE
@ INT_ENABLE USB_INT
return
;_______________________________________________________________________________________________________
DoUSBService:
usbservice
@ INT_RETURN
;_______________________________________________________________________________________________________
GetAD:
ADCON0=%00000001:Gosub GetSample:adval[0]=ADRESH 'get AN0 into adval[0] (7805 5v source voltage)
toggle actled
'ADCON0=%00001001:Gosub GetSample:adval[2]=ADRESH '12v Voltage -skip over AN1 (max756) get AN2 (12v battery source voltage divider output) into adval[2]
'toggle actled
'ADCON0=%00001101:Gosub GetSample:adval[3]=ADRESH ' 12v Current -AN3 into adval[3] (max4172 12v battery current out)
'toggle actled
'ADCON0=%00010001:Gosub GetSample:adval[4]=ADRESH 'AN4 into adval[4] (12v Input current)
RETURN
;_______________________________________________________________________________________________________
GetSample:
PAUSEUS 100
GoDone=1
While GoDone=1:Wend
Return
;_______________________________________________________________________________________________________
ToLCD:
SerOut2 spout,16468,[DEC3 QUAL,DEC3 adval[0],dec3 adval[2],Dec3 adval[3],dec3 pwmduty[0],dec3 pwmduty[1],dec3 pwmduty[2],DEC3 pwmduty[3],13,10]
RETURN
Bookmarks