⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 onewirei.s90

📁 Wind sensor for control speed air flow.
💻 S90
📖 第 1 页 / 共 2 页
字号:
        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 + -