Forum: Mikrocontroller und Digitale Elektronik LED und Taster am selben Port beim MCP23017


von Henry (Gast)


Lesenswert?

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.

: Verschoben durch Moderator
von Henry (Gast)


Lesenswert?

Hat keiner eine Idee dazu?

von HeikoG (Gast)


Lesenswert?

nur auf Verdacht:

> if (!(Data & 0x04))          // Abfrage DATA, welcher Taster ...

gegenüber

> if (!(Data == 0x08))          // Abfrage DATA, welcher Taster ...

verhält sich ja unterschiedlich.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Henry schrieb:
> funktioniert nichts mehr
Was funktioniert nicht maher und wie stellst du das fest?
Ich würde erwarten, dass durchaus etwas funktioniert. Und zwar genau so 
gut und so schlecht, wie du es programmiert hast.

Henry schrieb:
>      i2c_write(0xa0);        // Auswahl der LED
>      i2c_write(0x50);        // Auswahl der LED
Vielleicht wäre es da sinnvoll, das LED-"Abbild" lokal in einer 
Variablen zu berechnen und die dann auf den Ausgang zu schreiben.

Henry schrieb:
> T1 - PB2
> T2 - PB3
> L1 - PB4
> L2 - PB5
> L3 - PB6
> L4 - PB7
Ist es dann eigentlich sinnvoll, mit
> i2c_write(0x0a);        // Auswahl der LED
und
> i2c_write(0x05);        // Auswahl der LED
auf den PB2 und PB3 herumzuschreiben?

Henry schrieb:
> In diesem Beitrag wird ja beschrieben wie man LEDs und Taster am
> gleichen Port betreiben kann.
> #5369839
Kopiere einfach den kompletten Link aus der Browserzeile in die Textbox.

: Bearbeitet durch Moderator
von Henry (Gast)


Lesenswert?

HeikoG schrieb:
>> if (!(Data == 0x08))          // Abfrage DATA, welcher Taster ...

Wenn ich das so ändere hat es keinerlei Funktion.

Lothar M. schrieb:
> Was funktioniert nicht maher und wie stellst du das fest?

Wenn ich nur einen Taster verwende kann ich damit 2 LEDs ein und 
ausschalten. Je nach dem was eingestellt ist.

Lothar M. schrieb:
>> i2c_write(0x0a);        // Auswahl der LED

Lothar M. schrieb:
>> i2c_write(0x05);        // Auswahl der LED

Diese LEDs verwende ich nur zur Anzeige ob die Auswertung auf dem gleich 
Port auch funktioniert. Beim betätigen einer Taste leuchtet die LEDs und 
wenn ich den Taster loslasse geht die LED wieder aus.
Wenn ich beide Taster verwende leuchten alle 4 LEDs ohne das sie durch 
einen Taster geschaltet werden können.

von Henry (Gast)


Lesenswert?

Habe mal fleissig im Netz gesucht. Entweder wird einen der IC verkauft 
oder es sind Programme für Arduino und dem Raspi.
Scheinbar kennt keiner das Problem oder es läuft bei ihnen Störungsfrei.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Henry schrieb:
> leuchten alle 4 LEDs
Mit voller Helligkeit und gleich hell?
Oder nur mit etwa halber Helligkeit und/oder unterschiedlich hell?
Hast du ein Messgerät wie z. B. ein Oszilloskop oder einen 
Logikanalyzer, um mal an den Pins messen zu können?

Überleg dir mal gründlich, was in deinem Programm passiert, wenn kein 
Taster gedrückt ist, wenn einer der beiden gedrückt wird, wenn der 
andere gedrückt wird, oder wenn beide gedrückt werden.
Nimm dir für diese Überlegungen ruhig mal eine oder zwei Stunden.

Und nochmal: wenn an den PB2 und PB3 Taster angeschlossen sind, warum 
schaltest du da an den zugehörigen Ausgängen herum?

Henry schrieb:
> Habe mal fleissig im Netz gesucht.
Und auch mal das Datenblatt genau angeschaut und kontrolliert, ob deine 
Schaltung da dazu passt?

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.