📄 onewirei.s90
字号:
ST -Y, R27
ST -Y, R26
ST -Y, R25
ST -Y, R24
MOVW R27:R26, R17:R16
MOV R25, R20
LDI R24, 8
// 100 OWI_SendByte(OWI_ROM_READ, pin);
MOV R20, R25
LDI R16, 51
RCALL OWI_SendByte
// 101 while (bytesLeft > 0)
??OWI_ReadRom_0:
CPI R24, 1
BRCS ??OWI_ReadRom_1
// 102 { *romValue++ = OWI_ReceiveByte(pin);
MOV R16, R25
RCALL OWI_ReceiveByte
ST X, R16
ADIW R27:R26, 1
// 103 bytesLeft--;
DEC R24
RJMP ??OWI_ReadRom_0
// 104 }
// 105 }
??OWI_ReadRom_1:
LD R24, Y+
LD R25, Y+
LD R26, Y+
LD R27, Y+
RET
// 106 //==================== Match ROM ==============================
RSEG CODE:CODE:NOROOT(1)
// 107 void OWI_MatchRom(unsigned char * romValue, unsigned char pins)
OWI_MatchRom:
// 108 { unsigned char bytesLeft = 8;
ST -Y, R27
ST -Y, R26
ST -Y, R25
ST -Y, R24
MOVW R27:R26, R17:R16
MOV R25, R20
LDI R24, 8
// 109 OWI_SendByte(OWI_ROM_MATCH, pins);
MOV R20, R25
LDI R16, 85
RCALL OWI_SendByte
// 110 while (bytesLeft > 0)
??OWI_MatchRom_0:
CPI R24, 1
BRCS ??OWI_MatchRom_1
// 111 { OWI_SendByte(*romValue++, pins);
MOV R20, R25
LD R16, X
RCALL OWI_SendByte
ADIW R27:R26, 1
// 112 bytesLeft--;
DEC R24
RJMP ??OWI_MatchRom_0
// 113 }
// 114 }
??OWI_MatchRom_1:
LD R24, Y+
LD R25, Y+
LD R26, Y+
LD R27, Y+
RET
// 115 //==================== Search device =========================
RSEG CODE:CODE:NOROOT(1)
// 116 unsigned char OWI_SearchRom(unsigned char * bitPattern, unsigned char lastDeviation, unsigned char pin)
OWI_SearchRom:
// 117 { unsigned char currentBit = 1;
ST -Y, R8
ST -Y, R7
ST -Y, R6
ST -Y, R5
ST -Y, R4
ST -Y, R27
ST -Y, R26
ST -Y, R25
ST -Y, R24
REQUIRE ?Register_R4_is_cg_reg
REQUIRE ?Register_R5_is_cg_reg
REQUIRE ?Register_R6_is_cg_reg
REQUIRE ?Register_R7_is_cg_reg
REQUIRE ?Register_R8_is_cg_reg
MOVW R7:R6, R17:R16
MOV R8, R20
LDD R26, Y+9
LDI R24, 1
// 118 unsigned char newDeviation = 0;
LDI R27, 0
// 119 unsigned char bitMask = 0x01;
LDI R25, 1
// 120 unsigned char bitA;
// 121 unsigned char bitB;
// 122 OWI_SendByte(OWI_ROM_SEARCH, pin);
MOV R20, R26
LDI R16, 240
RCALL OWI_SendByte
// 123 while (currentBit <= 64)
??OWI_SearchRom_0:
CPI R24, 65
BRCS $+2+2
RJMP ??OWI_SearchRom_1
// 124 { bitA = OWI_ReadBit(pin);
MOV R16, R26
RCALL OWI_ReadBit
MOV R4, R16
// 125 bitB = OWI_ReadBit(pin);
MOV R16, R26
RCALL OWI_ReadBit
MOV R5, R16
// 126 if (bitA && bitB)
TST R4
BREQ ??OWI_SearchRom_2
TST R5
BRNE ??OWI_SearchRom_3
// 127 { newDeviation = OWI_ROM_SEARCH_FAILED;
// 128 return;
// 129 }
// 130 else
// 131 { if(bitA ^ bitB)
??OWI_SearchRom_2:
MOV R16, R5
EOR R16, R4
TST R16
BREQ ??OWI_SearchRom_4
// 132 { if (bitA) (*bitPattern) |= bitMask;
TST R4
BREQ ??OWI_SearchRom_5
MOVW R31:R30, R7:R6
LD R16, Z
OR R16, R25
ST Z, R16
RJMP ??OWI_SearchRom_6
// 133 else (*bitPattern) &= ~bitMask;
??OWI_SearchRom_5:
MOV R16, R25
COM R16
MOVW R31:R30, R7:R6
LD R17, Z
AND R17, R16
ST Z, R17
RJMP ??OWI_SearchRom_6
// 134 }
// 135 else // Both bits 0
// 136 { if (currentBit == lastDeviation) (*bitPattern) |= bitMask;
??OWI_SearchRom_4:
CP R24, R8
BRNE ??OWI_SearchRom_7
MOVW R31:R30, R7:R6
LD R16, Z
OR R16, R25
ST Z, R16
RJMP ??OWI_SearchRom_6
// 137 else
// 138 { if (currentBit > lastDeviation)
??OWI_SearchRom_7:
CP R8, R24
BRCC ??OWI_SearchRom_8
// 139 { (*bitPattern) &= ~bitMask;
MOV R16, R25
COM R16
MOVW R31:R30, R7:R6
LD R17, Z
AND R17, R16
ST Z, R17
// 140 newDeviation = currentBit;
MOV R27, R24
RJMP ??OWI_SearchRom_6
// 141 }
// 142 else if (!(*bitPattern & bitMask)) newDeviation = currentBit;
??OWI_SearchRom_8:
MOVW R31:R30, R7:R6
LD R16, Z
AND R16, R25
TST R16
BRNE ??OWI_SearchRom_6
MOV R27, R24
// 143 }
// 144 }
// 145 }
// 146 if ((*bitPattern) & bitMask) OWI_WriteBit1(pin);
??OWI_SearchRom_6:
MOVW R31:R30, R7:R6
LD R16, Z
AND R16, R25
TST R16
BREQ ??OWI_SearchRom_9
MOV R16, R26
RCALL OWI_WriteBit1
RJMP ??OWI_SearchRom_10
// 147 else OWI_WriteBit0(pin);
??OWI_SearchRom_9:
MOV R16, R26
RCALL OWI_WriteBit0
// 148 currentBit++;
??OWI_SearchRom_10:
INC R24
// 149 bitMask <<= 1;
LSL R25
// 150 if (!bitMask)
TST R25
BREQ $+2+2
RJMP ??OWI_SearchRom_0
// 151 { bitMask = 0x01;
LDI R25, 1
// 152 bitPattern++;
LDI R16, 1
ADD R6, R16
LDI R16, 0
ADC R7, R16
RJMP ??OWI_SearchRom_0
// 153 }
// 154 }
// 155 return newDeviation;
??OWI_SearchRom_1:
MOV R16, R27
??OWI_SearchRom_3:
LD R24, Y+
LD R25, Y+
LD R26, Y+
LD R27, Y+
LD R4, Y+
LD R5, Y+
LD R6, Y+
LD R7, Y+
LD R8, Y+
ADIW R29:R28, 1
RET
// 156 }
// 157 //CRC8
RSEG CODE:CODE:NOROOT(1)
// 158 unsigned char OWI_ComputeCRC8(unsigned char inData, unsigned char seed)
OWI_ComputeCRC8:
// 159 { unsigned char bitsLeft;
MOV R19, R16
MOV R16, R20
// 160 unsigned char temp;
// 161 for (bitsLeft = 8; bitsLeft > 0; bitsLeft--)
LDI R17, 8
??OWI_ComputeCRC8_0:
CPI R17, 1
BRCS ??OWI_ComputeCRC8_1
// 162 { temp = ((seed ^ inData) & 0x01);
MOV R21, R16
ANDI R21, 0x01
MOV R18, R19
ANDI R18, 0x01
EOR R18, R21
ANDI R18, 0x01
MOV R20, R18
// 163 if (temp == 0) seed >>= 1;
TST R20
BRNE ??OWI_ComputeCRC8_2
LSR R16
RJMP ??OWI_ComputeCRC8_3
// 164 else
// 165 { seed ^= 0x18;
??OWI_ComputeCRC8_2:
LDI R18, 24
EOR R16, R18
// 166 seed >>= 1;
LSR R16
// 167 seed |= 0x80;
ORI R16, 0x80
// 168 }
// 169 inData >>= 1;
??OWI_ComputeCRC8_3:
LSR R19
// 170 }
DEC R17
RJMP ??OWI_ComputeCRC8_0
// 171 return seed;
??OWI_ComputeCRC8_1:
RET
// 172 }
// 173 //CRC16
RSEG CODE:CODE:NOROOT(1)
// 174 unsigned int OWI_ComputeCRC16(unsigned char inData, unsigned int seed)
OWI_ComputeCRC16:
// 175 { unsigned char bitsLeft;
MOV R19, R16
// 176 unsigned char temp;
// 177 for (bitsLeft = 8; bitsLeft > 0; bitsLeft--)
LDI R18, 8
??OWI_ComputeCRC16_0:
CPI R18, 1
BRCS ??OWI_ComputeCRC16_1
// 178 { temp = ((seed ^ inData) & 0x01);
MOV R17, R20
ANDI R17, 0x01
MOV R16, R19
ANDI R16, 0x01
EOR R16, R17
ANDI R16, 0x01
MOV R22, R16
// 179 if (temp == 0) seed >>= 1;
TST R22
BRNE ??OWI_ComputeCRC16_2
LSR R21
ROR R20
RJMP ??OWI_ComputeCRC16_3
// 180 else
// 181 { seed ^= 0x4002;
??OWI_ComputeCRC16_2:
LDI R16, 2
LDI R17, 64
EOR R20, R16
EOR R21, R17
// 182 seed >>= 1;
LSR R21
ROR R20
// 183 seed |= 0x8000;
ORI R21, 0x80
// 184 }
// 185 inData >>= 1;
??OWI_ComputeCRC16_3:
LSR R19
// 186 }
DEC R18
RJMP ??OWI_ComputeCRC16_0
// 187 return seed;
??OWI_ComputeCRC16_1:
MOVW R17:R16, R21:R20
RET
// 188 }
// 189 //ROM CRC
RSEG CODE:CODE:NOROOT(1)
// 190 unsigned char OWI_CheckRomCRC(unsigned char * romValue)
OWI_CheckRomCRC:
// 191 { unsigned char i;
ST -Y, R27
ST -Y, R26
ST -Y, R25
ST -Y, R24
MOVW R27:R26, R17:R16
// 192 unsigned char crc8 = 0;
LDI R25, 0
// 193 for (i = 0; i < 7; i++)
LDI R24, 0
??OWI_CheckRomCRC_0:
CPI R24, 7
BRCC ??OWI_CheckRomCRC_1
// 194 { crc8 = OWI_ComputeCRC8(*romValue, crc8);
MOV R20, R25
MOVW R31:R30, R27:R26
LD R16, Z
RCALL OWI_ComputeCRC8
MOV R25, R16
// 195 romValue++;
ADIW R27:R26, 1
// 196 }
INC R24
RJMP ??OWI_CheckRomCRC_0
// 197 if (crc8 == (*romValue)) return OWI_CRC_OK;
??OWI_CheckRomCRC_1:
LD R16, X
CP R25, R16
BRNE ??OWI_CheckRomCRC_2
LDI R16, 0
RJMP ??OWI_CheckRomCRC_3
// 198 return OWI_CRC_ERROR;
??OWI_CheckRomCRC_2:
LDI R16, 1
??OWI_CheckRomCRC_3:
LD R24, Y+
LD R25, Y+
LD R26, Y+
LD R27, Y+
RET
// 199 }
ASEGN ABSOLUTE:DATA:NOROOT,01cH
__?EECR:
ASEGN ABSOLUTE:DATA:NOROOT,01dH
__?EEDR:
ASEGN ABSOLUTE:DATA:NOROOT,01eH
__?EEARL:
ASEGN ABSOLUTE:DATA:NOROOT,01fH
__?EEARH:
END
// 200
// 201
// 202
// 203
// 204
//
// 3 bytes in segment ABSOLUTE
// 866 bytes in segment CODE
//
// 866 bytes of CODE memory
// 0 bytes of DATA memory (+ 3 bytes shared)
//
//Errors: none
//Warnings: 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -