Hjælp til at controler en MCP23017. (Læst 4693x)

Offline asm7100

  • Højpas filter
  • *****
  • Indlæg: 309
  • Antal brugbare Indlæg: 17
  • Hvis det ikke kan gøres så gør det alligevel.
    • Vis profil
Hjælp til at controler en MCP23017.
« Dato: Februar 25, 2015, 18:07:49 »
Hej er der nogle der kan hjælpe mig med at forstå databladet til en mcp23017??
Jeg kan godt skrive ud til A og B porten, det har jeg fundet ud af at sætte op.
Mener også jeg har fået sat port A som en indput port.
Men jeg kan intet læse fra det og er har svært med at forstå det med Bank i databladet over kredsen.
Håber der er en der kan hjælpe mig på vej.
MVH
Allan Madsen

 

Offline Jakobsen

  • Højpas filter
  • *****
  • Indlæg: 302
  • Antal brugbare Indlæg: 45
    • Vis profil
Sv: Hjælp til at controler en MCP23017.
« Svar #1 Dato: Februar 25, 2015, 21:06:08 »
Hvilken processor bruger du?
Asm, C eller noget helt andet?

http://ww1.microchip.com/downloads/en/DeviceDoc/21952b.pdf

Umiddelbart virker det som om BANK bit vælger mellem tabel 1.3 og 1.4 samt 1.5 og 1.6
Hvor de cyane farved er dem der er forskellige afhængig at bank bit

Måske Evaluation boardet kan inspirer ... der er C kode med
http://www.microchip.com/DevelopmentTools/ProductDetails.aspx?PartNO=mcp23x17ev#dtDocumentation

The BANK bit changes how the registers are mapped
(see Table 1-5 and Table 1-6 for more details).
• If BANK = 1, the registers associated with each
port are segregated. Registers associated with
PORTA are mapped from address 00h - 0Ah and
registers associated with PORTB are mapped
from 10h - 1Ah.
• If BANK = 0, the A/B registers are paired. For
example, IODIRA is mapped to address 00h and
IODIRB is mapped to the next address (address
01h). The mapping for all registers is from 00h -
15h.
It is important to take care when changing the BANK bit
as the address mapping changes after the byte is
clocked into the device. The address pointer may point
to an invalid location after the bit is modified.
For example, if the device is configured to
automatically increment its internal Address Pointer,
the following scenario would occur:
• BANK = 0
• Write 80h to address 0Ah (IOCON) to set the
BANK bit
• Once the write completes, the internal address
now points to 0Bh which is an invalid address
when the BANK bit is set.
For this reason, it is advised to only perform byte writes
to this register when changing the BANK bit.


 

Offline asm7100

  • Højpas filter
  • *****
  • Indlæg: 309
  • Antal brugbare Indlæg: 17
  • Hvis det ikke kan gøres så gør det alligevel.
    • Vis profil
Sv: Hjælp til at controler en MCP23017.
« Svar #2 Dato: Februar 26, 2015, 00:22:32 »
Jeg bruger en ESP8266 (ESP12 model)
Den har firmware nodeECU og kører en avart af lua 5.1
Kode er her (-- er kommentar linier)
Kode:
--MCP23017 x20
    id=0
    intax20 = 5

--MCP23017 X21
--  id=1
--  intax21

-- I2C Setup
    sda=6
    scl=7
    PortA = 0x12
    PortB = 0x13

    -- initialize i2c, set pin1 as sda, set pin0 as scl
    i2c.setup(id,sda,scl,i2c.SLOW)

    -- user defined function: read from reg_addr content of dev_addr
    function read_reg(dev_addr, reg_addr)
      i2c.start(id)
      i2c.address(id, dev_addr ,i2c.TRANSMITTER)
      i2c.write(id,reg_addr)
      i2c.stop(id)
      i2c.start(id)
      i2c.address(id, dev_addr,i2c.RECEIVER)
      c=i2c.read(id,1)
      i2c.stop(id)
      return c
    end

    function write_reg(dev_addr, reg_addr, reg_val)
      i2c.start(id)
      i2c.address(id, dev_addr, i2c.TRANSMITTER)
      i2c.write(id, reg_addr)
      i2c.write(id, reg_val)
      i2c.stop(id)
    end
   
--- Dette skulle virke ----
    -- get content of register 0xAA of device 0x77
  --  write_reg(0x20, 0x00, 0xff) -- set Port A to input
    write_reg(0x20, 0x01, 0x00) -- set Port B to output

    for i=0,20 do
     
      print(read_reg(0x20,0x12))
      print("Setting bank B to value " .. i)
      write_reg(0x20, 0x13, 128)
      tmr.delay(100000)
      write_reg(0x20, 0x13, 0)
      tmr.delay(100000)
      write_reg(0x20, 0x13, 64)
      tmr.delay(100000)
      write_reg(0x20, 0x13, 0)
      tmr.delay(100000)
      tmr.wdclr()
    end
MVH
Allan Madsen

 

Offline asm7100

  • Højpas filter
  • *****
  • Indlæg: 309
  • Antal brugbare Indlæg: 17
  • Hvis det ikke kan gøres så gør det alligevel.
    • Vis profil
Sv: Hjælp til at controler en MCP23017.
« Svar #3 Dato: Februar 26, 2015, 00:54:06 »
Har fundet svaret :-) Takker for hjælpen. (Det var det med bank.0 / bank.1 jeg ikke havde forstået rigtigt)
MVH
Allan Madsen