📄 onewirei.s90
字号:
//////////////////////////////////////////////////////////////////////////////
// /
// 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 + -