1 | ; ATmega8
|
2 | ; Bernhard.Erfurt@gmx.de
|
3 | ; 06/2012
|
4 | ; ##############################################################################
|
5 | ; ##############################################################################
|
6 | ; ##############################################################################
|
7 | ; CRC Berechnung übernommen und abgeändert von: http://s-huehn.de
|
8 | ; CRC-Berechnung Application Note 27 von Dallas/Maxim
|
9 | ;
|
10 | ; zu berechnende Daten ow_Data (sRam)
|
11 | ; CARRY bei CRC-Fehler, sonst Carry gelöscht
|
12 | ;
|
13 | ow_CRC8: ;meinem Verständnis nach, berechnet die Routiene eine CRC8 Prüfsumme, Name auf '8' geändert
|
14 | push XL ;auf dem Stack sichern
|
15 | push XH
|
16 | push r16
|
17 | push r17
|
18 | push r18
|
19 | push r19
|
20 | push r20
|
21 | push r21
|
22 | ;ONE_WIRE_ROM_CRC7_RUN: ;wenn erneut berechnet werden soll, dann hier einspringen
|
23 | ; INITIALISIERUNG
|
24 | ldi XL,low (ow_Data) ;Zeiger
|
25 | ldi XH,high(ow_Data)
|
26 | ldi r19, 8 ;7 Bytes berechnen für ID nebst CRC, 8 Bytes für Scratchpad
|
27 | ;wenn eine ID geprüft werden soll, erstes Byte 00, restliche 8 Byte ID
|
28 | ;dahinter, da führende Nullen bei der CRC keine Änderung hervorrufen
|
29 | ldi r20, 0x18 ;Konstante für Berechnung
|
30 | clr r17 ;CRC-Startwert = 0 setzen
|
31 | ;ONE_WIRE_CRC7_100:
|
32 | ld r18, x+ ;Byte aus Puffer holen
|
33 | mov r21, r18 ;Byte zwischenspeichern
|
34 | ldi r16, 8 ;8 Verschiebungen
|
35 | ;ONE_WIRE_CRC7_200:
|
36 | eor r18, r17 ;CRC berechnen
|
37 | ror r18 ;Ergebnis in Carry schieben
|
38 | mov r18, r17 ;letzten CRC-Wert holen
|
39 | ;brcc ONE_WIRE_CRC7_300 ;war Ergebnis = 0? ja -> weiter
|
40 | brcc PC+2 ;war Ergebnis = 0? ja -> weiter
|
41 | eor r18, r20 ;sonst CRC-Wert updaten
|
42 | ;ONE_WIRE_CRC7_300:
|
43 | ror r18 ;neuen CRC-Wert positionieren
|
44 | mov r17, r18 ;und speichern
|
45 | mov r18, r21 ;restliche Bits holen
|
46 | bst r18, 0 ;LSB sichern, nächste Bitposition
|
47 | ror r18 ;gesichertes Bit als MSB einsetzen
|
48 | bld r18, 7 ;(Ersatz für RR-Befehl)
|
49 | mov r21, r18 ;und Wert zwischenspeichern
|
50 | dec r16 ;alle Verschiebungen erledigt?
|
51 | brne PC-13 ;ONE_WIRE_CRC7_200 ;nein -> Schleife
|
52 | dec r19 ;alle Bytes bearbeitet?
|
53 | brne PC-18 ;ONE_WIRE_CRC7_100 ;nein -> Schleife
|
54 | ;-------------------------------------------------------------------------------
|
55 | ; hier ist die CRC-Summe berechnet, mit empfangenem Wert überprüfen
|
56 | LDS temp,(ow_Data+8)
|
57 | ; ev. Korrektur
|
58 | ;STS(ow_Data+7),R17 ;eigentlich unnötig
|
59 | cp temp,r17
|
60 | brne PC+3 ;ONE_WIRE_CRC7_ERROR
|
61 | CLC ; CARRY=0 für 'CRC ok'
|
62 | rjmp PC+2 ;ONE_WIRE_CRC7_FERTIG
|
63 | ;-------------------------------------------------------------------------------
|
64 | ;ONE_WIRE_CRC7_ERROR:
|
65 | ;ggf Fehlerausgabe ect.pp.
|
66 | ;dann müssen aber die Sprünge angepasst werden
|
67 | ;da vor dem Test der berechnete CRC-Wert im Speicher abgelegt wurde (sofern das STS nicht geremmt ist), würde eine erneute Berechnung 'CRC ok' bringen - weshalb erschließt sich mir nicht, da die Daten ja wohl zuvor fehlerhaft übertragen wurden
|
68 | ; rjmp ONE_WIRE_ROM_CRC7_RUN ;die erneute Prüfung ist deshalb geremmt, da ohne STS erneut CRC-Fehler und mit STS definitiv kein CRC-Fehler, da CRC selber zusammen gerechnet und überschrieben
|
69 | SEC ;für 'CRC-Fehler'
|
70 | ;-------------------------------------------------------------------------------
|
71 | ;ONE_WIRE_CRC7_FERTIG:
|
72 | pop r21 ; wiederherstellen
|
73 | pop r20
|
74 | pop r19
|
75 | pop r18
|
76 | pop r17
|
77 | pop r16
|
78 | pop XH
|
79 | pop XL
|
80 | ret
|