www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit TWI und ACK


Autor: ben.pu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Seit einiger Zeit probieren wir uns schon die Finger wund um eine Master 
Slave-Kommunikation herzustellen. Jedoch gibts immer irgendwelceh 
Probleme.
Zuerst am besten die Codes...

main-Funktion vom Sender:

int main(void) {

  TWBR = 18;


  while (1)
  {

    for(volatile unsigned long i = 1; i < 30000; i++);

    TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT)));

    TWDR = (0x22 << 1);
    TWCR = (1<<TWINT)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT)));

    TWDR = 0x99;
    TWCR = (1<<TWINT)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT)));

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

  }

  return 0;
}



Main-Funktion vom Empfnger:

int main(void) {

  TWBR = 18;
  TWAR  = (0x22 << 1);
  TWCR |= (1<<TWEA) | (1<<TWEN);


  while (1)
  {
      
      if(TWSR == 0x60)
          //String aufm LCD
  }

  return 0;
}


Pull up Widerstnde zu VCC sind dran und beide Controller haben den 
selben Takt. Jeder für sich liefert auf dem Oszi ein wunderbares Bild 
ab. Wenn man sie jedoch zusammenhngt entsteht auf beiden Leitungen eine 
Nullinie. Möglich ist auch dass eins von beiden auf High war.

Wenn man das ACK-Configurationsbit auf 0 setzte sah der Bus wieder 
wunderbar aus aber der Slave aber der Slave empfing noch immer nichts. 
Wenn man dafür auch die Adresse unterschiedlich gesetzt hat trat das 
selbe Phänomen auf. Das Oszibild war wunderbar aber ACK war halt HIGH 
und es wurde kein String ausgegeben.

Wir wissen nicht mehr so richtig weiter. Hoffe ihr könnt uns ein 
bisschen weiterhelfen. Vielen Dank, ben.pu

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
µC? Taktrate? Mit was (Toolchain) wie (Optimierung) übersetzt?

> Jeder für sich liefert auf dem Oszi ein wunderbares Bild ab.

Der TWI-Slave darf von sich aus nix abliefern. Nur nach Aufforderung 
durch den TWI-Master!

Autor: ben.pu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

Stefan B. schrieb:
> µC? Taktrate? Mit was (Toolchain) wie (Optimierung) übersetzt?
>

ATmega8 und Atmega168, Programmierung mit Eclipse und WinAVR Toolchain, 
Optimierung Os

>> Jeder für sich liefert auf dem Oszi ein wunderbares Bild ab.
>
> Der TWI-Slave darf von sich aus nix abliefern. Nur nach Aufforderung
> durch den TWI-Master!

ja das war ein bischen unglücklich ausgedrückt... Ich meinte damit dass 
der Master Code auf beiden Mikrocontrollern gut funktioniert. Also 
einfach nur wenn man beide trennt und jeder für sich den Master Code 
ausführen lässt. Hat nix wirklich zu bedeuten - wollte das nur mal 
sagen...

Bin über jede Meinung erfreut,
Benny

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Atmega8 könnte ich per Software und Hardware testen. Atmega168 nur per 
Software (Simulator).

Ich persönlich wäre bei einem µC-Typ geblieben - bei zwei verschiedenen 
muss man IMHO zu oft die Toolchain umstellen und ein Datenblatt mehr 
wälzen.

Fürs Testen wären komplette Quellcodes für den Slave (ATmega8?) und den 
Master (ATmega168?) sinnvoll. Die Schnippsel oben sind nicht fehlerfrei 
kompilierbar.

Mit

>   for(volatile unsigned long i = 1; i < 30000; i++);

hast du eine Taktraten- und Toolchain-abhängige Zeitschleife drin, die 
ich so nicht implementieren würde. Ich würde hier ein _delay_ms() aus 
der Library verwenden.

Die Frage nach der Taktrate ist noch offen. Nur bei Kenntnis der 
Taktrate kann man abschätzen, ob deine magische Zeile TWBR = 18; 
sinnvoll ist.

Pi*Daumen rät man anhand dieser Zeile dass Master und Slave mit einer 
Taktrate F_CPU um die 5,2 MHz arbeiten müssten, um auf eine SCL-Speed 
von 100 kHz zu kommen; 400 kHz sind schon außerhalb der Spezifikation 
(20,8 MHz).

Autor: ben.pu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan B. schrieb:
> Atmega8 könnte ich per Software und Hardware testen. Atmega168 nur per
> Software (Simulator).
>
> Ich persönlich wäre bei einem µC-Typ geblieben - bei zwei verschiedenen
> muss man IMHO zu oft die Toolchain umstellen und ein Datenblatt mehr
> wälzen.
>
> Fürs Testen wären komplette Quellcodes für den Slave (ATmega8?) und den
> Master (ATmega168?) sinnvoll. Die Schnippsel oben sind nicht fehlerfrei
> kompilierbar.
>

Zwei gleiche Mikrocontroller stehen leider nicht zur Verfügung. Da ich 
mit Eclipse arbeite kann man zwei Projekte gleichzeitig, mit den 
jeweiligen Einstellungen, bearbeiten. Das Hin- und Herswitchen stellt 
hier kein Problem dar, da sich AVRDude nur das aktive Projekt flasht und 
auch prüft ob die Signaturen übereinstimmen - da machen sich zwei 
unterschiedliche Controller ausgezahlt :-) - und nur das jeweilige 
selektierte File und das dazugehörige Projekt kompilliert werden. Ich 
denk mal die Methode ist ziemlich sicher...

Die Codes werden bei mir fehlerfrei kompilliert. Wo hakts denn bei dir?
Master soll der Atmega8 werden und Atmega168 der Slave.

> Mit
>
>>   for(volatile unsigned long i = 1; i < 30000; i++);
>
> hast du eine Taktraten- und Toolchain-abhängige Zeitschleife drin, die
> ich so nicht implementieren würde. Ich würde hier ein _delay_ms() aus
> der Library verwenden.

Die Länge der Pause ist hier meiner Meinung nach für den Mikrocontroller 
unerheblich. Gewünscht ist dass überhaupt eine Pause ensteht und das 
Oszilloskop genau auf die Startbedingung Triggern kann.

>
> Die Frage nach der Taktrate ist noch offen. Nur bei Kenntnis der
> Taktrate kann man abschätzen, ob deine magische Zeile TWBR = 18;
> sinnvoll ist.
>

Sorry habsch vergessen... 8Mhz

> Pi*Daumen rät man anhand dieser Zeile dass Master und Slave mit einer
> Taktrate F_CPU um die 5,2 MHz arbeiten müssten, um auf eine SCL-Speed
> von 100 kHz zu kommen; 400 kHz sind schon außerhalb der Spezifikation
> (20,8 MHz).

Da hab ich wohl einen Fehler gemacht. Ich bin davon ausgegangen dass die 
Taktfrequenz des TWI ziemlich egal ist, sondern nur gleich sein muss.

Wäre für TWPS=0 und Fcpu=8Mhz und Ftwi=100mhz die Einstellung nach

TWBR = (CPU/SCL - 16) / 2
TWBR = 32

richtiger?

Vielen Dank für die Hilfe,
der Benny.

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was heisst Taktfrequenz muss gleich sein. Da der Slave seinen TWI Takt 
aus der SCL Leitung bezieht, braucht ihr gar nichts im TWBR eingetragen 
zu werden. Der Systemtakt des Slaves muss nur <= 16 * SCL-Takt sein.

Gruß
Fabian

Autor: ben.pu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arggghhh Stimmt... Nächste Frage:
Muss die Frequenz 100kHz betragen oder gehen auch andere?

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frequenz kann auch 37,48kHz oder 375kHz betragen. Ist im Prinzip 
egal, solange dein Slave mitkommt. Bis 100kHz bewegt man sich laut 
Standard halt im "Standard-Mode" und bis 400kHz dann im Fast-Mode.
Und wenns zu schnell wird kann er ja mit SCL-Clock-Streching auch noch 
bremsen.

Es musste oben natürlich heissen: Systemtakt-Slave >= 16 * SCL-Takt.

Gruß
Fabian

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ben.pu schrieb:
> while (1)
>   {
>
>       if(TWSR == 0x60)
>           //String aufm LCD
>   }

Da hatter recht, daß er SCL auf GND zieht forever.
Das ist nämlich Quatsch.

Du mußt das Interruptflag abtesten und zum Schluß auf 1 setzen:

while(1){
  uint8_t twcr;
  do{
    twcr = TWCR;
  while( (twcr & 1<<TWINT) == 0 );
  // nu mache was
  TWCR = twcr;
}


Peter

Autor: ben.pu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ich das so verstehen, dass der Slave nach dem ACK abbricht und 
würde erst weitermachen wenn der Slave den Bus wieder "freigibt"?
Das passiert dann durch das setzen des TWINT?

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.