📄 timer0.lis
字号:
.module Timer0.c
.area data(ram, con, rel)
0000 _InterruptFlag::
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 .dbfile G:\Mega8程序\TCXO评估板\Main\Timer0.c
0001 .dbsym e InterruptFlag _InterruptFlag c
.area vector(rom, abs)
.org 18
0012 00C0 rjmp _timer0
.area data(ram, con, rel)
0001 .dbfile G:\Mega8程序\TCXO评估板\Main\Timer0.c
.area lit(rom, con, rel)
0000 L2:
0000 00 .byte 0
0001 00000000 .byte 0,0,0,0
.area text(rom, con, rel)
0000 .dbfile G:\Mega8程序\TCXO评估板\Main\Timer0.c
0000 .dbfunc e timer0 _timer0 fV
0000 ; strTemp -> y+0
0000 ; intTemp -> R20,R21
0000 ; i -> R22
0000 ; pStr -> R10,R11
.even
0000 _timer0::
0000 00D0 rcall push_lset
0002 00D0 rcall push_gset3
0004 2597 sbiw R28,5
0006 .dbline -1
0006 .dbline 22
0006 ; /*************T/C0作为定时器,触发定时中断,来进行周期性的作业***************/
0006 ; #include<iom8v.h>
0006 ; #include <macros.h>
0006 ; extern unsigned int adc_rel;
0006 ; extern unsigned char adc_mux;
0006 ; extern void putchar(unsigned char c);
0006 ; extern void puts(char *s);
0006 ;
0006 ; extern unsigned char rom_read(unsigned int Address);
0006 ; extern void rom_write(unsigned int Address,unsigned char Data);
0006 ;
0006 ; extern unsigned char i2c_read(unsigned char RomAddress);
0006 ; extern void i2c_write(unsigned char Wdata,unsigned char RomAddress);
0006 ;
0006 ; extern unsigned int eeprom_addr;
0006 ; extern unsigned char eeprom_val;
0006 ;
0006 ; unsigned char InterruptFlag=0x00;//最小位为有AD转换数据发送请求,次位为UART口转换为普通IO口请求
0006 ;
0006 ; #pragma interrupt_handler timer0:10
0006 ; void timer0(void)
0006 ; {
0006 .dbline 23
0006 ; unsigned char strTemp[5]={0},i;
0006 80E0 ldi R24,<L2
0008 90E0 ldi R25,>L2
000A FE01 movw R30,R28
000C 05E0 ldi R16,5
000E 10E0 ldi R17,0
0010 FA93 st -y,R31
0012 EA93 st -y,R30
0014 9A93 st -y,R25
0016 8A93 st -y,R24
0018 00D0 rcall asgncblk
001A .dbline 24
001A ; unsigned char *pStr=strTemp;
001A CE01 movw R24,R28
001C 5C01 movw R10,R24
001E .dbline 26
001E ; unsigned int intTemp;
001E ; TIMSK&=0b11111110;
001E 89B7 in R24,0x39
0020 8E7F andi R24,254
0022 89BF out 0x39,R24
0024 .dbline 27
0024 ; if(InterruptFlag&0b00000001)//如果有数据发送请求,则在定时中断中将数据发送出去。
0024 20900000 lds R2,_InterruptFlag
0028 20FE sbrs R2,0
002A 2BC0 rjmp L3
002C .dbline 28
002C ; {
002C .dbline 29
002C ; pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
002C C501 movw R24,R10
002E 0396 adiw R24,3
0030 5C01 movw R10,R24
0032 .dbline 30
0032 ; for(i=4;i!=0;i--)
0032 64E0 ldi R22,4
0034 1AC0 rjmp L8
0036 L5:
0036 .dbline 31
0036 .dbline 32
0036 2AE0 ldi R18,10
0038 30E0 ldi R19,0
003A 00910000 lds R16,_adc_rel
003E 10910100 lds R17,_adc_rel+1
0042 00D0 rcall mod16u
0044 C801 movw R24,R16
0046 C096 adiw R24,48
0048 F501 movw R30,R10
004A 8083 std z+0,R24
004C .dbline 33
004C 2AE0 ldi R18,10
004E 30E0 ldi R19,0
0050 00910000 lds R16,_adc_rel
0054 10910100 lds R17,_adc_rel+1
0058 00D0 rcall div16u
005A 10930100 sts _adc_rel+1,R17
005E 00930000 sts _adc_rel,R16
0062 .dbline 34
0062 C501 movw R24,R10
0064 0197 sbiw R24,1
0066 5C01 movw R10,R24
0068 .dbline 35
0068 L6:
0068 .dbline 30
0068 6A95 dec R22
006A L8:
006A .dbline 30
006A 6623 tst R22
006C 21F7 brne L5
006E .dbline 36
006E ; {
006E ; *pStr=adc_rel%10+48;
006E ; adc_rel/=10;
006E ; pStr--;
006E ; }
006E ; pStr=strTemp;
006E CE01 movw R24,R28
0070 5C01 movw R10,R24
0072 .dbline 37
0072 ; puts(pStr);
0072 8C01 movw R16,R24
0074 00D0 rcall _puts
0076 .dbline 38
0076 ; InterruptFlag&=0b11111110;
0076 80910000 lds R24,_InterruptFlag
007A 8E7F andi R24,254
007C 80930000 sts _InterruptFlag,R24
0080 .dbline 39
0080 ; }
0080 3DC0 rjmp L4
0082 L3:
0082 .dbline 41
0082 ;
0082 ; else if(InterruptFlag&0b00000010)//如果有EEPROM读请求,则在定时中断中将数据发送出去。
0082 20900000 lds R2,_InterruptFlag
0086 21FE sbrs R2,1
0088 29C0 rjmp L9
008A .dbline 42
008A ; {
008A .dbline 43
008A ; intTemp=(int)rom_read(eeprom_addr);//读取内部EEPROM数据
008A 00910000 lds R16,_eeprom_addr
008E 10910100 lds R17,_eeprom_addr+1
0092 00D0 rcall _rom_read
0094 402F mov R20,R16
0096 5527 clr R21
0098 .dbline 46
0098 ; //intTemp=(int)i2c_read((unsigned char)eeprom_addr);//读取外部EEPROM数据
0098 ;
0098 ; pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
0098 C501 movw R24,R10
009A 0396 adiw R24,3
009C 5C01 movw R10,R24
009E .dbline 47
009E ; for(i=4;i!=0;i--)
009E 64E0 ldi R22,4
00A0 11C0 rjmp L14
00A2 L11:
00A2 .dbline 48
00A2 .dbline 49
00A2 2AE0 ldi R18,10
00A4 30E0 ldi R19,0
00A6 8A01 movw R16,R20
00A8 00D0 rcall mod16u
00AA C801 movw R24,R16
00AC C096 adiw R24,48
00AE F501 movw R30,R10
00B0 8083 std z+0,R24
00B2 .dbline 50
00B2 2AE0 ldi R18,10
00B4 30E0 ldi R19,0
00B6 8A01 movw R16,R20
00B8 00D0 rcall div16u
00BA A801 movw R20,R16
00BC .dbline 51
00BC C501 movw R24,R10
00BE 0197 sbiw R24,1
00C0 5C01 movw R10,R24
00C2 .dbline 52
00C2 L12:
00C2 .dbline 47
00C2 6A95 dec R22
00C4 L14:
00C4 .dbline 47
00C4 6623 tst R22
00C6 69F7 brne L11
00C8 .dbline 53
00C8 ; {
00C8 ; *pStr=intTemp%10+48;
00C8 ; intTemp/=10;
00C8 ; pStr--;
00C8 ; }
00C8 ; pStr=strTemp;
00C8 CE01 movw R24,R28
00CA 5C01 movw R10,R24
00CC .dbline 54
00CC ; puts(pStr);
00CC 8C01 movw R16,R24
00CE 00D0 rcall _puts
00D0 .dbline 55
00D0 ; InterruptFlag&=0b11111101;
00D0 80910000 lds R24,_InterruptFlag
00D4 8D7F andi R24,253
00D6 80930000 sts _InterruptFlag,R24
00DA .dbline 56
00DA ; }
00DA 10C0 rjmp L10
00DC L9:
00DC .dbline 58
00DC ;
00DC ; else if(InterruptFlag&0b00000100)//如果有EEPROM写请求,则在定时中断中将数据写入。
00DC 20900000 lds R2,_InterruptFlag
00E0 22FE sbrs R2,2
00E2 0CC0 rjmp L15
00E4 .dbline 59
00E4 ; {
00E4 .dbline 62
00E4 ;
00E4 ; /*调试的目标程序行*/
00E4 ; rom_write(eeprom_addr,eeprom_val);//写入内部EEPROM数据
00E4 20910000 lds R18,_eeprom_val
00E8 00910000 lds R16,_eeprom_addr
00EC 10910100 lds R17,_eeprom_addr+1
00F0 00D0 rcall _rom_write
00F2 .dbline 91
00F2 ; //i2c_write(eeprom_val,(unsigned char)eeprom_addr);//写入外部EEPROM数据
00F2 ;
00F2 ; /***************以下内容为程序调试内容*************************
00F2 ; puts("eeprom地址:");
00F2 ; pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
00F2 ; for(i=4;i!=0;i--)
00F2 ; {
00F2 ; *pStr=eeprom_addr%10+48;
00F2 ; eeprom_addr/=10;
00F2 ; pStr--;
00F2 ; }
00F2 ; pStr=strTemp;
00F2 ; puts(pStr);
00F2 ;
00F2 ; puts("eeprom数据:");
00F2 ; intTemp=(unsigned int)eeprom_val;
00F2 ; pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
00F2 ; for(i=4;i!=0;i--)
00F2 ; {
00F2 ; *pStr=intTemp%10+48;
00F2 ; intTemp/=10;
00F2 ; pStr--;
00F2 ; }
00F2 ; pStr=strTemp;
00F2 ; puts(pStr);
00F2 ; //**************以上内容为程序调试内容*************************/
00F2 ;
00F2 ;
00F2 ; InterruptFlag&=0b11111011;
00F2 80910000 lds R24,_InterruptFlag
00F6 8B7F andi R24,251
00F8 80930000 sts _InterruptFlag,R24
00FC .dbline 92
00FC ; }
00FC L15:
00FC L10:
00FC L4:
00FC .dbline 93
00FC ; TIMSK|=0x01;//Timer0中断允许
00FC 89B7 in R24,0x39
00FE 8160 ori R24,1
0100 89BF out 0x39,R24
0102 .dbline 94
0102 ; TCNT0=0x10;//预植16,定时30ms
0102 80E1 ldi R24,16
0104 82BF out 0x32,R24
0106 .dbline -2
0106 L1:
0106 2596 adiw R28,5
0108 00D0 rcall pop_gset3
010A 00D0 rcall pop_lset
010C .dbline 0 ; func end
010C 1895 reti
010E .dbsym l strTemp 0 A[5:5]c
010E .dbsym r intTemp 20 i
010E .dbsym r i 22 c
010E .dbsym r pStr 10 pc
010E .dbend
010E .dbfunc e timer0_init _timer0_init fV
.even
010E _timer0_init::
010E .dbline -1
010E .dbline 97
010E ; }
010E ; void timer0_init(void)
010E ; {
010E .dbline 98
010E ; TIMSK|=0x01;//Timer0中断允许
010E 89B7 in R24,0x39
0110 8160 ori R24,1
0112 89BF out 0x39,R24
0114 .dbline 99
0114 ; TCCR0=0x04;//1024分频,8MHz、TCNT0=0x10下,每次中断大约1/8ms
0114 84E0 ldi R24,4
0116 83BF out 0x33,R24
0118 .dbline 100
0118 ; TCNT0=0x10;//预植16,累计计数240发生中断,定时30ms
0118 80E1 ldi R24,16
011A 82BF out 0x32,R24
011C .dbline -2
011C L17:
011C .dbline 0 ; func end
011C 0895 ret
011E .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -