www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega16L mit 8Mhz nicht schnell genug für I²C fast-mode?


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Martin F. (martin_f23)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

mich quält gerade eine Rechnung, die mit laut Datenblatt scheinbar den 
fast-mode nicht zulässt. (einen ähnlichen Fall gab es hier im Forum 
2005, der aber nie aufgelöst wurde, was die Rechnung angeht)
Nach der Formel SCL = CPU/(16+2TWBR*4^TWPS) auf Seite 176 des ATmega16 
Datenblattes:

Funktionierender Fall: Meine CPU wird mit 8MHz getaktet. Der Bustakt ist 
100kHz (standard mode)
100 kHz = {8,0 MHz} / { 16 + 2 * TWBR * 4^TWPS }
100 kHz * (16 + 2 * TWBR * 4^TWPS) = 8000 kHz
16 + 2 * TWBR * 4^TWPS = 80
2 * TWBR * 4^TWPS = 64
4^TWPS = 64 / (2*TWBR)
TWBR = 32 / 4^TWPS
Nun soll laut Datenblatt TWBR >= 10 sein, wenn meine CPU Master ist.
10 <= 32 / 4^TWPS
4^TWPS <= 16/5
TWPS <= log_4(16/5)
TWPS <= 0,84
=> TWPS = 0

Nicht-funktionierender Fall: Meine CPU wird mit 8MHz getaktet. Der 
Bustakt ist 400kHz (fast mode)
400 kHz = {8,0 MHz} / { 16 + 2 * TWBR * 4^TWPS }
400 kHz * (16 + 2 * TWBR * 4^TWPS) = 8000 kHz
16 + 2 * TWBR * 4^TWPS = 20
2 * TWBR * 4^TWPS = 4
4^TWPS = 4 / (2*TWBR)
4^TWPS = 2 / TWBR
TWPS = log_4(2/TWBR)
TWPS <= log_4(2/10)   //oder Werte >10 für TWBR, das macht's aber nur schlimmer ;-)

Logarithmus einer Zahl kleiner 1 wird negativ. Negative Werte für TWPS 
gibt es nicht. Wo ist der Fehler?
Oder kann der ATmega16L das tatsächlich nicht? (Laut Datenblatt reicht 
allerdings die 16-fache Taktfrequenz des I²C-Busses als Takt für die 
CPU. Das wären 6,4Mhz, ich habe 8Mhz.)


PS: log_4(x) is Logarithmus von x zur Basis 4

Autor: Lattice User (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Martin F. schrieb:
> Nun soll laut Datenblatt TWBR >= 10 sein, wenn meine CPU Master ist.

Wo im Datenblatt steht das?
Zumindestens im aktuellen (07/10) finde ich es nirgends.

Autor: Martin F. (martin_f23)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Direkt unter der o.g. Formel (bei mir S.176) im Abschnitt "Two-Wire 
Serial Interface". (s. angehängter Screenshot)
Hmm, meines ist 10/03, ich habe mal das 10/07 gesucht, dort fehlt die 
"Note" (nun S.178) tatsächlich, allerdings steht dort zwei Mal "Note:" 
hinterenander, nicht dass es verschluckt wurde(?)

Autor: holger (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
>Nun soll laut Datenblatt TWBR >= 10 sein, wenn meine CPU Master ist.

Mit TWBR = 10 und TWPS = 0 kommst du auf maximal 222222Hz bei 8MHz.

Mit TWBR = 2 und TWPS = 0 kommst du auf 400000Hz bei 8MHz.

Hör auf mit deiner Rechnerei und mach dir ne Tabelle für
Werte die TWBR und TWPS auch wirklich annehmen können.

Autor: Martin F. (martin_f23)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Das ist richtig, aber das ändert erstmal nichts daran, dass mein 
Datenblatt sagt: TWBR<10 ist tunlichst nicht zu verwenden. Nur weil ich 
nicht rechne, sondern sage "so müsste es sein", "darf" ich es (nach dem 
Stand des Datenblattes) trotzdem nicht.
Fragt sich nur, warum dieser Abschnitt rausgefallen ist. Ich weiß nicht, 
wie alt mein µC ist und ob da ggf. etwas in Hardware geändert wurde, 
damit das Problem in neueren Revisionen vielleicht nicht mehr auftritt 
o.ä.?

Autor: Lattice User (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Laut History im 2466T-07/10 wurde es hier geändert:

Rev. 2466L-06/05 1. Updated note in “Bit Rate Generator Unit” on page 
178.

Das ist immerhin 7 Jahre und 9 Revisionen her.

Autor: holger (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
>Das ist richtig, aber das ändert erstmal nichts daran, dass mein
>Datenblatt sagt: TWBR<10 ist tunlichst nicht zu verwenden.

Mein Gott, dann probier es doch einfach aus.
Entweder es geht oder es geht nicht. Wenn es nicht geht
dann musst du mit TWBR = 10 leben.

Was du nicht kannst ist eine SCL Frequenz für TWBR = 10
vorzugeben. Das geht einfach nicht. Für TWBR = 10
gibt es nur vier Möglichkeiten für SCL:

TWPS = 0        222222Hz
TWPS = 1         83333Hz
TWPS = 2         23809Hz
TWPS = 3          6172Hz

Mehr geht nicht. Deine Logarithmen kannst du dir sonst wo hin stecken.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net