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

📄 onewirei.s90

📁 Wind sensor for control speed air flow.
💻 S90
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////////////
//                                                                           /
//                                                     14/Nov/2007  16:06:19 /
// IAR Atmel AVR C/C++ Compiler V4.12A/W32, Evaluation Version               /
// Copyright 1996-2005 IAR Systems. All rights reserved.                     /
//                                                                           /
//    Source file  =  D:\Work\Devices\WindSensor\Software\OneWireI.c         /
//    Command line =  D:\Work\Devices\WindSensor\Software\OneWireI.c         /
//                    --cpu=m8 -ms -o D:\Work\Devices\WindSensor\Software\De /
//                    bug\Obj\ -lB D:\Work\Devices\WindSensor\Software\Debug /
//                    \List\ --initializers_in_flash --version1_calls -s2    /
//                    --no_cse --no_inline --no_code_motion --no_cross_call  /
//                    --no_clustering --no_tbaa --debug                      /
//                    -DENABLE_BIT_DEFINITIONS -e -I "C:\Program Files\IAR   /
//                    Systems\Embedded Workbench 4.0 Evaluation\avr\INC\"    /
//                    -I "C:\Program Files\IAR Systems\Embedded Workbench    /
//                    4.0 Evaluation\avr\INC\CLIB\" --eeprom_size 512        /
//    List file    =  D:\Work\Devices\WindSensor\Software\Debug\List\OneWire /
//                    I.s90                                                  /
//                                                                           /
//                                                                           /
//////////////////////////////////////////////////////////////////////////////

        NAME OneWireI

        RSEG CSTACK:DATA:NOROOT(0)
        RSEG RSTACK:DATA:NOROOT(0)

        EXTERN ?Register_R4_is_cg_reg
        EXTERN ?Register_R5_is_cg_reg
        EXTERN ?Register_R6_is_cg_reg
        EXTERN ?Register_R7_is_cg_reg
        EXTERN ?Register_R8_is_cg_reg

        PUBLIC OWI_CheckRomCRC
        PUBLIC OWI_ComputeCRC16
        PUBLIC OWI_ComputeCRC8
        PUBLIC OWI_DetectPresence
        PUBLIC OWI_Init
        PUBLIC OWI_MatchRom
        PUBLIC OWI_ReadBit
        PUBLIC OWI_ReadRom
        PUBLIC OWI_ReceiveByte
        PUBLIC OWI_SearchRom
        PUBLIC OWI_SendByte
        PUBLIC OWI_SkipRom
        PUBLIC OWI_WriteBit0
        PUBLIC OWI_WriteBit1
        PUBWEAK _A_DDRD
        PUBWEAK _A_PIND
        PUBWEAK _A_PORTD
        PUBWEAK __?EEARH
        PUBWEAK __?EEARL
        PUBWEAK __?EECR
        PUBWEAK __?EEDR

// D:\Work\Devices\WindSensor\Software\OneWireI.c
//    1 /********************************************************************
//    2   OneWire module
//    3 ********************************************************************/
//    4 #include <iom8.h>

        ASEGN ABSOLUTE:DATA:NOROOT,030H
// union <unnamed> volatile __io _A_PIND
_A_PIND:
        DS 1

        ASEGN ABSOLUTE:DATA:NOROOT,031H
// union <unnamed> volatile __io _A_DDRD
_A_DDRD:
        DS 1

        ASEGN ABSOLUTE:DATA:NOROOT,032H
// union <unnamed> volatile __io _A_PORTD
_A_PORTD:
        DS 1
//    5 #include <ioavr.h>
//    6 #include <inavr.h>
//    7 #include <string.h>
//    8 #include "onewirei.h"
//    9 
//   10 //=============== OWI init =========================================

        RSEG CODE:CODE:NOROOT(1)
//   11 void OWI_Init(unsigned char pins)
OWI_Init:
//   12 { OWI_RELEASE_BUS(pins);
        MOV	R17, R16
        COM	R17
        IN	R18, 0x11
        AND	R18, R17
        OUT	0x11, R18
        IN	R17, 0x12
        OR	R17, R16
        OUT	0x12, R17
//   13   __delay_cycles(OWI_DELAY_H_STD_MODE);
        LDI	R18, 113
        LDI	R19, 3
        SUBI	R18, 1
        SBCI	R19, 0
        BRNE	$-4
//   14 }
        RET
//   15 //================== Write 1 ======================================

        RSEG CODE:CODE:NOROOT(1)
//   16 void OWI_WriteBit1(unsigned char pins)
OWI_WriteBit1:
//   17 { unsigned char intState;  
//   18   intState = __save_interrupt();
        IN	R18, 0x3F
        MOV	R17, R18
//   19   __disable_interrupt();
        CLI
//   20   OWI_PULL_BUS_LOW(pins);
        IN	R18, 0x11
        OR	R18, R16
        OUT	0x11, R18
        MOV	R18, R16
        COM	R18
        IN	R19, 0x12
        AND	R19, R18
        OUT	0x12, R19
//   21   __delay_cycles(OWI_DELAY_A_STD_MODE);
        LDI	R18, 10
        DEC	R18
        BRNE	$-2
        NOP
//   22   OWI_RELEASE_BUS(pins);
        MOV	R18, R16
        COM	R18
        IN	R19, 0x11
        AND	R19, R18
        OUT	0x11, R19
        IN	R18, 0x12
        OR	R18, R16
        OUT	0x12, R18
//   23   __delay_cycles(OWI_DELAY_B_STD_MODE);
        LDI	R18, 152
        DEC	R18
        BRNE	$-2
        RJMP	$+2
//   24   __restore_interrupt(intState);
        OUT	0x3F, R17
//   25 }
        RET
//   26 //================== Write 0 ======================================

        RSEG CODE:CODE:NOROOT(1)
//   27 void OWI_WriteBit0(unsigned char pins)
OWI_WriteBit0:
//   28 { unsigned char intState;
//   29   intState = __save_interrupt();
        IN	R18, 0x3F
        MOV	R17, R18
//   30   __disable_interrupt();
        CLI
//   31   OWI_PULL_BUS_LOW(pins);
        IN	R18, 0x11
        OR	R18, R16
        OUT	0x11, R18
        MOV	R18, R16
        COM	R18
        IN	R19, 0x12
        AND	R19, R18
        OUT	0x12, R19
//   32   __delay_cycles(OWI_DELAY_C_STD_MODE);
        LDI	R18, 143
        DEC	R18
        BRNE	$-2
//   33   OWI_RELEASE_BUS(pins);
        MOV	R18, R16
        COM	R18
        IN	R19, 0x11
        AND	R19, R18
        OUT	0x11, R19
        IN	R18, 0x12
        OR	R18, R16
        OUT	0x12, R18
//   34   __delay_cycles(OWI_DELAY_D_STD_MODE);
        LDI	R18, 20
        DEC	R18
        BRNE	$-2
//   35   __restore_interrupt(intState);
        OUT	0x3F, R17
//   36 }
        RET
//   37 //================== Read bit ====================================

        RSEG CODE:CODE:NOROOT(1)
//   38 unsigned char OWI_ReadBit(unsigned char pins)
OWI_ReadBit:
//   39 { unsigned char intState;
        MOV	R17, R16
//   40   unsigned char bitsRead;
//   41   intState = __save_interrupt();
        IN	R19, 0x3F
        MOV	R18, R19
//   42   __disable_interrupt();
        CLI
//   43   OWI_PULL_BUS_LOW(pins);
        IN	R19, 0x11
        OR	R19, R17
        OUT	0x11, R19
        MOV	R19, R17
        COM	R19
        IN	R20, 0x12
        AND	R20, R19
        OUT	0x12, R20
//   44   __delay_cycles(OWI_DELAY_A_STD_MODE);
        LDI	R19, 10
        DEC	R19
        BRNE	$-2
        NOP
//   45   OWI_RELEASE_BUS(pins);
        MOV	R19, R17
        COM	R19
        IN	R20, 0x11
        AND	R20, R19
        OUT	0x11, R20
        IN	R19, 0x12
        OR	R19, R17
        OUT	0x12, R19
//   46   __delay_cycles(OWI_DELAY_E_STD_MODE);
        LDI	R19, 17
        DEC	R19
        BRNE	$-2
        RJMP	$+2
//   47   bitsRead = OWI_PIN & pins;
        IN	R19, 0x10
        AND	R19, R17
        MOV	R16, R19
//   48   __delay_cycles(OWI_DELAY_F_STD_MODE);
        LDI	R19, 130
        DEC	R19
        BRNE	$-2
        RJMP	$+2
//   49   __restore_interrupt(intState);
        OUT	0x3F, R18
//   50   return bitsRead;
        RET
//   51 }
//   52 //================== Detect device ===============================

        RSEG CODE:CODE:NOROOT(1)
//   53 unsigned char OWI_DetectPresence(unsigned char pins)
OWI_DetectPresence:
//   54 { unsigned char intState;
        MOV	R17, R16
//   55   unsigned char presenceDetected;
//   56   intState = __save_interrupt();
        IN	R19, 0x3F
        MOV	R18, R19
//   57   __disable_interrupt();
        CLI
//   58   OWI_PULL_BUS_LOW(pins);
        IN	R19, 0x11
        OR	R19, R17
        OUT	0x11, R19
        MOV	R19, R17
        COM	R19
        IN	R20, 0x12
        AND	R20, R19
        OUT	0x12, R20
//   59   __delay_cycles(OWI_DELAY_H_STD_MODE);
        LDI	R20, 113
        LDI	R21, 3
        SUBI	R20, 1
        SBCI	R21, 0
        BRNE	$-4
//   60   OWI_RELEASE_BUS(pins);
        MOV	R19, R17
        COM	R19
        IN	R20, 0x11
        AND	R20, R19
        OUT	0x11, R20
        IN	R19, 0x12
        OR	R19, R17
        OUT	0x12, R19
//   61   __delay_cycles(OWI_DELAY_I_STD_MODE);
        LDI	R19, 167
        DEC	R19
        BRNE	$-2
        RJMP	$+2
//   62   presenceDetected = ((~OWI_PIN) & pins);
        IN	R19, 0x10
        COM	R19
        AND	R19, R17
        MOV	R16, R19
//   63   __delay_cycles(OWI_DELAY_J_STD_MODE);
        LDI	R20, 240
        LDI	R21, 2
        SUBI	R20, 1
        SBCI	R21, 0
        BRNE	$-4
//   64   __restore_interrupt(intState);
        OUT	0x3F, R18
//   65   return presenceDetected;
        RET
//   66 }
//   67 //================== Send byte ==================================

        RSEG CODE:CODE:NOROOT(1)
//   68 void OWI_SendByte(unsigned char data, unsigned char pins)
OWI_SendByte:
//   69 { unsigned char temp;
        ST	-Y, R27
        ST	-Y, R26
        ST	-Y, R25
        ST	-Y, R24
        MOV	R26, R16
        MOV	R25, R20
//   70   unsigned char i;
//   71   for (i = 0; i < 8; i++)
        LDI	R24, 0
??OWI_SendByte_0:
        CPI	R24, 8
        BRCC	??OWI_SendByte_1
//   72   { temp = data & 0x01;
        MOV	R16, R26
        ANDI	R16, 0x01
        MOV	R27, R16
//   73     if (temp)
        TST	R27
        BREQ	??OWI_SendByte_2
//   74     { OWI_WriteBit1(pins);
        MOV	R16, R25
        RCALL	OWI_WriteBit1
        RJMP	??OWI_SendByte_3
//   75     }
//   76     else
//   77     { OWI_WriteBit0(pins);
??OWI_SendByte_2:
        MOV	R16, R25
        RCALL	OWI_WriteBit0
//   78     }
//   79     data >>= 1;
??OWI_SendByte_3:
        LSR	R26
//   80   }
        INC	R24
        RJMP	??OWI_SendByte_0
//   81 }
??OWI_SendByte_1:
        LD	R24, Y+
        LD	R25, Y+
        LD	R26, Y+
        LD	R27, Y+
        RET
//   82 //================== Read byte ==================================

        RSEG CODE:CODE:NOROOT(1)
//   83 unsigned char OWI_ReceiveByte(unsigned char pin)
OWI_ReceiveByte:
//   84 { unsigned char data;
        ST	-Y, R26
        ST	-Y, R25
        ST	-Y, R24
        MOV	R26, R16
//   85   unsigned char i;
//   86   data = 0x00;
        LDI	R25, 0
//   87   for (i = 0; i < 8; i++)
        LDI	R24, 0
??OWI_ReceiveByte_0:
        CPI	R24, 8
        BRCC	??OWI_ReceiveByte_1
//   88   { data >>= 1;
        LSR	R25
//   89     if (OWI_ReadBit(pin)) data |= 0x80;
        MOV	R16, R26
        RCALL	OWI_ReadBit
        TST	R16
        BREQ	??OWI_ReceiveByte_2
        ORI	R25, 0x80
//   90   }
??OWI_ReceiveByte_2:
        INC	R24
        RJMP	??OWI_ReceiveByte_0
//   91   return data;
??OWI_ReceiveByte_1:
        MOV	R16, R25
        LD	R24, Y+
        LD	R25, Y+
        LD	R26, Y+
        RET
//   92 }
//   93 //================= Skip ROM ===================================

        RSEG CODE:CODE:NOROOT(1)
//   94 void OWI_SkipRom(unsigned char pins)
OWI_SkipRom:
//   95 { OWI_SendByte(OWI_ROM_SKIP, pins);
        ST	-Y, R24
        MOV	R24, R16
        MOV	R20, R24
        LDI	R16, 204
        RCALL	OWI_SendByte
//   96 }
        LD	R24, Y+
        RET
//   97 //================= Read ROM ==================================

        RSEG CODE:CODE:NOROOT(1)
//   98 void OWI_ReadRom(unsigned char * romValue, unsigned char pin)
OWI_ReadRom:
//   99 { unsigned char bytesLeft = 8;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -