Forum: Mikrocontroller und Digitale Elektronik MCP23017 - Ansteuerungsproblem


von Computergarf (Gast)


Lesenswert?

Ich habe jetzt schon seit einiger Zeit mit dem MCP23017 rumprobiert, 
aber ich komme nicht zu einen richtigen Ergebnis.
Hat vielleicht jemand eine Idee in welcher Reihenfolge man etwas (und 
WAS) via I2C senden muss damit die Ports gesetzt werden können oder 
gelesen.
Auch mit den ganzen Tabellen im Datenblatt kann ich nicht direkt etwas 
anfangen. (Bascom oder Idee)
Vielen Dank!

von Fachmann (Gast)


Lesenswert?

Beispiel:

#include "i2cmaster.h"
#define CP2317  0x40 //Habe A0 bis A2 auf GND gelegt

int main(void)
{
   i2c_init();                 // initialize I2C library
   //Setzte GPB als Ausgänge
   i2c_start_wait(CP2317+I2C_WRITE);     //set device address +write
mode
   i2c_write(0x01);                      //spreche IODIR von GPB an
   i2c_write(0x00);                      //setzte GPB auf Ausgänge
   i2c_stop();

   while(1)
  {
     i2c_start_wait(CP2317+I2C_WRITE);
     i2c_write(0x15);                        // write adresse = OLATB
     i2c_write(0xFF);                        // schalte alle Ausgänge
ein
     i2c_stop();
     _delay_ms(500);
     i2c_start_wait(CP2317+I2C_WRITE);
     i2c_write(0x15);                        // write address = OLATB
     i2c_write(0x00);                        // schalte alle Ausgänge
aus
     i2c_stop();
  }
}

von Computergarf (Gast)


Lesenswert?

Danke für die schnelle Antwort!
Hättest du vielleicht noch ein Beispiel für das Lesen.

von Fachmann (Gast)


Lesenswert?

Prizipiel funktionieren alle I2C IC,s gleich, nur die addressen und 
Register sind verschieden, wenn du also schon Erfaruhng damit hast dann 
ist es kein Problem. Mann kann code von irgend einem anderen I2C 
baustein nehmen und ihn anpassen.Aber ich weiss nicht welchen Compiler 
du hast, und die I2C Prozeduren sind unterschiedlich von Compiler zu 
Compiler.
Hier ist JAL Beispiel:
1
-- procedure to write a register
2
procedure mcp23008_register_write(byte in opcode,byte in reg, byte in data) is
3
var bit r
4
5
   i2c_start()
6
      r = i2c_transmit_byte(opcode)    -- i2c Device Opcode for write
7
      r = i2c_transmit_byte(reg)       -- register
8
      r = i2c_transmit_byte(data)      -- hex
9
   i2c_stop()
10
   
11
end procedure
12
13
-- procedure to read a register
14
procedure mcp23008_register_read(byte in opcode,byte in reg, byte out data) is
15
var bit r
16
   i2c_start()
17
      r = i2c_transmit_byte(opcode)      --  i2c Device Opcode for write
18
      r = i2c_transmit_byte(reg)         -- device register address
19
   i2c_restart()
20
      r = i2c_transmit_byte(opcode + 1)  -- i2c device opcode for read
21
      data = i2c_receive_byte(false)
22
   i2c_stop()
23
24
end procedure
25
26
-- setup mcp23008 as required
27
procedure mcp23008_initialize(byte in opcode) is
28
29
   mcp23008_register_write(opcode,0x0A,0b0000_0000) -- OLAT O/P (0000_0000 no latching on all pins)
30
   mcp23008_register_write(opcode,0x06,0b1110_0000) -- GPPU  High bytes pull up low bytes no pull up
31
   mcp23008_register_write(opcode,0x00,0b1110_0000) -- IODIR High bytes i/p low bytes o/p
32
   mcp23008_register_write(opcode,0x05,0x34) -- IOCON  b5 seq read off b4 slew rate dis-able
33
                                             -- b2 int pin open
34
end procedure
35
36
-- setup mcp23008 as required all ouputs
37
procedure mcp23008_lcd2_init(byte in opcode) is
38
39
mcp23008_register_write(opcode,0x0A,0b0000_0000) -- OLAT O/P (0000_0000 no latching on all pins)
40
mcp23008_register_write(opcode,0x06,0b0000_0000) -- GPPU  High bytes pull up low bytes no pull up
41
mcp23008_register_write(opcode,0x00,0b0000_0000) -- IODIR High bytes i/p low bytes o/p
42
mcp23008_register_write(opcode,0x05,0x34) -- IOCON  b5 seq read off b4 slew rate dis-able
43
                                             -- b2 int pin open
44
end procedure

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.