Forum: Mikrocontroller und Digitale Elektronik SHT* Daten auslesen?


von Paul (Gast)


Lesenswert?

Guten Tag,
ich hab einige Beiträge zum Sensor SHT* von Sensirion gefunden doch
leider nichts was mich weiter brachte.

Folgendes:
Ich sende Transmission Start danach den Opcode zum auslesen der
Feuchte/Temp. Beim letzten toggeln der SCK Leitung sollte der Sensor
die Datenleitung auf Low ziehen (ACK). Das macht er aber nicht. Der
Portpin des MSP430 für Data ist zu diesem Moment als Ausgang
initialisiert, kann der Sensor dann überhaupt die Leitung runterziehen?
Einen 10k Pulldown Widerstand wie im Datenblatt hab ich an Vdd gelegt.
Im Beispiel von Sensirion wird der Port eines 8051 nicht umgeschalten,
da hab ich mich schon umgesehen.

Danke, Paul

von Rahul (Gast)


Lesenswert?

Natürlich musst du den Pin als Eingang schalten.
Der SHT meldet sich erst, wenn er mit der Messung fertig ist (Zeiten
stehen im Datenblatt (in irgendnem Timing-Diagramm).
In dieser Zeit muß der Pin dann zum Eingang umgeschaltet werden.
Ein externer Pull-up-Widerstand ist laut Datenblatt ja auch notwendig.

>Im Beispiel von Sensirion wird der Port eines 8051 nicht
>umgeschalten, da hab ich mich schon umgesehen.

Das bezweifle ich. Portpins der 8051er schaltet man dadurch als
Eingang, indem man eine 1 in das Portregister schreibt (die haben kein
Port-Direction-Register). Durch den internen Aufbau des Portpin
(Openkollektor-Endstufe mit zuschaltbarem Pull-Up) ist es einfacher
zwischen Ein- und Ausgang umzuschalten.

von Paul (Gast)


Lesenswert?

Danke Rahul, leider wurde meine Hoffnung das es danach funktioniert
entäuscht. Vielleicht hab ich nur einen kleinen Fehler drin den ich
nicht sehe?

char write_byte(unsigned char opcode)
{
    unsigned char i,error=0;
    for (i=0x80;i>0;i/=2) //shift bit for masking
    {
        if (i & opcode) DATA=1; // masking opcode with i
        else DATA=0;
        SCK=1;
        wait(3);
        SCK=0;
    }
    DATA=1;             // release DATA-line
    P3DIR &= ~BIT4;     // Data auf Eingang schalten
    SCK=1;              // clk #9 for ack
    wait(3);
    //SCK=0;
    while((P3IN & BIT4)!=0)  // warten auf Pulldown
    {wait(1);}
    error=DATA;       //check ack (DATA will be pulled down by SHT11)
    SCK=0;
    return error;       //error=1 in case of no acknowledge
}

von Paul (Gast)


Lesenswert?

Nochmal:
To avoid signal contention the microcontroller should only drive DATA
low. An external pull-up resistor (e.g. 10 kΩ ) is required to
pull the signal high.

Was bedeutet das für mich "should only drive DATA low"? Ich bin doch
mit meinem Port direkt am Data-Pin des Sensors. Daran hängt der
Widerstand gegen 3,3 Volt. Wiso ist das dann ein
"Pull-up"-Widerstand.
Sorry, ist mein erstes Elektronik-Bastel-Projekt. Bedeutet es das ich
mit dem uP die Leitung runterziehe, und wenn ich den Port auf Eingang
schalte springt die Leitung auf High und der Sensor sollte sie dann
wieder "kurzschließen" um mir sein ACK mit zu teilen?
?:-|...

von Paul (Gast)


Lesenswert?

Im FAQ von Sensirion steht das sich Data nur bei einer fallenden Flanke
von SCK ändern darf? Im oberen Code hab ich vom Aufbau her nichts
geändert aber Data änderert sich bei steigender Flanke?
Stimmt das Beispiel nicht oder schreiben die auf der Homepage
falsches?
Wie ändere ich das ab? Ist mir ein Rätsel

von AndreasB (Gast)


Lesenswert?

Drive Data low bedeutet, wenn du den Bus treibst (etwas draufschreibst)
darfst du nur ne 0 rausschreiben. Wenn du ne 1 aufm Bus brauchst,
schaltest du deinen Port weg vom Bus. Der externe Pullup "zieht" dann
die Leitung auf High, verbindet sie quasi mit Vcc (er sorgt für dich für
die 1)

Pullup/pulldown Widerstände sorgen am Bus für einen definierten pegel,
ein Pullup "zieht" die Spannung gegen Vcc und ein Pulldown "zieht"
sie auf Gnd.

von AndreasB (Gast)


Lesenswert?

Data sollte sich nur NACH einer fallenden Flanke von SCK ändern (also
wenn SCK low ist), nicht währenddessen. und Data muss bei einer
steigenden Flanke stabil sein (da wird dann der Wert von Data
eingelesen). Während SCK high ist, darf sich Data nicht ändern.
(Ausnahme: "Transmission Start" Sequenz)

In der FAQ bei Sensirion hab ich dazu nix gefunden, schau mal im
Datenblatt Abschnitt 2.2.2

Gruß Andreas

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.