PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CRC8 in bestehenden Code implementieren (DS1820)



martin66119
05.04.2007, 14:47
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



$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]

PicNick
05.04.2007, 16:43
however, bascom hat ja sowas

checksum = CRC8( data, datalen)

for_ro
05.04.2007, 17:41
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.



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