www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I²C Adressen prüfen


Autor: gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich möchte das mein mega8 I2C Master beim einschalten guckt welche 
Slaves eingeschaltet sind. Dazu soll er einfach nur alle Adressen von 
0x10 bis 0x1F prüfen.

Mein Problem ist das wenn ich folgenden Code ausführe fängt ein Slave an 
zu spinnen und hängt sich bei jedem zweiten mal auf auf (Zieht dabei 
beide Signalleitungen auf low).
uint8_t i;
for(i = 0x10; i <= 0x1F; ++i)
{
  temp_buffer[0] = (i<<TWI_ADR_BITS)|(0<<TWI_READ_BIT);
  TWI_Start_Transceiver_With_Data(temp_buffer, 1);
  while(TWI_Transceiver_Busy());
  _delay_us(50);
}

Das ist noch minimal Code, er hängt sich direkt beim ersten Durchlauf 
bei TWI_Transceiver_Busy() auf weil die Leitungen auf low sind.

Wenn ich den Code mitten im Betrieb laufen lassen (taster/uart) 
funktioniert alles wunderbar.

Der Slave der den Fehler verursacht hat TWAR = 0x10 (Addrese).

Ich verwende den Code aus App note AVR311 und AVR315.

Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, Gustav,


mein Verdächtiger: "TWI_Start_Transceiver_With_Data()" - was passiert da 
drin?

Ciao
Wolfgang Horn

Autor: gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
/****************************************************************************
Call this function to send a prepared message. The first byte must contain the slave address and the
read/write bit. Consecutive bytes contain the data to be sent, or empty locations for data to be read
from the slave. Also include how many bytes that should be sent/read including the address byte.
The function will hold execution (loop) until the TWI_ISR has completed with the previous operation,
then initialize the next operation and return.
****************************************************************************/
void TWI_Start_Transceiver_With_Data( unsigned char *msg, unsigned char msgSize )
{
  unsigned char temp;

  while ( TWI_Transceiver_Busy() );             // Wait until TWI is ready for next transmission.

  TWI_msgSize = msgSize;                        // Number of data to transmit.
  TWI_buf[0]  = msg[0];                         // Store slave address with R/W setting.
  if (!( msg[0] & (TRUE<<TWI_READ_BIT) ))       // If it is a write operation, then also copy data.
  {
    for ( temp = 1; temp < msgSize; temp++ )
      TWI_buf[ temp ] = msg[ temp ];
  }
  TWI_statusReg.all = 0;      
  TWI_state         = TWI_NO_STATE ;
  TWCR = (1<<TWEN)|                             // TWI Interface enabled.
         (1<<TWIE)|(1<<TWINT)|                  // Enable TWI Interupt and clear the flag.
         (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|       // Initiate a START condition.
         (0<<TWWC);                             //
}

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur so aus Neigierde:
- du benutzt auch den IAR-Compiler (für den ist das Code-Beispiel)?
- du hast auch die Interrupts aktiviert? (der Code arbeitet 
Interruptbasiert, und du "pfuschst" da irgendwie dazwischen)
- warum fragst du diese Adresen ab, ohne irgendeine Auswertung, d.h. 
ohne zu kontrollieren OB ein slave antwortet? (da gibt's eine "union..." 
mit dem aktuellen TWI-Status....)

also meine Tipps sind RTFM! sowohl vom AVR als auch von Compiler und 
App-Note

Autor: Jörg B. (manos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sind das für Slaves? µC's (Software) oder 
Porterweiterungen/Sensoren/etc (fertige Hardware).

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.