Hallo
In diesem Beitrag wird ja beschrieben wie man LEDs und Taster am
gleichen Port betreiben kann.
#5369839
Habe den Code soweit übernommen und er funktioniert ohne Probleme.
Wollte den Code nun auf 2 Taster erweitern. Leider klappt das nicht.
Habe die Hardware auch auf einem Breadbord aufgebaut und verwende diesen
Code dazu:
1 | i2c_init(); // initialize I2C library
|
2 | //setzt Port A als Ausgang mit IODIRA
|
3 | i2c_start(MCP23017_ADDR); // Angabe Adresse
|
4 | //i2c_write(MCP23017_IODIRA); // Steuert die Richtung der Daten am Port A
|
5 | i2c_write(MCP23017_IODIRB); // Steuert die Richtung der Daten am Port B
|
6 | //i2c_write(0x00); // Angabe Ausgang 0x00-alle an, 0xff-alle aus
|
7 | i2c_write(0x0f); // Angabe Ausgang 0x00-alle an, 0xff-alle aus, f0 B4-B7
|
8 | i2c_stop();
|
9 |
|
10 |
|
11 | // setzt Port B alle R mit GPPUB als Eingang
|
12 | i2c_start(MCP23017_ADDR); // Angabe Adresse
|
13 | i2c_write(MCP23017_GPPUB); // aktivierung der internen Pullups Widerstände
|
14 | i2c_write(0x0c); // schalte alle Eingänge auf 5V
|
15 | i2c_stop();
|
16 |
|
17 |
|
18 | // Alle Eingänge Port B invertieren
|
19 | i2c_start(MCP23017_ADDR); // Angabe Adresse
|
20 | i2c_write(MCP23017_IPOLB); // Taster schalten Masse (active-low)
|
21 | i2c_write(0x00); // alle Eingänge invertieren
|
22 | i2c_stop();
|
Für die Abfrage des Tasters verwende ich das:
1 | // Abfrage der Eingänge am MCP
|
2 | i2c_start(MCP23017_ADDR); // Angabe Adresse
|
3 | i2c_write(MCP23017_GPIOB);
|
4 | i2c_stop();
|
5 |
|
6 | i2c_start(MCP23017_ADDR +1); // Auslesen Adresse + 1
|
7 | Data = i2c_readNak(); // liest Eingänge ein
|
8 | i2c_stop();
|
9 |
|
10 | // Abfrage Taster
|
11 |
|
12 | if (!(Data & 0x04)) // Abfrage DATA, welcher Taster 0c beide, T1-4, T2-8
|
13 | { // Angabe Taster mit 0x05
|
14 | i2c_start(MCP23017_ADDR); // Angabe Adresse
|
15 | //i2c_write(MCP23017_OLATA); // Schalte Ausgang A
|
16 | i2c_write(MCP23017_OLATB); // Schalte Ausgang B
|
17 | i2c_write(0xa0); // Auswahl der LED
|
18 | i2c_stop();
|
19 | }
|
20 | else
|
21 | {
|
22 | i2c_start(MCP23017_ADDR); // Angabe Adresse
|
23 | //i2c_write(MCP23017_OLATA); // Schalte Ausgang A
|
24 | i2c_write(MCP23017_OLATB); // Schalte Ausgang B
|
25 | i2c_write(0x0a); // Auswahl der LED
|
26 | i2c_stop();
|
27 | }
|
Wenn ich den zweiten Taster dazu nehme funktioniert nichts mehr. Jeder
Taster für sich funktioniert korrekt.
1 | if (!(Data == 0x08)) // Abfrage DATA, welcher Taster 0c beide, T1-4, T2-8
|
2 | { // Angabe Taster mit 0x05
|
3 | i2c_start(MCP23017_ADDR); // Angabe Adresse
|
4 | //i2c_write(MCP23017_OLATA); // Schalte Ausgang A
|
5 | i2c_write(MCP23017_OLATB); // Schalte Ausgang B
|
6 | i2c_write(0x50); // Auswahl der LED
|
7 | i2c_stop();
|
8 | }
|
9 | else
|
10 | {
|
11 | i2c_start(MCP23017_ADDR); // Angabe Adresse
|
12 | //i2c_write(MCP23017_OLATA); // Schalte Ausgang A
|
13 | i2c_write(MCP23017_OLATB); // Schalte Ausgang B
|
14 | i2c_write(0x05); // Auswahl der LED
|
15 | i2c_stop();
|
Die Belegung der Taster und LED:
T1 - PB2
T2 - PB3
L1 - PB4
L2 - PB5
L3 - PB6
L4 - PB7
Verwende die angebene Lib genau so.
In dem Artikel wird ein Datenblatt angegeben, bin gerade dabei es zu
lesen.
Hatte aber bisher auch keine Lösung gebracht.
LG H.