PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TWI-Probleme Atmega128



seventh_son
12.06.2007, 15:17
Hallo,

ich möchte ein I2C-Display mit einem Atmega128 ansteuern. Nachdem unter Benutzung der Procyon AVRlib sich aber nichts am Display tat, habe ich mich zunächst mal darauf konzentriert, den TWI unter die Lupe zu nehmen.

Ich habe ein Oszi an SCL angeschlossen und einfach mal vom Controller eine Startbedingung generieren lassen:



int main (void)
{
_delay_ms(300);
TWSR = 0;/* no prescaler */
TWBR = 72;//((F_CPU/100000)-16)/2;
TWCR=4;//(1<<TWEN);
TWCR=(1<<TWSTA);
while(1);
return 0;
}

Normalerweise müßte SDA ja jetzt auf 0 gezogen werden und an SCL müßte ein Takt anliegen. Beides ist aber nicht der Fall.

Habe ich noch irgendeine Einstellung (Register, etc.) vergessen? Was könnte sonst der Grund sein?

Gruß

seventh_son

jar
12.06.2007, 15:22
nimm doch einfach die I²C Lib und beachte diesen Satz daraus:

/* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */

TWSR = 0; /* no prescaler */
TWBR = ((F_CPU/SCL_CLOCK)-16)/2; /* must be > 10 for stable operation */

also meine TWI Erfahrungen mit Start NULL Ahnung und gleich mal einen RTC angesprochen waren sofort erfolgreich

der häufigste Fehler ist der vergessene Pullup am Ende der Leitung 4,7k-47k , ich hab 47k drin, aber man liest oft selten größer als 10k

seventh_son
12.06.2007, 15:25
Hallo jar,

wie du in meinem Code-Beispiel siehst sind TWSR und TWBR richtig gesetzt. Bei einer CPU-Clock von 16 MHz dürfte 72 der richtige Wert sein, und er ist auch größer 10. Weiß nicht worauf Du hinaus willst.

Zweimal 10k Pullups sind gesetzt.

jar
12.06.2007, 17:20
>>wie du in meinem Code-Beispiel siehst sind TWSR und TWBR richtig gesetzt.

mag sein, hab nicht hingesehen


>>Bei einer CPU-Clock von 16 MHz dürfte 72 der richtige Wert sein,

keine Ahnung

>>und er ist auch größer 10.

stimmt

>>Zweimal 10k Pullups sind gesetzt.

hab ich nicht sehen können


>>Weiß nicht worauf Du hinaus willst.

machs dir leicht nimm
http://homepage.hispeed.ch/peterfleury/avr-software.html#libs

linux_80
12.06.2007, 19:16
Hallo,

mit dieser Zeile sollte wohl ein Start gesendet werden:

TWCR=(1<<TWSTA);
aber hier wird das ganze TWI wieder deaktiviert, denn alle anderen Bits sind danach wieder 0 !

Man sollte hier auch die Werte für TWCR direkt selber setzen und nicht mit dem alten wert verodern, nur so:

TWCR = (1<<TWSTA)|(1<<TWINT)|(1<<TWEN);

Du musst Dir die ganze Beschreibung zu TWI reinziehen, sonst kommt da nix gescheites raus dabei.

seventh_son
13.06.2007, 14:33
Thanks, dass war einer der Fehler.

Mittlerweile läuft es prima.

Gruß

seventh_son