GREETBoard – I²C Portexpander

GREETBoard I2C Portexpander - Version 1.1

GREETBoard I2C Portexpander – Version 1.1

Version 1.1

Dieses Modul erweitert das GREETBoard-Projekt um zusätzliche Ein- und Ausgänge. Ein bewährter PCF8574-Baustein stellt die Kommunikation über den I²C-Bus sicher, so dass die jeweils vier Leuchtdioden und Taster sehr leicht ansprech-, bzw. auslesbar sind. Veränderungen an einem der PCF8574 Pins (z.B. die Betätigung eines Tasters) wird über ein Interrupt-Signal an den Mikrocontroller gemeldet. Damit muss das Modul nur bei Bedarf abgefragt werden. Eine regelmäßige Abfrage, ein sogenanntes Polling, ist somit nicht nötig.

Durch die Verwendung einer 10-poligen I²C-Buchse, ist dieses Modul ganz einfach mit dem Hauptmodul, dem GREETBoard – ATMega128, zu verbinden. Durch die integrierte Spannungsversorgung benötigt das GREETBoard – Port Expander keine eigene Versorgungsklemmen. Es wird vielmehr direkt vom Hauptmodul mit Energie versorgt.

Ein weiterer Vorteil der verwendeten I²C-Buchse ist, dass das Modul auch mit vielen anderen Mikrocontroller-Anwendungen benutzt werden kann. Damit ist es nicht auf das GREETBoard-Projekt beschränkt.

Schwierigkeitsgrad

GREETBoard - Port Expander - SchwierigkeitsgradDa nicht jeder ein Löt-Profil oder Programmier-Crack ist, versuche ich die Module in Schwierigkeitsgrade aufzuteilen. Damit kann sich jeder entsprechend seiner persönlichen Fähigkeiten an die  verschiedenen Module und Programme heranwagen.

Eigenschaften

  • Vier zusätzliche Eingänge über den I²C-Bus
  • Vier zusätzliche Ausgänge über den I²C-Bus
  • Große LEDs für eine bessere Sichtbarkeit
  • Es werden keine Ports am Mikrocontroller verwendet
  • Bus-Adresse auf dem Modul individuell einstellbar
  • Externe Spannungsversorgung über die Bus-Verbindung
  • Pull up Widerstände auf dem Modul per Jumper zuschaltbar
  • Ein bewährter PCF8574-Baustein stellt die I²C-Kommunikation sicher
  • Stapelbar, durch standardisierte Platinenbohrlöcher
  • Kleine Abmessung, ca. 50 x 40mm (1/8 Modul)

Modulübersicht

Die folgende Übersicht zeigt die auf dem GREETBoard – I²C Portexpander verwendeten Funktionen. Die fehlenden Pull Up Widerstände werden mit der Version 1.1 hinzugefügt. Leider sind sie auf dem aktuellen Bild nicht nicht zu sehen.

GREETBoard I2C Portexpander - Übersicht

GREETBoard I2C Portexpander – Übersicht

Bestückungsplan

Um eine Berührung von spannungsführenden Teilen zu vermeiden habe ich die Taster sehr weit nach links verschoben und auch das Widerstandsnetzwerk als „Abstandshalter“ platziert. So sollte es eigentlich nicht passieren, dass irgendwelche Bauteile versehentlich kaputt gemacht werden.

GREETBoard I2C Portexpander - Board-Layout

GREETBoard I2C Portexpander – Board-Layout

Stückliste

StückBauteilWert
1C1100nF
4LED1, LED2, LED3, LED4LED grün, 5mm
1IC1PCF8574
2R1, R210k Ohm
1R3Widerstandsnetzwerk, 8-pol., 220 Ohm
4S1, S2, S3, S4Kurzhubtaster
1X110-pol. Wannensteckerbuchse
4X2, A0, A1, A23-pol. Stiftleiste

Schaltplan

GREETBoard I2C Port Expander - Schaltplan - Version 1.1

GREETBoard I2C Port Expander – Schaltplan – Version 1.1

Erste Programme

Tasten auslesen und LED schalten

Ein Tastendruck am GREETBoard – I²C Portexpander wird von Hauptmodul erkannt und eine LED wird auf dem Portexpander gesetzt. Dabei wird das GREETBoard – Portexpander mehrmals pro Sekunde ausgelesen, dies ist das sogenannte Polling

#ifndef F_CPU            //Wenn CPU-Takt nicht bereits definiert
#define F_CPU 16000000   //...dann definiere ihn auf 16MHz
#endif

#include <util/delay.h>        //Einbinden der .h Datei

unsigned char adr1_w = 0x42;   //Device 1 write-address
unsigned char adr1_r = 0x43;   //Device 1 read-address
unsigned char d;
unsigned char e;

int main(void) {               //Hauptprogramm
  i2c_start(adr1_w);           //Schreibbefehl für Device 1
  i2c_write(0xff);             //Alle Pins des PCF auf 0

  while(1) {                    //Hauptschleife

    i2c_start(adr1_r);          //Starte Lesezugriff
    d=i2c_readNak();            //Schreib Leseergebnis in d
    if (~d & 0x10) {            //Wenn S1 gedrückt ist...
      e = d & 0xf7;             //d UND F7 (1111 0111), aktiv. LED1
      e = e | 0x10;             //löscht Signal von Taster S1
      i2c_start(adr1_w);        //Schreibbefehl
      i2c_write(e);             //Schreibe e
      _delay_ms(100);           //100ms warten
    }
    if (~d & 0x20) {   
      e = d & 0xfb;
      e = e | 0x20;
      i2c_start(adr1_w);
      i2c_write(e);
      _delay_ms(100);
    }
    if (~d & 0x40) {    
      e = d & 0xfd;
      e = e | 0x40;
      i2c_start(adr1_w);
      i2c_write(e);
      _delay_ms(100);
    }
    if (~d & 0x80) {   
      e = d & 0xff;
      e = e | 0x80;
      i2c_start(adr1_w);
      i2c_write(e);
      _delay_ms(100);
    }
  }
  _delay_ms(100);
  2c_stop();
}

Steckerbelegungen

BezBeschreibungPinBelegungSymbol
X1I²C-Buchse1
2
3
4
5
6
7
8
9
10
SCL
GND
SDA
GND
VCC
GND
VCC
GND
NC
Interrupt
X2Pull Up Jumper1-2
2-3
Deaktiviert
Aktiviert
A0
A1
A2
Adress-Jumper1-2
2-3
High
Low