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