MCP23017 - Ansteuerungsproblem

Gast #3771281
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!
Gast #3771631
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();
  }
}
Gast #3772103
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.