Forum: Mikrocontroller und Digitale Elektronik SHT71 Kabellänge?


von Philip O. (versipellis)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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.

von Peter D. (pdiener) Benutzerseite


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

von MaWin (Gast)


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 ?

von Philip O. (versipellis)


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?

von (prx) A. K. (prx)


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.

von Philip O. (versipellis)


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

von spess53 (Gast)


Lesenswert?


von Philip O. (versipellis)


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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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!

von Peter D. (pdiener) Benutzerseite


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

von Philip O. (versipellis)


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?

von Peter D. (pdiener) Benutzerseite


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

von (prx) A. K. (prx)


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.

von Philip O. (versipellis)


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

von Philip O. (versipellis)


Lesenswert?

Meinst du allgemein?oder meinst du bei dem Readbyte?

von (prx) A. K. (prx)


Lesenswert?

War falsch gelesen, sorry.

von Peter D. (pdiener) Benutzerseite


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

von Philip O. (versipellis)


Lesenswert?

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

von Peter D. (pdiener) Benutzerseite


Lesenswert?

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

Grüße,

Peter

von Philip O. (versipellis)


Angehängte Dateien:

Lesenswert?

Also hier mal das gesamte Projekt auch wenns etwas chaotisch 
programmiert ist.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

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

von Philip O. (versipellis)


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

von (prx) A. K. (prx)


Lesenswert?

Wackeln die Rohdaten des Sensors auch?

von Hans M. (hansilein)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

Hans Mayer schrieb:

> software-Kondnsator

Was'n dat?

von Philip O. (versipellis)


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?

von Peter D. (pdiener) Benutzerseite


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?

von Philip O. (versipellis)


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.

von Peter D. (pdiener) Benutzerseite


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.

von Philip O. (versipellis)


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.

von Peter D. (pdiener) Benutzerseite


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.

von Peter D. (pdiener) Benutzerseite


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.

von Philip O. (versipellis)


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?

von Philip O. (versipellis)


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.

von Philip O. (versipellis)


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.

von Philip O. (versipellis)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.