Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
microcontrollertechnik:11_i2c_schnittstelle [2023/11/19 02:45]
mexleadmin
microcontrollertechnik:11_i2c_schnittstelle [2024/03/11 00:03] (aktuell)
mexleadmin
Zeile 1: Zeile 1:
-====== 10 I2C Schnittstelle ======+====== 11 I2C Schnittstelle ======
 <WRAP group>  <WRAP group> 
 <WRAP column 30%> <WRAP column 30%>
Zeile 8: Zeile 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>
Zeile 37: Zeile 43:
 </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. \\
Zeile 149: Zeile 155:
 ===== Software ===== ===== Software =====
  
-==== einfache Anwendung ====+==== einfache Anwendung - nur Polling ====
  
 Im ersten Schritt ist im folgenden eine einfache Anwendung dargestellt. \\ Im ersten Schritt ist im folgenden eine einfache Anwendung dargestellt. \\
Zeile 177: Zeile 183:
 --> III. Code in Microchip Studio # --> III. Code in Microchip Studio #
  
-<fs x-large>**TWI Master**</fs>+<fs x-large>**I2C Master**</fs>
  
 <WRAP group><WRAP column 40%><sxh c; first-line: 1> <WRAP group><WRAP column 40%><sxh c; first-line: 1>
Zeile 195: Zeile 201:
  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
      
Zeile 251: Zeile 257:
         I2C_transmitDataOrAddress(TWI_Data); // Daten senden         I2C_transmitDataOrAddress(TWI_Data); // Daten senden
         I2C_transmitStop(); // Stoppbit schreiben         I2C_transmitStop(); // Stoppbit schreiben
- // ggf. kann am Ende der Übertragung ein _delay_us(1) zur Synchronisierung helfen+ _delay_us(1); // erst durch den Delay ist ein Triggern im Simulide möglich 
     }     }
 } }
Zeile 295: Zeile 301:
 </sxh> </sxh>
 </WRAP><WRAP column 55%> </WRAP><WRAP column 55%>
- \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\+ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
 ''Deklarationen ==================================='' ''Deklarationen ===================================''
 \\ \\ \\ \\
Zeile 309: Zeile 315:
 ''Hauptprogramm ========================='' ''Hauptprogramm =========================''
  
-  - es wird zunächst die Pull-up Widerstände aktiviert, um die Schalter einlesen zu können+  - es werden zunächst die Pull-up Widerstände aller Pins an Port B aktiviert, um die Schalter einlesen zu können
   - in der Haupschleife läuft:   - in der Haupschleife läuft:
     - Zu Beginn eine Iitialisierung der I2C Schnittstelle. Die wiederholte Initialisierung vermeidet Probleme der I2C Zustandsmaschine.     - Zu Beginn eine Iitialisierung der I2C Schnittstelle. Die wiederholte Initialisierung vermeidet Probleme der I2C Zustandsmaschine.
Zeile 316: Zeile 322:
     - 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 =========================''
Zeile 335: Zeile 341:
 </WRAP></WRAP> </WRAP></WRAP>
  
-<fs x-large>**TWI Slave**</fs>+<fs x-large>**I2C Slave**</fs>
  
 <WRAP group><WRAP column 40%><sxh c; first-line: 1> <WRAP group><WRAP column 40%><sxh c; first-line: 1>
Zeile 353: Zeile 359:
  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
        
Zeile 386: Zeile 392:
 #define SET_ALL_TO_OUT (0xFF) // Konstante für die Aktivierung der Port Ausgänge #define SET_ALL_TO_OUT (0xFF) // Konstante für die Aktivierung der Port Ausgänge
 #define TWI_ADRESS (0b0001010) // Konstante für die I2C Adresse #define TWI_ADRESS (0b0001010) // Konstante für die I2C Adresse
 +#define TWI_ADRESS_MASK (0b0001010) // Konstante für die I2C Adress-Maske
    
 //Funktionsprototypen //Funktionsprototypen
Zeile 393: Zeile 400:
    
 uint8_t TWI_Address         = TWI_ADRESS; // Variable der I2C Adresse  uint8_t TWI_Address         = TWI_ADRESS; // Variable der I2C Adresse 
-uint8_t TWI_AddressMask     0b11111110; // Variable Zum maskieren der eingehenden Adresse+uint8_t TWI_AddressMask     TWI_ADRESS_MASK; // Variable Zum maskieren der eingehenden Adresse
    
 int main(void) int main(void)
