Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
Balkonkraftwerk Speicher und Wechselrichter Tests und Tutorials

K
K
Zeile 1: Zeile 1:
 
= Two-wire Serial Interface =
 
= Two-wire Serial Interface =
  
Bezeichnung von [[Atmel|Atmel]] für den auf vielen [[AVR|AVR]] Mega's vorhandenen [[I2C|I<sup>2</sup>C]].
+
Bezeichnung von [[Atmel|Atmel]] für die auf vielen [[AVR|AVR]] Megas vorhandene [[I2C|I<sup>2</sup>C]]-Hardware.
  
In diesem Artikel soll nur auf Besonderheiten der [[Atmel]] [[Microcontroller]] eingegangen werden, Einzeilheiten zu [[I2C|I<sup>2</sup>C]] finden sich in den entsprechenden Artikeln.
+
In diesem Artikel soll nur auf Besonderheiten der [[AVR]]-[[Microcontroller]] eingegangen werden, Einzeilheiten zu [[I2C|I<sup>2</sup>C]] finden sich in den entsprechenden Artikeln.
  
 
= Merkmale =
 
= Merkmale =
Zeile 13: Zeile 13:
  
 
= TWI verwenden =
 
= TWI verwenden =
Um TWI mit dem [[AVR]] verwenden zu können sind einige Einstellungen nötig, die hier, in Abhängigkeit der Anwendung, aufgezeigt werden.
+
Um TWI mit dem [[AVR]] verwenden zu können sind einige Einstellungen nötig, die hier in Abhängigkeit der Anwendung aufgezeigt werden.
  
 
== TWI-Register ==
 
== TWI-Register ==
Zeile 36: Zeile 36:
 
;TWDR
 
;TWDR
 
:Data Register, alle 8 bit
 
:Data Register, alle 8 bit
:Beim Senden: nächstes Byte das auf den Bus ausgegeben werden soll
+
:Beim Senden: nächstes Byte, das auf den Bus ausgegeben werden soll
 
:Beim Empfangen: letztes Byte, das über den Bus gekommen ist
 
:Beim Empfangen: letztes Byte, das über den Bus gekommen ist
 
:Die Daten sind gültig, solange das Bit ''TWINT'' in ''TWCR'' gesetzt ist
 
:Die Daten sind gültig, solange das Bit ''TWINT'' in ''TWCR'' gesetzt ist
Zeile 43: Zeile 43:
 
:Slave Address Register
 
:Slave Address Register
 
<div align="center">{{Registertabelle8Bit|TWA6|TWA5|TWA4|TWA3|TWA2|TWA1|TWA0|TWGCE}}</div>
 
<div align="center">{{Registertabelle8Bit|TWA6|TWA5|TWA4|TWA3|TWA2|TWA1|TWA0|TWGCE}}</div>
:Wird der AVR als Slave eingesetzt, wird in den oberen 7 Bit die Adresse eingetragen auf die reagiert werden soll
+
:Wird der AVR als Slave eingesetzt, wird in den oberen 7 Bit die Adresse eingetragen, auf die reagiert werden soll
 
:als Master ist es unbenutzt
 
:als Master ist es unbenutzt
 
:Setzt man Bit0, kann zusätzlich auf einen ''General Call'' reagiert werden
 
:Setzt man Bit0, kann zusätzlich auf einen ''General Call'' reagiert werden
Zeile 51: Zeile 51:
 
* Master Transmitter (nur senden)
 
* Master Transmitter (nur senden)
 
* Master Receiver (senden und empfangen)
 
* Master Receiver (senden und empfangen)
* Slave Transmitter (auf abruf senden)
+
* Slave Transmitter (auf Abruf senden)
 
* Slave Receiver (nur empfangen)
 
* Slave Receiver (nur empfangen)
Abhängig von der Anwendung, kann der [[AVR]] alle Arten der Übertragung im gleichen Programm ausführen.
+
Abhängig von der Anwendung kann der [[AVR]] alle Arten der Übertragung im gleichen Programm ausführen.
  
 
== Master ==
 
== Master ==
Zeile 62: Zeile 62:
 
=== Bit Rate Generator ===
 
=== Bit Rate Generator ===
 
Zur Übertragung gibt es die Bitraten ''Standard'', mit bis zu 100kBit/s, und ''FastMode'', mit bis zu 400kBit/s.
 
Zur Übertragung gibt es die Bitraten ''Standard'', mit bis zu 100kBit/s, und ''FastMode'', mit bis zu 400kBit/s.
Der Master muss immer den Takt erzeugen, der bei bedarf auf der Leitung SCL angelegt wird.
+
Der Master muss immer den Takt erzeugen, der bei Bedarf auf der Leitung SCL angelegt wird.
Der SCL-Takt ist beim AVR abhängig von der CPU-Frequenz, deshalb ist es von Vorteil (im gegensatz zu RS232), wenn man Frequenzen mit geraden Werten verwendet, zB. 8.0 MHz, da sich der Wert besser teilen lässt um auf 100kHz bzw. 400kHz zu kommen.
+
Der SCL-Takt ist beim AVR abhängig von der CPU-Frequenz. Im Gegensatz zum [[RS232]] ist I2C jedoch ein synchrones Protokoll, das mit dem Taktsignal SCL arbeitet. Daher muss man nicht exakt auf eine Frequenz von von 100kHz bzw. 400kHz kommen.
  
Im TWI-Modul des AVR gibt es zwei stellen, an denen man die Teilung der Frequenz einstellen kann.
+
Im TWI-Modul des AVR gibt es zwei Stellen, an denen man die Teilung der Frequenz einstellen kann:
 
* die ''Prescaler Bits'' (TWPS), diese 2 Bits befinden sich im ''TWI Status Register'' (TWSR)
 
* die ''Prescaler Bits'' (TWPS), diese 2 Bits befinden sich im ''TWI Status Register'' (TWSR)
 
* für die genauere Einstellung das ''TWI Bit Rate Register'' (TWBR)
 
* für die genauere Einstellung das ''TWI Bit Rate Register'' (TWBR)
Zeile 71: Zeile 71:
 
'''Formel zur Berechnung der SCL-Frequenz:'''
 
'''Formel zur Berechnung der SCL-Frequenz:'''
 
<div align="center">
 
<div align="center">
<math>\mathrm{SCL{-}Frequenz =  \frac{CPU{-}Frequenz}{16\ +\ 2\ ( TWBR )\ 4 ^ { TWPS } } }</math>
+
<math>\mathrm{SCL{-}Frequenz =  \frac{CPU{-}Frequenz}{16 + 2 \cdot TWBR \cdot 4^{TWPS} } }</math>
 
</div>
 
</div>
  
Da ein AVR zur Zeit max. mit 20MHz getaktet werden kann, ist es nicht nötig den Prescaler zu benutzen, bzw. er wird auf den Teiler 1 gestellt, was keiner Teilung entspricht. Mit diesem Teiler können alle CPU-Frequenzen und TWI-Takte abgedeckt werden.
+
Da ein AVR zur Zeit max. mit 20MHz getaktet werden kann, ist es nicht nötig, den Prescaler zu benutzen, bzw. er wird auf den Teiler 1 gestellt, was keiner Teilung entspricht. Mit diesem Teiler können alle CPU-Frequenzen und TWI-Takte abgedeckt werden.
  
'''Mögliche Prescaler Werte:'''
 
 
<div align="center">
 
<div align="center">
 
{| {{Blauetabelle}}
 
{| {{Blauetabelle}}
|'''BitWert'''
+
|+ '''Mögliche&nbsp;Prescaler-Werte'''
|'''Teiler'''
+
|- {{Hintergrund1}}
 +
!| Bit-Wert || Teiler
 
|-
 
|-
|00
+
|00 ||1
|1
+
 
|-
 
|-
|01
+
|01 ||4
|4
+
 
|-
 
|-
|10
+
|10 ||16
|16
+
 
|-
 
|-
|11
+
|11 ||64
|64
+
 
|}
 
|}
 
</div>
 
</div>
 
Die Werte von TWBR gehen von theoretisch 0 bis 255. Laut [[Atmel]] soll der Wert aber mind. 10 Betragen, da es sonst zu Problemen bei der Übertragung kommen kann.
 
Die Werte von TWBR gehen von theoretisch 0 bis 255. Laut [[Atmel]] soll der Wert aber mind. 10 Betragen, da es sonst zu Problemen bei der Übertragung kommen kann.
  
'''Beispiel Berechnung'''
+
'''Beispiel-Berechnung''':
  
Es soll eine SCL-Frequenz von 100kHz erzeugt werden, die CPU-Frequenz beträgt 8.0MHz, der Teiler (Prescaler) ist, wie oben erwähnt, auf 1 (TWPS = 0).
+
Es soll eine SCL-Frequenz von 100kHz erzeugt werden, die CPU-Frequenz beträgt 8MHz, der Teiler (Prescaler) ist &ndash; wie oben erwähnt &ndash; auf 1 (TWPS = 0).
  
 
Laut der Formel ergibt das dann:
 
Laut der Formel ergibt das dann:
<pre>100kHz = 8.0MHz / (16 + 2 * x * 4^0 )    / 1 fällt weg
+
<pre>
 +
100kHz = 8.0MHz / (16 + 2 * x * 4^0 )    / 1 fällt weg
 
100kHz = 8.0MHz / (16 + 2 * x )          / *(16 + 2 * x )
 
100kHz = 8.0MHz / (16 + 2 * x )          / *(16 + 2 * x )
 
100kHz * (16 + 2 * x ) = 8000kHz        / kürzen  / : 100
 
100kHz * (16 + 2 * x ) = 8000kHz        / kürzen  / : 100
Zeile 109: Zeile 106:
 
x = 32
 
x = 32
 
</pre>
 
</pre>
'''Ergebnis:''' Der Wert für TWBR muss 32 sein, damit die SCL-Frequenz 100kHz, bei 8.0MHz CPU-Frequenz, ergibt.
+
;Ergebnis: Der Wert für TWBR muss 32 sein, damit die SCL-Frequenz von 100kHz ergibt bei 8MHz CPU-Frequenz.
  
'''Es Ergibt sich somit Folgende Formel zum Berechnen von TWBR:'''
+
'''Es Ergibt sich somit folgende Formel zum Berechnen von TWBR:'''
 
<div align="center">
 
<div align="center">
 
<math>\mathrm{TWBR = \frac{ \frac {CPU{-}Frequenz}{SCL{-}Frequenz} - 16}{2}}</math>
 
<math>\mathrm{TWBR = \frac{ \frac {CPU{-}Frequenz}{SCL{-}Frequenz} - 16}{2}}</math>
 
</div>
 
</div>
  
Kommt ein Wert kleiner 10 heraus, sollte eine höhere CPU-Frequenz gewählt werden. Wird eine krumme CPU-Frequenz verwendet was kein Ganzzahliges Ergebnis zur folge hat, kann man mit der 1. Formel überprüfen ob der Wert auf- oder Abgerundet wird. Auf der sicheren Seite ist man, wenn der Wert aufgerundet wird, das entspricht einer grösseren Teilung, also eine geringfügig kleinere Bitrate und liegt deshalb im Standard.
+
Kommt ein Wert kleiner 10 heraus, sollte der Prescaler verwendet werden oder falls möglich ein höherer CPU-Takt. Wird eine krumme CPU-Frequenz verwendet, die kein ganzzahliges Ergebnis zur Folge hat, kann man mit der ersten Formel überprüfen, ob der Wert auf- oder abgerundet wird. Auf der sicheren Seite ist man, wenn der Wert aufgerundet wird. Das entspricht einer grösseren Teilung, also eine geringfügig kleinere Bitrate und liegt deshalb im Standard.
  
 
== Slave ==
 
== Slave ==
Zeile 122: Zeile 119:
 
*gewünschte Slaveadresse im ''Address Register'' (TWAR) setzen
 
*gewünschte Slaveadresse im ''Address Register'' (TWAR) setzen
 
*im ''Control Register'' (TWCR)
 
*im ''Control Register'' (TWCR)
*:mit TWEN das TWI Modul aktivieren
+
**mit TWEN das TWI Modul aktivieren
*:mit TWEA das Senden des Bestätigungsbits (ACK) zulassen
+
**mit TWEA das Senden des Bestätigungsbits (ACK) zulassen
  
 
anschliessend als Slave
 
anschliessend als Slave
*warten bis im ''Control Register'' (TWCR) das Bit TWINT gesetzt ist, welches anzeigt, das auf dem Bus was los ist
+
*warten, bis im ''Control Register'' (TWCR) das Bit TWINT gesetzt ist, welches anzeigt, daß auf dem Bus was los ist
 
*das ''Status Register'' (TWSR) abfragen und entsprechend darauf reagieren
 
*das ''Status Register'' (TWSR) abfragen und entsprechend darauf reagieren
  
Zeile 132: Zeile 129:
 
'''Anmerkung zur CPU-Frequenz'''
 
'''Anmerkung zur CPU-Frequenz'''
  
Da der Master den Takt vorgibt, muss der Slave nur mit dessen Takt am Bus mitlauschen. Um zu gewährleisten, das der Slave dem Takt folgen kann sollte laut [[Atmel]] die CPU-Frequenz des Slave mind. das 16-fache der Bus-Frequenz betragen.
+
Da der Master den Takt vorgibt, muss der Slave nur mit dessen Takt am Bus mitlauschen. Um zu gewährleisten, daß der Slave dem Takt folgen kann sollte laut [[Atmel]] die CPU-Frequenz eines ATMega-Slave mind. das 16-fache der Bus-Frequenz betragen.
  
 
das ergibt folgende Werte
 
das ergibt folgende Werte
 
<div align="center">
 
<div align="center">
 
{| {{Blauetabelle}}
 
{| {{Blauetabelle}}
|'''Bus-Frequenz'''
+
|- {{Hintergrund1}}
|'''minimale CPU-Frequenz'''
+
!| Bus-Frequenz || minimale CPU-Frequenz
 
|-
 
|-
|100 kHz
+
|100 kHz || 1,6 MHz
|1,6 MHz
+
 
|-
 
|-
|400 kHz
+
|400 kHz || 6,4 MHz
|6,4 MHz
+
 
|}
 
|}
 
</div>
 
</div>
  
 
= Quellen =
 
= Quellen =
Atmel Datenblätter
+
AVR-Datenblätter
  
 
= Siehe auch =
 
= Siehe auch =

Version vom 6. Januar 2006, 14:58 Uhr

Two-wire Serial Interface

Bezeichnung von Atmel für die auf vielen AVR Megas vorhandene I2C-Hardware.

In diesem Artikel soll nur auf Besonderheiten der AVR-Microcontroller eingegangen werden, Einzeilheiten zu I2C finden sich in den entsprechenden Artikeln.

Merkmale

  • Master- und Slavemodus
  • Multimaster
  • 7-Bit Adressierung (als Master möglicherweise auch 10-Bit Adressierung)
  • Übertragungsrate von bis zu 400kBit/s

TWI verwenden

Um TWI mit dem AVR verwenden zu können sind einige Einstellungen nötig, die hier in Abhängigkeit der Anwendung aufgezeigt werden.

TWI-Register

Hier eine kurze Beschreibung der für den TWI Betrieb notwendigen Register

TWBR
Bit Rate Register, alle 8 bit
dient zum einstellen des Bus-Taktes als Master, siehe Bit Rate Generator
TWCR
Control Register
Bit: 7 6 5 4 3 2 1 0
Name: TWINT TWEA TWSTA TWSTO TWWC TWEN ––– TWIE
die Hauptschaltstelle befindet sich hier, für
aktivieren des TWI-Moduls, Start- und Stopsequenz senden, ACK-Bit senden, Interruptanforderung aktivieren
TWSR
Status Register
Bit: 7 6 5 4 3 2 1 0
Name: TWS7 TWS6 TWS5 TWS4 TWS3 ––– TWPS1 TWPS0
die oberen 5 Bit geben den Status der letzten Aktion wieder
die zwei niederwertigen Bit zum einstellen des Prescaler als Master, siehe Bit Rate Generator
TWDR
Data Register, alle 8 bit
Beim Senden: nächstes Byte, das auf den Bus ausgegeben werden soll
Beim Empfangen: letztes Byte, das über den Bus gekommen ist
Die Daten sind gültig, solange das Bit TWINT in TWCR gesetzt ist
TWAR
Slave Address Register
Bit: 7 6 5 4 3 2 1 0
Name: TWA6 TWA5 TWA4 TWA3 TWA2 TWA1 TWA0 TWGCE
Wird der AVR als Slave eingesetzt, wird in den oberen 7 Bit die Adresse eingetragen, auf die reagiert werden soll
als Master ist es unbenutzt
Setzt man Bit0, kann zusätzlich auf einen General Call reagiert werden

Übertragungsarten

Bei TWI gibt es diese Übertragungsarten

  • Master Transmitter (nur senden)
  • Master Receiver (senden und empfangen)
  • Slave Transmitter (auf Abruf senden)
  • Slave Receiver (nur empfangen)

Abhängig von der Anwendung kann der AVR alle Arten der Übertragung im gleichen Programm ausführen.

Master

Ist der AVR Master, bestimmt er was und wie schnell es auf dem I2C-Bus zugeht. (Ausnahme: Clock_Stretching )

Zur Bestimmung der Bus-Geschwindigkeit ist der Bit Rate Generator zuständig.

Bit Rate Generator

Zur Übertragung gibt es die Bitraten Standard, mit bis zu 100kBit/s, und FastMode, mit bis zu 400kBit/s. Der Master muss immer den Takt erzeugen, der bei Bedarf auf der Leitung SCL angelegt wird. Der SCL-Takt ist beim AVR abhängig von der CPU-Frequenz. Im Gegensatz zum RS232 ist I2C jedoch ein synchrones Protokoll, das mit dem Taktsignal SCL arbeitet. Daher muss man nicht exakt auf eine Frequenz von von 100kHz bzw. 400kHz kommen.

Im TWI-Modul des AVR gibt es zwei Stellen, an denen man die Teilung der Frequenz einstellen kann:

  • die Prescaler Bits (TWPS), diese 2 Bits befinden sich im TWI Status Register (TWSR)
  • für die genauere Einstellung das TWI Bit Rate Register (TWBR)

Formel zur Berechnung der SCL-Frequenz:

[math]\mathrm{SCL{-}Frequenz = \frac{CPU{-}Frequenz}{16 + 2 \cdot TWBR \cdot 4^{TWPS} } }[/math]

Da ein AVR zur Zeit max. mit 20MHz getaktet werden kann, ist es nicht nötig, den Prescaler zu benutzen, bzw. er wird auf den Teiler 1 gestellt, was keiner Teilung entspricht. Mit diesem Teiler können alle CPU-Frequenzen und TWI-Takte abgedeckt werden.

Mögliche Prescaler-Werte
Bit-Wert Teiler
00 1
01 4
10 16
11 64

Die Werte von TWBR gehen von theoretisch 0 bis 255. Laut Atmel soll der Wert aber mind. 10 Betragen, da es sonst zu Problemen bei der Übertragung kommen kann.

Beispiel-Berechnung:

Es soll eine SCL-Frequenz von 100kHz erzeugt werden, die CPU-Frequenz beträgt 8MHz, der Teiler (Prescaler) ist – wie oben erwähnt – auf 1 (TWPS = 0).

Laut der Formel ergibt das dann:

100kHz = 8.0MHz / (16 + 2 * x * 4^0 )    / 1 fällt weg
100kHz = 8.0MHz / (16 + 2 * x )          / *(16 + 2 * x )
100kHz * (16 + 2 * x ) = 8000kHz         / kürzen  / : 100
16 + 2 * x  = 80                         / -16
2 * x  = 64                              / :2
x = 32
Ergebnis
Der Wert für TWBR muss 32 sein, damit die SCL-Frequenz von 100kHz ergibt bei 8MHz CPU-Frequenz.

Es Ergibt sich somit folgende Formel zum Berechnen von TWBR:

[math]\mathrm{TWBR = \frac{ \frac {CPU{-}Frequenz}{SCL{-}Frequenz} - 16}{2}}[/math]

Kommt ein Wert kleiner 10 heraus, sollte der Prescaler verwendet werden oder falls möglich ein höherer CPU-Takt. Wird eine krumme CPU-Frequenz verwendet, die kein ganzzahliges Ergebnis zur Folge hat, kann man mit der ersten Formel überprüfen, ob der Wert auf- oder abgerundet wird. Auf der sicheren Seite ist man, wenn der Wert aufgerundet wird. Das entspricht einer grösseren Teilung, also eine geringfügig kleinere Bitrate und liegt deshalb im Standard.

Slave

Um den AVR als Slave zu konfigurieren sind nur diese wenigen Schritte notwendig:

  • gewünschte Slaveadresse im Address Register (TWAR) setzen
  • im Control Register (TWCR)
    • mit TWEN das TWI Modul aktivieren
    • mit TWEA das Senden des Bestätigungsbits (ACK) zulassen

anschliessend als Slave

  • warten, bis im Control Register (TWCR) das Bit TWINT gesetzt ist, welches anzeigt, daß auf dem Bus was los ist
  • das Status Register (TWSR) abfragen und entsprechend darauf reagieren


Anmerkung zur CPU-Frequenz

Da der Master den Takt vorgibt, muss der Slave nur mit dessen Takt am Bus mitlauschen. Um zu gewährleisten, daß der Slave dem Takt folgen kann sollte laut Atmel die CPU-Frequenz eines ATMega-Slave mind. das 16-fache der Bus-Frequenz betragen.

das ergibt folgende Werte

Bus-Frequenz minimale CPU-Frequenz
100 kHz 1,6 MHz
400 kHz 6,4 MHz

Quellen

AVR-Datenblätter

Siehe auch


--Linux 80 00:52, 6. Jan 2006 (CET)


LiFePO4 Speicher Test