mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SHT71 Kabellänge?


Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey ich wollte mal fragen obs bei einer Kabellänge von ca. 70-80 cm zu 
starken Fehlübertragungen kommt?
Ich weiß nur nich obs das ist, weil ich nur bei der Feuchtigkeit starke 
Schwankungen bekomme... die Temperatur scheint richtig und stabil zu 
bleiben.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist zu lang, 15 cm sollte das Kabelmaximum sein oder aber die 
Übertragung muß extrem verlangsamt werden. Außerdem sollte direkt am SHT 
ein 100nF-Keramikkondensator die Betriebsspannung abblocken und ein 
4kOhm...10kOhm Pullup am Data-I/O-Pin angeschlossen werden.

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Laut Datenblatt sollte das Kabel kürzer 10 cm sein, andernfalls ist eine 
Schirmung zwischen SCK und DATA notwendig. Eine Reduktion der Datenrate 
(SCK-Frequenz) kann die Übertragung stabiler machen.

Ich würde die Taktfrequenz testweise auf ca 100 Hz stellen und die 
Fehlerrate prüfen. So dürften eigentlich keine Übertragungsfehler 
auftreten.

Grüße,

Peter

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein 2-Wire Interface sollte 70cm schaffen, aber natürlich nur wenn es 
richtig gemacht wurde.
Was verwendest du als pull up, hast du einen Stützkondensator zwischen 
GND und VCC, sind die Leitungen irgendwie ungeschickt (parallel zu 
Leitungen mit hohem Strom).

Was passiert, wenn du 1/10 der Geschwindigkeit für SCK verwendest ?

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm das mit der Frequenz werd ich mal versuchen...Also als Kabel hab ich 
ein Flachbandkabel werd mal die Länge des Kabels verkürzen und dann mal 
schauen obs besser wird.

Edit:

Aber wiesou funktioniert dann die Temperatur richtig?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe problemlos einen SHT11 mit 50cm Flachbandkabel an einem 
Butterfly dran. Mit 100nF Kondensator für VCC/GND direkt am SHT11 und 
nur dem internen Pullup-Widerstand vom Controller. Taktung ist fast 
ungebremst das was der 2MHz Controller hergibt.

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm...der Kondensator ist bei mir schon integriert auf dem Sensor.

Edit:

Hier mal den Quellcode, hab ihn von jemand anders im Internet bekommen 
vielleicht ist da ein Hacken dran:
readsh11:
  clr trt
  
  clr rhrt
  cbi SENSOR_PORT,PIN_CLK    ;init clock line
  sbi SENSOR_DDR,PIN_CLK
  
  cbi SENSOR_PORT,PIN_DATA    ;init data line
  cbi SENSOR_DDR,PIN_DATA
  
  rcall rdelay
  
  
  ldi temp1 ,10    ;connection reset sequence
  
re1:  rcall chigh
  rcall clow
  dec temp1
  brne re1


  rcall chigh    ;transmission start
  rcall dlow
  rcall clow
  rcall chigh
  rcall dhigh
  rcall clow  

  ldi temp1,0b00000101  ;send byte: command for 'check RH'
  rcall sendbyte
;---------  
        ;wait for sensor ready 
re3:  ldi temp1,2
  rcall g_wms
  sbis SENSOR_PIN,PIN_DATA
  rjmp re2
  inc rhrt
  brne re3
  
re4:  rjmp reto    ;sensor timed out (512 ms)
  
re2:  rcall readbyte    ;read one byte

  rcall dlow    ;acknowlegde
  rcall chigh
  rcall clow
  rcall dhigh  
  
  rcall readbyte    ;readbyte
  
  mov rhl,temp2
  
  rcall chigh    ;skip acknowlegde to end communication
  rcall clow
  
  
        ;--------read temperature
        

  rcall chigh    ;transmission start
  rcall dlow
  rcall clow
  rcall chigh
  rcall dhigh
  rcall clow
    
    
  ldi temp1,0b00000011  ;send byte: command for 'check temp'
  rcall sendbyte
  
        ;wait for sensor ready 
rew3:  ldi zl,2
  rcall g_wms
  sbis SENSOR_PIN,PIN_DATA
  rjmp rew2
  inc trt
  brne rew3
  
rew4:  rjmp reto    ;sensor timed out (512 ms)
  
rew2:  rcall readbyte    ;read one byte

  mov th,temp2

  rcall dlow    ;acknowlegde
  rcall chigh
  rcall clow
  rcall dhigh  
  
  rcall readbyte    ;readbyte
  
  mov tl,temp2
  
  rcall chigh    ;skip acknowlegde to end communication
  rcall clow
  
  ret

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Da gibt es auch noch Hinweise:

http://www.sensirion.com/en/pdf/product_informatio...

MfG Spess

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also hab ich das richtig verstanden...1x 100nF so nah am Sensor wie 
möglich zwischen GND und VCC und dann noch jeweils einen 100nF zwischen 
GND und und SCK und eins zwischen GND und Data? am Sensor und am 
Mikrocontroller

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philip Ockert schrieb:
> und dann noch jeweils einen 100nF zwischen
> GND und und SCK und eins zwischen GND und Data? am Sensor und am
> Mikrocontroller

Nein, auf keinen Fall!

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, an die Datenleitungen dürfen keine so großen Kapazitäten 
angeschlossen werden. Zum Vermeiden von zu hoher Flankensteilheit kann 
man einige Pikofarad draufbauen, aber nur, wenn man weiß, was man da 
macht. Normal bracht man das aber nicht. Der auf Vcc ist richtig und 
auch wichtig.

Wieso wird im Programm für einfache Anweisungen, wie das Setzen von 
Bits, rcall verwendet? Das geht mit Makros viel effizienter.

Grüße,

Peter

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber der bei VCC und GND der ist doch da schon drauf auf dem Sensor?oder 
ist das ein anderer???

Ok ich muss mir mal Macros anschauen^^...nur vom Quellcode her müssts 
doch so komplett laufen oder?

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber der bei VCC und GND der ist doch da schon drauf auf dem Sensor?oder
>ist das ein anderer???

Das weiß ich nicht, was da schon drauf ist. Das ist auch egal, wenn 
mehrere 100nF parallel auf der Versorgung sind, schadet das auch nicht.

Den Quellcode sieht man ja nicht komplett, so kann ich dazu nicht sagen.

Grüße,

Peter

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philip Ockert schrieb:

> Aber der bei VCC und GND der ist doch da schon drauf auf dem Sensor?

Laut Datasheet ja. Bei mir ist es kein SHT71 sondern ein SHT11, daher 
separat nötig.

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dürfte ja beim Abruf der Feuchtigkeit ein Problem sein, wenn so ein 
riesen Unterschied ist zwischen zwei Messungen.
Also hier mal der Code, der die Feuchtigkeit und Temperatur abruft:
.equ SENSOR_PORT = PORTC
.equ SENSOR_DDR  = DDRC
.equ SENSOR_PIN    = PINC
.equ PIN_DATA   = 2
.equ PIN_CLK    = 1

.equ Zahl     = 4010     //d1 für Temperatur berechnen mit 10^3
.equ C1        = 2046    //Gerundet von 2.0468 auf 2.046*1000
.equ C21    = 36    //C2 aufgeteilt in vor dem Komma und nach dem Kommastellen 0.0367*10^3     
.equ C22    = 7        //Nachkommastelle
.equ C23    = 10
.equ C31    = 1595    //C3 von 1.5955*10^-6 durch *10^3 auf 1.595 /1000 gerundet
.equ C32    = 1000
.equ C33    = 1000

.def    rhl=r8
.def    rhh=r9

.def    tl=r10
.def    th=r11

.def    rel=r12
.def    reh=r13

.def    trt=r14

.def    rhrt=r15

.ifndef XTAL
.equ XTAL = 4000000
.endif

  

;Kurze Pause        
shortbreak:                            ; 50us Pause
        ldi  temp1, ( XTAL * 50 / 3 ) / 1000000
shortbreak_:
        dec  temp1
        brne shortbreak_
        ret                         ; wieder zurück

dlow:    sbi SENSOR_DDR,PIN_DATA        ;set data low
    rjmp rdelay
    
dhigh:    cbi SENSOR_DDR,PIN_DATA        ;set data high
    rjmp rdelay
    

clow:    cbi SENSOR_PORT,PIN_CLk        ;set clock low
    rjmp rdelay
    
chigh:    sbi SENSOR_PORT,PIN_CLK        ;set clock high

rdelay:    push temp1            ;1 msek delay to allow the lines to settle
    push temp2
    ldi temp1,1
    rcall g_wms
    pop temp2
    pop temp1
    ret

;-------PAUSE----------
g_wms:    ldi temp2,250    ;wait zl msec  (at 4MHz clock)
g_wmsa:    rcall g_wmsb
    nop
    nop
    nop
    nop
    nop
    dec temp2
    brne g_wmsa
    dec temp1
    brne g_wms
g_wmsb:    ret    



readsh11:
    clr trt
    
    clr rhrt
    cbi SENSOR_PORT,PIN_CLK        ;init clock line
    sbi SENSOR_DDR,PIN_CLK
    
    cbi SENSOR_PORT,PIN_DATA        ;init data line
    cbi SENSOR_DDR,PIN_DATA
    
    rcall rdelay
    
    
    ldi temp1 ,10        ;connection reset sequence
    
re1:    rcall chigh
    rcall clow
    dec temp1
    brne re1


    rcall chigh        ;transmission start
    rcall dlow
    rcall clow
    rcall chigh
    rcall dhigh
    rcall clow    

    ldi temp1,0b00000101    ;send byte: command for 'check RH'
    rcall sendbyte
;---------    
                ;wait for sensor ready 
re3:    ldi temp1,2
    rcall g_wms
    sbis SENSOR_PIN,PIN_DATA
    rjmp re2
    inc rhrt
    brne re3
    
re4:    rjmp reto        ;sensor timed out (512 ms)
    
re2:    rcall readbyte        ;read one byte

    rcall dlow        ;acknowlegde
    rcall chigh
    rcall clow
    rcall dhigh    
    
    rcall readbyte        ;readbyte
    
    mov rhl,temp2
    
    rcall chigh        ;skip acknowlegde to end communication
    rcall clow
    
    
                ;--------read temperature
                

    rcall chigh        ;transmission start
    rcall dlow
    rcall clow
    rcall chigh
    rcall dhigh
    rcall clow
        
        
    ldi temp1,0b00000011    ;send byte: command for 'check temp'
    rcall sendbyte
    
                ;wait for sensor ready 
rew3:    ldi zl,2
    rcall g_wms
    sbis SENSOR_PIN,PIN_DATA
    rjmp rew2
    inc trt
    brne rew3
    
rew4:    rjmp reto        ;sensor timed out (512 ms)
    
rew2:    rcall readbyte        ;read one byte

    mov th,temp2

    rcall dlow        ;acknowlegde
    rcall chigh
    rcall clow
    rcall dhigh    
    
    rcall readbyte        ;readbyte
    
    mov tl,temp2
    
    rcall chigh        ;skip acknowlegde to end communication
    rcall clow
    
    ret
    
;-----------time out

reto:    movw temp1,rel
    inc temp1        ;increase number of timeouts
    movw rel,temp1

    ret
    
    
    
    

;------------    
    
readbyte:
    ldi temp1,8
    ldi    temp2,0
ree1:    clc            ;Read bit
    sbic SENSOR_PIN,PIN_DATA        
    sec            
        
    rol temp2
    
    rcall chigh
    rcall clow
    
    dec temp1
    brne ree1

    ret
    
    

;----------


sendbyte:
    ldi temp2,8        ;send 8 bits
se3:    lsl temp1
    brcc se1
    rcall dhigh
    rjmp se2
se1:
    rcall dlow
se2:    
    rcall chigh
    rcall clow
    dec temp2
    brne se3

    rcall dhigh        ;release dataline

    clc            ;check ack
    sbic SENSOR_PORT,PIN_DATA        ;c=0: ack recieved
    sec            ;c=1: ack not recieved
    
    push temp2
    in temp2,sreg
    
    rcall chigh        ;flush ack bit
    rcall clow
    
    out sreg,temp2
    pop temp2
    
    ret

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meinst du allgemein?oder meinst du bei dem Readbyte?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War falsch gelesen, sorry.

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist doch nicht der Code, den du laufen lässt, der lässt sich nicht 
assemblieren, temp1 undefined.

Und bitte den Code in den Anhang, direkt so als Datei, wie sie ist.

Grüße,

Peter

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind nur die Routinen von dem Sensor hab ich in ne extra Datei... die 
Temps sind declariert in der Main

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann häng doch mal bitte das ganz Projekt an, so sieht ja niemand, wie 
die Werte überhaupt angezeigt werden.

Grüße,

Peter

Autor: Philip Ockert (versipellis)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also hier mal das gesamte Projekt auch wenns etwas chaotisch 
programmiert ist.

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf welcher Taktfrequenz läuft denn der Controller?
Sind das die eingestelleten 4 MHz?

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jap sind die eingestellten 4MHz ich werd aber bald auf nen externen 
Quarz umstellen...weil die Uhr bis jetzt noch relativ ungenau läuft weil 
ich internen Takt verwende

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wackeln die Rohdaten des Sensors auch?

Autor: Hans Mayer (hansilein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest statt den 100nF auch einen software-Kondnsator zwischen Vcc 
und sck einsetzen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans Mayer schrieb:

> software-Kondnsator

Was'n dat?

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja hab ich beobachtet manchmal...hat mich vorallem gewundert, dass ich 
manchmal mehr als 12 Bits hatte (also die letzte eins war manchmal bei 
13 oder 14) was ja bei Feuchtigkeit eigentlich nicht sein darf oder?ist 
ja nur eine 12 Bit Messung. Aber ich werd nachher wenn meine 
Terrariumsteuerung ausgeht also Licht etc mal abstöpseln und mir noch 
mal die Bits ausgeben lassen.

Wo steht das?mit dem Software Kondensator?

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was macht denn das eigentlich:
.org OVF1addr
           in     save_sreg, SREG

Was soll das im Fall des Timerüberlaufs bewirken, außer, dass kein reti 
ausgeführt wird, und das Programm beliebigen Unsinn macht?

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach das hab ich noch beim Kopieren von der Entprellroutine dort hinein 
gemacht...brauch ich wohl nicht...
Edit:
Was mir aufgefallen ist, meine Endzeit wird immer wieder zurück gesetzt 
bzw. auf 2 Stunden. Und das liegt irgendwie an dem was mein 
Mikrocontroller macht im Interrupt mit dem Feuchtigkeitscheck.

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
entprell_init:
       push    temp1               ; temp 1 sichern
        in      temp1,sreg          ; SREG sichern
        clr      key_old
      clr      key_state
      clr      key_press
      out     sreg,temp1          ; sreg wieder herstellen
        pop     temp1

feuchte_check:

Wieso wird in der Initialisierung der Entprellung das Statusregister 
gesichert? Es schadet ja nicht, aber es ist einfach überflüssig.
Was mich daran mehr stört, ist dass die entprell_init kein return hat, 
also danach gleich mit feuchte_check weitermacht.

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahhh bingo^^ danke...ja das mit dem Stautsregister war so weil irgendwie 
dort immer das Zero Bit sich danach nicht wieder zurück gesetzt hat.

Aber durch den Ret hat sich nichts geändert...bei mir ändert es jedesmal 
meine Endzeit_stunde auf 2 wenn ich das mit dem Feucht_check durchführen 
lasse.

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Warnungen beim Assemblieren hast du gesehen?
C:\Projekte\Software\AVR\SHT11_test\Terrasteuerung1_Uhr_Einstellungen.asm(12): warning: Register r27 already defined by the .DEF directive
C:\Projekte\Software\AVR\SHT11_test\Terrasteuerung1_Uhr_Einstellungen.asm(14): warning: Register r26 already defined by the .DEF directive
C:\Projekte\Software\AVR\SHT11_test\Terrasteuerung1_Uhr_Einstellungen.asm(38): warning: Register r28 already defined by the .DEF directive
C:\Projekte\Software\AVR\SHT11_test\Terrasteuerung1_Uhr_Einstellungen.asm(39): warning: Register r29 already defined by the .DEF directive
C:\Projekte\Software\AVR\SHT11_test\Terrasteuerung1_Uhr_Einstellungen.asm(40): warning: Register r30 already defined by the .DEF directive
C:\Projekte\Software\AVR\SHT11_test\Terrasteuerung1_Uhr_Einstellungen.asm(41): warning: Register r31 already defined by the .DEF directive

Da ist auch Endzeit_stunde betroffen.

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass mal die Umrechnung der Rohdaten weg und schau die Rohdaten vom 
Sensor als 16 bit Zahl direkt an, diese Umrechnerei durchblicke ich 
nicht ganz.

calchumhum:
  //u1 in (u11:u12):
    ldi temp1, LOW(C1)

    ldi  temp2, HIGH(C1)

    ldi temp3, 0
    ldi temp4, 0

    ldi temp5, LOW(C23)
    ldi  temp6, HIGH(C23)

    rcall div32

Was soll denn die Rechnerei mit den Konstanten, das kann man doch alles 
vorher ausrechnen, es kommt doch immer das gleiche dabei raus. Abgesehen 
davon ist die Rechnung irgendwie unnötig kompliziert und der Kommentar 
nicht besonders nachvollziehbar.

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja stimmt da ists echt sinnlos...gut ich wollts etwas so gestallten dass 
man bei kleineren Änderungen bei den Konstanten einfach oben das 
Einträgt.Diese Warnungen machen doch nichts oder?das ist doch nur weil 
die letzten Registern schon durch diese Z X Y definiert sind?

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab mal alles weggelassen und mach nur die 
Feuchtigkeitsrechnung + Bit Ausgabe...und die schwankt wie vorher.
Edit:
Okay ich glaub ich weiß woran es liegt...werde das Kabel noch mal 
auftrennen und die Lötstellen kontrollieren, weil ich dort den Fehler 
sehe, wenn ich das Kabel liegen lasse kommen gerade nur relativ gleiche 
Werte raus. Hebe ich das Kabel in die Luft und bleib aber so, dann 
wackeln die Werte wieder.

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So langsam geb ichs auf...wenn ich den Sensor raus mache und einfach 
beobachte was passiert, dann kommen lauter komische Zahlen raus anstatt 
dass der Kontroller einfach nur noch die selben Zahlen anzeigt.

Autor: Philip Ockert (versipellis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay hat sich erledigt war ein Problem in der Routine für den Sensor da 
ich dort einmal das rhh vergessen habe zu speichern...jetzt frag ich 
mich bloß woran es liegt dass sich immer wieder meine Endzeit auf 02:00 
stellt... liegt irgendwo in der Schleife in der ich den Sensor abrufe.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.