LPC2148 und SHT11

Gast #631634
Lesenswert?

Hallo ihr alle,
hab mir einen sht11 zugelegt und will den nun mit meinem lpc2148 
auslesen.

hab den code von der sensiron seite genommen und entsprechend auf den 
lpc2148 gemappt, aber irgendwie geht's nicht. er liefert mit immer die 
fehlernummer 2.

was kann ich noch machen???

schonmal danke im vorraus!!!

Gruß

Jessica
Gast #631761
Lesenswert?

Da ist Einiges im Argen:

(1) Sensirion Beispielcode ist für 8051 mit open-collector Ausgängen. 
Mit Ausnahme der "I2C Pins" sind beim LPC2k die Ausgänge Push/Pull. Bei 
"DATA_HIGH //release DATA-line" entspricht Anweisung nicht Kommentar 
falls keine "I2C-Pins" verwendet werden also eben kein "bus release". 
IO1DIR für push/pull wäre Pin als Eingang konfigurieren (IO1DIR) 
(+externer Pullup)

(2) if (IOSET & DATA) zur Abfrage des Zustands an Data-Pin: LPC2k User's 
Manual nochmal zu Gemüte führen und Unterschied zwischen IO1SET und 
IO1PIN nachvollziehen

(3) Werden die Maximalfrequenzen/Wartezeiten eingehalten? vgl. SHT 
Datenblatt. Im Zweifel mit Scope testen.

(x) komische Makroverwendung mit ;

Martin Thomas
Gast #631781
Lesenswert?

Ich habe das bei einer AVR Portierung(CV) so gemacht dass ich den PIN 
input output modus entsprechend dem jeweiligen I2C Befehl immer 
umgeschalten habe und das hat auf Anhieb funktioniert.

Die Funktion sht11_handler() wird durch Timer Interrupt alle 5ms im 
Hintergrund aufgerufen und die SHT11 Werte sind automatisch immer auf 
den neuesten Stand.

Hoffe es hilft Dir weiter,

Gerhard

P.S: Habe vor diesen SHT11 code auch auf ARM2148 umzuportieren
Angehängte Dateien:
Gast #637614
Lesenswert?

@ mthomas

zu (1) das was du da schreibst verstehe ich nicht so ganz, kannst du mir 
das vielleicht nochmal genauer erklören??

zu (2) oohh, mein fehler, nach gelesen und geändert

zu (3) timings sind ok. habe ich mit Scope überprüft.

zu (x) ja ich weiss ist ja auch nur testweise so


@ Gerhard.
habe mir deinen code noch nicht genau angeguckt werde dies aber gleich 
tun. hast vielleicht zufällig schon den code auf den lpc portiert??



vielen vielen Dank für eure bisherige Hilfe

Jessica
Gast #638752
Lesenswert?

>zu (1) das was du da schreibst verstehe ich nicht so ganz, kannst du mir
>das vielleicht nochmal genauer erklören??

Ich "erklör" doch gern, ist aber bei so unspezifischen Fragen nicht so 
einfach und kostet Zeit. Was ist nicht zu verstehen?

Des geht einfach darum, dass die Data-Leitung beim Lesen nicht vom LPC 
'festgenagelt' sein darf, sondern der Sensor diese beim Senden auf low 
ziehen kann.

Am einfachsten dürfte es sein, einen der I2C-Pins des LPC2k für Data zu 
nutzen (externen Pull-Up nicht vergessen), diese sind 
open-collector/open-drain und man braucht dann nicht viel anzupassen.

Ansonsten bei anderem Pin ebenfalls externen Pull-Up-Widerstand an Data 
(vgl. SHT Datenblatt/Appnote) Alternativ: Pins an Port1 von LPC213x/4x 
z.B. haben interen Pull-Ups. Im Prinzip:
- Data Ausgabe high : iodir=0 (Eingang), der pull-up 'zieht auf high'
- Data Ausgabe low: ioclr / iodir=1 (Ausgang)
- Data Eingabe: iodir=0 (Eingang) / iopin lesen
(Lässt sich optimieren: Ausgangsregister kann meist 'set' bleiben und 
geschaltet wird nur per iodir.)

> zu (3) timings sind ok. habe ich mit Scope überprüft.
Und wie sah das auf dem "Scope" aus, als der SHT auf der Data-Line 
antworten sollte?


Martin Thomas
(und nein, ich habe keinen fertigen LPC2k-Code für SHTs)
Gast #641414
Lesenswert?

Ok, super, vielen Dank. Jetzt hab ichs besser verstanden. Also schließe 
ich am besten die DATA-Leitung an P0.3 (SDA0 I2C0) an und die 
CLK-Leitung an irgendeinen anderen Port. Muss ich dann P0.3 im PINSEL0 
Register als SDA0 definieren oder normal als GPIO??

Zur Scope-Sache:
Am Scope konnte man sehen, dass vom SHT kein Acknowledge kam.

vielen vielen Dank.
Gast #641427
Lesenswert?

> Muss ich dann P0.3 im PINSEL0 Register als SDA0 definieren oder
> normal als GPIO??
Letzteres. Der Beispielcode "schaltet" den Pin und nutzt keine I2C 
Hardware (SHTxx sind ohnehin keine "richtigen" I2C devices)
Gast #673031
Lesenswert?

das heisst also, wenn ich die daten- und clockleitung an die io-pins mit 
den open-kollektor-ausgängen (i2c-pins) angeschlossen hab, muss ist der 
port durch ein  IOSET auf HIGH gezogen (durch die pull-ups) und durch 
ein IOCLR auf LOW gezogen!? Und das IODIR bleibt die ganze zeit auf "0" 
???

richtig???

ich danke dir vielmals für deine bisherige Hilfe

Gruß

Jessica

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