Zeile 431: Zeile 438:
   - Hier wird die Frequenz des Quarz direkt eingestellt.    - Hier wird die Frequenz des Quarz direkt eingestellt. 
   - Weiterhin wird eine Konstante für die I2C Frequenz definiert \\ \\    - Weiterhin wird eine Konstante für die I2C Frequenz definiert \\ \\ 
-  - Die Header-Dateien und die Bit-ändernden Makros entsprechen denen der letzten Programme. \\ \\ \\ \\ \\ +  - Die Header-Dateien und die Bit-ändernden Makros entsprechen denen der letzten Programme. \\ \\ \\ \\ 
   - Die weiteren Konstanten sind:   - Die weiteren Konstanten sind:
     - Konstante für die das Setzen der Pins als Ausgang     - Konstante für die das Setzen der Pins als Ausgang
-    - Konstante für die I2C Adresse  \\ \\ \\ \\ \\ +    - Konstante für die I2C Adresse   
-  - Zwei globale Variablen beinhalten die I2C Adresse und die Maske für die eingelesene Adresse+    - Konstante für die Maskierung der Adresse \\ \\ \\ \\ \\ 
 +  - Zwei globale Variablen beinhalten die I2C Adresse und die Maske für die eingelesene Adresse \\ \\ 
  
 ''Hauptprogramm ========================='' ''Hauptprogramm =========================''
  
-  - es wird zunächst die Pull-up Widerstände aktiviert, um die Schalter einlesen zu können +  - Es werden alle Pins an Port B als Ausgang geschalten 
-  - in der Haupschleife läuft: +  - Die I2C Adresse, auf welche der Slave hört, wird gesetzt \\ \\ 
-    - Zu Beginn eine Iitialisierung der I2C Schnittstelle. Die wiederholte Initialisierung vermeidet Probleme der I2C Zustandsmaschine. +  In der Haupschleife läuft nur das Setzen des Port B anhand der eingelesenen I2C Daten \\ \\ \\ \\ \\
-    - Als nächstes wird die startende Flanke gesendet. +
-    - Das erste Byte auf dem I2C Bus ist die Adressebyte. Dieses setzt sich aus der Adresse und einem Bit zusammenwelches angibt, ob der Slave nur zuhören (''0'') oder antworten (''1'') soll. +
-    Nun wird der Zustand das Port B als I2C Daten eingelesen.  +
-    - Diese werden per I2C übertragen. +
-    - Und zum Schluss wird das Stopp Bit gesendet+
  
-'' I2C Initialisierung ========================='' +'' Setzen der I2C Adresse auf die der Slave hört ========================='' 
-  - im Statusregister werden die Bits ''TWSR''Mit dem Befehl ''ISR()'' wird eine Interrupt Service Routine für den  __OV__er__F__low Interrupt für __TIMER2__ angelegt.  +  - Die Adresse wird in das Adressbyte geschrieben.  
-  - Der Überlauf-Interrupt durch den Timer2 wird erst bei Überlauf des 8-Bit Wert ausgeführtAuch hier ergibt sich durch den Prescaler und Modus (''TCCR2A'' und ''TCCR2B''eine Periode von $T_{\rm ISR}= 0,16\bar{6}~\rm ms$. +  - Die Adressmaske wird in das Maskenbyte geschriebenDurch 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''
-  - Auch das Kontrollregister wird zurückgesetzt +  - 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! 
-  - im Bitraten Register wird die I2C Frequenz eingestellt \\ \\ \\ \\ \\ \\ \\ \\ \\ \\  \\ \\ \\ \\ \\ \\ +'' Auslesen der übermittelten Daten =============='' 
-'' I2C Startbit senden =============='' +  - Hier wird solange gewartetbis I2C Daten vorliegen 
-\\ \\ \\ +  - Nach dem Ändern des Konrollregisters muss die Abarbeitung abgewartet werden. Dies ist daran zu erkennen, das ''TWINT'' gleich ''1'' wird
-  - Es soll die I2C Schnittstelle aktiviert (''TWEN'' setzen) und das Startbit gesendet (''TWSTA'' setzen) werdenDas Schreiben einer ''1'' in ''TWINT'' löscht dieses Interruptflag +
-  - 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 sollenmü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>
Zeile 474: Zeile 464:
  
  
-==== 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 =====
  
 ==== Bibliotheken ==== ==== Bibliotheken ====
Zeile 488: Zeile 483:
   * 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 Bitmaipulation, 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.