ATMega128 mit 16MHz Takt und I2C-Probleme

OP #1478235
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
OP #1478332
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
OP #1478369
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
OP #1478517
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
OP #1478624
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.