Datum:
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
Datum:
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.
Datum:
Angehängte Dateien: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(?)
Datum:
>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.
Datum:
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.ä.?
Datum:
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.
Datum:
>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.
