MCP23S17 - Three different approaches - ShiftIn/ShiftOut / MSSP+PBP / MSSP+ASM


Closed Thread
Results 1 to 19 of 19

Hybrid View

  1. #1
    Join Date
    Aug 2008
    Location
    Portugal
    Posts
    240


    1 out of 1 members found this post helpful. Did you find this post helpful? Yes | No

    Default Second Approache - MSSP Module with PBP only

    Code:
    '****************************************************************
    '*  Name    : MCP23S17 + MSPP + PBP                             *
    '*  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 = %00000000 
     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:
        nCS = 0                 'Enable the MCP23S17
        SSPBUF = MCPWRT         'Command to Write to the MCP23S17
        PAUSEUS 1    
        SSPBUF = MCPReg         'Register to Write the Data
        PAUSEUS 1 
        SSPBUF = DataOut        'Data to be sent
        PAUSEUS 1           
        nCS = 1                 'Disable the MCP23S17
    RETURN
    RECEIVE_MCP23S17:
        nCS = 0                 'Enable the MCP23S17
        SSPBUF = MCPRED         'Command to Read from the MCP23S17
        PAUSEUS 1 
        SSPBUF = MCPReg         'Register to Read from
        PAUSEUS 1  
        SSPBUF = 0              'Send something
        PAUSEUS 1  
        DataIn = SSPBUF         'Data received from te MCP23S17
        PAUSEUS 1 
        nCS = 1                 'Disable the MCP23S17
    RETURN
    END

    Size: 166 Words

    Time to execute the following Routine ( Send) - 92 ticks -> 46.0uS
    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) - 119 ticks -> 59.1uS
    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
    Thanks and Regards;
    Gadelhas

  2. #2
    Join Date
    Aug 2008
    Location
    Portugal
    Posts
    240


    Did you find this post helpful? Yes | No

    Default Third Approache - MSSP Module with PBP and ASM Send and Receive Routine

    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
    Thanks and Regards;
    Gadelhas

  3. #3
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,172


    Did you find this post helpful? Yes | No

    Default Re: Third Approache - MSSP Module with PBP and ASM Send and Receive Routine

    This is great stuff. I use the MCP23016, but this new IC is much faster.

    Can you explain how you came up with the 3us delay in the 3rd approach? I look at your comment and the SPI characteristics in the datasheet and don't know what to use exactly.

    Robert
    Last edited by Demon; - 2nd February 2012 at 02:33.

  4. #4
    Join Date
    Aug 2008
    Location
    Portugal
    Posts
    240


    Did you find this post helpful? Yes | No

    Default Re: Third Approache - MSSP Module with PBP and ASM Send and Receive Routine

    Quote Originally Posted by Demon View Post
    This is great stuff. I use the MCP23016, but this new IC is much faster.

    Can you explain how you came up with the 3us delay in the 3rd approach? I look at your comment and the SPI characteristics in the datasheet and don't know what to use exactly.

    Robert
    Hi Robert, Thanks for your comment.

    Hi came up with 3 uS by trial and error. I tried 2 uS, but it wasn´t enough. The problem is not the MCP23S17, but the SSPUBUF register of the PIC. I think if you run the PIC faster, for instance @20Mhz, you can even reduce that time.
    Thanks and Regards;
    Gadelhas

  5. #5
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,172


    Did you find this post helpful? Yes | No

    Default Re: Third Approache - MSSP Module with PBP and ASM Send and Receive Routine

    Wouldn't it be the other way around? If you run a PIC faster, it would cycle quicker so you'd need more delay instructions no?

    I checked the datasheet again and page 35 table 2-4 has 500ns for Serial Data to Output Valid. Does that mean it takes 500ns for the IC to process a complete output operation?

    I would assume reading is quicker...?

    Robert

  6. #6
    Join Date
    Aug 2008
    Location
    Portugal
    Posts
    240


    Did you find this post helpful? Yes | No

    Default Re: Third Approache - MSSP Module with PBP and ASM Send and Receive Routine

    Quote Originally Posted by Demon View Post
    Wouldn't it be the other way around? If you run a PIC faster, it would cycle quicker so you'd need more delay instructions no?

    I checked the datasheet again and page 35 table 2-4 has 500ns for Serial Data to Output Valid. Does that mean it takes 500ns for the IC to process a complete output operation?

    I would assume reading is quicker...?

    Robert
    The problem is that when you put a byte in the SSPUF of the PIC, it takes some time for the PIC to output that byte( @8Mhz ~3uS ). If you run the PIC faster, the time that it takes to output the byte gets reduced.
    At this speed ( 8Mhz ), you put the byte into the SSPUF and you must wait 3us to put another byte in the SSPUF, if you put a byte before the 3us, for instance at 2us, the byte before will be corrupted and the pic will output the new byte and miss the byte before. You can try this in the simulation that is attached.

    You are looking at the wrong table ( 2-4 GP and INT TIMMING). You should look table 2-3 (SPI Characteristics ). The MCP23S17 can RUN at a max of 10Mhz ( SPI ).
    Thanks and Regards;
    Gadelhas

  7. #7
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,622


    1 out of 1 members found this post helpful. Did you find this post helpful? Yes | No

    Default Re: MCP23S17 - Three different approaches - ShiftIn/ShiftOut / MSSP+PBP / MSSP+ASM

    Hi,
    Instead of relying on software timing you can check the MSSP interrupt flag:
    Code:
    myByte VAR BYTE
    SSPIF VAR PIR1.3
    
    myByte = 123
    
    SSPBUF = myByte                 ' Load byte to shiftregister buffer
    SSPIF = 0                             ' Clear interrupt flag
    WHILE SSPIF=0 : WEND        ' Wait for transmission to finish
    This way you don't have to change any timing if you change the oscillator or if you change the MSSP module clock divisor etc.

    Check the datasheet and make sure the SSPIF is at PIR1.3 for your device. (I think they try to keep it consistent but you never know)

    /Henrik.

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts