- 12V Akku mit 280 Ah bauen         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 27

Thema: SHT75 am PIC 16F877A

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    40
    Beiträge
    140

    SHT75 am PIC 16F877A

    Anzeige

    Powerstation Test
    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ß

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    40
    Beiträge
    140
    Keiner nen Tipp?

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    40
    Beiträge
    140
    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

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    40
    Beiträge
    140
    Servus,

    also ich brauche nach wie vor HILFE!!!

    Gruß

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    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

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    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

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    40
    Beiträge
    140
    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ß

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    40
    Beiträge
    140
    Achja...

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

    Gruß

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    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

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad