mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C funkt nicht auf dem ATmega8 (ATmega128)


Autor: Manuel -- (ploana)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich finde keinen Fehler an meinem Code

Im ersten schritt stelle ich die Baudrate ein, und dann sollte es los 
gehen ...

Im Debuger sehe ich, dass das TWINT Bit nicht gesetzt oder gleich wieder 
auf 0 gesetzt wird

somit bleibt das programm schon in der ersten while schleife hängen:
  TWSR = 0;                         // no prescaler 
   TWBR = ( ( (F_CPU/SCL_CLOCK)-16 )/2 );  // must be > 10 for stable operation
  while (1)      //Endlosschleife
  {
    
    // send START condition
    //TWCR = 0x00 | (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    TWCR = 0x00;
    TWCR |= (1<<TWEN);
    TWCR |= (1<<TWINT);
    TWCR |= (1<<TWSTA);
    
    
    asm("nop");

    // wait until transmission completed
    while(!(TWCR & (1<<TWINT)));

    // check value of TWI Status Register. Mask prescaler bits.
    twst = TW_STATUS & 0xF8;
    if ( (twst != TW_START) && (twst != TW_REP_START)) PORTD = 0x01;



    // send device address
    TWDR = address;
    TWCR = (1<<TWINT) | (1<<TWEN);

    // wail until transmission completed and ACK/NACK has been received
    while(!(TWCR & (1<<TWINT)));

    // check value of TWI Status Register. Mask prescaler bits.
    twst = TW_STATUS & 0xF8;
    if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) PORTD = 0x02;



    // send data to the previously addressed device
    TWDR = 0xF0;
    TWCR = (1<<TWINT) | (1<<TWEN);

    // wait until transmission completed
    while(!(TWCR & (1<<TWINT)));

    // check value of TWI Status Register. Mask prescaler bits
    twst = TW_STATUS & 0xF8;
    if( twst != TW_MT_DATA_ACK) PORTD = 0x04;



    //send stop condition
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
  
    // wait until stop condition is executed and bus released
    while(TWCR & (1<<TWSTO));


lg und danke im voraus

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>// wait until transmission completed

Wenn du das im Simulator-Debugger laufen lässt, wird die Transmission ja 
auch niemals completed, weil nix am TWI-Bus dranhängt.

http://homepage.hispeed.ch/peterfleury/i2cmaster.zip
kennst du sicherlich? Das Original funktioniert nämlich einwandfrei.

Oliver

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.