📄 tcxoboard.lst
字号:
__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 + -