<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=88.152.216.119</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=88.152.216.119"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/88.152.216.119"/>
	<updated>2026-04-11T03:16:00Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=I%C2%B2C&amp;diff=81278</id>
		<title>I²C</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=I%C2%B2C&amp;diff=81278"/>
		<updated>2014-02-03T11:09:41Z</updated>

		<summary type="html">&lt;p&gt;88.152.216.119: ok&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;I²C&#039;&#039;&#039; ist ein synchroner serieller Zweidraht-[[Bus]] (eine Daten- und eine Taktleitung), der für die Kommunikation zwischen [[IC]]s über kleine Distanzen geeignet ist. Entwickelt wurde er Anfang der 80er Jahre von Philips.&lt;br /&gt;
Gesprochen &amp;quot;I quadrat C&amp;quot; steht für IIC = Inter [[IC]] Bus. Aus Lizenzgründen heißt der I²C Bus bei manchen Herstellern auch &#039;&#039;&#039;TWI&#039;&#039;&#039;, two wire interface.&lt;br /&gt;
&lt;br /&gt;
Ich habe keine Ahnung von dem ganzen Zeug!&lt;br /&gt;
&lt;br /&gt;
== I2C ==&lt;br /&gt;
In einem I²C-Bus gibt es mindestens einen Master mit bis zu 127 Slaves und einen Broadcast Kanal. Ein I²C-Bus mit mehreren Mastern wird als &amp;quot;Multi-Master-Bus&amp;quot; bezeichnet.&lt;br /&gt;
Der (oder die) Master sprechen die Slaves an; ein Slave kann NIE selbstständig Daten senden. Dazu übernimmt der Master, der Daten senden oder empfangen möchte, den Bus und gibt die (7-bit- bzw. 10-bit-)Adresse des Slaves aus, mit dem er kommunizieren möchte. Nach der Adresse teilt der Master dem entsprechenden Slave mit, ob er Daten senden oder empfangen möchte. Danach werden die eigentlichen Daten (entweder vom Master oder Slave) auf den Bus gelegt. Hat der Master den Lese- oder Schreibvorgang abgeschlossen, so gibt er den Bus wieder frei.&lt;br /&gt;
Sofern mehrere Master vorhanden sind, stellt ein Protokoll sicher, dass sich diese nicht gegenseitig stören.&lt;br /&gt;
&lt;br /&gt;
=== I2C - Übertragungsraten  ===&lt;br /&gt;
Die Übertragungsrate beträgt beim standard mode bis zu 100 kbit/s, beim fast mode bis zu 400 kbit/s und beim high-speed mode bis zu 3,4 MBit/s. Falls die Taktrate für einen Slave zu hoch ist, kann er die Clock-Leitung auf Null ziehen und die Übertragung damit verlangsamen (sog. Clock Stretching). Dies ist auf Bit- wie auf Byte-Ebene möglich; ersteres allerdings nicht im high-speed mode.&lt;br /&gt;
Um längere Übertragungswege zu realisieren, kann man die Taktrate fast beliebig vermindern (einige Bausteine erzeugen aber irgendwann ein Time-Out). Mit einer Taktfrequenz von nur 5 kbit/s können dann durchaus mehrere Meter überbrückt werden.&lt;br /&gt;
&lt;br /&gt;
Im PC wird ein dem I²C-Bus sehr ähnliches System benutzt, um z.&amp;amp;nbsp;B. die Daten eines [[SDRAM]]-Modules auszulesen. Dieser nennt sich [[SMBus]] (System Management Bus).&lt;br /&gt;
&lt;br /&gt;
Erfahrungen mit den Atmegas (gemessene I2C-Taktfrequenzen):&lt;br /&gt;
* 16,000MHz - schafft sauber bis zu 700KHz&lt;br /&gt;
* 18,432MHz - schafft sauber bis zu 950KHz&lt;br /&gt;
&lt;br /&gt;
Selbst unter schlechten Bedingungen wie...&lt;br /&gt;
* 50cm 6-adriges Spiralkabel, frei schwingend verbaut in einem Rennwagen als Verbindung zwischen Lenkraddisplay und Amaturenbrett&lt;br /&gt;
* Nähe zu nicht geschirmten Leitungen mit 12V, GND und 5V PWM zum Dimmen von LEDs&lt;br /&gt;
* grausamen Umgebungsbedingungen, Fahrten im Regen, Schnee oder bei glühender Sonne und gefühlten 100° C ;-) auf der Rennstrecke.&lt;br /&gt;
hat der Bus ohne Probleme funktioniert.&lt;br /&gt;
&lt;br /&gt;
=== Bausteine ===&lt;br /&gt;
&lt;br /&gt;
Neben Mikrocontrollern gibt es eine Reihe von Peripheriebausteinen, die per I²C angeschlossen werden können. Eine gute Anlaufstelle bei der Suche ist die unten angegebene Seite des &amp;quot;Erfinders&amp;quot; Philips, heute als [http://www.nxp.com NXP] bekannt.&lt;br /&gt;
&lt;br /&gt;
*serielle [[Speicher#EEPROM | EEPROM]]s &lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?text=24C01&amp;amp;action=Search 24Cxx]&lt;br /&gt;
** [http://ics.nxp.com/products/pcf/seeproms/ PCF85xx von NXP, 256-2048 Byte]&lt;br /&gt;
&lt;br /&gt;
*I/O-Portexpander&lt;br /&gt;
** [[Port-Expander_PCF8574|PCF8574]]&lt;br /&gt;
** [http://www.mikrocontroller.net/part/MCP23008 MCP23008] (8-bit) von Microchip&lt;br /&gt;
** [http://www.mikrocontroller.net/part/MCP23017 MCP23017](16-bit) von Microchip&lt;br /&gt;
&lt;br /&gt;
* I2C MUX, zum Anschluss von ICs mit gleicher, fester Adresse&lt;br /&gt;
** [http://www.datasheetcatalog.org/cgi-bin/helo.pl?field=Nume&amp;amp;type=C&amp;amp;text=PCA9545A&amp;amp;producedby=&amp;amp;action=Search PCA9545A]&lt;br /&gt;
&lt;br /&gt;
* [[AD-Wandler]]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/182614 12x12 Bit ADC MAX1238]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/182614 12x10 Bit ADC MAX1138]&lt;br /&gt;
** [http://www.maxim-ic.com/datasheet/index.mvp/id/1890 MAX127 und MAX128 von Maxim, 12bit x8, PDIP24+SSOP28]&lt;br /&gt;
** [http://www.jtronics.de/platinen.html 12x8  Bit ADC MAX1038]&lt;br /&gt;
&lt;br /&gt;
* [[DA-Wandler]]&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?field=Nume&amp;amp;type=C&amp;amp;text=TDA8444&amp;amp;producedby=&amp;amp;action=Search TDA8444, 8x6Bit]&lt;br /&gt;
&lt;br /&gt;
* Uhrenbausteine&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?field=Nume&amp;amp;type=C&amp;amp;text=PCF8583&amp;amp;producedby=&amp;amp;action=Search PCF8583, mit 256 Bytes RAM]&lt;br /&gt;
** DS1307&lt;br /&gt;
&lt;br /&gt;
* [[LCD]]-Treiber&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?field=Nume&amp;amp;type=C&amp;amp;text=PCF8577&amp;amp;producedby=&amp;amp;action=Search PCF8577, 2x32 Segmente]&lt;br /&gt;
&lt;br /&gt;
* [[Temperatursensor|Temperatursensoren]]&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?text=DS1621&amp;amp;action=Search DS1621]&lt;br /&gt;
** [http://www.datasheetcatalog.net/cgi-bin/helo.pl?text=lm75&amp;amp;action=Search LM75]&lt;br /&gt;
** [http://www.sensirion.com/en/pdf/product_information/Datasheet-humidity-sensor-SHT21.pdf SHT21]&lt;br /&gt;
** TMP101 von TexasInstruments&lt;br /&gt;
** TMP175 von TI (mehr als 8 Bausteine im gleichen Bus möglich)&lt;br /&gt;
&lt;br /&gt;
* Drucksensoren&lt;br /&gt;
** SMD500&lt;br /&gt;
** BMP085&lt;br /&gt;
&lt;br /&gt;
* Beschleunigungssensor&lt;br /&gt;
** [http://www.mikrocontroller.net/articles/BMA020 BMA020]&lt;br /&gt;
&lt;br /&gt;
=== Galvanische Trennung ===&lt;br /&gt;
* http://www.analog.com/static/imported-files/application_notes/AN_913.pdf&lt;br /&gt;
* http://www.analog.com/en/interface/digital-isolators/products/index.html#Isolated_I2C_Isolators&lt;br /&gt;
* http://www.silabs.com/Support%20Documents/TechnicalDocs/Si840x.pdf&lt;br /&gt;
* http://www.silabs.com/applications/industrial/Pages/i2c-isolation.aspx&lt;br /&gt;
* http://www.mikrocontroller.net/attachment/5670/Galvanische_Trennung_fuer_I2C-Bus.pdf&lt;br /&gt;
* http://www.esacademy.com/en/library/technical-articles-and-documents/miscellaneous/i2c-bus/frequently-asked-questions/i2c-faq.html&lt;br /&gt;
* http://www.mikrocontroller.net/topic/17425#125464&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AT91-TWI]]&lt;br /&gt;
* [[AVR TWI]]&lt;br /&gt;
* [[I2C als Hausbus]]&lt;br /&gt;
* Beitrag zu [http://www.mikrocontroller.net/topic/181115#1748880 I2C-Adressen] im Forum&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://ics.nxp.com/interface/ NXP (ehemals Philips) Produktseite]&lt;br /&gt;
* [http://www.nxp.com/acrobat/usermanuals/UM10204_3.pdf I2C Spezifikation 3.0]&lt;br /&gt;
* [http://www.i2c-bus.org I²C FAQ, Einführung, Hintergrundinformationen]&lt;br /&gt;
* [http://www.robotikhardware.de/download/rn_pc_i2c.pdf robotikhardware.de]&lt;br /&gt;
* [http://www.elektronikwissen.net/pegelwandler/7-bidirektionaler-levelshifter-fuer-i2c.html Betrieb von 3V3 und 5V-Bausteinen am I2C-Bus]&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheken ===&lt;br /&gt;
* [http://www.jtronics.de/avr-projekte.html AVR TWI Slave]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/235733#2398750 TWI MASTER in ASM]&lt;br /&gt;
* [http://homepage.hispeed.ch/peterfleury/avr-software.html AVR TWI/I2C MASTER in C]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/87597 AVR TWI Master und Slave Funtionen in C]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/266642 universelle I2C Master Prozedur für AVR]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/103600 I2C (TWI) Sniffer mit AVR]&lt;br /&gt;
&lt;br /&gt;
===I²C-Interface===&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/155136#1462320 Beitrag &amp;quot;i2c usb interface&amp;quot;] (Linux)&lt;br /&gt;
* [http://sprut.de/electronic/pic/projekte/usb4all/usb4all.htm USB4ALL bei sprut.de] universeller USB-Baustein, auch für I2C&lt;br /&gt;
&lt;br /&gt;
===I²C-Monitor===&lt;br /&gt;
*http://realterm.sourceforge.net/#I2C%20Bus&lt;br /&gt;
*http://www.avrfreaks.net/index.php?module=FreaksTools&amp;amp;func=viewItem&amp;amp;item_id=411&lt;br /&gt;
* [http://www.telos.info/ConniiMM20 Connii MM 2.0 - I²C Monitor with USB Interface]&lt;br /&gt;
* [http://www.telos.info/traciixl20 Tracii XL - High-End I²C Monitor]&lt;br /&gt;
*http://i2cchip.com/&lt;br /&gt;
* [http://www.ullihome.de/index.php/Hauptseite#USB_AVR-Lab I2C Logger Firmware für USB AVR-ISP]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/41535 I2C Monitor mit Mega8 (Firmware)]&lt;br /&gt;
* [http://warmcat.com/milksop/cheapi2c.html Cheapi2c] by Numbnut (Andy Green) uses your PC CPU (Linux only!) and printer port to perform realtime snooping of a standard 100kHz I2C bus with 100% capture.&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/103600#905495 I2C (TWI) Sniffer]. Basierend auf einem ATtiny85 mit Ausgabe auf RS232 (C und ASM).&lt;br /&gt;
* [http://en.radzio.dxp.pl/i2c-sniffer/ I2C/TWI bus sniffer/analyzer] (ATTiny2313 @ 20 MHz und USB über FTDI FT245RL oder UM245R)&lt;br /&gt;
* [http://www.i2cchip.com/start_bit_detector1.jpg I2C Startbit-Detector] auf [http://www.i2cchip.com/ www.i2cchip.com]&lt;br /&gt;
* [http://www.harbaum.org/till/i2c_tiny_usb/index.shtml i2c-tiny-usb open source/open hardware zum Auslesen mit einem PC]&lt;br /&gt;
&lt;br /&gt;
[[Category:I2C| ]]&lt;/div&gt;</summary>
		<author><name>88.152.216.119</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Port-Expander_PCF8574&amp;diff=81277</id>
		<title>Port-Expander PCF8574</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Port-Expander_PCF8574&amp;diff=81277"/>
		<updated>2014-02-03T11:03:41Z</updated>

		<summary type="html">&lt;p&gt;88.152.216.119: Pipmann&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der &#039;&#039;&#039;PCF8574&#039;&#039;&#039; ist ein via [[I2C]]-Bus angeschlossener 8-Bit I/O Port-Expander. Wer schon einmal unter &amp;quot;chronischem Pinmangel&amp;quot; in einer seiner Applikationen gelitten hat, weiss was gemeint ist.&lt;br /&gt;
&lt;br /&gt;
Hallo Penis.&lt;br /&gt;
&lt;br /&gt;
Falls ihr noch nie etwas mit dem I2C gemacht habt, dann lest euch bitte zuerst die entsprechende Rubrik durch. Danach wird das Verstehen wesentlich einfacher fallen.&lt;br /&gt;
&lt;br /&gt;
Das Datenblatt findet ihr [http://www.nxp.com/documents/data_sheet/PCF8574.pdf hier].&lt;br /&gt;
&lt;br /&gt;
=Funktion=&lt;br /&gt;
&lt;br /&gt;
Ein seriell an den Baustein gesendeter Wert wird auf dessen Pins parallel ausgegeben. Es gibt zwei Adresspins (A0:2), an welchen man die Adresse in Hardware einstellen kann (Pins jeweils auf Masse bzw. Vcc legen). Es können also maximal 2^3 = 8 Bausteine vom Typ PCF8574 und maximal 2^3 = 8 Bausteine vom Typ PCF8574&#039;&#039;&#039;A&#039;&#039;&#039; (unterschiedliche Addresspräfixe) direkt am Bus betrieben werden. Will man mehr ICs anschliessen ist ein I2C-Multiplexer notwendig (z.&amp;amp;nbsp;B. PCA9544A).&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/mc-project/Pages/Projekte/ICs/Port%20Expander/expander-pins.gif&lt;br /&gt;
&lt;br /&gt;
An den Pins P0:7 kann ein 8 Bit Wert ausgegeben bzw. eingelesen werden. SDA und SCL dienen der Kommunikation über den I²C-Bus. /INT dient dazu, eingehende Daten an den Pins des Bausteins zu signalisieren. Man kann diesen Pin direkt an einen der Pins (externe Interrupts: INT0, INT1) des Mikrocontrollers legen. Da der Expander mit einem Open-Drain Ausgang daher kommt, muss ein Pull-Up gegen Betriebsspannung geschaltet werden. So kann der PCF8574 dem Mikrocontroller ohne den Umweg über den I2C übermitteln, dass sich die Eingangssignale geändert haben. Man kann ihn natürlich auch einfach offen lassen. Die Pins P0:7 können bis zu 25mA aufnehmen, aber nur gegen GND! Denn es handelt sich um [[Ausgangsstufen Logik-ICs|Open Collektor Ausgänge]]. Ausgeben können die IOs nur ca. 100µA über den interen Pull-Up Widerstand (welcher genaugenommen eine [[Konstantstromquelle]] ist). Kurzzeitig kann dieser Pull-Up 1mA liefern, wenn ein Ausgang von LOW auf HIGH schaltet, das verkürzt die Umschaltzeit wesentlich. Der gesamt aufgenommene Strom sollte 200mA nicht überschreiten.&lt;br /&gt;
&lt;br /&gt;
=I²C Kommunikation=&lt;br /&gt;
&lt;br /&gt;
Gestartet wird die Kommunikation durch das Senden der Start-Bedingung gefolgt vom Adressbyte.&lt;br /&gt;
&lt;br /&gt;
Das Adressbyte für den PCF8574:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || Bit 0 || Hexadezimal&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |  0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | R/W &lt;br /&gt;
|| 0x40 + A[2:0]*2 + R/W&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Das Adressbyte für den PCF8574&#039;&#039;&#039;A&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || Bit 0 || Hexadezimal&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | R/W &lt;br /&gt;
|| 0x70 + A[2:0]*2 + R/W&lt;br /&gt;
|}&lt;br /&gt;
Der Adresse (4Bit für die eindeutige Kennung + 3 frei wählbare Bits) folgt das obligatorische R/W-Bit, welches festlegt, ob ein Lese- oder Schreibzugriff ausgeführt werden soll (R/W=0 Schreiben, R/W=1 Lesen).&lt;br /&gt;
&lt;br /&gt;
Wurde ein ACK empfangen, d.h. hat sich ein Slave angesprochen gefühlt, so kann man nun ein Datenbyte senden (R/W=0) oder den Status der Eingänge einlesen (R/W=1), also ein Datenbyte empfangen. Wurde ein Byte gesendet, so bestätigt der Baustein dieses mit ACK. Der Anwender kann nun festlegen, ob er das nächste Byte senden möchte oder ein STOP senden. Wurde ein Byte gelesen, so hat der Master dieses per ACK zu bestätigen, so er denn gleich das nächste empfangen möchte. Ansonsten kann hier das ACK entfallen und ein STOP gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Stellt sich nur noch die Frage: Wie regelt man nun, ob ein Pin als Ein- oder Ausgang arbeiten soll? Soviel gleich vorweg: So etwas wie die Datenrichtungsregister des [[AVR]]s gibt es hier nicht, man muss ohne sie auskommen. Den Ausgangspegel der Pins definiert man über einen Schreibzugriff. Sendet man beispielsweise nach der Adresse gefolgt vom ACK des Bausteins 0xF0, so bedeutet das, dass P0:3 nun L-Pegel haben und P4:7 H-Pegel. Will man einige IOs als Eingänge verwenden, muss man die entsprechenden Ausgänge zunächst auf H-Pegel setzen, da es sich um [[Ausgangsstufen Logik-ICs|Open Collektor Ausgänge]] handelt sind die Ausgänge somit inaktiv. Führt man nun einen Lesezugriff durch, so stehen im gelesenen Byte die Pegel der Pins.&lt;br /&gt;
&lt;br /&gt;
=Anwendung=&lt;br /&gt;
&lt;br /&gt;
Im nachfolgenden Bild sind verschiedene Anwendungen der IOs dargestellt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:PCF8574.png|640px]]&lt;br /&gt;
&lt;br /&gt;
* P0..P3 - Ausgänge für LEDs: Die LEDS sind mit ihrer Anode über einen Vorwiderstand gegen VCC verdrahtet. Eine LED wird eingeschaltet, indem der jeweilige Ausgang auf LOW gesetzt wird (LOW aktive). Es ist &amp;lt;B&amp;gt;NICHT&amp;lt;/B&amp;gt; möglich, die LEDs mit ihrer Kathode gegen GND zu verdrahten, da die Ausgänge vom Typ [[Ausgangsstufen_Logik-ICs#Open_Collector| Open Collector]] sind und nur bei LOW große Ströme schalten können.&lt;br /&gt;
* P4 - Ausgänge für ULN2003 &amp;amp; Co: Hier wird bei HIGH doch schon richtig Strom gebraucht (ca. 1mA). Das kann der IC nicht selber liefern (typisch ca. 100µA). Deshalb wird hier ein relativ niederohmiger Pull-Up Widerstand benötigt.&lt;br /&gt;
* P5 - Ausgänge für Logikbausteine: Nichts besonderes.&lt;br /&gt;
* P6 - Eingänge für Logikbausteine: Der Logikbaustein muss bei LOW bis zu 300µA Strom liefern können, da die internen Pull-Up Widerstände darauf dimensioniert sind und man sie nicht abschalten kann.&lt;br /&gt;
* P7 - Eingänge für Taster: Die internen Pull-up Widerstände sind hier nützlich.&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Routinen zum Ansteuern des Baustein können hier herunter geladen werden:&lt;br /&gt;
* [http://www.mikrocontroller.net/mc-project/Pages/Projekte/ICs/Port%20Expander/Portexpander%20Beispiel.zip Portexpander Beispiel.zip]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Anwendung soll ein solcher Expander bei mir natürlich auch finden. Am meisten hat mich beim Anschluss von LCDs immer deren Pin-Hunger im 4-Bit-Modus gestört. Samt der Steuereingänge kostet einen das 7 Pins. Da ein LCD selten viel zu tun hat, sollte die Verwendung eines solchen Bausteines kein Problem darstellen. Um nicht wieder bei Null anzufangen, werde ich einfach die oben erwähnten Low-Level-Routinen in die vielfach bewährte LCD-Bibliothek von Peter Pfleury einbinden. Allerdings hat dieses kleine Projekt momentan noch den Status ToDo.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Category:Mc-project.de]]&lt;br /&gt;
[[Kategorie:Portexpander]]&lt;br /&gt;
[[Kategorie:I2C]]&lt;/div&gt;</summary>
		<author><name>88.152.216.119</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Port-Expander_PCF8574&amp;diff=81276</id>
		<title>Port-Expander PCF8574</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Port-Expander_PCF8574&amp;diff=81276"/>
		<updated>2014-02-03T11:03:05Z</updated>

		<summary type="html">&lt;p&gt;88.152.216.119: Falsche Angabe an Adresspins&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der &#039;&#039;&#039;PCF8574&#039;&#039;&#039; ist ein via [[I2C]]-Bus angeschlossener 8-Bit I/O Port-Expander. Wer schon einmal unter &amp;quot;chronischem Pinmangel&amp;quot; in einer seiner Applikationen gelitten hat, weiss was gemeint ist.&lt;br /&gt;
&lt;br /&gt;
Falls ihr noch nie etwas mit dem I2C gemacht habt, dann lest euch bitte zuerst die entsprechende Rubrik durch. Danach wird das Verstehen wesentlich einfacher fallen.&lt;br /&gt;
&lt;br /&gt;
Das Datenblatt findet ihr [http://www.nxp.com/documents/data_sheet/PCF8574.pdf hier].&lt;br /&gt;
&lt;br /&gt;
=Funktion=&lt;br /&gt;
&lt;br /&gt;
Ein seriell an den Baustein gesendeter Wert wird auf dessen Pins parallel ausgegeben. Es gibt zwei Adresspins (A0:2), an welchen man die Adresse in Hardware einstellen kann (Pins jeweils auf Masse bzw. Vcc legen). Es können also maximal 2^3 = 8 Bausteine vom Typ PCF8574 und maximal 2^3 = 8 Bausteine vom Typ PCF8574&#039;&#039;&#039;A&#039;&#039;&#039; (unterschiedliche Addresspräfixe) direkt am Bus betrieben werden. Will man mehr ICs anschliessen ist ein I2C-Multiplexer notwendig (z.&amp;amp;nbsp;B. PCA9544A).&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/mc-project/Pages/Projekte/ICs/Port%20Expander/expander-pins.gif&lt;br /&gt;
&lt;br /&gt;
An den Pins P0:7 kann ein 8 Bit Wert ausgegeben bzw. eingelesen werden. SDA und SCL dienen der Kommunikation über den I²C-Bus. /INT dient dazu, eingehende Daten an den Pins des Bausteins zu signalisieren. Man kann diesen Pin direkt an einen der Pins (externe Interrupts: INT0, INT1) des Mikrocontrollers legen. Da der Expander mit einem Open-Drain Ausgang daher kommt, muss ein Pull-Up gegen Betriebsspannung geschaltet werden. So kann der PCF8574 dem Mikrocontroller ohne den Umweg über den I2C übermitteln, dass sich die Eingangssignale geändert haben. Man kann ihn natürlich auch einfach offen lassen. Die Pins P0:7 können bis zu 25mA aufnehmen, aber nur gegen GND! Denn es handelt sich um [[Ausgangsstufen Logik-ICs|Open Collektor Ausgänge]]. Ausgeben können die IOs nur ca. 100µA über den interen Pull-Up Widerstand (welcher genaugenommen eine [[Konstantstromquelle]] ist). Kurzzeitig kann dieser Pull-Up 1mA liefern, wenn ein Ausgang von LOW auf HIGH schaltet, das verkürzt die Umschaltzeit wesentlich. Der gesamt aufgenommene Strom sollte 200mA nicht überschreiten.&lt;br /&gt;
&lt;br /&gt;
=I²C Kommunikation=&lt;br /&gt;
&lt;br /&gt;
Gestartet wird die Kommunikation durch das Senden der Start-Bedingung gefolgt vom Adressbyte.&lt;br /&gt;
&lt;br /&gt;
Das Adressbyte für den PCF8574:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || Bit 0 || Hexadezimal&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |  0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | R/W &lt;br /&gt;
|| 0x40 + A[2:0]*2 + R/W&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Das Adressbyte für den PCF8574&#039;&#039;&#039;A&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Bit 7 || Bit 6 || Bit 5 || Bit 4 || Bit 3 || Bit 2 || Bit 1 || Bit 0 || Hexadezimal&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A2 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A1 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | A0 &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | R/W &lt;br /&gt;
|| 0x70 + A[2:0]*2 + R/W&lt;br /&gt;
|}&lt;br /&gt;
Der Adresse (4Bit für die eindeutige Kennung + 3 frei wählbare Bits) folgt das obligatorische R/W-Bit, welches festlegt, ob ein Lese- oder Schreibzugriff ausgeführt werden soll (R/W=0 Schreiben, R/W=1 Lesen).&lt;br /&gt;
&lt;br /&gt;
Wurde ein ACK empfangen, d.h. hat sich ein Slave angesprochen gefühlt, so kann man nun ein Datenbyte senden (R/W=0) oder den Status der Eingänge einlesen (R/W=1), also ein Datenbyte empfangen. Wurde ein Byte gesendet, so bestätigt der Baustein dieses mit ACK. Der Anwender kann nun festlegen, ob er das nächste Byte senden möchte oder ein STOP senden. Wurde ein Byte gelesen, so hat der Master dieses per ACK zu bestätigen, so er denn gleich das nächste empfangen möchte. Ansonsten kann hier das ACK entfallen und ein STOP gesendet werden.&lt;br /&gt;
&lt;br /&gt;
Stellt sich nur noch die Frage: Wie regelt man nun, ob ein Pin als Ein- oder Ausgang arbeiten soll? Soviel gleich vorweg: So etwas wie die Datenrichtungsregister des [[AVR]]s gibt es hier nicht, man muss ohne sie auskommen. Den Ausgangspegel der Pins definiert man über einen Schreibzugriff. Sendet man beispielsweise nach der Adresse gefolgt vom ACK des Bausteins 0xF0, so bedeutet das, dass P0:3 nun L-Pegel haben und P4:7 H-Pegel. Will man einige IOs als Eingänge verwenden, muss man die entsprechenden Ausgänge zunächst auf H-Pegel setzen, da es sich um [[Ausgangsstufen Logik-ICs|Open Collektor Ausgänge]] handelt sind die Ausgänge somit inaktiv. Führt man nun einen Lesezugriff durch, so stehen im gelesenen Byte die Pegel der Pins.&lt;br /&gt;
&lt;br /&gt;
=Anwendung=&lt;br /&gt;
&lt;br /&gt;
Im nachfolgenden Bild sind verschiedene Anwendungen der IOs dargestellt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:PCF8574.png|640px]]&lt;br /&gt;
&lt;br /&gt;
* P0..P3 - Ausgänge für LEDs: Die LEDS sind mit ihrer Anode über einen Vorwiderstand gegen VCC verdrahtet. Eine LED wird eingeschaltet, indem der jeweilige Ausgang auf LOW gesetzt wird (LOW aktive). Es ist &amp;lt;B&amp;gt;NICHT&amp;lt;/B&amp;gt; möglich, die LEDs mit ihrer Kathode gegen GND zu verdrahten, da die Ausgänge vom Typ [[Ausgangsstufen_Logik-ICs#Open_Collector| Open Collector]] sind und nur bei LOW große Ströme schalten können.&lt;br /&gt;
* P4 - Ausgänge für ULN2003 &amp;amp; Co: Hier wird bei HIGH doch schon richtig Strom gebraucht (ca. 1mA). Das kann der IC nicht selber liefern (typisch ca. 100µA). Deshalb wird hier ein relativ niederohmiger Pull-Up Widerstand benötigt.&lt;br /&gt;
* P5 - Ausgänge für Logikbausteine: Nichts besonderes.&lt;br /&gt;
* P6 - Eingänge für Logikbausteine: Der Logikbaustein muss bei LOW bis zu 300µA Strom liefern können, da die internen Pull-Up Widerstände darauf dimensioniert sind und man sie nicht abschalten kann.&lt;br /&gt;
* P7 - Eingänge für Taster: Die internen Pull-up Widerstände sind hier nützlich.&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Routinen zum Ansteuern des Baustein können hier herunter geladen werden:&lt;br /&gt;
* [http://www.mikrocontroller.net/mc-project/Pages/Projekte/ICs/Port%20Expander/Portexpander%20Beispiel.zip Portexpander Beispiel.zip]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Anwendung soll ein solcher Expander bei mir natürlich auch finden. Am meisten hat mich beim Anschluss von LCDs immer deren Pin-Hunger im 4-Bit-Modus gestört. Samt der Steuereingänge kostet einen das 7 Pins. Da ein LCD selten viel zu tun hat, sollte die Verwendung eines solchen Bausteines kein Problem darstellen. Um nicht wieder bei Null anzufangen, werde ich einfach die oben erwähnten Low-Level-Routinen in die vielfach bewährte LCD-Bibliothek von Peter Pfleury einbinden. Allerdings hat dieses kleine Projekt momentan noch den Status ToDo.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Category:Mc-project.de]]&lt;br /&gt;
[[Kategorie:Portexpander]]&lt;br /&gt;
[[Kategorie:I2C]]&lt;/div&gt;</summary>
		<author><name>88.152.216.119</name></author>
	</entry>
</feed>