however, Bascom hat ja sowas
checksum = CRC8( data, datalen)
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
EDIT Ich hab' schon mal Code-Tags implementiert (PicNick)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
[/code]
however, Bascom hat ja sowas
checksum = CRC8( data, datalen)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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.
Probier es halt mal.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
Gruß
EDIT: schon wieder PicNick (COde-tag am falschen Platz)
Rolf
Lesezeichen