ATmega16L mit 8Mhz nicht schnell genug für I²C fast-mode?

OP #2644301
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)
1
100 kHz = {8,0 MHz} / { 16 + 2 * TWBR * 4^TWPS }
2
100 kHz * (16 + 2 * TWBR * 4^TWPS) = 8000 kHz
3
16 + 2 * TWBR * 4^TWPS = 80
4
2 * TWBR * 4^TWPS = 64
5
4^TWPS = 64 / (2*TWBR)
6
TWBR = 32 / 4^TWPS
Nun soll laut Datenblatt TWBR >= 10 sein, wenn meine CPU Master ist.
1
10 <= 32 / 4^TWPS
2
4^TWPS <= 16/5
3
TWPS <= log_4(16/5)
4
TWPS <= 0,84
=> TWPS = 0

Nicht-funktionierender Fall: Meine CPU wird mit 8MHz getaktet. Der 
Bustakt ist 400kHz (fast mode)
1
400 kHz = {8,0 MHz} / { 16 + 2 * TWBR * 4^TWPS }
2
400 kHz * (16 + 2 * TWBR * 4^TWPS) = 8000 kHz
3
16 + 2 * TWBR * 4^TWPS = 20
4
2 * TWBR * 4^TWPS = 4
5
4^TWPS = 4 / (2*TWBR)
6
4^TWPS = 2 / TWBR
7
TWPS = log_4(2/TWBR)
8
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
OP #2644341
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(?)
Angehängte Dateien:
Gast #2644356
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.
OP #2644359
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.ä.?
Gast #2644369
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren