Need to know code to interface mcp23017 i/o exp via i2c

B-Joe

New Member
Hi, evry one.
Can some one please help me with a code to interface
an i/o expander via i2c to my 14m2 in order to connect a 3x4
keypad to my alarm project.
Thnx a lot.
 

lbenson

Senior Member
Thanks to the westaust55 tutorial on the mcp23017:
Code:
#picaxe 14M2 
SETFREQ M16

SYMBOL mcp23017 = %01000000 ; $0100 A2, A1, A0, R/W all connected to 0V
SYMBOL IODIRA = $00 ; Port A IO Direction register DEFAULT = I/P
SYMBOL IODIRB = $01 ; Port B IO Direction register DEFAULT = I/P
SYMBOL IOCON = $0A ; IO Expander config register - address $0B accesses the same register
SYMBOL GPIOA = $12 ; Port A General purpose register
SYMBOL GPIOB = $13 ; Port B General Purpose register
SYMBOL OLATA = $14 ; Port A latch register
SYMBOL OLATB = $15 ; Port B latch register

  pause 8000
  HI2CSETUP i2cmaster, mcp23017, i2cFAST_16, i2cbyte
'  HI2CSETUP i2cmaster, mcp23017, i2cSLOW_16, i2cbyte
  PAUSE 400

  HI2COUT IODIRA, ($00) ;set all port A pins as outputs (0)
  HI2COUT IODIRB, ($FF) ;set all port B pins as inputs (1)

   PAUSE 100

  do
    HI2COUT GPIOA, (%11111111) ; all ON
    PAUSE 4000
    HI2COUT GPIOA, (%00000000) ; all OFF
    PAUSE 4000
'    sertxd("t")
    HI2CIN GPIOB,(b2)
    sertxd(#b2)
 loop
 

B-Joe

New Member
Westuast 55 tutorial re code for mcp23017.

Thanks to the westaust55 tutorial on the mcp23017:
Code:
#picaxe 14M2 
SETFREQ M16

SYMBOL mcp23017 = %01000000 ; $0100 A2, A1, A0, R/W all connected to 0V
SYMBOL IODIRA = $00 ; Port A IO Direction register DEFAULT = I/P
SYMBOL IODIRB = $01 ; Port B IO Direction register DEFAULT = I/P
SYMBOL IOCON = $0A ; IO Expander config register - address $0B accesses the same register
SYMBOL GPIOA = $12 ; Port A General purpose register
SYMBOL GPIOB = $13 ; Port B General Purpose register
SYMBOL OLATA = $14 ; Port A latch register
SYMBOL OLATB = $15 ; Port B latch register

  pause 8000
  HI2CSETUP i2cmaster, mcp23017, i2cFAST_16, i2cbyte
'  HI2CSETUP i2cmaster, mcp23017, i2cSLOW_16, i2cbyte
  PAUSE 400

  HI2COUT IODIRA, ($00) ;set all port A pins as outputs (0)
  HI2COUT IODIRB, ($FF) ;set all port B pins as inputs (1)

   PAUSE 100

  do
    HI2COUT GPIOA, (%11111111) ; all ON
    PAUSE 4000
    HI2COUT GPIOA, (%00000000) ; all OFF
    PAUSE 4000
'    sertxd("t")
    HI2CIN GPIOB,(b2)
    sertxd(#b2)
 loop
THanx so much guys. You are the best!!!
 

Mark.R

Member
Hi,

Been doing bits of research on this expander chip and i2c in general, its been interesting. How would the example of Westaust55 code changed/posted by Ibenson change to address more than one MCP23017 having the same A as out and B as input?
 

lbenson

Senior Member
Not certain this answers your question, but for instance
Code:
; MCP23017 register address constants (from westaust55 tutorial)
SYMBOL mcp23017_0 = %01000000 ; $0100 A2, A1, A0, R/W all connected to 0V
SYMBOL mcp23017_1 = %01000010 ; A0 connected to +V
SYMBOL mcp23017_2 = %01000100 ; A1 connected to +V
SYMBOL IODIRA = $00 ; Port A IO Direction register DEFAULT = I/P
SYMBOL IODIRB = $01 ; Port B IO Direction register DEFAULT = I/P
SYMBOL GPIOA = $12 ; Port A General purpose register
SYMBOL GPIOB = $13 ; Port B General Purpose register

  ' set up mcp23017 i/o expanders
  HI2CSETUP i2cmaster, mcp23017_0, cI2CSpeed, i2cbyte
  HI2COUT IODIRA, ($00) ;set all port A pins as outputs (0)
  HI2COUT IODIRB, ($00) ;set all port B pins as outputs (0)
  HI2COUT GPIOA, ($00) ;set port A pins
  HI2COUT GPIOB, ($FF) ;set all port B pins as inputs (1)

  HI2CSETUP i2cmaster, mcp23017_1, cI2CSpeed, i2cbyte
  HI2COUT IODIRA, ($00) ;set all port A pins as outputs (0)
  HI2COUT IODIRB, ($00) ;set all port B pins as outputs (0)
  HI2COUT GPIOA, ($00) ;set port A pins
  HI2COUT GPIOB, ($FF) ;set all port B pins as inputs (1)
etc. as needed to set or read after having issued HI2CSETUP for the appropriate mcp23017.
 
Top