-         

Ergebnis 1 bis 6 von 6

Thema: TWI-Probleme Atmega128

  1. #1

    TWI-Probleme Atmega128

    Anzeige

    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:

    Code:
    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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.03.2007
    Beiträge
    176
    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

  3. #3
    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.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.03.2007
    Beiträge
    176
    >>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/peterfleu...ware.html#libs

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    mit dieser Zeile sollte wohl ein Start gesendet werden:
    Code:
    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:
    Code:
    TWCR = (1<<TWSTA)|(1<<TWINT)|(1<<TWEN);
    Du musst Dir die ganze Beschreibung zu TWI reinziehen, sonst kommt da nix gescheites raus dabei.

  6. #6
    Thanks, dass war einer der Fehler.

    Mittlerweile läuft es prima.

    Gruß

    seventh_son

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •