- LiFePO4 Speicher Test         
Ergebnis 1 bis 3 von 3

Thema: CRC8 in bestehenden Code implementieren (DS1820)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109

    CRC8 in bestehenden Code implementieren (DS1820)

    Einen schönen guten Tag!

    In neinen Code, den ich hier im Forum zusammengesucht und auf meine Anwendung angepasst und erweitert habe, möchte ich gerne CRC8 implementieren.

    Kann mir bitte jemand helfen wie ich dies machen muss.
    Hier mein Code.

    Danke schonmal für eure Hilfe
    Martin

    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400
    $hwstack = 46
    $swstack = 40
    $framesize = 40
    
    '**************************Funktionen LCD-Display*******************************
    Config Lcd = 40 * 4
    Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
    Config Lcdbus = 4
    Config Lcdmode = Port
    
    Config Portb = Output
      Brenner Alias Portb.3
      Pumpefb Alias Portb.4
      Pumpehk Alias Portb.5
    
    Dim ___lcdno As Byte
    
    ___lcdno = 0
     Initlcd
     Cursor Off
     Cls
    
    ___lcdno = 1
    Initlcd
    Cursor Off
    Cls
    '**************************Def. allgemeiner Variabeln***************************
    Dim Tempmessstelle(8) As Single
    Dim Tagnacht As Bit
    Dim Nachtbetrieb As Byte
    Dim Tagbetrieb As Byte
    
    Const Tagtemp_og = 21.6
    Const Tagtemp_ug = 21.4
    Const Nachttemp_og = 20.9
    Const Nachttemp_ug = 20.7
    
    
    Dim Zähler As Byte
    Zähler = 0
    
    '*************************Config Timer1*****************************************
    Config Timer1 = Timer , Prescale = 1024       '64       '256       'Konfiguriere Timer1
    Enable Timer1                      'schalte den Timer1 ein
    On Timer1 Isr_von_timer1           'verzweige bei Timer1 überlauf zu   Isr_von_Timer1
    Enable Interrupts
    Timer1 = 34286                     'Timer1 soll schon von 34285 wegzählen   4 sekunden
    '***************************Config RTC******************************************
    Config Sda = Portc.4
    Config Scl = Portc.5
    
    Const Ds1307w = &HD0               ' Addresses of Ds1307 clock
    Const Ds1307r = &HD1
    
    Config Clock = User                ' this will dim the bytes automatic
    Dim Weekday As Byte
    
    'Time$ = "20:02:00"                 ' to watch the day changing value
    'Date$ = "02.27.07"                 ' erstmaliges stellen der Uhr
    '***************Variabeln für Servo*********************************************
    Config Portc.2 = Output
    
    Dim Minimum As Integer
    Dim Maximum As Integer
    Dim Vorlauftemp As Integer
    Dim Servosoll As Integer
    Dim Ist As Integer
    
    Minimum = 1200                     ' Vorlaufminimum
    Maximum = 500                      ' Vorlaufmaximum
    Ist = Maximum
    
    Pulseout Portc , 2 , Maximum       'Servo auf maximale Vorlauftemperatur
    Waitms 60
    
    '***************************Config 1Wire****************************************
    
    Config 1wire = Portc.1             'DS1820
    
    Match_rom Alias &H55
    Read_scratchpad Alias &HBE
    Start_conversion Alias &H44
    
    Innen Alias 0
    Vorlauf Alias 1
    Rücklauf Alias 2
    Aussen Alias 3
    Kessel Alias 4
    Boiler Alias 5
    
    
    Dim Read_temp As Integer
    Dim Sensor_ids(48) As Byte
    Dim Id As Byte
    Dim Offset As Byte
    Dim Ds_array(7) As Byte
    Dim Bruchteil As Single
    Dim Temperatur As Single
    Dim I As Integer
    '***************************ID 1Wire configurieren******************************
    For Id = 1 To 40                   'Einlesen der 5 Sensoren IDs (5*8 Byte)
       I = Id - 1
       Readeeprom Sensor_ids(id) , I
    Next Id
    '***********************************Hauptprogramm*******************************
    Do
    
    Loop
    End
    '**********************************1Wire****************************************
    1wire:
       Locate 2 , 20
       Lcd Time$
       Wait 1
       For Id = Innen To Kessel
          Offset = Id * 8
          Offset = Offset + 1          'Offset geht auf 1, 9, 17, 25 und 33
          1wreset                      'hier wird der Temperaturwert eingelesen
          1wwrite Match_rom
          1wwrite Sensor_ids(offset) , 8       '8 Byte ID wird übertragen
          1wwrite Read_scratchpad
          For I = 1 To 7               'nur bis 7, weil 8 und 9 uninteressant
             Ds_array(i) = 1wread()
          Next I
          Read_temp = Makeint(ds_array(1) , Ds_array(2))
          1wreset                      'jetzt wird wieder die Konvertierung gestartet
          1wwrite Match_rom
          1wwrite Sensor_ids(offset) , 8
          1wwrite Start_conversion
          Shift Read_temp , Right
          If 127 < Read_temp Then Read_temp = Read_temp - 32768
          Bruchteil = 16 - Ds_array(7)
          Bruchteil = Bruchteil / 16
          Bruchteil = Bruchteil - 0.25
    
    
          Temperatur = Read_temp + Bruchteil
          Tempmessstelle(id + 1) = Temperatur
    
          If Temperatur <> 85.0 Then   ' < 80.0 And Temperatur > -20.0 Then
            Tempmessstelle(id + 1) = Temperatur
          End If
    
                              'Innen Alias 0
                              'Vorlauf Alias 1
                              'Rücklauf Alias 2
                              'Aussen Alias 3
                              'Kessel Alias 4
                              'Boiler Alias 5
          ___lcdno = 0
          Select Case Id
          Case Innen:
             Locate 1 , 1 : Lcd "WZ:       "
             Locate 1 , 5 : Lcd Fusing(temperatur , "#.#")
          Case Aussen:
             Locate 1 , 11 : Lcd "AT:       "
             Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
          Case Vorlauf:                'ausgabe im Display ist dann z.B.
             Locate 2 , 1 : Lcd "VL:       "
             Locate 2 , 5 : Lcd Fusing(temperatur , "#.#" )       '  Inn  Auss  Kess Rück Vorl
          Case Rücklauf:               ' 14.4  52.4 67.3 43.0 62.8
             Locate 2 , 11 : Lcd "RL:       "
             Locate 2 , 14 : Lcd Fusing(temperatur , "#.#")
          End Select
    
          ___lcdno = 1
          Select Case Id
          Case Kessel:
             Locate 1 , 11 : Lcd "KE:     "
             Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
          End Select
    
         Cursor Off
       Next Id
    Return
    '***************************Gültigkeit Messwerte********************************
     'Checkmessergebnisse:
    
    
    
     'Return
    '***************************Vorlauftem Servoschritte****************************
    Servostellung:
       Vorlauftemp = Int(tempmessstelle(4))
       Vorlauftemp = Vorlauftemp - 22
       If Vorlauftemp <= 0 Then
          Vorlauftemp = 0
       Else
          Vorlauftemp = Vorlauftemp * 10
       End If
    Return
    '*********************Vorlauftemperatur reduzieren******************************
    Vorlauftempgeringer:
      Servosoll = Minimum - Vorlauftemp
      If Ist < Servosoll Then
        Ist = Ist + 1
        Pulseout Portc , 2 , Ist
        Waitms 60
      End If
    Return
     '*************************Sub Relais schalten***********************************
    Schalterelais:
    Select Case Tagnacht
      Case 0
        Gosub Nachtbetrieb
      Case 1
        Gosub Tagbetrieb
    End Select
    Return
     '**************************Sub für Tagbetrieb***********************************
    Tagbetrieb:
      If Tempmessstelle(1) >= Tagtemp_og Then       'And Oldmesswert(1) >= Tagtemp_og Then
        Brenner = 0                    ' Brenner
        Pumpefb = 0                    ' Pumpe FB
        Pumpehk = 0                    ' PumpeHK
      End If
      If Tempmessstelle(1) < Tagtemp_ug Then       'And Oldmesswert(1) < Tagtemp_ug Then
        Brenner = 1
        Pumpefb = 1
        Pumpehk = 1
      End If
    Return
    '**************************Sub für Nachtbetrieb*********************************
    Nachtbetrieb:
      If Tempmessstelle(1) >= Nachttemp_og Then       'And Oldmesswert(1) >= Nachttemp_ogthen
        Brenner = 0
        Pumpefb = 0
        Pumpehk = 0                    ' Pumpe FB
      End If
      If Tempmessstelle(1) < Nachttemp_ug Then       'And Oldmesswert(1) < Nachttemp_ug Then
        Brenner = 1
        Pumpefb = 1
        Pumpehk = 1
      End If
    Return
    
    '**************************Subroutine für Timer1********************************
    Isr_von_timer1:                    'ISR von Timer1
      Timer1 = 34286
      If _hour >= Nachtbetrieb Or _hour < Tagbetrieb Then       'Or _hour = 7 Or _hour = 8 Then
        Tagnacht = 0                   'Nachteinstellung
      Else
        Tagnacht = 1                   'Tageinstellung
      End If
    
      Gosub 1wire
      'Gosub Checkmessergebnisse
      Gosub Servostellung
      Gosub Schalterelais
     ' If Zähler < 2 Then
     '   Zähler = Zähler + 1
     ' Else
        Gosub Vorlauftempgeringer
     '   Zähler = 0
     ' End If
    Return
    
    '***************************Subs für RTC****************************************
    Getdatetime:
      I2cstart                         ' Generate start code
      I2cwbyte Ds1307w                 ' send address
      I2cwbyte 0                       ' start address in 1307
    
      I2cstart                         ' Generate start code
      I2cwbyte Ds1307r                 ' send address
      I2crbyte _sec , Ack
      I2crbyte _min , Ack              ' MINUTES
      I2crbyte _hour , Ack             ' Hours
      I2crbyte Weekday , Ack           ' Day of Week
      I2crbyte _day , Ack              ' Day of Month
      I2crbyte _month , Ack            ' Month of Year
      I2crbyte _year , Nack            ' Year
      I2cstop
      _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
      _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
    Return
    
    Setdate:
      _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
      I2cstart                         ' Generate start code
      I2cwbyte Ds1307w                 ' send address
      I2cwbyte 4                       ' starting address in 1307
      I2cwbyte _day                    ' Send Data to SECONDS
      I2cwbyte _month                  ' MINUTES
      I2cwbyte _year                   ' Hours
      I2cstop
    Return
    
    Settime:
      _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
      I2cstart                         ' Generate start code
      I2cwbyte Ds1307w                 ' send address
      I2cwbyte 0                       ' starting address in 1307
      I2cwbyte _sec                    ' Send Data to SECONDS
      I2cwbyte _min                    ' MINUTES
      I2cwbyte _hour                   ' Hours
      I2cstop
    Return
    '**********************************************************
    
    $eeprom
    
    Data &H10 , &HE8 , &HF4 , &H23 , &H01 , &H08 , &H00 , &HEF       '
    Data &H10 , &H1B , &HD0 , &H23 , &H01 , &H08 , &H00 , &H23       '
    Data &H10 , &H78 , &H37 , &H39 , &H01 , &H08 , &H00 , &H11       '
    Data &H10 , &HC0 , &H46 , &H19 , &H01 , &H08 , &H00 , &H67       '
    Data &H10 , &HBD , &HB6 , &H23 , &H01 , &H08 , &H00 , &H40       '
    Data &H10 , &H56 , &HA3 , &H23 , &H01 , &H08 , &H00 , &H3F
    EDIT Ich hab' schon mal Code-Tags implementiert (PicNick)

    [/code]

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    however, Bascom hat ja sowas

    checksum = CRC8( data, datalen)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Nachdem ich des Öfteren Probleme mit den Werten hatte, habe ich bei mir auch CRC installiert, kopiert aus Code-Schnipsel aus diesem Forum.
    Im Groben so:
    Nach dem Einlesen aller 9 bytes (im Moment liest du nur 7)
    Gosub crcit
    Anschliessend prüfen, ob die Variable Crc auf 0 ist. Nur dann war die Übertragung korrekt. Ansonsten habe ich auch mal testweise Crc und alle eingelesenen Werte ausgegeben.

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

    Gruß

    EDIT: schon wieder PicNick (COde-tag am falschen Platz)

    Rolf

Berechtigungen

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

12V Akku bauen