Code:
' --------------------CHIP FUSES-------------------------------
@ __CONFIG _CONFIG1H, _HS_OSC_1H & _FSCM_OFF_1H & _IESO_OFF_1H
@ __CONFIG _CONFIG2L, _PWRT_OFF_2L & _BOR_OFF_2L
@ __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_1_2H
@ __CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
@ __CONFIG _CONFIG3H, _CCP2MX_OFF_3H & _PBAD_DIG_3H & _MCLRE_ON_3H
DEFINE OSC 40
INTCON = 0
ADCON1.0 = 1 ' Turn off analog inputs
ADCON1.1 = 1
ADCON1.2 = 1
ADCON1.3 = 1
ADCON0.0 = 0 ' Turn off analog converter
CMCON.0 = 1
CMCON.1 = 1
CMCON.2 = 1
' --------------------Ports---------------------------------------
'76543210 '76543210
TRISA = %00000000: PORTA = %00000000
TRISB = %00000011: PORTB = %00000000
TRISC = %00000000: PORTC = %00000000
' ALIAS & MODIFIERS
' ================================================================
nCSA VAR PORTA.3
nCSB var PORTA.4 '- BAD - OPEN COLLECTOR! DO NOT USE
nRST VAR PORTA.2
SCLK VAR PORTA.1
SDO VAR PORTA.0
xmit Var PORTA.5
UPbtn VAR PORTB.0
DWNbtn VAR PORTB.1
' VARIABLES & COSTANTS
' ================================================================
MCP23A CON $42 'Register address to MCP23S17 Config
MCP23B CON $40 'Register address to MCP23S17 PortA(1)
IOCON CON $0A 'Register address to MCP23S17 Config
IODIRA CON $00 'Register address to MCP23S17 PortA(1)
IODIRB CON $01 'Register address to MCP23S17 PortB(2)
GPIOA CON $12 'Register address to MCP23S17 GPIOA(1)
GPIOB CON $13 'Register address to MCP23S17 GPIOB(2)
OLATA CON $14 'Register address to MCP23S17 LATA(1)
OLATB CON $15 'Register address to MCP23S17 LATB(2)
DataOut var BYTE
Voltage VAR WORD 'Variable for manipulating Voltage as full 16 bit word
VoltageFst VAR Voltage.BYTE0 'Variable for Voltage Byte 0 to Send to MCP23S17A-A
VoltageSec VAR Voltage.BYTE1 'Variable for Voltage Byte 1 to Send to MCP23S17A-B
Param Var BYTE 'Variable for Parameters Byte to Send to MCP23S17B-A
RD VAR Param.0 'Varible to set read bit on IP Board - 0 = Read
WR VAR Param.1 'Varible to set write bit on IP Board - 1 = Write
O4 VAR Param.2 'Varible unused 4
RY VAR Param.3 'Varible to set Relay bit on IP Board - 1 = Relay Pulled
O3 VAR Param.4 'Varible unused 3
O2 VAR Param.5 'Varible unused 2
CH1 VAR Param.6 'Varible bit 0 of ADC channel select
CH0 VAR Param.7 'Varible bit 1 of ADC channel select
AuxPort Var BYTE 'Variable for Aux Port Byte to Send to the MCP23S17B-B
UPbtnvar Var BYTE 'Variable for UP Button
DWNbtnvar VAR BYTE 'Variable for DOWN Button
MCPReg VAR BYTE 'Variable for the Register to Send to the MCP23S17
MCPWRT var BYTE 'Command o write in MCP23S17 Address $00
MCPRED var BYTE 'Command o read from MCP23S17 Address $00
' INIT
' ================================================================
UPbtnvar = 0
DWNbtnvar = 0
ncsa = 1
'ncsb = 1
nRST = 0 'Reset the port expanders
PAUSE 1
nRST = 1
MCPReg = IOCON 'Configures MCP23S17-A
DataOut = $28
nCSA = 0 'Enable MCP23S17-A
SHIFTOUT SDO, SCLK, 1, [MCP23A,MCPReg,DataOut]
nCSA = 1 'Disable MCP23S17-A
MCPReg = IODIRA 'Configures PortA(1) All Output
DataOut = $00
nCSA = 0 'Enable MCP23S17-A
SHIFTOUT SDO, SCLK, 1, [MCP23A,MCPReg,DataOut]
nCSA = 1 'Disable MCP23S17-A
MCPReg = IODIRB 'Configures PortB(2) All Output
DataOut = $00
nCSA = 0 'Enable MCP23S17-A
SHIFTOUT SDO, SCLK, 1, [MCP23A,MCPReg,DataOut]
nCSA = 1 'Disable MCP23S17-A
MCPReg = IOCON 'Configures the MCP23S17
DataOut = $28
nCSA = 0 'Enable MCP23S17-B
SHIFTOUT SDO, SCLK, 1, [MCP23B,MCPReg,DataOut]
nCSA = 1 'Disable the MCP23S17
MCPReg = IODIRA 'Configures PortA(1) All Output
DataOut = $00
nCSA = 0 'Enable MCP23S17-B
SHIFTOUT SDO, SCLK, 1, [MCP23B,MCPReg,DataOut]
nCSA = 1 'Disable the MCP23S17
MCPReg = IODIRB 'Configures PortB(2) All Output
DataOut = $00
nCSA = 0 'Enable MCP23S17-B
SHIFTOUT SDO, SCLK, 1, [MCP23B,MCPReg,DataOut]
nCSA = 1 'Disable the MCP23S17
AuxPort = %00000000
GOSUB SEND_AuxPort
' _
' |CH|--|RY|-|W|R
Param = %00001010 ' 00 00 1 0 1 0
GOSUB SEND_Param
Voltage = 0
GOSUB SEND_Voltage
' MAIN LOOP
' ===============================================================
MAIN:
BUTTON DWNbtn,1,255,255,DWNbtnvar,1,BtnDwn
BUTTON UPbtn,1,255,255,UPbtnvar,1,BtnUp
GOSUB Transmit
GOTO MAIN
' SUB - ROTINES
' ================================================================
BtnUp:
IF Voltage >= 65535 THEN
gOTO MAIN
ENDIF
Voltage = (Voltage + 1)
GOSUB SEND_Voltage
'pause 50
GOTO MAIN
BtnDwn:
IF Voltage = 0 THEN
GOTO MAIN
ENDIF
Voltage = (Voltage - 1)
GOSUB SEND_Voltage
'pause 50
GOTO MAIN
Transmit:
xmit = 1
PAUSEUS 1
xmit = 0
pause 50
RETURN
SEND_Voltage:
Voltage = Voltage REV 16
nCSA = 0 'Enable MCP23S17-A
SHIFTOUT SDO, SCLK, 1, [MCP23A,OLATA,VoltageFst]
nCSA = 1 'Disable the MCP23S17
pause 1
nCSA = 0 'Enable MCP23S17-A
SHIFTOUT SDO, SCLK, 1, [MCP23A,OLATB,VoltageSec]
nCSA = 1 'Disable the MCP23S17
RETURN
SEND_Param:
nCSA = 0 'Enable MCP23S17-B
SHIFTOUT SDO, SCLK, 1, [MCP23B,OLATA,Param]
nCSA = 1 'Disable the MCP23S17
RETURN
SEND_AuxPort:
nCSA = 0 'Enable MCP23S17-B
SHIFTOUT SDO, SCLK, 1, [MCP23B,OLATB,Auxport]
nCSA = 1 'Disable the MCP23S17
RETURN
goto main
END
Bookmarks