ATMega32u4 I2C zu langsam

OP #4514792
Lesenswert?
• ▲
▼
Hallo zusammen, ich kämpfe gerade etwas mit dem TWI Modul von meinen 
ATMega32u4.

Ich schaffe es nicht mit dem TWI Modul mehr als 170 kHz Bustakt zu 
erzeugen.

Der ATMega läugt mit 16 MHz externem Quarz bei 5 Volt.
Clock Divider ist 1
JTAG und WatchDog-Timer sind abgeschaltet.

Es befinden sich außer einem Logic-Analyser keine Geräte auf dem BUS.
Die Pull-Ups haben 1 kOhm.

Theoretisch sollte der BUS mit 400 kHz getaktet werden. Tatsächlich 
kommen aber nur 170 kHz raus.

Code (relevanter Part):
1
CLKPR = 0x80  // clock prescaler freischalten
2
CLKPR = 0x00  // clock prescaler auf 1* schalten
3

4
TWBR = 3;
5
TWSR = 0;
6

7
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);  // START senden
8
while(!(TWCR & (1<<TWINT)));
9

10
TWDR = 0x00;
11
TWCR =  (1<<TWINT) | (1<<TWEN);  // Adresse 0 senden
12
while(!(TWCR & (1<<TWINT)));
13

14
TWDR = 0x00;
15
TWCR =  (1<<TWINT) | (1<<TWEN);  // Daten 0 senden
16
while(!(TWCR & (1<<TWINT)));
17

18
TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);  // STOP senden
19
while(!(TWCR & (1<<TWINT)));

Vermutlich übersehe ich hier nur etwas, aber ich komme einfach nicht 
drauf.
OP #4514804
Lesenswert?
• ▲
▼
A. K. schrieb:
> Tobias E. schrieb:
>> Der ATMega läugt mit 16 MHz externem Quarz bei 5 Volt.
>
> Gehofft oder gemessen?

der Code läuft in ner Endlosschleife mit _delay_ms(1).
Der Logic-Analyser zeigt genau eine Milli-Sekunde Delay zwischen 
Übertragungen.
#define F_CPU = 16000000 ist gesetzt.
Das müsste meiner Meinung nach ausreichen als Messung.

neuer PIC Freund schrieb im Beitrag #4514799:
> Vielleicht Flags manuell löschen, wenn keine ISR vorhanden?

nicht gelöschte Flags würden zu höheren delays zwischen abschnitten der 
Übertragung (start, addresse, daten, stop) führen. Dürften aber keinen 
Einfluss auf den Adress-Frame oder den Daten-Frame haben.
#4514815
Lesenswert?
• ▲
▼
Bei TWBR=3 und TWPS=0 komme ich auf 16/(16 + 2*3*(4**0)) = 16/22 = 0,72 
MHz, nicht auf 0,4 MHz. Dafür wäre 16/40 notwendig, also TWBR=12.

Ausserdem: "TWBR should be 10 or higher if the TWI operates in Master 
mode. If TWBR is lower than 10, the Master may produce an incorrect 
output on SDA and SCL for the reminder of the byte."
#4514870
Lesenswert?
• ▲
▼
Tobias E. schrieb:
> TWSR = 0 resultiert in TWPS = 1. Dann stimmt die Rechnung mit 400kHz.

Nein, TWPS sind die Bits in TWSR: "To calculate bit rates, see “Bit Rate 
Generator Unit” on page 231. The value of TWPS1..0 is used in the
equation."

TWPS=0 = 4**0 = prescale by 1
TWPS=1 = 4**1 = prescale by 4
TWPS=2 = 4**2 = prescale by 16
TWPS=3 = 4**3 = prescale by 64

Das 4**TWPS ist genau der Term im Nenner. Klingelt es jetzt?

> Mit einem höheren Wert für TWSR sind also die 400kHz nicht erreichbar.

Mit einem definierten Minimum von TWBR=10 wären sie demzufolge überhaupt 
nicht erreichbar. Schon das hätte zu denken geben sollen.
OP #4514898
Lesenswert?
• ▲
▼
A. K. schrieb:
> Das 4**TWPS ist genau der Term im Nenner. Klingelt es jetzt?
>
>> Mit einem höheren Wert für TWSR sind also die 400kHz nicht erreichbar.
>
> Mit einem definierten Minimum von TWBR=10 wären sie demzufolge überhaupt
> nicht erreichbar. Schon das hätte zu denken geben sollen.

Das kam mir tatsächlich komisch vor. Aber da hat wohl mal wieder die 
Betriebsblindheit zugeschlagen.
Danke fürs Augen öffnen.
OP #4515045
Lesenswert?
• ▲
▼
Ich habe jetzt mit
TWSR = 0
TWBR = 12
immer noch nur 150 kHz erreicht.

Allerdings hat gegentesten mit einem anderen Atmega32u4 ergeben, dass 
mein erster vermutlich defekt ist. Der zweite hat nämlich perfekt die 
400 kHz getroffen (mit exakt dem selben Code).

Falls jetzt noch jemand ne Idee hat was an dem anderen kaputt sein 
könnte immer her damit, aber im Prinzip ist das Problem jetzt gelöst.

Grüße und danke für eure Hilfe
M1k3y

Edit: Ich fühle mich langsam echt verarscht, jetzt tut der erste auch 
richtig.
OP #4516396
Lesenswert?
• ▲
▼
Ich lass das mal hier falls jemand anderes auch das Problem hat:

Obwohl die Register letztlich richtig waren wurden sporadisch immer noch 
nur 150 kHz erreicht.

Nach überprüfen der Schaltung hat sich einer der Pull-Ups als 
Fehlerquelle herausgestellt. Dieser war nicht richtig auf das Breadboard 
gesteckt. Nachdem das gefixt war, funktionierte alles zuverlässig wie es 
sollte.

Grüße,
M1k3y

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