PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom heizung vom sht11



stevensen
30.12.2007, 15:19
Hallo,
ist kein Roboter-thema aber vielleicht wollt ihr mir trotzdem helfen.
ich habe einen sht11 mit einem Mega8 laufen. Jetzt war es recht feucht die letzten Tage und da hat sich Kondensationswasser auf dem sht11 niedergeschlagen. Für solche Fälle gibt es eine Heizung auf dem Sht11. Ich benutze den Samplecode von Bascom und möchte gerne wissen wie ich die Heizung an- und ausschalten kann.
Die Variante funktioniert bei mir nicht.
Command = &B00000110
Call Getit
Command = &B00000100
Call Getit

Außerdem habe ich das Problem das der Sht11 nur sehr schlecht startet. Das Programm bleibt beim Ansprechen des Sht11 hängen. Nur mit Hilfe des Watchdogs läuft das Programm nach mehreren Minuten dann durch. Was kann ich da machen?

Stromi
30.12.2007, 23:14
Und welche Beispielvariante nimmst du, die aus Österreich?
Datenblatt hast du schon?

stevensen
31.12.2007, 10:38
Ich weiß nicht wieviele Varianten es gibt. Ich benutzte die man z.b. bei der Demo im Sample Verzeichnis findet. Wenn Du eine andere Variante hast, kannst Du die vielleicht hier reinstellen?

Stromi
01.01.2008, 10:53
Frohes neues Jahr für alle!
sht11.bas

'Routine to read the SHT11 Humidity sensor chip
'By Stuart Leslie
'Contact stu@4sightinc.com with any questions
'CRC includet by Helmut Hoerschgl
'Contact helmut.hoerschgl@gmx.at
'Uses BASCOM-AVR 'a .01 uf capacitor across VCC and Ground on the SHT11 really cleans up the data
'a pullup is required on "data" pin as shown in the data sheet
$regfile = "M16def.dat"

Dim Er As Long
Dim Crc_cor As Byte
Dim Cx As Byte
Dim Crc_sht As Byte
Dim A1 As Byte
Dim I1 As Byte , J As Byte
Dim Z1(3) As Byte
Dim X As Byte
Dim Idx As Byte
Dim Crc As Byte
Dim I As Byte
Dim Ctr As Byte
Dim Dataword As Word
Dim Command As Byte
Dim Dis As String * 20
Dim Calc As Single
Dim Calc2 As Single
Dim Rhlinear As Single
Dim Rhlintemp As Single
Dim Tempc As Single
Dim Tempf As Single

Const C1 = -4
Const C2 = 0.0405
Const C3 = -0.0000028
Const T1c = .01
Const T2 = .00008
Const T1f = .018

Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.5 , Rs = Porta.4
Config Lcd = 16 * 2

Sck Alias Portd.6
Dataout Alias Portd.7
Datain Alias Pind.7

Declare Sub Getit()
Declare Sub Calc_crc(byval X As Byte)

Ddrd = &B11111111 'all port bare output
Config Pind.6 = Output 'sck
Config Pind.7 = Output 'datain
'reset the serial communications first, it is easily confused!
Set Dataout
For Ctr = 1 To 12
Set Sck
Waitus 2
Reset Sck
Waitus 2
Next Ctr
Cls
Waitms 20
Cursor Off
Waitms 20

Do
'continually read the tempfature and humidity
Command = &B00000011
Z1(1) = 3
Call Getit 'Get the temperature, puts result in "dataword" for us
'
Tempf = T1f * Dataword
Tempf = Tempf - 40
Tempc = T1c * Dataword 'get celcius for later calculations and for "the rest of the world"
Tempc = Tempc - 40
Dis = Fusing(tempf , "###.##")
Locate 1 , 14 : Lcd "CRC"
Waitms 20
Locate 1 , 1 : Lcd "Temp=" ; Dis ; "(F)"
Wait 1
Command = &B00000101
Z1(1) = 5
Call Getit 'get the humidity
Calc = C2 * Dataword
Calc2 = Dataword * Dataword 'that "2" in the datasheet sure looked like a footnote for a couple days, nope it means "squared"!
Calc2 = C3 * Calc2
Calc = Calc + C1
Rhlinear = Calc + Calc2
'Dis = Fusing(rhlinear , "##.##")
'Print "Humidity adjusted for linear = " ; Dis

Calc = T2 * Dataword
Calc = Calc + T1c
Calc2 = Tempc - 25
Calc = Calc2 * Calc
Rhlintemp = Calc + Rhlinear
Dis = Fusing(rhlintemp , "##.##")
Locate 2 , 0 : Lcd "Hum=" ; Dis
Wait 1
Loop

