mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega32 / I2C / TWI


Autor: Peulebo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich schreibe zur Zeit meine Diplomarbeit. So zu meinem Problem 
ich habe leider überhaupt keine Ahnung was den I2C Bus betrifft.

Ich habe mir ein kleines Testboard mit dem Atmega32 gebaut, jetzt dacht 
ich mir ich gehe langsam vor und lasse den µc erstmal nur als Master 
Bytes senden, aber hierbei hapert es leider schon. Ich habe noch gar 
keinen Slave angeschlossen, wollte mir das Ergebnis erstmal am 
Oszilloskop ansehen.

Ich suche eine gut verständlich Anleitung, hab mich schon seit heute 
moorgen durchs Netzt gewühlt und irgendwie nix passendes gefunden.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

http://de.wikipedia.org/wiki/I%C2%B2C

naja, selbst Wikipedia liefert da schon sinnvolles und wenn es nur die 
Links zu den Spezifikationen sind...

Beispielcodes für den AVR sollte es bei Atmel oder hier im Forum geben.
Weit kommst Du ohne Slave ohnehin nicht, Startcondition senden, Adresse 
senden und dann ist Schluß, weil ja kein ACK vom Slave kommt.

Gruß aus Berlin
Michael

Autor: Peulebo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, hab mir das den ganzen morgen schon durchgelesen und ich denke auch 
verstanden.

Kannst du mir vielleicht helfen das schonmal in ein c-Programm zu fügen?

-Startcondition senden
-Adresse senden

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peulebo schrieb:
> Hi, hab mir das den ganzen morgen schon durchgelesen und ich denke auch
> verstanden.
>
> Kannst du mir vielleicht helfen das schonmal in ein c-Programm zu fügen?
>
> -Startcondition senden
> -Adresse senden

Peter Fleury hat eine fertige I2C Library.
Dort kann man sich das alles mal in Natura ansehen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Kannst du mir vielleicht helfen das schonmal in ein c-Programm zu fügen?

Lies dir das entsprechende Kapitel vom Datenblatt durch. Da ist auch ein 
kommentiertes Codebeispiel drin.

MfG Spess

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peulebo schrieb:

> Ich habe mir ein kleines Testboard mit dem Atmega32 gebaut, jetzt dacht
> ich mir ich gehe langsam vor und lasse den µc erstmal nur als Master
> Bytes senden, aber hierbei hapert es leider schon. Ich habe noch gar
> keinen Slave angeschlossen, wollte mir das Ergebnis erstmal am
> Oszilloskop ansehen.

Das kann schon problematisch sein, weil der Master nach dem ersten 
Senden ein ACK des angesprochenen Slave erwartet. Mit dem Oszilloskop 
könntest du max. bis zu diesem Punkt etwas sehen, d.h die Adresse und ob 
der Master ein READ oder WRITE macht.

Statt Oszilloskop sind auch spezialisierte Sniffer oder Monitore 
interessant. Die können mit Softwareunterstützung auch die Bedeutung der 
beobachteten Bits udn Bytes aufschlüsseln. Näheres im Artikel I2C

Autor: Peulebo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan B. schrieb:
> Das kann schon problematisch sein, weil der Master nach dem ersten
> Senden ein ACK des angesprochenen Slave erwartet. Mit dem Oszilloskop
> könntest du max. bis zu diesem Punkt etwas sehen, d.h die Adresse und ob
> der Master ein READ oder WRITE macht

Genau das wollte ich machen. Hast du eine Idee?

Autor: Peulebo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int main (void)

{
    uint8_t   twst;
  unsigned char address=0x66;
  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
  while(!(TWCR & (1<<TWINT)));
  twst = TW_STATUS & 0xF8;
  if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
  TWDR = address;
  TWCR = (1<<TWINT) | (1<<TWEN);
  twst = TW_STATUS & 0xF8;
  if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
  return 0;

}

Habe das so erstmal übernommen.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peulebo schrieb:
> Genau das wollte ich machen. Hast du eine Idee?

Nimm ein Slavedevice dzu :-)

Autor: Peulebo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, bin immer noch am probieren also das ist mein code soweit, sieht 
jemand Fehler?



#include <avr/io.h>

int main (void)
{

TWBR=0x20;

DDRC = (1<<DDC0)|(1<<DDC1);   //Pins als Ausgang
PORTC = (1<<DDC0)|(1<<DDC1);  //Pull ups aktivieren

  while(1)
  {
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Startbedingung
  TWDR = 0x93;
  TWCR = (1<<TWINT)|(1<<TWEN);
  TWDR = 0x20;
  TWCR = (1<<TWINT)|(1<<TWEN);
  }
}

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.