Forum: Mikrocontroller und Digitale Elektronik I2C mit Sensirion Sensor


von Ahnungslos_am_Morgen (Gast)


Lesenswert?

Hallo Mitstreiter.

Ich stehe momentan vor einem kleinen Problem. Ich würde gerne den 
Sensirion SHT21 rel. Feuchte und Temp.-Sensor mit einem Atmega644p 
auslesen via I²C auslesen.

Dazu gibt es ja einige Beschreibungen und Tuts im Web. Im Prinzip 
funktioniert es auch recht gut. Alle Daten/Befehle welche ich an den 
Sensor schicken werden erfolgreich durchgeführt. Soll heißen.

Start->Sensoraddy+W->Anweisung zur 
Temp.Triggerung->Restart->Sensoraddy+R->Interne Messung des 
Sensors->!!!ab hier passiert aber nichts mehr!!!

Das Problem ist also, dass mir der Sensor nichts zurückschickt. Mit dem 
Oszi konnte ich feststellen, dass weder ClK noch Daten auf dem Bus 
versendet werden.

Daher meine Frage an euch. Liegt es ev. daran, dass der µC kein clk 
ausgibt? Wenn ja, wie kann ich diesem sagen das er "clocken" soll?

Oder liegt das Problem an einer anderen Stelle. Gibt es ev. eine 
Initialisierung die ich vergessen habe (gibts irgendwo ne Stelle wo ich 
auf Master Reciever umstellen muss o.ä.)

Hat jmd Erfahrungen? Oder kann ich den Sensor gar nicht im Hold Master 
Mode auslesen?


Soweit erst einmal. Danke für Ratschläge.

von Wastl F. (rescuetigerchen)


Lesenswert?

Wie hast du den Sensor denn angeschlossen?
Hast du Pull-Up Widerstände verwendet? (an SDA und SCL)
Wie du geschrieben hast, kannst du kein CLK Signal messen.
Das ist aber zwingend notwendig um eine synchrone Datenübertragung 
hinzubekommen. Dieses Signal ist dauerhaft an (zumindest solange man 
kommunizieren möchte) und kann über den Timer des Atmega gesteuert 
werden. Hierbei auf die Frequenz achten, diese ist abhängig von der 
Controllertaktfrequenz.
Vllt mal einen Code-Teil (Setup und Ansprechen) oder Schaltung posten. 
Dann ist es sicher einfacher etwas zu finden.
Gruß,
wastl

von wztaut (Gast)


Lesenswert?

der sensor benötigt einige zeit nachdem der read befehl eingegangen ist 
um zu messen. Die genaue zeit steht im Datenblatt. Du kannst dir 
aussuchen ob du im prozessor eine fixe Wartezeit einbaust oder ob du 
wartest bis sich der sensirion sensor wieder meldet. Der zieht die CLK 
oder DAT Leitung auf L oder H während des Messvorgangs(weiß ich leider 
nicht mehr genau).

Habe das damals vor ca nem Jahr mit einer Soft-I2C Lösung gemacht auf 
nem PIC.... funktioniert noch immer tadellos.

von cskulkw (Gast)


Lesenswert?

Der Hold Master Mode ist das Halten des Sensor der SCL- Taktleitung auf 
LOW solange er am messen ist.

Ich hatte vor 2 Monaten den SHT11 am Wickel und stand vor der Frage, ob 
ich die I²C-Peripherie verwende oder nicht. Ich habe mich für das 
Bitklappern entschieden, weil der SHT11 ohnehin den Stadard nicht 
einhält. Den mühsamen Weg habe ich deshalb gewählt, weil ich jetzt den 
Sensor an jeden beliebigen Port anschließen kann.

Aber das läuft da genauso, die Clockleitung wird auf 0 gehalten. Erst 
wenn die auf 1 springt, kann man mit dem Auslesen fortfahren.

Ich denke Du mußt Dir was einfallen lassen, wie Du mitbekommst, dass der 
Sensor die Taktleitung nicht mehr auf 0 zieht.

Vielleicht ist es sinnvoll dazu einen weiteren PORT-Pin zu spendieren, 
der nur einliest. Diesen müßtest Du dann pollen. Ich denke die 
I2C-Schnittstelle auszuschalten und auf Input-Port-Funktion 
umzukonfigurieren ist machbar aber zu aufwendig.

Wenn Du den zusätzlichen Portpin nicht spendieren kannst oder willst, 
dann wenn den No-Master-Hold-Modus an. Auf Seite 8 steht es beschrieben.

Alternativ kannst Du auch einfach die typische Wandlungszeit warten und 
dann mit etwas zusätzlicher Wartezeit, die Kommunikation fortsetzen.

Sollte er dauerhaft die Leitung auf 0 halten, dann würde ich sagen, ist 
der Sensor falsch konfiguriert oder defekt.
Ich habe 6 SHT11 in Betrieb genommen und alle verhalten sich, wie im 
Datenblatt.

Hoffe, dass ich Dir helfen konnte. Viel Erfolg

von Ahnungslos_am_Morgen (Gast)


Lesenswert?

Pull-ups etc sind dran, auch warte ich 70 ms, welche der Sensor zum 
Messen braucht.

Ich habe gerade eben noch einmal das Datenblatt durchgelesen. Gut 
möglich das ich die Informationen zum Slave Transmitter Mode einfügen 
muss damit die Kommunikation klappt. (das hatte ich bisher außer acht 
gelassen)

Sollte ich da nicht zum Ziel kommen, werde ich wohl diese Software I2C 
Lösung in Betracht ziehen.

Sollte dies mit dem Slave Transmitter Mode klappen, werde ich mich noch 
einmal melden und das Ergebnis vorstellen.

von Ahnungslos_am_Morgen (Gast)


Lesenswert?

wie gewünscht nochmal der derzeitige Codestand:

  //interne Pull ups
  DDRC &= ((1<<0) | (1<<1));
  PORTC |= (1<<0) | (1<<1);


  //Bit Rate Register
  TWBR = 12;
  // Status Register
  TWSR = 0b11111000;


  while(1)
  {

   if (zahl == 1)
   {

    //Senden Startbedingung
    TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    //Warten bis diese verschickt wurde
    while (!(TWCR & (1<<TWINT)));
         //Prüfen, Start mit Bestätigung vorhanden?
    if ((TWSR == 0x08))
    {
    lcd_clear();
    lcd_setcursor(0,2);
      lcd_string("A");
      }
    //SLA+W.
    TWDR = 0b10000000;
    TWCR = (1<<TWINT) | (1<<TWEN);
    while (!(TWCR & (1<<TWINT)))
    {};
    //Senden der Addresse+W und erhaltenes ACK?
    if ((TWSR == 0x18))
    {

    lcd_setcursor(2,2);
      lcd_string("B");
      }
    //Triggern auf Temp.
    TWDR = 0b11100011;
    TWCR = (1<<TWINT) | (1<<TWEN);

    while (!(TWCR & (1<<TWINT)))
    {
    };
    //Daten gesendet und erhaltenes ACK?
    if ((TWSR == 0x28))
    {
    lcd_setcursor(4,2);
      lcd_string("C");
      }
    //Senden erneuten Startbedingung
    TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    //Warten bis diese verschickt wurde
    while (!(TWCR & (1<<TWINT)));

    //Senden der Addresse+Readbefehl
    TWDR = 0b10000001;
    TWCR = (1<<TWINT) | (1<<TWEN);

    while (!(TWCR & (1<<TWINT)))
    {};
    PORTA=TWSR;   //gibt0x40 aus, ist also okay

               //ab hier passiert nix mehr
    _delay_ms(66);
    //TWCR = (1<<TWINT) | (1<<TWEN);
    status=TWDR;
    sprintf(Buffer, "%i", status);
    lcd_setcursor(0,1);
      lcd_string(Buffer);

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ahnungslos_am_Morgen schrieb:
> auch warte ich 70 ms, welche der Sensor zum
> Messen braucht.

Das ist zu knapp.  Das Datenblatt nennt maximal 85 ms in der
höchsten Auflösung (die meiner Erinnerung nach die voreingestellte
ist, wenn man nichts anderes auswählt).

Ansonsten funktionierte das Teil bei mir auch auf Anhieb.

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.