📄 timer0.s
字号:
.module Timer0.c
.area data(ram, con, rel)
_InterruptFlag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile G:\Mega8程序\TCXO评估板\Main\Timer0.c
.dbsym e InterruptFlag _InterruptFlag c
.area vector(rom, abs)
.org 18
rjmp _timer0
.area data(ram, con, rel)
.dbfile G:\Mega8程序\TCXO评估板\Main\Timer0.c
.area lit(rom, con, rel)
L2:
.byte 0
.byte 0,0,0,0
.area text(rom, con, rel)
.dbfile G:\Mega8程序\TCXO评估板\Main\Timer0.c
.dbfunc e timer0 _timer0 fV
; strTemp -> y+0
; intTemp -> R20,R21
; i -> R22
; pStr -> R10,R11
.even
_timer0::
rcall push_lset
rcall push_gset3
sbiw R28,5
.dbline -1
.dbline 22
; /*************T/C0作为定时器,触发定时中断,来进行周期性的作业***************/
; #include<iom8v.h>
; #include <macros.h>
; extern unsigned int adc_rel;
; extern unsigned char adc_mux;
; extern void putchar(unsigned char c);
; extern void puts(char *s);
;
; extern unsigned char rom_read(unsigned int Address);
; extern void rom_write(unsigned int Address,unsigned char Data);
;
; extern unsigned char i2c_read(unsigned char RomAddress);
; extern void i2c_write(unsigned char Wdata,unsigned char RomAddress);
;
; extern unsigned int eeprom_addr;
; extern unsigned char eeprom_val;
;
; unsigned char InterruptFlag=0x00;//最小位为有AD转换数据发送请求,次位为UART口转换为普通IO口请求
;
; #pragma interrupt_handler timer0:10
; void timer0(void)
; {
.dbline 23
; unsigned char strTemp[5]={0},i;
ldi R24,<L2
ldi R25,>L2
movw R30,R28
ldi R16,5
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 24
; unsigned char *pStr=strTemp;
movw R24,R28
movw R10,R24
.dbline 26
; unsigned int intTemp;
; TIMSK&=0b11111110;
in R24,0x39
andi R24,254
out 0x39,R24
.dbline 27
; if(InterruptFlag&0b00000001)//如果有数据发送请求,则在定时中断中将数据发送出去。
lds R2,_InterruptFlag
sbrs R2,0
rjmp L3
.dbline 28
; {
.dbline 29
; pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
movw R24,R10
adiw R24,3
movw R10,R24
.dbline 30
; for(i=4;i!=0;i--)
ldi R22,4
rjmp L8
L5:
.dbline 31
.dbline 32
ldi R18,10
ldi R19,0
lds R16,_adc_rel
lds R17,_adc_rel+1
rcall mod16u
movw R24,R16
adiw R24,48
movw R30,R10
std z+0,R24
.dbline 33
ldi R18,10
ldi R19,0
lds R16,_adc_rel
lds R17,_adc_rel+1
rcall div16u
sts _adc_rel+1,R17
sts _adc_rel,R16
.dbline 34
movw R24,R10
sbiw R24,1
movw R10,R24
.dbline 35
L6:
.dbline 30
dec R22
L8:
.dbline 30
tst R22
brne L5
.dbline 36
; {
; *pStr=adc_rel%10+48;
; adc_rel/=10;
; pStr--;
; }
; pStr=strTemp;
movw R24,R28
movw R10,R24
.dbline 37
; puts(pStr);
movw R16,R24
rcall _puts
.dbline 38
; InterruptFlag&=0b11111110;
lds R24,_InterruptFlag
andi R24,254
sts _InterruptFlag,R24
.dbline 39
; }
rjmp L4
L3:
.dbline 41
;
; else if(InterruptFlag&0b00000010)//如果有EEPROM读请求,则在定时中断中将数据发送出去。
lds R2,_InterruptFlag
sbrs R2,1
rjmp L9
.dbline 42
; {
.dbline 43
; intTemp=(int)rom_read(eeprom_addr);//读取内部EEPROM数据
lds R16,_eeprom_addr
lds R17,_eeprom_addr+1
rcall _rom_read
mov R20,R16
clr R21
.dbline 46
; //intTemp=(int)i2c_read((unsigned char)eeprom_addr);//读取外部EEPROM数据
;
; pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
movw R24,R10
adiw R24,3
movw R10,R24
.dbline 47
; for(i=4;i!=0;i--)
ldi R22,4
rjmp L14
L11:
.dbline 48
.dbline 49
ldi R18,10
ldi R19,0
movw R16,R20
rcall mod16u
movw R24,R16
adiw R24,48
movw R30,R10
std z+0,R24
.dbline 50
ldi R18,10
ldi R19,0
movw R16,R20
rcall div16u
movw R20,R16
.dbline 51
movw R24,R10
sbiw R24,1
movw R10,R24
.dbline 52
L12:
.dbline 47
dec R22
L14:
.dbline 47
tst R22
brne L11
.dbline 53
; {
; *pStr=intTemp%10+48;
; intTemp/=10;
; pStr--;
; }
; pStr=strTemp;
movw R24,R28
movw R10,R24
.dbline 54
; puts(pStr);
movw R16,R24
rcall _puts
.dbline 55
; InterruptFlag&=0b11111101;
lds R24,_InterruptFlag
andi R24,253
sts _InterruptFlag,R24
.dbline 56
; }
rjmp L10
L9:
.dbline 58
;
; else if(InterruptFlag&0b00000100)//如果有EEPROM写请求,则在定时中断中将数据写入。
lds R2,_InterruptFlag
sbrs R2,2
rjmp L15
.dbline 59
; {
.dbline 62
;
; /*调试的目标程序行*/
; rom_write(eeprom_addr,eeprom_val);//写入内部EEPROM数据
lds R18,_eeprom_val
lds R16,_eeprom_addr
lds R17,_eeprom_addr+1
rcall _rom_write
.dbline 91
; //i2c_write(eeprom_val,(unsigned char)eeprom_addr);//写入外部EEPROM数据
;
; /***************以下内容为程序调试内容*************************
; puts("eeprom地址:");
; pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
; for(i=4;i!=0;i--)
; {
; *pStr=eeprom_addr%10+48;
; eeprom_addr/=10;
; pStr--;
; }
; pStr=strTemp;
; puts(pStr);
;
; puts("eeprom数据:");
; intTemp=(unsigned int)eeprom_val;
; pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
; for(i=4;i!=0;i--)
; {
; *pStr=intTemp%10+48;
; intTemp/=10;
; pStr--;
; }
; pStr=strTemp;
; puts(pStr);
; //**************以上内容为程序调试内容*************************/
;
;
; InterruptFlag&=0b11111011;
lds R24,_InterruptFlag
andi R24,251
sts _InterruptFlag,R24
.dbline 92
; }
L15:
L10:
L4:
.dbline 93
; TIMSK|=0x01;//Timer0中断允许
in R24,0x39
ori R24,1
out 0x39,R24
.dbline 94
; TCNT0=0x10;//预植16,定时30ms
ldi R24,16
out 0x32,R24
.dbline -2
L1:
adiw R28,5
rcall pop_gset3
rcall pop_lset
.dbline 0 ; func end
reti
.dbsym l strTemp 0 A[5:5]c
.dbsym r intTemp 20 i
.dbsym r i 22 c
.dbsym r pStr 10 pc
.dbend
.dbfunc e timer0_init _timer0_init fV
.even
_timer0_init::
.dbline -1
.dbline 97
; }
; void timer0_init(void)
; {
.dbline 98
; TIMSK|=0x01;//Timer0中断允许
in R24,0x39
ori R24,1
out 0x39,R24
.dbline 99
; TCCR0=0x04;//1024分频,8MHz、TCNT0=0x10下,每次中断大约1/8ms
ldi R24,4
out 0x33,R24
.dbline 100
; TCNT0=0x10;//预植16,累计计数240发生中断,定时30ms
ldi R24,16
out 0x32,R24
.dbline -2
L17:
.dbline 0 ; func end
ret
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -