Code:
'****************************************************************
'* Name : MCP23S17 + MSPP + ASM *
'* Author : [GADELHAS] *
'* Notice : Copyright (c) 2012 *
'* : All Rights Reserved *
'* Date : 31-01-2012 *
'* Version : 1.0 *
'* Notes : *
'* : EASYPICV6 + PIC16F887 + MCP23S17 *
'****************************************************************
' CONFIGS
' ================================================================
@ __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _BOR_OFF & _DEBUG_OFF & _LVP_OFF & _FCMEN_ON & _IESO_OFF
@ __CONFIG _CONFIG2, _WRT_OFF & _BOR40V
' DEFINES & INCLUDES
' ================================================================
DEFINE OSC 8
' REGISTERS AND PINOUT ( 1 = IN; 0 = OUT )
' ================================================================
'76543210 '76543210
TRISA = %00000000: PORTA = %00000100
TRISB = %00000000: PORTB = %00000000
TRISC = %00010000: PORTC = %00000000
TRISD = %00000000: PORTD = %00000000
TRISE = %00000000: PORTE = %00000000
ADCON0 = %00000000
ADCON1 = %00000000
ANSEL = %00000000
ANSELH = %00000000
CM1CON0 = %00000000
CM2CON0 = %00000000
SSPSTAT = %00000000 'Configures the SPI Module ( Read DataSheet )
SSPCON = %00110000 'Configures the SPI Module ( Read DataSheet )
' ALIAS & MODIFIERS
' ================================================================
nCS VAR PORTA.2
nRST VAR PORTA.3
SCLK VAR PORTC.3
SDI VAR PORTC.4
SDO VAR PORTC.5
' VARIABLES & COSTANTS
' ================================================================
MCPWRT CON $40 'Command o write in MCP23S17 Address $00
MCPRED CON $41 'Command o read from MCP23S17 Address $00
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 'Variable for Data Byte to Send to the MCP23S17
DataIn VAR BYTE 'Variable for Data Byte to Receive from the MCP23S17
MCPReg VAR BYTE 'Variable for the Register to Send to the MCP23S17
' PROGRAM INIT
' ================================================================
GOSUB INIT_MCP23S17 'Init the MCP23S17
' MAIN LOOP
' ================================================================
MAIN:
MCPReg=OLATA 'This light up the leds, connected in
DataOut=DataOut+1 'PortA(1) of the MCP23S17
GOSUB SEND_MCP23S17
MCPReg = GPIOB 'This read the PortB(1) of the MCP23S17
GOSUB RECEIVE_MCP23S17 'and show the result on the PORTB of the
PORTB = DataIn 'PIC
PAUSE 200
GOTO MAIN
' SUB - ROTINES
' ================================================================
INIT_MCP23S17:
nRST = 0 'Reset the port expander
PAUSE 1
nRST = 1
MCPReg = IOCON 'Configures the MCP23S17
DataOut = $20
GOSUB SEND_MCP23S17
MCPReg = IODIRA 'Configures PortA(1) All Output
DataOut = $00
GOSUB SEND_MCP23S17
MCPReg = IODIRB 'Configures PortB(2) All Input
DataOut = $FF
GOSUB SEND_MCP23S17
RETURN
SEND_MCP23S17:
ASM
bcf PORTA, 2 ;Enable the MCP23S17
MOVE?CB _MCPWRT, SSPBUF ;Command to Write to the MCP23S17
call _delay
MOVE?BB _MCPReg, SSPBUF ;Register to Write the Data
call _delay
MOVE?BB _DataOut, SSPBUF ;Data to be sent
call _delay
bsf PORTA, 2 ;Disable the MCP23S17
ENDASM
RETURN
RECEIVE_MCP23S17:
ASM
bcf PORTA, 2 ;Enable the MCP23S17
MOVE?CB _MCPRED, SSPBUF ;Command to Read from the MCP23S17
call _delay
MOVE?BB _MCPReg, SSPBUF ;Register to Read from
call _delay
MOVE?BB _DataOut, SSPBUF ;Send something
call _delay
MOVE?BB SSPBUF, _DataIn ;Data received from te MCP23S17
bsf PORTA, 2 ;Disable the MCP23S17
ENDASM
RETURN
delay: 'Delay Routine 3uS - You may have to change if running OSC faster
asm ;8Mhz/4 = 2Mhz = 0.5uS X 6cycles(2 p/goto) = 3uS
goto $+1
goto $+1
goto $+1
endasm
return
END
Size: 157 Words
Time to execute the following Routine ( Send) - 47 ticks -> 23.1uS
Code:
MCPReg=OLATA 'This light up the leds, connected in
DataOut=DataOut+1 'PortA(1) of the MCP23S17
GOSUB SEND_MCP23S17
Time to execute the following Routine ( Receive) - 50 ticks -> 25.0uS
Code:
MCPReg = GPIOB 'This read the PortB(1) of the MCP23S17
GOSUB RECEIVE_MCP23S17 'and show the result on the PORTB of the
PORTB = DataIn 'PIC
Bookmarks