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

📄 timer.s

📁 ISD1700语音芯片放音的ISP实现
💻 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 + -