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

📄 tcxoboard.lst

📁 详细介绍M8两版间通讯
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
    002F E5CF      LDI	R28,0x5F
    0030 E0D4      LDI	R29,4
    0031 BFCD      OUT	0x3D,R28
    0032 BFDE      OUT	0x3E,R29
    0033 51C0      SUBI	R28,0x10
    0034 40D0      SBCI	R29,0
    0035 EA0A      LDI	R16,0xAA
    0036 8308      STD	Y+0,R16
    0037 2400      CLR	R0
    0038 E8EE      LDI	R30,0x8E
    0039 E0F0      LDI	R31,0
    003A E010      LDI	R17,0
    003B 39E6      CPI	R30,0x96
    003C 07F1      CPC	R31,R17
    003D F011      BEQ	0x0040
    003E 9201      ST	R0,Z+
    003F CFFB      RJMP	0x003B
    0040 8300      STD	Z+0,R16
    0041 E3E0      LDI	R30,0x30
    0042 E0F0      LDI	R31,0
    0043 E6A0      LDI	R26,0x60
    0044 E0B0      LDI	R27,0
    0045 E010      LDI	R17,0
    0046 35EE      CPI	R30,0x5E
    0047 07F1      CPC	R31,R17
    0048 F021      BEQ	0x004D
    0049 95C8      LPM
    004A 9631      ADIW	R30,1
    004B 920D      ST	R0,X+
    004C CFF9      RJMP	0x0046
    004D D001      RCALL	_main
_exit:
    004E CFFF      RJMP	_exit
_main:
  strTemp              --> Y+0
  i                    --> R22
  intTemp              --> R10
  pStr                 --> R20
    004F 9725      SBIW	R28,5
FILE: G:\Mega8程序\TCXO评估板\Main\Main.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) extern void timer0_init(void);
(0004) extern void pwm1_init(void);
(0005) extern void uart_init(void);
(0006) extern void adc_init(void);
(0007) extern void int_init(void);
(0008) extern void TWI_init(void);
(0009) 
(0010) extern void puts(char *s);
(0011) extern void putchar(unsigned char c);
(0012) 
(0013) extern unsigned char i2c_read(unsigned char RomAddress);
(0014) extern void i2c_write(unsigned char Wdata,unsigned char RomAddress);
(0015) 
(0016) unsigned char ExtendRomAddr,ExtendRomVal;//定义片外EEPROM
(0017) unsigned char ExtendRomRW=0b00000000;
(0018) void main(void)
(0019)  {
(0020)  	unsigned int intTemp;
(0021)  	unsigned char strTemp[5]={0},i;
    0050 E286      LDI	R24,0x26
    0051 E090      LDI	R25,0
    0052 01FE      MOVW	R30,R28
    0053 E005      LDI	R16,5
    0054 E010      LDI	R17,0
    0055 93FA      ST	R31,-Y
    0056 93EA      ST	R30,-Y
    0057 939A      ST	R25,-Y
    0058 938A      ST	R24,-Y
    0059 D40B      RCALL	asgncblk
(0022)  	unsigned char *pStr=strTemp;
    005A 01AE      MOVW	R20,R28
(0023) 	OSCCAL=0x8e;//内部振荡器校正字,需要使用Ponygrog测试
    005B E88E      LDI	R24,0x8E
    005C BF81      OUT	0x31,R24
(0024) 	//TCXO评估板上的TQFP上为0x8e,而DIP28的为0xa5
(0025) 	uart_init();//初始化USRART
    005D D132      RCALL	_uart_init
(0026) 	puts("欢迎进入TCXO评估板调试程序");
    005E E60E      LDI	R16,0x6E
    005F E010      LDI	R17,0
    0060 D11D      RCALL	_puts
(0027) 	timer0_init();//初始化定时器
    0061 D0D4      RCALL	_timer0_init
(0028) 	pwm1_init();//初始化PWM输出
    0062 D0DB      RCALL	_pwm1_init
(0029) 	adc_init();//初始化ADC
    0063 D0EE      RCALL	_adc_init
(0030) 	int_init();//int0,int1中断使能
    0064 D274      RCALL	_int_init
(0031) 	TWI_init();
    0065 D2CA      RCALL	_TWI_init
(0032) 	SEI();//开放全局中断
    0066 9478      BSET	7
(0033) 	OCR1A=655;//0.8v
    0067 E88F      LDI	R24,0x8F
    0068 E092      LDI	R25,2
    0069 BD9B      OUT	0x2B,R25
    006A BD8A      OUT	0x2A,R24
(0034) 	OCR1B=2459;//3v
    006B E98B      LDI	R24,0x9B
    006C E099      LDI	R25,0x9
    006D BD99      OUT	0x29,R25
    006E BD88      OUT	0x28,R24
(0035) 
(0036) 	i2c_write(0x12,0x11);//写入外部EEPROM数据
    006F E121      LDI	R18,0x11
    0070 E102      LDI	R16,0x12
    0071 D34D      RCALL	_i2c_write
(0037) 	puts("数据已经写入");
    0072 E601      LDI	R16,0x61
    0073 E010      LDI	R17,0
    0074 D109      RCALL	_puts
    0075 C036      RJMP	0x00AC
(0038) 	
(0039) 	/******************从机的数据发送尚未完成*************************************
(0040) 	intTemp=(int)i2c_read((unsigned char)intTemp);//读取外部EEPROM数据
(0041) 
(0042) 	pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
(0043) 	for(i=4;i!=0;i--)
(0044) 	 {
(0045) 		*pStr=intTemp%10+48;
(0046) 		intTemp/=10;
(0047) 		pStr--;
(0048) 	 }
(0049) 	pStr=strTemp;
(0050) 	puts(pStr);
(0051) 	puts("数据读完");
(0052) 	*****************************************************************************/
(0053) 	
(0054) 	while(1)
(0055) 	 {
(0056) 	 	if(ExtendRomRW&0b00000010)
    0076 90200060  LDS	R2,ExtendRomRW
    0078 FE21      SBRS	R2,1
    0079 C024      RJMP	0x009E
(0057) 	 	 {
(0058) 			intTemp=(int)i2c_read(ExtendRomAddr);//读取外部EEPROM数据
    007A 9100008F  LDS	R16,ExtendRomAddr
    007C D357      RCALL	_i2c_read
    007D 2EA0      MOV	R10,R16
    007E 24BB      CLR	R11
(0059) 
(0060) 			pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
    007F 5F4D      SUBI	R20,0xFD
    0080 4F5F      SBCI	R21,0xFF
(0061) 			for(i=4;i!=0;i--)
    0081 E064      LDI	R22,4
    0082 C010      RJMP	0x0093
(0062) 			 {
(0063) 				*pStr=intTemp%10+48;
    0083 E02A      LDI	R18,0xA
    0084 E030      LDI	R19,0
    0085 0185      MOVW	R16,R10
    0086 D35B      RCALL	mod16u
    0087 01C8      MOVW	R24,R16
    0088 96C0      ADIW	R24,0x30
    0089 01FA      MOVW	R30,R20
    008A 8380      STD	Z+0,R24
(0064) 				intTemp/=10;
    008B E02A      LDI	R18,0xA
    008C E030      LDI	R19,0
    008D 0185      MOVW	R16,R10
    008E D355      RCALL	div16u
    008F 0158      MOVW	R10,R16
(0065) 				pStr--;
    0090 5041      SUBI	R20,1
    0091 4050      SBCI	R21,0
    0092 956A      DEC	R22
    0093 2366      TST	R22
    0094 F771      BNE	0x0083
(0066) 			 }
(0067) 			pStr=strTemp;
    0095 01AE      MOVW	R20,R28
(0068) 			puts(pStr);
    0096 018A      MOVW	R16,R20
    0097 D0E6      RCALL	_puts
(0069) 			ExtendRomRW&=0b11111101;
    0098 91800060  LDS	R24,ExtendRomRW
    009A 7F8D      ANDI	R24,0xFD
    009B 93800060  STS	ExtendRomRW,R24
(0070) 	 	 }
    009D C00E      RJMP	0x00AC
(0071) 	 	else if(ExtendRomRW&0b00000100)
    009E 90200060  LDS	R2,ExtendRomRW
    00A0 FE22      SBRS	R2,2
    00A1 C00A      RJMP	0x00AC
(0072) 	 	 {
(0073) 	 	 	i2c_write(ExtendRomVal,ExtendRomAddr);//写入外部EEPROM数据
    00A2 9120008F  LDS	R18,ExtendRomAddr
    00A4 9100008E  LDS	R16,ExtendRomVal
    00A6 D318      RCALL	_i2c_write
(0074) 	 	 	ExtendRomRW&=0b11111011;
    00A7 91800060  LDS	R24,ExtendRomRW
    00A9 7F8B      ANDI	R24,0xFB
    00AA 93800060  STS	ExtendRomRW,R24
    00AC CFC9      RJMP	0x0076
    00AD 9625      ADIW	R28,5
    00AE 9508      RET
_timer0:
  strTemp              --> Y+0
  intTemp              --> R20
  i                    --> R22
  pStr                 --> R10
    00AF D387      RCALL	push_lset
    00B0 D37D      RCALL	push_gset3
    00B1 9725      SBIW	R28,5
FILE: G:\Mega8程序\TCXO评估板\Main\Timer0.c
(0001) /*************T/C0作为定时器,触发定时中断,来进行周期性的作业***************/
(0002) #include<iom8v.h>
(0003) #include <macros.h>
(0004) extern unsigned int adc_rel;
(0005) extern unsigned char adc_mux;
(0006) extern void putchar(unsigned char c);
(0007) extern void puts(char *s);
(0008) 
(0009) extern unsigned char rom_read(unsigned int Address);
(0010) extern void rom_write(unsigned int Address,unsigned  char Data);
(0011) 
(0012) extern unsigned char i2c_read(unsigned char RomAddress);
(0013) extern void i2c_write(unsigned char Wdata,unsigned char RomAddress);
(0014) 
(0015) extern unsigned int eeprom_addr;
(0016) extern unsigned char eeprom_val;
(0017) 
(0018) unsigned char InterruptFlag=0x00;//最小位为有AD转换数据发送请求,次位为UART口转换为普通IO口请求
(0019) 
(0020) #pragma interrupt_handler timer0:10
(0021) void timer0(void)
(0022)  {
(0023) 	unsigned char strTemp[5]={0},i;
    00B2 E28B      LDI	R24,0x2B
    00B3 E090      LDI	R25,0
    00B4 01FE      MOVW	R30,R28
    00B5 E005      LDI	R16,5
    00B6 E010      LDI	R17,0
    00B7 93FA      ST	R31,-Y
    00B8 93EA      ST	R30,-Y
    00B9 939A      ST	R25,-Y
    00BA 938A      ST	R24,-Y
    00BB D3A9      RCALL	asgncblk
(0024) 	unsigned char *pStr=strTemp;
    00BC 01CE      MOVW	R24,R28
    00BD 015C      MOVW	R10,R24
(0025) 	unsigned int intTemp;
(0026) 	TIMSK&=0b11111110;
    00BE B789      IN	R24,0x39
    00BF 7F8E      ANDI	R24,0xFE
    00C0 BF89      OUT	0x39,R24
(0027) 	if(InterruptFlag&0b00000001)//如果有数据发送请求,则在定时中断中将数据发送出去。
    00C1 90200089  LDS	R2,InterruptFlag
    00C3 FE20      SBRS	R2,0
    00C4 C02B      RJMP	0x00F0
(0028) 	 {
(0029) 		pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
    00C5 01C5      MOVW	R24,R10
    00C6 9603      ADIW	R24,3
    00C7 015C      MOVW	R10,R24
(0030) 		for(i=4;i!=0;i--)
    00C8 E064      LDI	R22,4
    00C9 C01A      RJMP	0x00E4
(0031) 		 {
(0032) 			*pStr=adc_rel%10+48;
    00CA E02A      LDI	R18,0xA
    00CB E030      LDI	R19,0
    00CC 9100008A  LDS	R16,adc_rel
    00CE 9110008B  LDS	R17,adc_rel+1
    00D0 D311      RCALL	mod16u
    00D1 01C8      MOVW	R24,R16
    00D2 96C0      ADIW	R24,0x30
    00D3 01F5      MOVW	R30,R10
    00D4 8380      STD	Z+0,R24
(0033) 			adc_rel/=10;
    00D5 E02A      LDI	R18,0xA
    00D6 E030      LDI	R19,0
    00D7 9100008A  LDS	R16,adc_rel
    00D9 9110008B  LDS	R17,adc_rel+1
    00DB D308      RCALL	div16u
    00DC 9310008B  STS	adc_rel+1,R17
    00DE 9300008A  STS	adc_rel,R16
(0034) 			pStr--;
    00E0 01C5      MOVW	R24,R10
    00E1 9701      SBIW	R24,1
    00E2 015C      MOVW	R10,R24
    00E3 956A      DEC	R22
    00E4 2366      TST	R22
    00E5 F721      BNE	0x00CA
(0035) 		 }
(0036) 		pStr=strTemp;
    00E6 01CE      MOVW	R24,R28
    00E7 015C      MOVW	R10,R24
(0037) 		puts(pStr);
    00E8 018C      MOVW	R16,R24
    00E9 D094      RCALL	_puts
(0038) 		InterruptFlag&=0b11111110;
    00EA 91800089  LDS	R24,InterruptFlag
    00EC 7F8E      ANDI	R24,0xFE
    00ED 93800089  STS	InterruptFlag,R24
(0039) 	 }
    00EF C03D      RJMP	0x012D
(0040) 
(0041) 	else if(InterruptFlag&0b00000010)//如果有EEPROM读请求,则在定时中断中将数据发送出去。
    00F0 90200089  LDS	R2,InterruptFlag
    00F2 FE21      SBRS	R2,1
    00F3 C029      RJMP	0x011D
(0042) 	 {
(0043) 	 	intTemp=(int)rom_read(eeprom_addr);//读取内部EEPROM数据
    00F4 91000091  LDS	R16,eeprom_addr
    00F6 91100092  LDS	R17,eeprom_addr+1
    00F8 D22E      RCALL	_rom_read
    00F9 2F40      MOV	R20,R16
    00FA 2755      CLR	R21
(0044) 	 	//intTemp=(int)i2c_read((unsigned char)eeprom_addr);//读取外部EEPROM数据
(0045) 
(0046) 		pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
    00FB 01C5      MOVW	R24,R10
    00FC 9603      ADIW	R24,3
    00FD 015C      MOVW	R10,R24
(0047) 		for(i=4;i!=0;i--)
    00FE E064      LDI	R22,4
    00FF C011      RJMP	0x0111
(0048) 		 {
(0049) 			*pStr=intTemp%10+48;
    0100 E02A      LDI	R18,0xA
    0101 E030      LDI	R19,0
    0102 018A      MOVW	R16,R20
    0103 D2DE      RCALL	mod16u
    0104 01C8      MOVW	R24,R16
    0105 96C0      ADIW	R24,0x30
    0106 01F5      MOVW	R30,R10
    0107 8380      STD	Z+0,R24
(0050) 			intTemp/=10;
    0108 E02A      LDI	R18,0xA
    0109 E030      LDI	R19,0
    010A 018A      MOVW	R16,R20
    010B D2D8      RCALL	div16u
    010C 01A8      MOVW	R20,R16
(0051) 			pStr--;
    010D 01C5      MOVW	R24,R10
    010E 9701      SBIW	R24,1
    010F 015C      MOVW	R10,R24
    0110 956A      DEC	R22
    0111 2366      TST	R22
    0112 F769      BNE	0x0100
(0052) 		 }
(0053) 		pStr=strTemp;
    0113 01CE      MOVW	R24,R28
    0114 015C      MOVW	R10,R24
(0054) 		puts(pStr);
    0115 018C      MOVW	R16,R24
    0116 D067      RCALL	_puts
(0055) 		InterruptFlag&=0b11111101;
    0117 91800089  LDS	R24,InterruptFlag
    0119 7F8D      ANDI	R24,0xFD
    011A 93800089  STS	InterruptFlag,R24
(0056) 	 }
    011C C010      RJMP	0x012D
(0057) 
(0058) 	else if(InterruptFlag&0b00000100)//如果有EEPROM写请求,则在定时中断中将数据写入。
    011D 90200089  LDS	R2,InterruptFlag
    011F FE22      SBRS	R2,2
    0120 C00C      RJMP	0x012D
(0059) 	 {
(0060) 
(0061) 		/*调试的目标程序行*/
(0062) 		rom_write(eeprom_addr,eeprom_val);//写入内部EEPROM数据
    0121 91200090  LDS	R18,eeprom_val
    0123 91000091  LDS	R16,eeprom_addr
    0125 91100092  LDS	R17,eeprom_addr+1
    0127 D1F7      RCALL	_rom_write
(0063) 		//i2c_write(eeprom_val,(unsigned char)eeprom_addr);//写入外部EEPROM数据
(0064) 
(0065) /***************以下内容为程序调试内容*************************
(0066) 	 	puts("eeprom地址:");
(0067) 		pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
(0068) 		for(i=4;i!=0;i--)
(0069) 		 {
(0070) 			*pStr=eeprom_addr%10+48;
(0071) 			eeprom_addr/=10;
(0072) 			pStr--;
(0073) 		 }
(0074) 		pStr=strTemp;
(0075) 		puts(pStr);
(0076) 
(0077) 	 	puts("eeprom数据:");
(0078) 	 	intTemp=(unsigned int)eeprom_val;
(0079) 		pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
(0080) 		for(i=4;i!=0;i--)
(0081) 		 {
(0082) 			*pStr=intTemp%10+48;
(0083) 			intTemp/=10;
(0084) 			pStr--;
(0085) 		 }
(0086) 		pStr=strTemp;
(0087) 		puts(pStr);
(0088) //**************以上内容为程序调试内容*************************/
(0089) 
(0090) 
(0091) 		InterruptFlag&=0b11111011;
    0128 91800089  LDS	R24,InterruptFlag
    012A 7F8B      ANDI	R24,0xFB
    012B 93800089  STS	InterruptFlag,R24
(0092) 	 }
(0093) 	TIMSK|=0x01;//Timer0中断允许
    012D B789      IN	R24,0x39
    012E 6081      ORI	R24,1
    012F BF89      OUT	0x39,R24
(0094) 	TCNT0=0x10;//预植16,定时30ms
    0130 E180      LDI	R24,0x10
    0131 BF82      OUT	0x32,R24
    0132 9625      ADIW	R28,5
    0133 D2DC      RCALL	pop_gset3
    0134 D319      RCALL	pop_lset
    0135 9518      RETI
(0095)  }
(0096) void timer0_init(void)
(0097)  {
(0098)  	TIMSK|=0x01;//Timer0中断允许
_timer0_init:
    0136 B789      IN	R24,0x39
    0137 6081      ORI	R24,1
    0138 BF89      OUT	0x39,R24
(0099) 	TCCR0=0x04;//1024分频,8MHz、TCNT0=0x10下,每次中断大约1/8ms
    0139 E084      LDI	R24,4
    013A BF83      OUT	0x33,R24
(0100) 	TCNT0=0x10;//预植16,累计计数240发生中断,定时30ms
    013B E180      LDI	R24,0x10
    013C BF82      OUT	0x32,R24
    013D 9508      RET
FILE: G:\Mega8程序\TCXO评估板\Main\PWM1.c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -