Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
microcontrollertechnik:10_i2c_schnittstelle [2023/11/19 03:01] mexleadminmicrocontrollertechnik:11_i2c_schnittstelle [2025/11/08 13:16] (current) mexleadmin
Line 1: Line 1:
-====== 10 I2C Schnittstelle ======+====== 11 I2C Schnittstelle ======
 <WRAP group>  <WRAP group> 
 <WRAP column 30%> <WRAP column 30%>
Line 8: Line 8:
  
   - wissen wie die Kommunikation zwischen I2C Master und Slave funktioniert   - wissen wie die Kommunikation zwischen I2C Master und Slave funktioniert
 +
 +Im Video wird eine Library für die Kommunikation verwendet. Wir werden in untenstehenden Beispiel die Register selbst schreiben.
  
 </WRAP> <WRAP column 65%> </WRAP> <WRAP column 65%>
 ==== Video ==== ==== Video ====
    
 +{{youtube>evTYfGX8cgQ?size=700x400}}
 +
 +<WRAP hide>
 {{youtube>7aZ43cl7o_w?size=700x400}} {{youtube>7aZ43cl7o_w?size=700x400}}
 +</WRAP>
  
 </WRAP> </WRAP> </WRAP> </WRAP>
- 
  
 ==== Statemachine für Datenpaket ==== ==== Statemachine für Datenpaket ====
Line 37: Line 42:
 </WRAP> </WRAP>
  
-**Übertragung**\\+=== Übertragung === 
 Für die I2C Übertragung "trommelt" der Master-IC auf der Taktleitung (SCL). Bei jedem "Trommelschlag" (SCL=High), darf der Slave die Datenleitung (SDA) lesen. \\ Für die I2C Übertragung "trommelt" der Master-IC auf der Taktleitung (SCL). Bei jedem "Trommelschlag" (SCL=High), darf der Slave die Datenleitung (SDA) lesen. \\
 D.h. während der Datenübertragung bleibt die Datenleitung bei SCL=High konstant. \\ D.h. während der Datenübertragung bleibt die Datenleitung bei SCL=High konstant. \\
Line 149: Line 154:
 ===== Software ===== ===== Software =====
  
-==== einfache Anwendung ====+==== wichtiger Hinweis ==== 
 + 
 +Die im Mikrocontroller fest verdrahtete State Machine von Microchip / ATMEL kann sich (selbst in der Simulation) durch ungünstiges Timing bzw. ungünstige Zustände aufhängen. \\ 
 +Diese Zustände lassen sich leicht dadurch beheben, dass eine erneute Initialisierung der I2C Register nach jedem Versenden / Empfangen durchgeführt wird. 
 + 
 +==== einfache Anwendung - nur Polling ====
  
 Im ersten Schritt ist im folgenden eine einfache Anwendung dargestellt. \\ Im ersten Schritt ist im folgenden eine einfache Anwendung dargestellt. \\
Line 195: Line 205:
  Hardware : Simulide 1.0.0 >R810  Hardware : Simulide 1.0.0 >R810
      
- Software : Entwicklungsumgebung: AtmelStudio 7.0+ Software : Entwicklungsumgebung: Microchip Studio 7.0
    C-Compiler: AVR/GNU C Compiler 5.4.0    C-Compiler: AVR/GNU C Compiler 5.4.0
      
Line 295: Line 305:
 </sxh> </sxh>
 </WRAP><WRAP column 55%> </WRAP><WRAP column 55%>
- \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\+ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
 ''Deklarationen ==================================='' ''Deklarationen ===================================''
 \\ \\ \\ \\
Line 316: Line 326:
     - Nun wird der Zustand das Port B als I2C Daten eingelesen.      - Nun wird der Zustand das Port B als I2C Daten eingelesen. 
     - Diese werden per I2C übertragen.     - Diese werden per I2C übertragen.
-    - Und zum Schluss wird das Stopp Bit gesendet \\ \\ \\ \\+    - Und zum Schluss wird das Stopp Bit gesendet \\ \\
  
 '' I2C Initialisierung ========================='' '' I2C Initialisierung =========================''
Line 353: Line 363:
  Hardware :  Simulide 0.5.16-RC5  Hardware :  Simulide 0.5.16-RC5
      
- Software :  Entwicklungsumgebung: AtmelStudio 7.0+ Software :  Entwicklungsumgebung: Microchip Studio 7.0
     C-Compiler: AVR/GNU C Compiler 5.4.0     C-Compiler: AVR/GNU C Compiler 5.4.0
        
Line 437: Line 447:
     - Konstante für die I2C Adresse       - Konstante für die I2C Adresse  
     - Konstante für die Maskierung der Adresse \\ \\ \\ \\ \\     - Konstante für die Maskierung der Adresse \\ \\ \\ \\ \\
-  - Zwei globale Variablen beinhalten die I2C Adresse und die Maske für die eingelesene Adresse \\ \\ \\+  - Zwei globale Variablen beinhalten die I2C Adresse und die Maske für die eingelesene Adresse \\ \\ 
  
 ''Hauptprogramm ========================='' ''Hauptprogramm =========================''
  
-  - es werden alle Pins an Port B als Ausgang geschalten +  - Es werden alle Pins an Port B als Ausgang geschalten 
-  - Die I2C Adresse, auf welche der Slave hört, wird gesetzt  +  - Die I2C Adresse, auf welche der Slave hört, wird gesetzt \\ \\ 
-  - in der Haupschleife läuft nur das setzen des Port B anhand der eingelesenen I2C Daten +  - In der Haupschleife läuft nur das Setzen des Port B anhand der eingelesenen I2C Daten \\ \\ \\ \\ \\
  
 '' Setzen der I2C Adresse auf die der Slave hört ========================='' '' Setzen der I2C Adresse auf die der Slave hört =========================''
   - Die Adresse wird in das Adressbyte geschrieben.    - Die Adresse wird in das Adressbyte geschrieben. 
   - Die Adressmaske wird in das Maskenbyte geschrieben. Durch die Maske lässt sich ein Slave auch mit verschiedenen Adressen ansprechen, da die Maske angibt, welche Bits nicht berücksichtigt werden sollen (mit ''0'')   - Die Adressmaske wird in das Maskenbyte geschrieben. Durch die Maske lässt sich ein Slave auch mit verschiedenen Adressen ansprechen, da die Maske angibt, welche Bits nicht berücksichtigt werden sollen (mit ''0'')
-  - Im Kontrollregister wird die "Rückbestätigung" and den Master (Acknowledge) aktiviert (''TWEA'' setzen) und das I2C Modul aktiviert (''TWEN'' setzen) +  - Im Kontrollregister wird die "Rückbestätigung" and den Master (Acknowledge) aktiviert (''TWEA'' setzen) und das I2C Modul aktiviert (''TWEN'' setzen). Hier darf ''TWINT'' nicht geändert werden!
 '' Auslesen der übermittelten Daten =============='' '' Auslesen der übermittelten Daten ==============''
-\\ \\ \\ 
   - Hier wird solange gewartet, bis I2C Daten vorliegen   - Hier wird solange gewartet, bis I2C Daten vorliegen
-  - Nach dem Ändern des Konrollregisters muss die Abarbeitung abgewartet werden. Dies ist daran zu erkennen, das ''TWINT'' gleich ''1'' wird \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ +  - Nach dem Ändern des Konrollregisters muss die Abarbeitung abgewartet werden. Dies ist daran zu erkennen, das ''TWINT'' gleich ''1'' wird
- +
-'' I2C Adressbyte/Daten senden ========================='' +
-  - Bevor Daten übertragen werden sollen, müssen diese erst in das I2C Datenregister geschrieben werden. +
-  - Wieder die I2C Schnittstelle aktivieren (''TWEN'' setzen) und das Inrerruptflag löschen (''TWINT'' setzen) +
-  - auch hier muss wieder die Abarbeitung abgewartet werden +
- +
-\\ \\ \\ \\ \\ \\ +
- +
-'' I2C Stoppbit senden ========================='' +
-  - Das Stoppbit wird wieder im Kontrollregister aktiviert +
-  - Hier ist kein Warten notwendig +
    
 </WRAP></WRAP> </WRAP></WRAP>
Line 470: Line 468:
  
  
-==== komplexere Anwendung ==== +==== komplexere Anwendung - mit Interrupt ==== 
-Als Beispiel wurde die Temperaturmessung gewählt + 
-  {{microcontrollertechnik:twi_slave_master.zip}}+Als Beispiel wurde hier die Temperaturmessung aus Lektion 8 gewählt. \\ 
 +Das Projekt und die Simulation ist hier zu finden {{microcontrollertechnik:ad_wandler_i2c.zip}} 
 + 
 +Bitte nutzen Sie diese als Vorlage, wen Sie eine I2C Schnittstelle implementieren wollen. Da in diesem Programmstand alles über Interrupts läuft, können auch weitere Funktionen abgearbeitet werden. 
 + 
 +===== weiterführende Unterlagen ===== 
 + 
 +Die detaillierte Beschreibung zu I2C findet sich in des {{microcontrollertechnik:um10204_-_i2c-bus_specification_and_user_manual.pdf|I2C Bus Specification and User Manual}} des Herstellers (ehemls Phillips nun NXP).
  
 ==== Bibliotheken ==== ==== Bibliotheken ====
Line 484: Line 489:
   * alternative und schlanke Implementierung des Slaves von [[https://github.com/thegouger/avr-i2c-slave|The Gouger (GitHub)]] \\ (Kopie vom 16.01.22: {{microcontrollertechnik:avr-i2c-slave-master.zip}})   * alternative und schlanke Implementierung des Slaves von [[https://github.com/thegouger/avr-i2c-slave|The Gouger (GitHub)]] \\ (Kopie vom 16.01.22: {{microcontrollertechnik:avr-i2c-slave-master.zip}})
  
-===== Beispiele =====+==== Beispiele ====
  
-  * Simulide: ''...\share\simulide\examples\Arduino\sofware_i2c_lcd\i2c_lcd-arduino'' (hierbei wird Software I2C eingesetzt) +  * In Simulide ist eine Umsetzung von Software I2C zu finden: ''...\share\simulide\examples\Arduino\sofware_i2c_lcd\i2c_lcd-arduino''  
-  * Software I2C+  * Eine vollständige Implementierung des Codes für den I2C Master ist in der Library von Peter Fleury zu finden: [[http://www.peterfleury.epizy.com/avr-software.html|library]], [[http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__ic2master.html|Dokumentation]] 
-    * Library von Peter Fleury: [[http://www.peterfleury.epizy.com/avr-software.html|library]], [[http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__ic2master.html|Dokumentation]] +  Eine Implementierung eines [[Software I2C Slave]], also eines I2C an einem beliebigen Pin durch Bitmanipulation, habe ich bereitgestellt. Es soll jedoch stets bevorzugt werden die vorhandenen Hardware I2C zu nutzen.
-    * [[Software I2C Slave]]+
  
-===== weiterführende Unterlagen ===== +==== Beschreibung ==== 
-  Die "[[https://mu.microchip.com/practical-i2c-introduction-implementation-and-troubleshooting|Microchip University]]" hat auch eine schöne Einführung in I2C. Hier wird aber nicht die Implementierung in Microchip Studio auf einem AVR-Chip gezeigt, sondern in MPLAB X auf einem PIC. D.h. der Code ist nicht direkt übertragbar.+ 
 +Die "[[https://mu.microchip.com/practical-i2c-introduction-implementation-and-troubleshooting|Microchip University]]" hat auch eine schöne Einführung in I2C. Hier wird aber nicht die Implementierung in Microchip Studio auf einem AVR-Chip gezeigt, sondern in MPLAB X auf einem PIC. D.h. der Code ist nicht direkt übertragbar.