📄 timer.s
字号:
.module timer.c
.area text(rom, con, rel)
.dbfile E:\AVR\ISD1700_ISP\src\timer.c
.area data(ram, con, rel)
.dbfile E:\AVR\ISD1700_ISP\src\timer.c
_WdtTimer::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\AVR\ISD1700_ISP\src\timer.c
.dbsym e WdtTimer _WdtTimer c
_Timer1BaseClk::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile E:\AVR\ISD1700_ISP\src\timer.c
.dbsym e Timer1BaseClk _Timer1BaseClk i
.area text(rom, con, rel)
.dbfile E:\AVR\ISD1700_ISP\src\timer.c
.dbfunc e watchdog_init _watchdog_init fV
.even
_watchdog_init::
.dbline -1
.dbline 11
; #include <iom64v.h>
; #include <macros.h>
; #include "main.h"
;
; unsigned char WdtTimer = 0; //外部看门狗定时器
; volatile unsigned int Timer1BaseClk = 0; //Timer1基准时钟
;
; // 看门狗初始化函数
; // prescale: 512K cycles,overtime 417ms
; void watchdog_init(void)
; {
.dbline 12
; WDR(); //this prevents a timout on enabling
wdr
.dbline 13
; WDTCR = 0x18; //WDCE、WDE位置1,再改变超时时间
ldi R24,24
out 0x21,R24
.dbline 14
; WDTCR = 0x0D; //WATCHDOG ENABLED - dont forget to issue WDRs
ldi R24,13
out 0x21,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 22
; }
;
; //TIMER1 initialize - prescale:8
; // WGM: 0) Normal, TOP=0xFFFF
; // desired value: 2000Hz
; // actual value: 2000.000Hz (0.0%)
; void timer1_init(void)
; {
.dbline 23
; TCCR1B = 0x00; //stop
clr R2
out 0x2e,R2
.dbline 24
; TCNT1H = 0xFC; //setup
ldi R24,252
out 0x2d,R24
.dbline 25
; TCNT1L = 0x18;
ldi R24,24
out 0x2c,R24
.dbline 26
; OCR1AH = 0x03;
ldi R24,3
out 0x2b,R24
.dbline 27
; OCR1AL = 0xE8;
ldi R24,232
out 0x2a,R24
.dbline 28
; OCR1BH = 0x03;
ldi R24,3
out 0x29,R24
.dbline 29
; OCR1BL = 0xE8;
ldi R24,232
out 0x28,R24
.dbline 30
; OCR1CH = 0x03;
ldi R24,3
sts 121,R24
.dbline 31
; OCR1CL = 0xE8;
ldi R24,232
sts 120,R24
.dbline 32
; ICR1H = 0x03;
ldi R24,3
out 0x27,R24
.dbline 33
; ICR1L = 0xE8;
ldi R24,232
out 0x26,R24
.dbline 34
; TCCR1A = 0x00;
out 0x2f,R2
.dbline 35
; TCCR1B = 0x02; //start Timer
ldi R24,2
out 0x2e,R24
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 56
jmp _timer1_ovf_isr
.area text(rom, con, rel)
.dbfile E:\AVR\ISD1700_ISP\src\timer.c
.area data(ram, con, rel)
.dbfile E:\AVR\ISD1700_ISP\src\timer.c
L4:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\AVR\ISD1700_ISP\src\timer.c
.area text(rom, con, rel)
.dbfile E:\AVR\ISD1700_ISP\src\timer.c
.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
.dbsym s timer1int L4 c
.even
_timer1_ovf_isr::
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R24
st -y,R25
st -y,R26
st -y,R27
in R2,0x3f
st -y,R2
.dbline -1
.dbline 42
; }
;
; //-------------------------------------------------------------------------
;
; #pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
; void timer1_ovf_isr(void)
; {
.dbline 46
; //TIMER1 has overflowed
; static unsigned char timer1int = 0;
;
; TCNT1H = 0xFC; //reload counter high value
ldi R24,252
out 0x2d,R24
.dbline 47
; TCNT1L = 0x18; //reload counter low value
ldi R24,24
out 0x2c,R24
.dbline 49
;
; timer1int++;
lds R24,L4
subi R24,255 ; addi 1
sts L4,R24
.dbline 50
; if (timer1int >= 2)
cpi R24,2
brlo L5
X0:
.dbline 51
; {
.dbline 53
; //1ms
; timer1int = 0;
clr R2
sts L4,R2
.dbline 54
; Timer1BaseClk++;
lds R24,_Timer1BaseClk
lds R25,_Timer1BaseClk+1
adiw R24,1
sts _Timer1BaseClk+1,R25
sts _Timer1BaseClk,R24
.dbline 55
; if (Timer1BaseClk >= 60000)
ldi R24,96
ldi R25,234
ldi R26,0
ldi R27,0
lds R2,_Timer1BaseClk
lds R3,_Timer1BaseClk+1
clr R4
clr R5
cp R2,R24
cpc R3,R25
cpc R4,R26
cpc R5,R27
brlt L7
X1:
.dbline 56
; {
.dbline 57
; Timer1BaseClk = 0;
clr R2
clr R3
sts _Timer1BaseClk+1,R3
sts _Timer1BaseClk,R2
.dbline 58
; }
L7:
.dbline 60
;
; WdtTimer++;
lds R24,_WdtTimer
subi R24,255 ; addi 1
sts _WdtTimer,R24
.dbline 61
; }
L5:
.dbline -2
L3:
.dbline 0 ; func end
ld R2,y+
out 0x3f,R2
ld R27,y+
ld R26,y+
ld R25,y+
ld R24,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
reti
.dbend
.dbfunc e GetTime _GetTime fi
; iTime1 -> R18,R19
; iTime2 -> R16,R17
.even
_GetTime::
.dbline -1
.dbline 65
; }
;
; unsigned int GetTime(void)
; {
L10:
.dbline 67
; unsigned int iTime1,iTime2;
; do{
.dbline 68
; iTime1 = Timer1BaseClk;
lds R18,_Timer1BaseClk
lds R19,_Timer1BaseClk+1
.dbline 69
; iTime2 = Timer1BaseClk;
lds R16,_Timer1BaseClk
lds R17,_Timer1BaseClk+1
.dbline 70
; }while(iTime2 != iTime1);
L11:
.dbline 70
cp R16,R18
cpc R17,R19
brne L10
X2:
.dbline 71
; return iTime2;
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbsym r iTime1 18 i
.dbsym r iTime2 16 i
.dbend
.dbfunc e GetPassTime _GetPassTime fi
; temp_i -> R10,R11
; iCurTime -> R10,R11
; iPreTime -> R12,R13
.even
_GetPassTime::
xcall push_xgsetF03C
movw R12,R16
.dbline -1
.dbline 76
; }
; //-------------------------------------------------------------------------
;
; unsigned int GetPassTime(unsigned int iPreTime)
; {
.dbline 77
; unsigned int temp_i = 0;
.dbline 78
; unsigned int iCurTime = GetTime();
xcall _GetTime
movw R10,R16
.dbline 80
;
; if (iCurTime >= iPreTime)
cp R16,R12
cpc R17,R13
brlo L14
X3:
.dbline 81
; {
.dbline 82
; return (iCurTime - iPreTime);
sub R16,R12
sbc R17,R13
xjmp L13
L14:
.dbline 85
; }
; else
; {
.dbline 86
; return (60000 - iPreTime + iCurTime);
movw R2,R12
clr R4
clr R5
ldi R20,96
ldi R21,234
ldi R22,0
ldi R23,0
sub R20,R2
sbc R21,R3
sbc R22,R4
sbc R23,R5
movw R2,R10
clr R4
clr R5
add R20,R2
adc R21,R3
adc R22,R4
adc R23,R5
movw R16,R20
.dbline -2
L13:
.dbline 0 ; func end
xjmp pop_xgsetF03C
.dbsym r temp_i 10 i
.dbsym r iCurTime 10 i
.dbsym r iPreTime 12 i
.dbend
; }
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -