Forum: Mikrocontroller und Digitale Elektronik ATMega32u4 I2C zu langsam


von Tobias E. (m1k3y)


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.

von (prx) A. K. (prx)


Lesenswert?

Tobias E. schrieb:
> Der ATMega läugt mit 16 MHz externem Quarz bei 5 Volt.

Gehofft oder gemessen?

von neuer PIC Freund (Gast)


Lesenswert?

Vielleicht Flags manuell löschen, wenn keine ISR vorhanden?

von Tobias E. (m1k3y)


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.

: Bearbeitet durch User
von (prx) A. K. (prx)


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."

: Bearbeitet durch User
von Tobias E. (m1k3y)


Lesenswert?

TWSR = 0 resultiert in TWPS = 1. Dann stimmt die Rechnung mit 400kHz.

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

von (prx) A. K. (prx)


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.

: Bearbeitet durch User
von Tobias E. (m1k3y)


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.

von Tobias E. (m1k3y)


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.

: Bearbeitet durch User
von Tobias E. (m1k3y)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.