PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SHT75 am PIC 16F877A



Enrock
20.11.2007, 07:25
Servus und Hallo,

ich habe ein Problem mit meinem SHT75 Temperatur und Feuchte-Sensor. Und zwar bekomme ich diesen an meinem PIC 16F877A nicht zum laufen.
Hier erstmal mein Code


list p=16f877a ; list directive to define processor
#include <p16f877a.inc> ; processor specific variable definitions

; __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _RC_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF

EXTERN LCD_AN
;***********************Variablendefinition******* ********************

D_SENSOR_DATA UDATA 0x040 ;start of general purpose registers

COUNTER_SEN res 1 ; Counter in Init

TEMP_DATA res 1 ; TEMP_DATA
TEMP_ACK RES 1 ; TEMP_ACK
TEMP_TEST res 1 ; TEMP_TEST

ADDR_COMM res 1 ; Address and Command

HIGH_BYTE res 1 ; Oberste 8 bit
LOW_BYTE res 1 ; untere 8 bit

GLOBAL HIGH_BYTE, LOW_BYTE

EXTERN DELAY_30ms



#define SENSOR_DATA PORTA, 1
#define SENSOR_SCK PORTB, 2

#define SENSOR_DATA_DIR TRISA, 1
#define SENSOR_SCK_DIR TRISB, 2


PROG1 Code ; START
;ORG 0x000
goto START_SHT
;
;org 0x0005 ; Interrupt
;retfie

START_SHT
GLOBAL START_SHT
;***********************Init********************** ******************
movlw 0x005
movwf HIGH_BYTE
movwf LOW_BYTE
movwf ADDR_COMM

movlw b'00000101' ; Messe Feuchte
movwf ADDR_COMM

bsf STATUS, RP0 ; Bank1
bcf SENSOR_SCK_DIR ; Output
bcf SENSOR_DATA_DIR ; Output
bcf STATUS, RP0 ; Bank0
;***********************Transmission*Start******** ********************
bsf SENSOR_DATA
bsf SENSOR_SCK
bcf SENSOR_DATA
bcf SENSOR_SCK

bsf SENSOR_SCK
bsf SENSOR_DATA

movlw d'8'
movwf COUNTER_SEN

;***********************Feuchte messen****************************
SEND_BIT_TO_SENSOR

bcf SENSOR_SCK
btfss ADDR_COMM,7
goto SEND_NULL
bsf SENSOR_DATA
goto SEND_BIT

SEND_NULL
bcf SENSOR_DATA

SEND_BIT
bsf SENSOR_SCK

rlf ADDR_COMM,f ; rotate
decfsz COUNTER_SEN,F
goto SEND_BIT_TO_SENSOR

bcf SENSOR_SCK

bsf STATUS, RP0
bsf SENSOR_DATA_DIR ; Input
bcf STATUS, RP0

bsf SENSOR_SCK

btfss SENSOR_DATA ; Acknowledge bekommen?

goto ACK_GET_FROM_SENSOR
goto ACK_LOST
;***********************Get Acknowledge****************************
ACK_GET_FROM_SENSOR ; Ack bekommen
;movlw b'00001111'
;movwf PORTB
bcf SENSOR_SCK

movlw d'30'
movwf COUNTER_SEN

call DELAY_30ms
;***********************Daten empfangen****************************
WAIT_FOR_SENSORDATA
btfss SENSOR_DATA
goto READ_DATA
decfsz COUNTER_SEN,f
goto WAIT_FOR_SENSORDATA
goto ACK_LOST ; wenn keine Daten dann ende
;***********************Lese*Daten**************** *****************
READ_DATA

call GET_BYTE
movf ADDR_COMM,w
movwf HIGH_BYTE ; oberes Byte
call SEND_ACK_TO_SENSOR

call GET_BYTE
movf ADDR_COMM,w
movwf LOW_BYTE ; unteres Byte
call SEND_ACK_TO_SENSOR

call GET_BYTE

goto geschafft
;***********************Get*Byte****************** *****************
GET_BYTE

clrf ADDR_COMM
movlw d'8'
movwf COUNTER_SEN

GET_BYTE_LOOP
bsf SENSOR_SCK
btfss SENSOR_DATA
goto GET_ZERO_BIT
bsf ADDR_COMM,0
goto GOT_BIT

GET_ZERO_BIT
bcf ADDR_COMM,0

GOT_BIT
bcf SENSOR_SCK
decfsz COUNTER_SEN,f
goto GET_NEXT_BIT
goto DONE

GET_NEXT_BIT
rlf ADDR_COMM,f ; rotate
goto GET_BYTE_LOOP

DONE
return
;***********************Sende*Acknowledge********* *******************
SEND_ACK_TO_SENSOR

bsf STATUS,RP0
bcf SENSOR_DATA
bcf STATUS, RP0

bcf SENSOR_DATA
bsf SENSOR_SCK
bcf SENSOR_SCK

bsf STATUS, RP0
bsf SENSOR_DATA
bcf STATUS, RP0

return
;***********************Kein* Acknowledge****************************
ACK_LOST
movlw b'11110000'
movwf HIGH_BYTE
movlw b'00001111'
movwf LOW_BYTE

geschafft
bsf PORTB,2
;movwf PORTB

;***********************Ende********************** ******************
ABM
goto LCD_AN
;return
;goto ABM

end






Gibt es jemanden, der mit dem Sensor Erfahrung hat und ebenfalls wie ich in Assembler programmiert?
Jemand ne Idee, was ich falsch mache oder wo der Fehler ist. Vielleicht in der Initialisierung….

Danke

Gruß

Enrock
21.11.2007, 11:04
Keiner nen Tipp?

Siro
21.11.2007, 17:29
Wie schnell läuft denn dein PIC, Taktfrquenz ???
Der Sensor ist nicht unbegrenzt schnell mit seiner Schnittstelle
Siehe Datenblatt.

Hast Du den Adu auch ausgeschaltet, da Du RA1 für Data benutzt ?
Kannst Du mit einem Oszilloskope Dir die Signale ansehen ??


mit freundlichen Bits
Bernd Sirozynski

Enrock
22.11.2007, 07:11
Servus,

also der PIC ist an einen 4 MHz Quarz angeschlossen und läuft somit intern mit 1 MHz. Laut Datenblatt des STH http://www.sensirion.com/de/pdf/product_information/Data_Sheet_humidity_sensor_SHT1x_SHT7x_E.pdf kann die Clock mit maximal 10 MHz an >4,5 Volt VDD betrieben werden.
Ich habe auch schon versucht mit dem ein oder anderen Delay die Frequenz zu verringern, trotzdem funktioniert das ganze nicht richtig.

DER ADU wird im Hauptprogramm ausgeschaltet. Habe aber auch schon die Ports variiert. Keine Änderung.
Oszi habe ich leider keins, versuch aber so was aufzutreiben. Gute Idee.
Danke für deinen Tipp!

Gruß Daniel

Enrock
23.11.2007, 11:22
Servus,

also ich brauche nach wie vor HILFE!!! ](*,)

Gruß

Siro
23.11.2007, 13:02
Ok, die Taktfrequenz können wir dann wohl ausschließen.
Habe mir deinen Source Code im oberen Fenster markiert und in die MPLAB eingefügt. Leider gehen alle Leezeichen am Anfang der Zeile verloren. Kannst Du mir den Code z.B. per email oder falls das geht, irgendwie als Anlage senden, dann brauche ich nicht jede Zeile umzufummeln.
Bin gerne bereit nochmal eine intensiveren Blick in die Software zu
werfen.

mfg Siro

Siro
23.11.2007, 13:37
Du solltest in jedem Falle die
"connection reset sequence" einführen und bei jedem auftretenem Fehler
erneut senden. Unbedingt daruaf achten, das der Ruhezustand der
Clockleitung LOW ist
Habe mal den Code für Dich geschrieben:

siro_init: ; connection reset sequence für SHT75
bcf SENSOR_SCK ; idle state Clock = Low
bsf SENSOR_DATA ; Data auf High

movlw d'9' ; sende 9 Clock Impulse
movwf COUNTER_SEN ;
siro_InitLoop:
bsf SENSOR_SCK ; Clock High
bcf SENSOR_SCK ; Clock Low

decf COUNTER_SEN,F ; Zähler -1
btfss STATUS,Z ; scip wenn 0
goto siro_InitLoop ; loop widerholen

bsf SENSOR_SCK ; Clock wieder auf High
bcf SENSOR_DATA ; Data auf Low

bcf SENSOR_SCK ; Clock Low
bsf SENSOR_SCK ; Clock High
bsf SENSOR_DATA ; Data auf High
bcf SENSOR_SCK ; Clock Low

; dieser Code sollte immer nach einem Neustart und
; nach einem Fehler durchlaufen werden.
;
; weiter bin ich noch nicht gekommen, bleibe aber dran
mfg Siro

Enrock
23.11.2007, 13:49
Schon mal fettes Danke Siro.

Also ich habe mir das Ganze nochmal zur Brust genommen und die Ports verändert. Auch wenn ich dachte, dass das blödsinn sei.

Im Debugging läuft das Ganze mittlerweile einigermaßen. Das Problem ist nur, dass ich mir nicht ganz Sicher bin, ob der Sensor richtig misst.
Die Temperaturabweichung beträgt etwa 2 Grad und die Feuchteabweichung 5%.

Ohne Debugger bzw. MPLAB ICD 2 also auf dem reinen PIC läuft der Sensor nicht. Ich bekomme kein Acknowledge vom Sensor zurück, wenn ich die Adressierung sende.
Ich nehme mal an, dass das was mit der um einiges höheren Frequenz zu tun hat und sich dadurch die Signale auf die benachbarten Leitungen übertragen.
Ich kann mit dem Mulimeter feststellen, dass sich bei einem Takt der SCK Leitung die DATA Leitung um einige 100 mV verändert. Genauer kann ich leider nicht messen und ein Oszi habe ich leider auch nicht daheim.

Hast du/JEMAND vielleicht eine Idee, was die Abweichung der Messung betrifft und wie ich das Ganze auf dem PIC ohne Debugger zum laufen bekomme?

Nochmals Danke

Gruß

Enrock
23.11.2007, 13:52
Achja...

wenndu den Code ncoh magst, bräuchte ich eine eMail Adresse.

Gruß

Siro
23.11.2007, 13:58
Da fällt mir doch gerade ein :
Hast Du einen Pullup Widerstand dan der Datenleitung, würd mal
sagen, so um 1 K wäre Ok, Port A hat sowas nicht intern.
Zudem ist deine Wartezeit nur 30ms, mein Datenblatt schreibt was von
größer 55ms bei 12 Bit.
Eventuell eine zusätzliche Wartezeit bevor Du das Acknowledge erwartest
also etwas länger warten auf Low Signal.
muss doch hinzukriegen sein
mfg Siro

Enrock
23.11.2007, 18:18
Also der Pullup-Widerstand ist selbstverständlich drin... Habe 10 k genomme. Habe ich bei einer Schaltung im Netz gefunden.
Ich warte auf die Daten etwa 120ms und auch das Ack 30 ms. Das erschien mir ausreichend.

Bin mit meinem Latein am Ende.

kalledom
23.11.2007, 21:25
Hallo,
Du benutzt 'bsf' und 'bcf' für Bits im gleichen Register unmittelbar hintereinander. Es könnte sein, daß durch einen Pipeline-Effekt eines der Kommandos 'verschluckt' wird. Setze sicherheitshalber zwischen Bit-Befehle mit gleichem Register ein 'nop'.

Port A muß mit ADCON1 auf 'digital' initialisiert werden, weil dort nach Reset alles Analog-Eingänge sind.

Enrock
26.11.2007, 13:30
Guten Morgen,

also ich messe die Temperatur mit 14 Bit.
Temp=d1+d2*SOT laut Datenblatt. Das ergibt für mich dann
Temp=-40+(0,01*5784)
Temp=17,84 Grad.
Das Ergebnis weicht um genau 1 Grad von drei anderen Thermometern ab,
die ich hier rum fliegen habe. Die anderen zeigen zu dem Zeitpunkt der
Messung alle 16,8 Grad an. (Alles unterschiedliche Hersteller)
Hmpf komisch. Normalerweise sollte der SHT Sensor sack genau sein...
Sind nun die anderen drei nicht so gut oder funktioniert meine Messung
einfach noch nicht richtig?!

In der Application Notes habe ich für die Temperatur noch eine genauere
Formel gefunden. Diese ist allerdings für "extremere" Temperaturbereiche
und ändert bei meinem Fall gar nichts.

Es kann doch eigentlich nicht so schwer sein das Ding zum laufen zu
bekommen.

Also im Debugging läuft sowhl der sht75 wie auch der sht11 und beide liefern mir ähnliche Werte. (Ganz dicht beieinander.)
Wennich den Pic aber programmiere läuft gar nix... Ich bekomme kein Ackkowledge. Bei beiden nicht. Und ich raffe nicht warum


Gruß

Enrock
26.11.2007, 14:45
Okay ich habe das Problem gerade eben beseitigt!.

Argh.

Was ich mir aber immer noch nicht erklären kann ist die Abweichung bei der Messung.
Hat dazu jemand eine Idee?

Gruß

Enrock
28.11.2007, 12:05
Also die Abweichung kann ich mir nach wie vor nicht erklären.
Hat jemand mit einem anderen digitalen Temperatur-Sensor Erfahrung gemacht?
gruß

Enrock
29.11.2007, 15:23
Hallo,

Wie kann ich die relative Feuchte mit dem Pic 16 einfach berechnen? Der kann ja nicht multiplizieren!

Ich würd gerne weiter mit 12 Bit messen. Finde aber in den Application Notes nur Rechenvereinfachungen für 8 Bit.
Gruß

Enrock
03.12.2007, 07:10
Guten Morgen,

also mir ist nach wie vor schleierhaft, wie ich die Berechnung der
Feuchte realisieren kann.
Kann mir da jemand weiterhelfen.
Ist es vielleicht ratsam auf einen größeren PIC umzusteigen? Also auf
einen PIC18F, da diese multiplizieren können.

Gruß Daniel

Andun
03.12.2007, 08:48
Moin

Ich hatte für meine Jugend Forscht 2006 Arbeit einen SHT71 verwendet und muss zugeben, das ich mich am Schluss nicht mehr weiter damit beschäftigt habe, aber die Werte sind bei mir auch nicht im gewünschten Auflösungsmaßstab gewesen ... Hätte man vielleicht einstellen können, aber das habe ich damals dann nicht mehr gemacht.

Vermutlich bringt dir meine Arbeit nicht soo viel, aber auf meiner Seite findest du unter SUBMS alles zu dem Projekt.

mfg
Andun

Siro
03.12.2007, 16:19
Ich kann Dir einen PIC Code anbieten, der 16*16 Multiplizieren
und 32 /32 dividieren kann. Habe ich mal für die 12er Reihe
gebastelt kann auch für die 16er Reihe verwendet werden.
Vielleicht hilft Dir das weiter.
mfg. Siro

Enrock
03.12.2007, 16:21
Wär super!
Danke

Siro
03.12.2007, 16:39
Hast Du den Code runtergeladen ?.
Bedarf evtl. einiger Erklärungen.
Es gibt 4 Vraiablen a 32 Bit
var_ARG_A,var_ARG_B,var_ARG_C,var_ARG_D
Hierbei liegt jeweils das niederwertigste Byte Bit0.7 in
....AL die Bits 8..15 in ...AH Bit 16..23 in ....AHL Bit 24.31 in ....AHH

Möchtest Du zwei 16 Bit Werte multiplizieren, muss Du die Variablen
entsprechend mit den Werten laden

z.B 1000*2000=2000000

mov LOW D'1000',W ; A Wert setzen
movwf var_ARG_AL
mov HIGH D'1000',W
movwf var_ARG_AH

mov LOW D'2000',W ; B Wert setzen
movwf var_ARG_BL
mov HIGH D'2000',W
movwf var_ARG_BH

call MUL16 ; Berechnung ausführen, Ergebnis nach Wert A

; nun steht das Ergebnis 32 Bit breit in der Variablen ARG_A

Bit 0..7 in in var_ARG_AL
Bit 8..15 in var_ARG_AH
Bit 16..23 in var_ARG_AHL
Bit 24..31 in var_ARG_AHH

!!!! es wird also der A Wert überschrieben mit dem Ergebnis

Beim dividieren läuft das in ähnlicher Weise ab.
mfg. Siro

Siro
03.12.2007, 16:44
sorry, muss natürlich
movlw LOW D'1000' heissen um Konstanten zu laden.


oder bei deinen Messwerten
mov Messwert_Low,W
movwf var_ARG_AL
mov Messwert_High,W
movwf var_ARG_AH

usw.

Siro
03.12.2007, 17:23
Wenn Du mir deine Berechnung genau beschreibst,
welche Variable mit wieviel Bits mit wem multipliziert,dividiert usw.
werden muss implementiere ich Dir den Code mittels meinen Berechnungs Routinen. Stellt kein Problem dar. Ich hab ja auch meinen Spaß daran.
mfg Siro

Enrock
04.12.2007, 09:39
Servus,

wo kann ich mir den Code denn ziehen? Hab ich den Link verpasst?

Also ich würde gerne zur Berechnung der Feuchte die Formel aus dem Datenblatt anwenden... Habe mich da auch schon dran versucht allerdings tue ich mich sehr schwer beim multiplizieren.

Das heißt:

rH= c1+c2*Mess+c3*Mess²
das bedeutet für 12 bit
rH= -4+0,0405*Mess-2,8*10^(-6)*Mess²
Mess steht für den digitalen Wert der Feuchtemessung. maximal 2^12=4096

Um mit 0,0405 zu multiplizieren hatte ich mir überlegt einfach mit 4 und mit 5 zu multiplizieren und dann für eine Null einfach das Komma zu verschieben. Zum Schluss werden die Werte dann noch aufeinander addiert und zwar so, dass die jeweilige Additionen an die richtige Stelle gerückt wird. So wie man das früher brav in der Schule gelernt hat.

Zumindest kläppt das auf dem Papier aber leider nicht in meinem Programm.

Hast dafür eine Idee?

Gruß

Siro
04.12.2007, 10:09
Da wurde anscheinend das Attachment aus meiner Antwort gelöscht,
keine Ahnung warum. Ich selbst hatte extra probiert ob ich es runterladen
kann und das ging getsern auch einwandfrei.
Kann ich Dir den Code auch per email schicken ?
Siro

Siro
04.12.2007, 15:19
Deine Feuchteumrechnung ist fertig. Habe Dir den komplett getesteten
Code per email geschickt. Ein "Mini"-PIC kann also doch rechnen, ist nur eine Frage des Aufwands. Und das beste: es hat mir tatsächlich Spaß gemacht.
mfg Siro

Enrock
13.12.2007, 09:03
Servus,

also noch mal eine kurze Resonanz zu der ganzen Geschichte.

Ich habe die Umrechnung für die Temperatur fertig. Abweichung zum kalibrierten Messgerät beträgt +/-0,5 Grad. Also funktioniert wunderbar

Die Feuchte habe ich mit einigen Geraden genähert. Da mir die Rechnung laut Datenblatt einfach zu viel war. so beträgt die Abweichung rund +/- 2%, was mich nicht unbedingt glücklich macht aber vertretbar ist.

Trotzdem noch mal fettes fettes Danke an Siro. Bei der Multiplikation habe ich einiges gelernt.

Gruß Daniel