-
SHT75 am PIC 16F877A
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
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ß
-
-
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
-
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/prod...1x_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
-
Servus,
also ich brauche nach wie vor HILFE!!! ](*,)
Gruß
-
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
-
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
-
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ß
-
Achja...
wenndu den Code ncoh magst, bräuchte ich eine eMail Adresse.
Gruß
-
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