Sub Getit()
Local Datavalue As Word
Local Databyte As Byte
'start with "transmission start"
Set Sck
Reset Dataout
Reset Sck
Set Sck
Set Dataout
Reset Sck

'now send the command
Shiftout Dataout , Sck , Command , 1
Ddrd = &B11111101 'datain is now input
Config Pind.7 = Input 'datain
Set Sck 'click one more off
Reset Sck
Waitus 10 'no idea why, but it doesn't work without it!
Bitwait Pind.7 , Reset 'wait for the chip to have data ready
Shiftin Datain , Sck , Databyte , 1 'get the MSB
Datavalue = Databyte
Z1(2) = Databyte
Ddrd = &B11111111
Config Pind.7 = Output
Reset Dataout 'this is the tricky part- Lot's of hair pulling- have to tick the ack!
Set Sck
Reset Sck
Ddrd = &B11111101 'datain is now input
Config Pind.7 = Input
Shiftin Datain , Sck , Databyte , 1 'get the LSB
Z1(3) = Databyte
Shift Datavalue , Left , 8
Datavalue = Datavalue Or Databyte 'don't tick the clock or ack since we don't need the CRC value, leave it hanging!
Dataword = Datavalue
Ddrd = &B11111111
Config Pind.7 = Output
Reset Dataout
Set Sck
Reset Sck
Ddrd = &B11111101 'datain is now input
Config Pind.7 = Input
Shiftin Datain , Sck , Databyte , 1
Crc_sht = Databyte 'CRC von SHTXX übergeben
Gosub Crc_ex
Crc = 0
For J = 1 To 3 'die 3 Bytes an Calc_crc(x) übergeben
X = Z1(j)
Call Calc_crc(x)
Next
If Crc = Crc_cor Then
Locate 2 , 15
Waitms 20
Lcd "OK"
Waitms 20
Else
Locate 2 , 15
Waitms 20
Lcd "ER"
Waitms 20
Command = &B00011110
Set Sck
Reset Dataout
Reset Sck
Set Sck
Set Dataout
Reset Sck

Shiftout Dataout , Sck , Command , 1 'if CRC is wrong reset the SHTXX
Waitms 20
End If
Ddrd = &B11111111
Config Pind.7 = Output
Set Dataout
Set Sck
Reset Sck
End Sub

End

Sub Calc_crc(byval X As Byte) 'CRC Berechnung
Restore Crc_table
Idx = Crc Xor X
If X = 0 Then Idx = 3
For I = 0 To Idx
Read Crc
Next
End Sub

Crc_ex: 'vom SHTXX empfangener CRC wird hier in die korrekte Form gebracht
Cx = 0
A1 = 7
Do
Crc_cor.cx = Crc_sht.a1
Incr Cx
Decr A1
Loop Until Cx = 8
Return

Crc_table:
Data 0 , 49 , 98 , 83 , 196 , 245 , 166 , 151 , 185 , 136 , 219 , 234 , 125 , 76 , 31 , 46,
Data 67 , 114 , 33 , 16 , 135 , 182 , 229 , 212 , 250 , 203 , 152 , 169 , 62 , 15 , 92 , 109,
Data 134 , 183 , 228 , 213 , 66 , 115 , 32 , 17 , 63 , 14 , 93 , 108 , 251 , 202 , 153 , 168,
Data 197 , 244 , 167 , 150 , 1 , 48 , 99 , 82 , 124 , 77 , 30 , 47 , 184 , 137 , 218 , 235,
Data 61 , 12 , 95 , 110 , 249 , 200 , 155 , 170 , 132 , 181 , 230 , 215 , 64 , 113 , 34 , 19,
Data 126 , 79 , 28 , 45 , 186 , 139 , 216 , 233 , 199 , 246 , 165 , 148 , 3 , 50 , 97 , 80,
Data 187 , 138 , 217 , 232 , 127 , 78 , 29 , 44 , 2 , 51 , 96 , 81 , 198 , 247 , 164 , 149,
Data 248 , 201 , 154 , 171 , 60 , 13 , 94 , 111 , 65 , 112 , 35 , 18 , 133 , 180 , 231 , 214,
Data 122 , 75 , 24 , 41 , 190 , 143 , 220 , 237 , 195 , 242 , 161 , 144 , 7 , 54 , 101 , 84,
Data 57 , 8 , 91 , 106 , 253 , 204 , 159 , 174 , 128 , 177 , 226 , 211 , 68 , 117 , 38 , 23,
Data 252 , 205 , 158 , 175 , 56 , 9 , 90 , 107 , 69 , 116 , 39 , 22 , 129 , 176 , 227 , 210,
Data 191 , 142 , 221 , 236 , 123 , 74 , 25 , 40 , 6 , 55 , 100 , 85 , 194 , 243 , 160 , 145,
Data 71 , 118 , 37 , 20 , 131 , 178 , 225 , 208 , 254 , 207 , 156 , 173 , 58 , 11 , 88 , 105,
Data 4 , 53 , 102 , 87 , 192 , 241 , 162 , 147 , 189 , 140 , 223 , 238 , 121 , 72 , 27 , 42,
Data 193 , 240 , 163 , 146 , 5 , 52 , 103 , 86 , 120 , 73 , 26 , 43 , 188 , 141 , 222 , 239,
Data 130 , 179 , 224 , 209 , 70 , 119 , 36 , 21 , 59 , 10 , 89 , 104 , 255 , 206 , 157 , 172

shtbascom.bas

'Routine to read the SHT11 Humidity sensor chip
'By Stuart Leslie
'Contact stu@4sightinc.com with any questions
'Uses BascomAVR
'a .01 uf capacitor across VCC and Ground on the SHT11 really cleans up the data
'a pullup is required on "data" pin as shown in the data sheet

$regfile = "m88def.dat"


Dim Ctr As Byte
Dim Dataword As Word
Dim Command As Byte
Dim Dis As String * 20

Dim Calc As Single
Dim Calc2 As Single
Dim Rhlinear As Single
Dim Rhlintemp As Single
Dim Tempc As Single
Dim Tempf As Single

Const C1 = -4
Const C2 = 0.0405
Const C3 = -0.0000028
Const T1c = .01
Const T2 = .00008
Const T1f = .018

Sck Alias Portb.0
Dataout Alias Portb.1
Datain Alias Pinb.1
Redled Alias Portb.2

Declare Sub Getit()

Ddrb = &B11111111 'all port b are output
Config Pinb.0 = Output 'sck
Config Pinb.1 = Output 'datain

'reset the serial communications first, it is easily confused!
Set Dataout
For Ctr = 1 To 12
Set Sck
Waitus 2
Reset Sck
Waitus 2
Next Ctr


Do 'continually read the tempfature and humidity

Command = &B00000011
Call Getit 'Get the temperature, puts result in "dataword" for us
'
Tempf = T1f * Dataword
Tempf = Tempf - 40

Tempc = T1c * Dataword 'get celcius for later calculations and for "the rest of the world"
Tempc = Tempc - 40

Dis = Fusing(tempf , "###.##")
Print "Temperature = " ; Dis ; " (F)"

Command = &B00000101
Call Getit 'get the humidity
Calc = C2 * Dataword
Calc2 = Dataword * Dataword 'that "2" in the datasheet sure looked like a footnote for a couple days, nope it means "squared"!
Calc2 = C3 * Calc2
Calc = Calc + C1
Rhlinear = Calc + Calc2

'Dis = Fusing(rhlinear , "##.##")
'Print "Humidity adjusted for linear = " ; Dis


Calc = T2 * Dataword
Calc = Calc + T1c
Calc2 = Tempc - 25
Calc = Calc2 * Calc
Rhlintemp = Calc + Rhlinear

Dis = Fusing(rhlintemp , "##.##")
Print "Humidity adjusted for temperature = " ; Dis
Print

Wait 1
Loop


Sub Getit()

Local Datavalue As Word
Local Databyte As Byte

'start with "transmission start"
Set Sck
Reset Dataout
Reset Sck
Set Sck
Set Dataout
Reset Sck


'now send the command
Shiftout Dataout , Sck , Command , 1

Ddrb = &B11111101 'datain is now input
Config Pinb.1 = Input 'datain
Set Sck 'click one more off
Reset Sck
Waitus 10 'no idea why, but it doesn't work without it!
Bitwait Pinb.1 , Reset 'wait for the chip to have data ready

Shiftin Datain , Sck , Databyte , 1 'get the MSB
Datavalue = Databyte

Ddrb = &B11111111
Config Pinb.1 = Output

Reset Dataout 'this is the tricky part- Lot's of hair pulling- have to tick the ack!
Set Sck
Reset Sck

Ddrb = &B11111101 'datain is now input
Config Pinb.1 = Input

Shiftin Datain , Sck , Databyte , 1 'get the LSB
Shift Datavalue , Left , 8
Datavalue = Datavalue Or Databyte
'don't tick the clock or ack since we don't need the CRC value, leave it hanging!
Dataword = Datavalue

Ddrb = &B11111111
Config Pinb.1 = Output

Reset Dataout
Set Sck
Reset Sck

Ddrb = &B11111101 'datain is now input
Config Pinb.1 = Input

Shiftin Datain , Sck , Databyte , 1 'not using the CRC value for now- can't figure it out! Anybody know how to impliment?
'Print "CRC value was - " ; Databyte

Ddrb = &B11111111
Config Pinb.1 = Output

Set Dataout
Set Sck
Reset Sck
End Sub

End