Atmega32 / I2C / TWI

Gast #2009480
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.
#2009495
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
Gast #2009501
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
Persönliche Seite #2009550
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
Gast #2009561
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?
Gast #2009571
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.
Gast #2012800
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren