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.
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.
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
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 ?
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?
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.
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 |
Hi Da gibt es auch noch Hinweise: http://www.sensirion.com/en/pdf/product_information/AN_ESD_Latch-up_and_EMC_E.pdf MfG Spess
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
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!
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
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?
>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
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.
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 |
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
Sind nur die Routinen von dem Sensor hab ich in ne extra Datei... die Temps sind declariert in der Main
Dann häng doch mal bitte das ganz Projekt an, so sieht ja niemand, wie die Werte überhaupt angezeigt werden. Grüße, Peter
Also hier mal das gesamte Projekt auch wenns etwas chaotisch programmiert ist.
Auf welcher Taktfrequenz läuft denn der Controller? Sind das die eingestelleten 4 MHz?
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
Du könntest statt den 100nF auch einen software-Kondnsator zwischen Vcc und sck einsetzen.
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?
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?
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.
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.
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.
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.
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.
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.