Forum: Mikrocontroller und Digitale Elektronik ATMega128 mit 16MHz Takt und I2C-Probleme


von Luca B. (lucabert)


Lesenswert?

Hallo, Leute!

Folgendes Problem: ich habe eine RnbFra 1.2 auf der ich einen ATMega128 
eingebaut habe.

Bisher hat der µC mit einem 8MHz-Takt problemlos seine Arbeit gemacht.
Jetzt habe ich einen neuen Quarz eingebaut, und läuft das ganze mit 
16MHz-Takt.

In Prinzip läuft alles noch problemlos, bis auf dem Servocontroller 
(ATTiny, mit 4MHz-Takt).

Dazu, beim Compilieren, kriege ich folgendes Warning:

1
large integer implicitly truncated to unsigned type

bei der Zeile:

1
TWBR = ((F_CPU/SCL_CLOCK)-16)/2;

Ich nutze die I2C-Library von Fleury und F_CPU ist 16000000UL und 
SCL_CLOCK 20000L.
Wenn ich manuell diese Berechnung ausführe, sehe ich daß ich versuche 
ein Wert vom 392 in den Register TWBR zu speichern.
Wenn ich aber richtig verstanden habe, ist TWBR ein 8-Bit Register.
Also, die Warnung ist richtig, und ist zu verstehen, warum die 
Kommunikation mit dem ATTiny ab und zu gestört ist.

Nun, da ich weiß daß der ATMega128 problemlos mit einem Takt vom 16MHz 
laufen kann, welches Wert soll ich genau in diesen Register schreiben?

Da die Library auf dem ATTiny eine Grenze hat, muß ich unbedingt ein 
I2C-Clock vom 20KHz nutzen.

Ich danke euch für eure Hilfe!
Luca Bertoncello

von Hubert G. (hubertg)


Lesenswert?

Was hast du für einen Prescaler eingestellt? TWPS
Gehört der in der Rechnung nicht berücksichtigt?

von Luca B. (lucabert)


Lesenswert?

Hubert G. schrieb:
> Was hast du für einen Prescaler eingestellt? TWPS
> Gehört der in der Rechnung nicht berücksichtigt?

So ist die i2c_init:
1
  TWSR = 0;                         /* no prescaler */
2
  TWBR = ((F_CPU/SCL_CLOCK)-16)/2;  /* must be > 10 for stable operation */

Und, wie gesagt, F_CPU = 16000000UL und SCL_CLOCK = 20000L

Soll ich was ändern?

Grüße
Luca Bertoncello

von Hubert G. (hubertg)


Lesenswert?

Es wird bei diesem SCL-Clock ohne Prescaler nicht funktionieren.
Ich bin mir nur selbst nicht klar wie man diesen in der Rechnung 
berücksichtigt.

von Luca B. (lucabert)


Lesenswert?

Hubert G. schrieb:
> Es wird bei diesem SCL-Clock ohne Prescaler nicht funktionieren.
> Ich bin mir nur selbst nicht klar wie man diesen in der Rechnung
> berücksichtigt.

Erhlich gesagt, ich bin auch nicht wirklich sicher, was diese 
"Prescaler" ist, und wozu es jetzt deaktiviert worden ist.

Ich habe kein Problem es zu aktiveren, wenn es nutzt, obwohl sicher 
diese Warnung weiterhin bleiben wird.
Kannst du mir aber genau sagen, was es ist?

Danke
Luca Bertoncello

von Hubert G. (hubertg)


Lesenswert?

Dieser Prescaler teilt den SCL-Clock.
Wenn du Teiler 4 eingibst, musst du dein TWBR noch mal durch 4 teilen.

von Luca B. (lucabert)


Lesenswert?

Hubert G. schrieb:
> Dieser Prescaler teilt den SCL-Clock.
> Wenn du Teiler 4 eingibst, musst du dein TWBR noch mal durch 4 teilen.

Das bedeutet, daß ich versuchen soll, einen Prescaler-Wert zu setzen?

Also, anstatt
1
TWSR = 0;
 sollte ich
1
TWSR = 1;
 schreiben, oder?

Grüße
Luca Bertoncello

von Luca B. (lucabert)


Lesenswert?

Luca Bertoncello schrieb:
> Hubert G. schrieb:
>> Dieser Prescaler teilt den SCL-Clock.
>> Wenn du Teiler 4 eingibst, musst du dein TWBR noch mal durch 4 teilen.
>
> Das bedeutet, daß ich versuchen soll, einen Prescaler-Wert zu setzen?
>
> Also, anstatt
1
TWSR = 0;
 sollte ich
1
TWSR = 1;
 schreiben,
> oder?

Also, nach ein paar Testsm, kann ich sagen, daß die Lösung RICHTIG ist.

Nun funktioniert alles prima!

Danke für den Tipp!

Grüße
Luca Bertoncello

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.