Keiner nen Tipp?
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ß
Keiner nen Tipp?
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
Lesezeichen