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!
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(); } }
Danke für die schnelle Antwort! Hättest du vielleicht noch ein Beispiel für das Lesen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.