📄 main.s
字号:
.area vector(rom, abs)
.org 20
jmp _Timer1Capture_Interrupt
.area text(rom, con, rel)
.dbfile E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\RS232通信协议应用设计\main.c
.dbfunc e Timer1Capture_Interrupt _Timer1Capture_Interrupt fV
; temp2 -> <dead>
; temp1 -> <dead>
.even
_Timer1Capture_Interrupt::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R24
st -y,R25
st -y,R30
in R0,0x3f
st -y,R0
xcall push_gset2
.dbline -1
.dbline 94
;
; //***************************************************************
; // Function : Timer1Capture_Interrupt
; // Input : none
; // Output : none
; // Description : ATmega16 T/C1-Capature ISR
; //***************************************************************
; #pragma interrupt_handler Timer1Capture_Interrupt:6
; void Timer1Capture_Interrupt(void)
; {
.dbline 98
; INT16U temp1,temp2;
;
; //Clear Interrupt Flag
; TIFR |= 0x20;
in R24,0x38
ori R24,32
out 0x38,R24
.dbline 100
; //Calculate Line Period
; wLineCaptureTimeLast = wLineCaptureTime;
lds R2,_wLineCaptureTime
lds R3,_wLineCaptureTime+1
sts _wLineCaptureTimeLast+1,R3
sts _wLineCaptureTimeLast,R2
.dbline 101
; wLineCaptureTime = ICR1;
in R2,0x26
in R3,0x27
sts _wLineCaptureTime+1,R3
sts _wLineCaptureTime,R2
.dbline 102
; wLinePeriodTemp = wLineCaptureTime - wLineCaptureTimeLast;
lds R2,_wLineCaptureTimeLast
lds R3,_wLineCaptureTimeLast+1
lds R4,_wLineCaptureTime
lds R5,_wLineCaptureTime+1
sub R4,R2
sbc R5,R3
sts _wLinePeriodTemp+1,R5
sts _wLinePeriodTemp,R4
.dbline 103
; if((wLinePeriodTemp >= 14285) && (wLinePeriodTemp <= 25000))
movw R24,R4
cpi R24,205
ldi R30,55
cpc R25,R30
brlo L13
ldi R24,25000
ldi R25,97
movw R2,R4
cp R24,R4
cpc R25,R5
brlo L13
.dbline 104
; {
.dbline 105
; wLinePeriod = wLinePeriodTemp;
sts _wLinePeriod+1,R3
sts _wLinePeriod,R2
.dbline 106
; }
L13:
.dbline 108
; //Acquire Line Volt Accumulation
; dwLineVoltSum = dwLineVoltSumTemp;
lds R4,_dwLineVoltSumTemp+2
lds R5,_dwLineVoltSumTemp+2+1
lds R2,_dwLineVoltSumTemp
lds R3,_dwLineVoltSumTemp+1
sts _dwLineVoltSum+1,R3
sts _dwLineVoltSum,R2
sts _dwLineVoltSum+2+1,R5
sts _dwLineVoltSum+2,R4
.dbline 109
; dwLineVoltSumTemp = 0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
sts _dwLineVoltSumTemp+1,R21
sts _dwLineVoltSumTemp,R20
sts _dwLineVoltSumTemp+2+1,R23
sts _dwLineVoltSumTemp+2,R22
.dbline 110
; bLineCnt = bLineCntTemp;
lds R2,_bLineCntTemp
sts _bLineCnt,R2
.dbline 111
; bLineCntTemp = 0;
clr R2
sts _bLineCntTemp,R2
.dbline 112
; bLine_Event = 1;
ldi R24,1
sts _bLine_Event,R24
.dbline -2
.dbline 113
; }
L12:
xcall pop_gset2
ld R0,y+
out 0x3f,R0
ld R30,y+
ld R25,y+
ld R24,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
.dbline 0 ; func end
reti
.dbsym l temp2 1 i
.dbsym l temp1 1 i
.dbend
.dbfunc e swRoot _swRoot fi
; ii -> R10
; dwSquareRoot -> y+0
; dwNumber -> y+10
.even
_swRoot::
xcall push_arg4
xcall push_gset3
sbiw R28,4
.dbline -1
.dbline 122
;
; //***************************************************************
; // Function : swRoot
; // Input : dwNumber
; // Output : Square Root of input
; // Description : Square Root Calculate
; //***************************************************************
; INT16U swRoot(INT32U dwNumber)
; {
.dbline 126
; INT8U ii;
; INT32U dwSquareRoot;
;
; if(dwNumber == 0)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L16
.dbline 127
; {
.dbline 128
; return (0);
clr R16
clr R17
xjmp L15
L16:
.dbline 130
; }
; if(dwNumber <= 4194304)
ldi R20,0
ldi R21,0
ldi R22,64
ldi R23,0
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brlo L18
.dbline 131
; {
.dbline 132
; dwSquareRoot = dwNumber / 1024 + 63;
ldi R24,10
ldi R25,0
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
movw R2,R16
movw R4,R18
ldi R20,63
ldi R21,0
ldi R22,0
ldi R23,0
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 133
; }
xjmp L19
L18:
.dbline 134
; else if(dwNumber <= 134217728)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,8
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brlo L20
.dbline 135
; {
.dbline 136
; dwSquareRoot = dwNumber / 4096 + 255;
ldi R24,12
ldi R25,0
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
movw R2,R16
movw R4,R18
ldi R20,255
ldi R21,0
ldi R22,0
ldi R23,0
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 137
; }
xjmp L21
L20:
.dbline 139
; else
; {
.dbline 140
; dwSquareRoot = dwNumber / 16384 + 1023;
ldi R24,14
ldi R25,0
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
movw R2,R16
movw R4,R18
ldi R20,255
ldi R21,3
ldi R22,0
ldi R23,0
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 141
; }
L21:
L19:
.dbline 142
; for (ii = 0;ii < 5;ii++)
clr R10
xjmp L25
L22:
.dbline 143
.dbline 144
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
ldd R6,z+10
ldd R7,z+11
ldd R8,z+12
ldd R9,z+13
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall div32u
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
lsr R5
ror R4
ror R3
ror R2
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 145
L23:
.dbline 142
inc R10
L25:
.dbline 142
mov R24,R10
cpi R24,5
brlo L22
.dbline 146
; {
; dwSquareRoot = (dwSquareRoot + dwNumber / dwSquareRoot) / 2;
; }
; return((INT16U)dwSquareRoot);
movw R30,R28
ldd R16,z+0
ldd R17,z+1
.dbline -2
L15:
adiw R28,4
xcall pop_gset3
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r ii 10 c
.dbsym l dwSquareRoot 0 l
.dbsym l dwNumber 10 l
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -