Forum: Mikrocontroller und Digitale Elektronik Atmega32 / I2C / TWI


von Peulebo (Gast)


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.

von Michael U. (amiga)


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

von Peulebo (Gast)


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

von Karl H. (kbuchegg)


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.

von spess53 (Gast)


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

von Stefan B. (stefan) Benutzerseite


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

von Peulebo (Gast)


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?

von Peulebo (Gast)


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.

von Floh (Gast)


Lesenswert?

Peulebo schrieb:
> Genau das wollte ich machen. Hast du eine Idee?

Nimm ein Slavedevice dzu :-)

von Peulebo (Gast)


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);
  }
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.