Port alias in Port Expanders (MCP23S17)


Closed Thread
Results 1 to 19 of 19

Hybrid View

  1. #1
    Join Date
    Sep 2007
    Location
    Waco, Texas
    Posts
    151

    Default Port alias in Port Expanders (MCP23S17)

    Hello to All-
    I am trying to do something and I just can't break through the fog to see how this may be accomplished;
    Assign an alias to a port pin on a port expander.
    I know how to do it with a port/pin on the uProc but I just can't figure it out.
    The port expander is using SPI and each expander has its own chip select.
    How can you alias GPB.2 on chip2 from GPB.2 on chip3?
    What am I missing? Can it be done? Should it be done?
    I get that aliasing is somewhat lazy but it makes for clear code!

    Anyone done this?
    -Stumped......
    "If we knew what we were doing, it wouldn't be called research"
    - Albert Einstein

  2. #2
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,557


    Did you find this post helpful? Yes | No

    Default Re: Port alias in Port Expanders (MCP23S17)

    Hi,
    Since it's on a bus external to the PIC itself you are NOT going to do things like GPB.2 = 1 to "get at" the output directly since the actual data needs to be transfered to the external chip using SHIFTOUT or the MSSP module or whatever. I suspect you know that but wanted to get it squared away just in case.

    Since the port expander is on the SPI bus you're sending it one or more bytes. I'm guessing that one (or more) of those bytes reflects the desired state of the outputs on the expander. (Had you said which chip you're using I could've been more specific).

    So if you have a byte called ChipOne then you can alias each bit as usual ChipOne.0 = 1 but then you obviously need to transfer ChipOne to chip one. If you had a timer interrupt sending the byte to the expander x timer per second then doing ChipOne.4 = 1 might be fast/transparent enough - I don't know.

    /Henrik.

  3. #3
    Join Date
    Sep 2007
    Location
    Waco, Texas
    Posts
    151


    Did you find this post helpful? Yes | No

    Default Re: Port alias in Port Expanders (MCP23S17)

    Thanks, yes I did say which chip in the topic.... <grin>.
    And yes again, that is what I had come up with and I had used that in the past - using
    outputs var byte[4]
    and then indexing by just what you said -> outputs[0].4 = 1 or whatever.
    Just thought there may be other solutions....... more minds the better!
    Thanks for the input, I appreciate it.
    "If we knew what we were doing, it wouldn't be called research"
    - Albert Einstein

  4. #4
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,557


    Did you find this post helpful? Yes | No

    Default Re: Port alias in Port Expanders (MCP23S17)

    Ooops, I missed the topic, sorry about that!

    I guess I don't see the problem then....sorry about that as well :-)

    /Henrik.

  5. #5
    Join Date
    Sep 2007
    Location
    Waco, Texas
    Posts
    151


    Did you find this post helpful? Yes | No

    Default Re: Port alias in Port Expanders (MCP23S17)

    Henrik-
    I may have been too hasty in my description ( I am back on my home project) as I am stumped. I had used the I2C version of this part a while back and have it working. Now I am trying to use the SPI version (MCP23S17) for its speed and I can't seem to figure out how to get from a byte indicating which bit to turn on for the MCP23S17 part.
    Lets say I receive a var and it's value is $E. This var needs to tell the MCP23S17 that the 15th output should turn on. Now that is GPB-7 on the MCP23S17.
    I have a routine that converts HEX to DECIMAL (thanks to this forum years ago) and that works fine, how to I get a single decimal to go to the correct port on the MCP23S17?
    My code works fine to send a binary string (easier to visualize for me) to the MCP23S17 but I can't seem to get the finesse of going from 1 hex or 1 dec char to the right bit output.
    I have looked through the forum and I have seen yours and others pointing to OUT.0[var] which gets to the VAR-position of the OUT variable but as I have 2 eight bit outputs I am stumped......

    From the MCP23S17 datasheet it looks like it may be addressed as one 16 bit output, is that accurate? Any suggestions?
    Some code below:
    Code:
    OutA var byte
    
    OUTtest:'------------ TEST
                          OutA=$1                                                  'Simulate number from serial comm, example '1'
                          K=OutA                                                   'Sets up the conversion from hex to decimal
                          gosub H2D                                               'Performs the conversion
                          debug "After H2D K=",dec1 K,13               'Double-check what the sub did
                          k=k-8                                                        'try this for a pointer
                          OutA_DataOut=OutA.0[k]                        'Try to set the correct bit out of 8 to turn on and pass to OutA_DataOut which is passed to the MCB23S17
                            OutA_MCPReg = OLATA                             'Sets up PORTA output
    '                        OutA_DataOut=%11111110                    'This works by setting individual bits, but not good for what I want to do
                            gosub SEND_OutA_2317                         'Send to the expander
                            pause 10                                               'wait a bit
                            OutA_MCPReg = OLATB                             'Sets up PORTB output
                            OutA_DataOut=%01111111
                            gosub SEND_OutA_2317
    "If we knew what we were doing, it wouldn't be called research"
    - Albert Einstein

  6. #6
    Join Date
    Sep 2007
    Location
    Waco, Texas
    Posts
    151


    Did you find this post helpful? Yes | No

    Default Re: Port alias in Port Expanders (MCP23S17)

    Henrik-
    Also forgot to mention that in the older I2C design I had 8 bits of inputs and 8 bits of outputs on one 2317.
    This new design is all outputs - I thought it would be easier!
    Not so much......
    Regards,
    Steve
    "If we knew what we were doing, it wouldn't be called research"
    - Albert Einstein

Similar Threads

  1. I2C question w/ MCP23017 Port Expanders
    By dsicon in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 26th December 2012, 05:47
  2. 18F2520 - problem configuring fuse for port B as digital port.
    By hwhisperer in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 11th October 2010, 11:41
  3. LCD R/S works on Port A but not Port B
    By TDonBass in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 10th February 2009, 12:41
  4. RB port sequencer
    By freelancebee in forum mel PIC BASIC
    Replies: 0
    Last Post: - 17th August 2005, 19:58
  5. Duplicating port input to port output
    By lwindridge in forum mel PIC BASIC Pro
    Replies: 0
    Last Post: - 26th April 2004, 21:43

Members who have read this thread : 0

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