📄 output.lst
字号:
__start:
__text_start:
0084 EFCF LDI R28,0xFF
0085 E1D0 LDI R29,0x10
0086 BFCD OUT 0x3D,R28
0087 BFDE OUT 0x3E,R29
0088 51C0 SUBI R28,0x10
0089 40D0 SBCI R29,0
008A EA0A LDI R16,0xAA
008B 8308 STD Y+0,R16
008C 2400 CLR R0
008D E7EB LDI R30,0x7B
008E E0F1 LDI R31,1
008F E013 LDI R17,3
0090 38E0 CPI R30,0x80
0091 07F1 CPC R31,R17
0092 F011 BEQ 0x0095
0093 9201 ST R0,Z+
0094 CFFB RJMP 0x0090
0095 8300 STD Z+0,R16
0096 E8EC LDI R30,0x8C
0097 E0F0 LDI R31,0
0098 E0A0 LDI R26,0
0099 E0B1 LDI R27,1
009A E011 LDI R17,1
009B 30E7 CPI R30,7
009C 07F1 CPC R31,R17
009D F021 BEQ 0x00A2
009E 95C8 LPM
009F 9631 ADIW R30,1
00A0 920D ST R0,X+
00A1 CFF9 RJMP 0x009B
00A2 940E044A CALL _main
_exit:
00A4 CFFF RJMP _exit
FILE: D:\excersize\output.c
(0001) //======================================================调机自动化控车程序
(0002) //ICC-AVR application builder : 2006-9-2 0:12:00
(0003) // Target : M128
(0004) // Crystal: 16.000Mhz
(0005) //======================================================包含文件
(0006) #include <iom128v.h>
(0007) #include <macros.h>
(0008) #include <D:\excersize\output.h>
(0009) //======================================================定义外部固定地址变量CAN,IO
(0010) //define mappings
(0011) void mapping_init(void)
(0012) {
(0013) asm(
_mapping_init:
00A5 9508 RET
(0014) ".area memory(abs)\n"
(0015) ".org 0xD000\n"
(0016) " _CAN0Addr:: .blkb 50\n"
(0017) ".org 0xE000\n"
(0018) " _CAN1Addr:: .blkb 50\n"
(0019) ".org 0xF000\n"
(0020) " _IOAddr:: .blkb 50\n"
(0021) ".text\n"
(0022) );
(0023) }
(0024) //======================================================控制器IO口定义
(0025) void port_init(void)
(0026) {
(0027) PORTA = 0x00;
_port_init:
00A6 2422 CLR R2
00A7 BA2B OUT 0x1B,R2
(0028) DDRA = 0x00;
00A8 BA2A OUT 0x1A,R2
(0029) PORTB = 0xFF;
00A9 EF8F LDI R24,0xFF
00AA BB88 OUT 0x18,R24
(0030) DDRB = 0xFF;
00AB BB87 OUT 0x17,R24
(0031) PORTC = 0xFF; //m103 output only
00AC BB85 OUT 0x15,R24
(0032) DDRC = 0xFF;
00AD BB84 OUT 0x14,R24
(0033) PORTD = 0xFF;
00AE BB82 OUT 0x12,R24
(0034) DDRD = 0xF0;
00AF EF80 LDI R24,0xF0
00B0 BB81 OUT 0x11,R24
(0035) PORTE = 0xFF;
00B1 EF8F LDI R24,0xFF
00B2 B983 OUT 0x03,R24
(0036) DDRE = 0x08;
00B3 E088 LDI R24,0x8
00B4 B982 OUT 0x02,R24
(0037) PORTF = 0xFC;
00B5 EF8C LDI R24,0xFC
00B6 93800062 STS 0x62,R24
(0038) DDRF = 0x0C;
00B8 E08C LDI R24,0xC
00B9 93800061 STS 0x61,R24
(0039) PORTG = 0x1F;
00BB E18F LDI R24,0x1F
00BC 93800065 STS 0x65,R24
(0040) DDRG = 0x00;
00BE 92200064 STS 0x64,R2
00C0 9508 RET
(0041) }
(0042) //======================================================内部看门狗初始化
(0043) //Watchdog initialisation
(0044) // prescale: 2048K cycles
(0045) void watchdog_init(void)
(0046) {
(0047) WDR(); //this prevents a timout on enabling//
_watchdog_init:
00C1 95A8 WDR
(0048) WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
00C2 E08F LDI R24,0xF
00C3 BD81 OUT 0x21,R24
00C4 9508 RET
(0049) }
(0050)
(0051)
(0052) //======================================================串口初始化
(0053) //UART0 initialisation
(0054) // desired baud rate:38400
(0055) // actual baud rate:38462 (0.2%)
(0056) // char size: 8 bit
(0057) // parity: Disabled
(0058)
(0059) void uart0_init(void)
(0060) {
(0061) UCSR0B = 0x00; //disable while setting baud rate
_uart0_init:
00C5 2422 CLR R2
00C6 B82A OUT 0x0A,R2
(0062) UCSR0A = 0x00;
00C7 B82B OUT 0x0B,R2
(0063) UCSR0C = 0x06;
00C8 E086 LDI R24,6
00C9 93800095 STS 0x95,R24
(0064) UBRR0L = 0x19; //set baud rate lo
00CB E189 LDI R24,0x19
00CC B989 OUT 0x09,R24
(0065) UBRR0H = 0x00; //set baud rate hi
00CD 92200090 STS 0x90,R2
(0066) UCSR0B = 0xB8;
00CF EB88 LDI R24,0xB8
00D0 B98A OUT 0x0A,R24
00D1 9508 RET
_uart0_udre_isr:
00D2 922A ST R2,-Y
00D3 923A ST R3,-Y
00D4 938A ST R24,-Y
00D5 939A ST R25,-Y
00D6 93EA ST R30,-Y
00D7 93FA ST R31,-Y
00D8 B62F IN R2,0x3F
00D9 922A ST R2,-Y
(0067) }
(0068)
(0069)
(0070) //======================================================串口0发送中断
(0071) #pragma interrupt_handler uart0_udre_isr:20
(0072) void uart0_udre_isr(void){
(0073) if(TxOperateSp0!=TxLoadSp0){
00DA 9020027C LDS R2,TxLoadSp0
00DC 9030027B LDS R3,TxOperateSp0
00DE 1432 CP R3,R2
00DF F071 BEQ 0x00EE
(0074) UDR0=TxBuffer0[TxLoadSp0++];
00E0 2433 CLR R3
00E1 2D82 MOV R24,R2
00E2 5F8F SUBI R24,0xFF
00E3 9380027C STS TxLoadSp0,R24
00E5 E78D LDI R24,0x7D
00E6 E092 LDI R25,2
00E7 2DE2 MOV R30,R2
00E8 27FF CLR R31
00E9 0FE8 ADD R30,R24
00EA 1FF9 ADC R31,R25
00EB 8020 LDD R2,Z+0
00EC B82C OUT 0x0C,R2
(0075) }
00ED C003 RJMP 0x00F1
(0076) else{UCSR0B&=0XDF;}
00EE B18A IN R24,0x0A
00EF 7D8F ANDI R24,0xDF
00F0 B98A OUT 0x0A,R24
00F1 9029 LD R2,Y+
00F2 BE2F OUT 0x3F,R2
00F3 91F9 LD R31,Y+
00F4 91E9 LD R30,Y+
00F5 9199 LD R25,Y+
00F6 9189 LD R24,Y+
00F7 9039 LD R3,Y+
00F8 9029 LD R2,Y+
00F9 9518 RETI
(0077)
(0078) }
(0079)
(0080)
(0081) //======================================================time0 初始化
(0082) //TIMER0 initialisation - prescale:32
(0083) // WGM: Normal
(0084) // desired value: 1KHz
(0085) // actual value: 1.000KHz (0.0%)
(0086) void timer0_init(void){
(0087) TCCR0 = 0x00; //stop
_timer0_init:
00FA 2422 CLR R2
00FB BE23 OUT 0x33,R2
(0088) ASSR = 0x00; //set async mode//同步方式,允许更新计数,比较输出,控制寄存器
00FC BE20 OUT 0x30,R2
(0089) TCNT0 = 0x83; //set count
00FD E883 LDI R24,0x83
00FE BF82 OUT 0x32,R24
(0090) OCR0 = 0x7D;
00FF E78D LDI R24,0x7D
0100 BF81 OUT 0x31,R24
(0091) TCCR0 = 0x05; //start timer//128分频
0101 E085 LDI R24,5
0102 BF83 OUT 0x33,R24
0103 9508 RET
_timer0_comp_isr:
0104 938A ST R24,-Y
0105 939A ST R25,-Y
0106 B78F IN R24,0x3F
0107 938A ST R24,-Y
(0092) }
(0093) //======================================================time0 中断
(0094) #pragma interrupt_handler timer0_comp_isr:16
(0095) void timer0_comp_isr(void){
(0096) TCNT0 = 0x83;
0108 E883 LDI R24,0x83
0109 BF82 OUT 0x32,R24
(0097) T0Count0++;
010A 91800175 LDS R24,T0Count0
010C 91900176 LDS R25,T0Count0+1
010E 9601 ADIW R24,1
010F 93900176 STS T0Count0+1,R25
0111 93800175 STS T0Count0,R24
0113 9189 LD R24,Y+
0114 BF8F OUT 0x3F,R24
0115 9199 LD R25,Y+
0116 9189 LD R24,Y+
0117 9518 RETI
(0098) // T0Count1++;
(0099) // T0Count2++;
(0100) // T0Count3++;
(0101) // T0Count4++;
(0102) //compare occured TCNT0=OCR0
(0103) }
(0104) //======================================================速度中断处理函数
(0105)
(0106) //======================================================CPU初始化
(0107) //call this routine to initialise all peripherals
(0108) void init_devices(void)
(0109) {
(0110) //stop errant interrupts until set up
(0111) CLI(); //disable all interrupts
_init_devices:
0118 94F8 BCLR 7
(0112) XDIV = 0x00; //xtal divider//系统时钟分频控制寄存器
0119 2422 CLR R2
011A BE2C OUT 0x3C,R2
(0113) XMCRA = 0x0E; //external memory//外部存储器控制寄存器
011B E08E LDI R24,0xE
011C 9380006D STS 0x6D,R24
(0114) XMCRB = 0x80;
011E E880 LDI R24,0x80
011F 9380006C STS 0x6C,R24
(0115) mapping_init();
0121 DF83 RCALL _mapping_init
(0116) port_init();
0122 DF83 RCALL _port_init
(0117) //watchdog_init();
(0118) // timer1_init();
(0119) timer0_init();
0123 DFD6 RCALL _timer0_init
(0120)
(0121) //adc_init();
(0122)
(0123) MCUCR = 0xC0;//MCU控制寄存器
0124 EC80 LDI R24,0xC0
0125 BF85 OUT 0x35,R24
(0124) EICRA = 0x0A; //extended ext ints//外部中断控制寄存器
0126 E08A LDI R24,0xA
0127 9380006A STS 0x6A,R24
(0125) EICRB = 0x0F; //extended ext ints
0129 E08F LDI R24,0xF
012A BF8A OUT 0x3A,R24
(0126) EIMSK = 0x33; //0x03 extended ext enable
012B E383 LDI R24,0x33
012C BF89 OUT 0x39,R24
(0127) TIMSK = 0x12; //timer interrupt sources 01:time0
012D E182 LDI R24,0x12
012E BF87 OUT 0x37,R24
(0128) ETIMSK = 0x00; //extended timer interrupt sources
012F 2422 CLR R2
0130 9220007D STS 0x7D,R2
(0129) uart0_init();
0132 DF92 RCALL _uart0_init
(0130) SEI(); //re-enable interrupts
0133 9478 BSET 7
0134 9508 RET
(0131) // MyselfCan0Addr=1;
(0132) // MyselfCan1Addr=2;
(0133) }
(0134) //======================================================看门狗处理函数
(0135) void WatchDog(void){
(0136) DDRE|= 0x08;
_WatchDog:
0135 9A13 SBI 0x02,3
(0137) PORTE&= 0xF7;
0136 B183 IN R24,0x03
0137 7F87 ANDI R24,0xF7
0138 B983 OUT 0x03,R24
(0138) PORTE|= 0x08;
0139 9A1B SBI 0x03,3
(0139) PORTE&= 0xF7;
013A B183 IN R24,0x03
013B 7F87 ANDI R24,0xF7
013C B983 OUT 0x03,R24
(0140) PORTE|= 0x08;
013D 9A1B SBI 0x03,3
(0141) PORTE&= 0xF7;
013E B183 IN R24,0x03
013F 7F87 ANDI R24,0xF7
0140 B983 OUT 0x03,R24
(0142) PORTE|= 0x08;
0141 9A1B SBI 0x03,3
(0143) WDR();
0142 95A8 WDR
0143 9508 RET
(0144) }
(0145)
(0146)
(0147)
(0148) //===============================================初始设置
(0149) void set_value(void){
(0150)
(0151) // V_average_incept.Word=0;
(0152) // Cr_average_incept.Word=0;
(0153) OutputByte0Reg = 255;
_set_value:
0144 EF8F LDI R24,0xFF
0145 9380037F STS OutputByte0Reg,R24
(0154) OutputByte1Reg = 255;
0147 9380037E STS OutputByte1Reg,R24
(0155) OutputByte2Reg = 255;
0149 9380037D STS OutputByte2Reg,R24
014B 9508 RET
_tx0_int_to_bcd:
head --> R22
j --> R10
i --> R20
014C 940E04AF CALL push_gset3
014E 01A8 MOVW R20,R16
(0156) }
(0157)
(0158)
(0159) //将int型变量转换为bcd码,并填充到TxBuffer0[]中
(0160) /********************************************************************************/
(0161) void tx0_int_to_bcd(int i)
(0162) {
(0163) UC j,head=0;
014F 2766 CLR R22
(0164) if(i<0){
0150 3040 CPI R20,0
0151 E0E0 LDI R30,0
0152 075E CPC R21,R30
0153 F49C BGE 0x0167
(0165) i=-i;
0154 9540 COM R20
0155 9550 COM R21
0156 5F4F SUBI R20,0xFF
0157 4F5F SBCI R21,0xFF
(0166) TxBuffer0[TxOperateSp0++]='-';
0158 9020027B LDS R2,TxOperateSp0
015A 2433 CLR R3
015B 2D82 MOV R24,R2
015C 5F8F SUBI R24,0xFF
015D 9380027B STS TxOperateSp0,R24
015F E78D LDI R24,0x7D
0160 E092 LDI R25,2
0161 2DE2 MOV R30,R2
0162 27FF CLR R31
0163 0FE8 ADD R30,R24
0164 1FF9 ADC R31,R25
0165 E28D LDI R24,0x2D
0166 8380 STD Z+0,R24
(0167) }
(0168) j=i/10000;i%=10000;if(j){TxBuffer0[TxOperateSp0++]=j+0x30;head=1;}
0167 E120 LDI R18,0x10
0168 E237 LDI R19,0x27
0169 018A MOVW R16,R20
016A 940E0457 CALL div16s
016C 2EA0 MOV R10,R16
016D E120 LDI R18,0x10
016E E237 LDI R19,0x27
016F 018A MOVW R16,R20
0170 940E0453 CALL mod16s
0172 01A8 MOVW R20,R16
0173 20AA TST R10
0174 F089 BEQ 0x0186
0175 9020027B LDS R2,TxOperateSp0
0177 2433 CLR R3
0178 2D82 MOV R24,R2
0179 5F8F SUBI R24,0xFF
017A 9380027B STS TxOperateSp0,R24
017C E78D LDI R24,0x7D
017D E092 LDI R25,2
017E 2DE2 MOV R30,R2
017F 27FF CLR R31
0180 0FE8 ADD R30,R24
0181 1FF9 ADC R31,R25
0182 2D8A MOV R24,R10
0183 5D80 SUBI R24,0xD0
0184 8380 STD Z+0,R24
0185 E061 LDI R22,1
(0169) j=i/1000;i%=1000;if(j||head){TxBuffer0[TxOperateSp0++]=j+0x30;head=1;}
0186 EE28 LDI R18,0xE8
0187 E033 LDI R19,3
0188 018A MOVW R16,R20
0189 940E0457 CALL div16s
018B 2EA0 MOV R10,R16
018C EE28 LDI R18,0xE8
018D E033 LDI R19,3
018E 018A MOVW R16,R20
018F 940E0453 CALL mod16s
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -