Code:
define LOADER_USED 1 ' USB Boot loader
define RESET_ORG 800h
define INTERRUPT_ORG 808h
DEFINE OSC 48
DEFINE I2C_SCL PORTA,1
DEFINE I2C_SDA PORTA,0
Define I2C_SLOW 1 'At this clock speed this needed to be added to make it work.
'define SHIFT_PAUSEUS 200
ADCON1 = $F 'port A digital
CMCON = 7 'PortA Digital
USBBufferSizeMax con 16 ' maximum buffer size
USBBufferSizeTX con 16 ' input
USBBufferSizeRX con 16 ' output
' the USB buffer...
USBBuffer Var Byte[USBBufferSizeMax]
USBBufferOut Var Byte[USBBufferSizeMax]
USBBufferCount Var Byte
Addr var byte
j var byte
i var byte
'======================================================================================
' Port A Registers (8 Bit Mode)
IODIRA con $00 ' Direction Bit Control Reg
IOBITSA con %11111111 ' Direction Bit Settings Reg (0 = output, 1 = input)
IPOLA con $01 ' Interrupt Polarity Control Reg
GPINTENA con $02 'Interrupt Enable Reg
DEFVALA con $03
INTCONA con $04
IOCONA con $05 ' I/O Configuration Reg
IOCONSETA con %10111000 ' IOCON register setting
GPPUA con $06 ' Pull-Up Control Reg
INTFA con $07 ' Interrupt Flag Register
INTCAPA con $08
GPIOA con $09 ' General Purpose I/O
IOLATA con $0A ' Output Latch Reg
'Port B Registers (8 Bit Mode)
IODIRB con $10 ' Port B Direction Bit Control Address
IOBITSB con %00000000 ' Port B Direction Bit Settings (0 = output, 1 = input)
IPOLB con $11 ' Interrupt Polarity Control
GPINTENB con $12 ' Interrupt Enable Reg
DEFVALB con $13
INTCONB con $14
IOCONB con $15 ' I/O Configuration Reg
IOCONSETB con %10111000 ' IOCON register setting
GPPUB con $16 ' Pull-Up Control Reg
INTFB con $17 ' Interrupt Flag Register
INTPOLB con $18
GPIOB con $19 ' General Purpose I/O Reg
IOLATB con $1A ' Output Latch Reg
'========================================================================================
' Port A Reguisters (16 Bit Mode)
IODIRA16 con $00
IODIRB16 con $01
IOCONA16 con $0A
IOCONB16 con $0B
GPIOA16 con $12
GPIOB16 con $13
OLATA16 con $14
OLATB16 con $15
IO_EXP0WR con $4E ' MCP23017 Write
IO_EXP0RD con $4F ' MCP23017 Read
IO_DAT var byte ' MCP23017 Data read
IO_DAT_OLD var byte
Out_Dat var byte
' Interrupt definition
' ====================
' USB interrupt used to keep USB connection alive
INCLUDE "DT_INTS-18.bas" ' Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ' Include if using PBP interrupts
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler USB_INT, _DoUSBService, ASM, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
usbinit ' initialise USB...
USBService ' keep connection alive
UIE = $7F
UEIE = $9F
@ INT_ENABLE USB_INT
gosub InitMPC23017
gosub ReInitPortA
goto Programstart
' ************************************************************
' * Sub-routines *
' ************************************************************
DoUSBService: 'Keeps USB alive
usbservice
@ INT_RETURN
' ************************************************************
' * 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, USBBufferout, USBBufferCount, DoUSBOut ' if bus available, transmit data
return
InitMPC23017:
Pause 100
'############# PORTA
i2cwrite PortA.0,PortA.1,IO_EXP0WR,[IOCONA,IOCONSETA]
i2cwrite PortA.0,PortA.1,IO_EXP0WR,[IODIRA,$0] 'PortA inputs
i2cwrite PortA.0,PortA.1,IO_EXP0WR,[IOLATA,$FF] 'PortA = 0
'i2cwrite PortA.0,PortA.1,IO_EXP0WR,[IPOLA,0]
'i2cwrite PortA.0,PortA.1,IO_EXP0WR,[DEFVALA,0]
'i2cwrite PortA.0,PortA.1,IO_EXP0WR,[GPPUA,$FF] 'pull-ups enabled
'i2cwrite PortA.0,PortA.1,IO_EXP0WR,[INTCONA,0]
'i2cwrite PortA.0,PortA.1,IO_EXP0WR,[GPINTENA,$FF] 'interupt on change
'############## PORTB
i2cwrite PortA.0,PortA.1,IO_EXP0WR,[IOCONB,IOCONSETB]
i2cwrite PortA.0,PortA.1,IO_EXP0WR,[IODIRB,0]
i2cwrite PortA.0,PortA.1,IO_EXP0WR,[IOLATB,$FF]
'i2cwrite PortA.0,PortA.1,IO_EXP0WR,[IPOLB,0]
'i2cwrite PortA.0,PortA.1,IO_EXP0WR,[DEFVALB,0]
'i2cwrite PortA.0,PortA.1,IO_EXP0WR,[INTCONB,0]
'i2cwrite PortA.0,PortA.1,IO_EXP0WR,[GPINTENB,0]
return
ReInitPortA:
i2cwrite PortA.0,PortA.1,IO_EXP0WR,[IOCONA,IOCONSETA]
i2cwrite PortA.0,PortA.1,IO_EXP0WR,[IODIRA,$FF]
i2cwrite PortA.0,PortA.1,IO_EXP0WR,[GPPUA,$FF] 'pull-ups enabled
return
' ************************************************************
' * main program loop - remember, you must keep the USB *
' * connection alive with a call to USBService every couple *
' * of milliseconds or so... *
ProgramStart:
'gosub DoUSBIn
'gosub DoUSBOut
i2cwrite PortA.0,PortA.1,IO_EXP0wr,[gpioa]
i2cread PortA.0,PortA.1,IO_EXP0rd,[IO_dat]
if IO_DAT_OLD != io_dat then
'''' usbbufferout(0) = io_dat
for j = 0 to 15
usbbufferout(j) = io_dat
next j
gosub dousbout
out_dat = io_dat
io_dat_old = io_dat
endif
i2cwrite PortA.0,PortA.1,IO_EXP0WR,[gpioB,out_dat]
PAUSE 250
''i2cwrite PortA.0,PortA.1,IO_EXP0WR,[gpioB,0]
''PAUSE 250
goto ProgramStart
end
Thanks
Bookmarks