SHT71 Kabellänge?

OP #1843390
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.
Persönliche Seite #1843400
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
Gast #1843403
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 ?
OP #1843427
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:
1
readsh11:
2
  clr trt
3
  
4
  clr rhrt
5
  cbi SENSOR_PORT,PIN_CLK    ;init clock line
6
  sbi SENSOR_DDR,PIN_CLK
7
  
8
  cbi SENSOR_PORT,PIN_DATA    ;init data line
9
  cbi SENSOR_DDR,PIN_DATA
10
  
11
  rcall rdelay
12
  
13
  
14
  ldi temp1 ,10    ;connection reset sequence
15
  
16
re1:  rcall chigh
17
  rcall clow
18
  dec temp1
19
  brne re1
20

21

22
  rcall chigh    ;transmission start
23
  rcall dlow
24
  rcall clow
25
  rcall chigh
26
  rcall dhigh
27
  rcall clow  
28

29
  ldi temp1,0b00000101  ;send byte: command for 'check RH'
30
  rcall sendbyte
31
;---------  
32
        ;wait for sensor ready 
33
re3:  ldi temp1,2
34
  rcall g_wms
35
  sbis SENSOR_PIN,PIN_DATA
36
  rjmp re2
37
  inc rhrt
38
  brne re3
39
  
40
re4:  rjmp reto    ;sensor timed out (512 ms)
41
  
42
re2:  rcall readbyte    ;read one byte
43

44
  rcall dlow    ;acknowlegde
45
  rcall chigh
46
  rcall clow
47
  rcall dhigh  
48
  
49
  rcall readbyte    ;readbyte
50
  
51
  mov rhl,temp2
52
  
53
  rcall chigh    ;skip acknowlegde to end communication
54
  rcall clow
55
  
56
  
57
        ;--------read temperature
58
        
59

60
  rcall chigh    ;transmission start
61
  rcall dlow
62
  rcall clow
63
  rcall chigh
64
  rcall dhigh
65
  rcall clow
66
    
67
    
68
  ldi temp1,0b00000011  ;send byte: command for 'check temp'
69
  rcall sendbyte
70
  
71
        ;wait for sensor ready 
72
rew3:  ldi zl,2
73
  rcall g_wms
74
  sbis SENSOR_PIN,PIN_DATA
75
  rjmp rew2
76
  inc trt
77
  brne rew3
78
  
79
rew4:  rjmp reto    ;sensor timed out (512 ms)
80
  
81
rew2:  rcall readbyte    ;read one byte
82

83
  mov th,temp2
84

85
  rcall dlow    ;acknowlegde
86
  rcall chigh
87
  rcall clow
88
  rcall dhigh  
89
  
90
  rcall readbyte    ;readbyte
91
  
92
  mov tl,temp2
93
  
94
  rcall chigh    ;skip acknowlegde to end communication
95
  rcall clow
96
  
97
  ret
Persönliche Seite #1843458
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
OP #1843472
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:
1
.equ SENSOR_PORT = PORTC
2
.equ SENSOR_DDR  = DDRC
3
.equ SENSOR_PIN    = PINC
4
.equ PIN_DATA   = 2
5
.equ PIN_CLK    = 1
6

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

16
.def    rhl=r8
17
.def    rhh=r9
18

19
.def    tl=r10
20
.def    th=r11
21

22
.def    rel=r12
23
.def    reh=r13
24

25
.def    trt=r14
26

27
.def    rhrt=r15
28

29
.ifndef XTAL
30
.equ XTAL = 4000000
31
.endif
32

33
  
34

35
;Kurze Pause        
36
shortbreak:                            ; 50us Pause
37
        ldi  temp1, ( XTAL * 50 / 3 ) / 1000000
38
shortbreak_:
39
        dec  temp1
40
        brne shortbreak_
41
        ret                         ; wieder zurück
42

43
dlow:    sbi SENSOR_DDR,PIN_DATA        ;set data low
44
    rjmp rdelay
45
    
46
dhigh:    cbi SENSOR_DDR,PIN_DATA        ;set data high
47
    rjmp rdelay
48
    
49

50
clow:    cbi SENSOR_PORT,PIN_CLk        ;set clock low
51
    rjmp rdelay
52
    
53
chigh:    sbi SENSOR_PORT,PIN_CLK        ;set clock high
54

55
rdelay:    push temp1            ;1 msek delay to allow the lines to settle
56
    push temp2
57
    ldi temp1,1
58
    rcall g_wms
59
    pop temp2
60
    pop temp1
61
    ret
62

63
;-------PAUSE----------
64
g_wms:    ldi temp2,250    ;wait zl msec  (at 4MHz clock)
65
g_wmsa:    rcall g_wmsb
66
    nop
67
    nop
68
    nop
69
    nop
70
    nop
71
    dec temp2
72
    brne g_wmsa
73
    dec temp1
74
    brne g_wms
75
g_wmsb:    ret    
76

77

78

79
readsh11:
80
    clr trt
81
    
82
    clr rhrt
83
    cbi SENSOR_PORT,PIN_CLK        ;init clock line
84
    sbi SENSOR_DDR,PIN_CLK
85
    
86
    cbi SENSOR_PORT,PIN_DATA        ;init data line
87
    cbi SENSOR_DDR,PIN_DATA
88
    
89
    rcall rdelay
90
    
91
    
92
    ldi temp1 ,10        ;connection reset sequence
93
    
94
re1:    rcall chigh
95
    rcall clow
96
    dec temp1
97
    brne re1
98

99

100
    rcall chigh        ;transmission start
101
    rcall dlow
102
    rcall clow
103
    rcall chigh
104
    rcall dhigh
105
    rcall clow    
106

107
    ldi temp1,0b00000101    ;send byte: command for 'check RH'
108
    rcall sendbyte
109
;---------    
110
                ;wait for sensor ready 
111
re3:    ldi temp1,2
112
    rcall g_wms
113
    sbis SENSOR_PIN,PIN_DATA
114
    rjmp re2
115
    inc rhrt
116
    brne re3
117
    
118
re4:    rjmp reto        ;sensor timed out (512 ms)
119
    
120
re2:    rcall readbyte        ;read one byte
121

122
    rcall dlow        ;acknowlegde
123
    rcall chigh
124
    rcall clow
125
    rcall dhigh    
126
    
127
    rcall readbyte        ;readbyte
128
    
129
    mov rhl,temp2
130
    
131
    rcall chigh        ;skip acknowlegde to end communication
132
    rcall clow
133
    
134
    
135
                ;--------read temperature
136
                
137

138
    rcall chigh        ;transmission start
139
    rcall dlow
140
    rcall clow
141
    rcall chigh
142
    rcall dhigh
143
    rcall clow
144
        
145
        
146
    ldi temp1,0b00000011    ;send byte: command for 'check temp'
147
    rcall sendbyte
148
    
149
                ;wait for sensor ready 
150
rew3:    ldi zl,2
151
    rcall g_wms
152
    sbis SENSOR_PIN,PIN_DATA
153
    rjmp rew2
154
    inc trt
155
    brne rew3
156
    
157
rew4:    rjmp reto        ;sensor timed out (512 ms)
158
    
159
rew2:    rcall readbyte        ;read one byte
160

161
    mov th,temp2
162

163
    rcall dlow        ;acknowlegde
164
    rcall chigh
165
    rcall clow
166
    rcall dhigh    
167
    
168
    rcall readbyte        ;readbyte
169
    
170
    mov tl,temp2
171
    
172
    rcall chigh        ;skip acknowlegde to end communication
173
    rcall clow
174
    
175
    ret
176
    
177
;-----------time out
178

179
reto:    movw temp1,rel
180
    inc temp1        ;increase number of timeouts
181
    movw rel,temp1
182

183
    ret
184
    
185
    
186
    
187
    
188

189
;------------    
190
    
191
readbyte:
192
    ldi temp1,8
193
    ldi    temp2,0
194
ree1:    clc            ;Read bit
195
    sbic SENSOR_PIN,PIN_DATA        
196
    sec            
197
        
198
    rol temp2
199
    
200
    rcall chigh
201
    rcall clow
202
    
203
    dec temp1
204
    brne ree1
205

206
    ret
207
    
208
    
209

210
;----------
211

212

213
sendbyte:
214
    ldi temp2,8        ;send 8 bits
215
se3:    lsl temp1
216
    brcc se1
217
    rcall dhigh
218
    rjmp se2
219
se1:
220
    rcall dlow
221
se2:    
222
    rcall chigh
223
    rcall clow
224
    dec temp2
225
    brne se3
226

227
    rcall dhigh        ;release dataline
228

229
    clc            ;check ack
230
    sbic SENSOR_PORT,PIN_DATA        ;c=0: ack recieved
231
    sec            ;c=1: ack not recieved
232
    
233
    push temp2
234
    in temp2,sreg
235
    
236
    rcall chigh        ;flush ack bit
237
    rcall clow
238
    
239
    out sreg,temp2
240
    pop temp2
241
    
242
    ret
OP #1843530
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?
OP #1843546
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.
Persönliche Seite #1843560
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.
OP #1843564
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.
Persönliche Seite #1843578
Lesenswert?

Die Warnungen beim Assemblieren hast du gesehen?
1
C:\Projekte\Software\AVR\SHT11_test\Terrasteuerung1_Uhr_Einstellungen.asm(12): warning: Register r27 already defined by the .DEF directive
2
C:\Projekte\Software\AVR\SHT11_test\Terrasteuerung1_Uhr_Einstellungen.asm(14): warning: Register r26 already defined by the .DEF directive
3
C:\Projekte\Software\AVR\SHT11_test\Terrasteuerung1_Uhr_Einstellungen.asm(38): warning: Register r28 already defined by the .DEF directive
4
C:\Projekte\Software\AVR\SHT11_test\Terrasteuerung1_Uhr_Einstellungen.asm(39): warning: Register r29 already defined by the .DEF directive
5
C:\Projekte\Software\AVR\SHT11_test\Terrasteuerung1_Uhr_Einstellungen.asm(40): warning: Register r30 already defined by the .DEF directive
6
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.
Persönliche Seite #1843590
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.
OP #1843609
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren