-         

Ergebnis 1 bis 4 von 4

Thema: Bascom heizung vom sht11

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    11.01.2004
    Beiträge
    44

    Bascom heizung vom sht11

    Anzeige

    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?

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Und welche Beispielvariante nimmst du, die aus Österreich?
    Datenblatt hast du schon?

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    11.01.2004
    Beiträge
    44
    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?

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Frohes neues Jahr für alle!
    sht11.bas
    Code:
    '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
    Code:
    '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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •