📄 zong.lst
字号:
__text_start:
__start:
002C E5CF LDI R28,0x5F
002D E0D4 LDI R29,4
002E BFCD OUT 0x3D,R28
002F BFDE OUT 0x3E,R29
0030 51C0 SUBI R28,0x10
0031 40D0 SBCI R29,0
0032 EA0A LDI R16,0xAA
0033 8308 STD Y+0,R16
0034 2400 CLR R0
0035 E6E3 LDI R30,0x63
0036 E0F0 LDI R31,0
0037 E010 LDI R17,0
0038 36E9 CPI R30,0x69
0039 07F1 CPC R31,R17
003A F011 BEQ 0x003D
003B 9201 ST R0,Z+
003C CFFB RJMP 0x0038
003D 8300 STD Z+0,R16
003E E5E4 LDI R30,0x54
003F E0F0 LDI R31,0
0040 E6A0 LDI R26,0x60
0041 E0B0 LDI R27,0
0042 E010 LDI R17,0
0043 35E7 CPI R30,0x57
0044 07F1 CPC R31,R17
0045 F021 BEQ 0x004A
0046 95C8 LPM
0047 9631 ADIW R30,1
0048 920D ST R0,X+
0049 CFF9 RJMP 0x0043
004A 940E019B CALL _main
_exit:
004C CFFF RJMP _exit
FILE: zong.c
(0001) //ICC-AVR application builder : 2009-3-19 15:44:36
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007)
(0008)
(0009) //*****************************************************
(0010) //全局变量定义
(0011) //*****************************************************
(0012)
(0013) unsigned char N=0;//用来区别是第一次外部中断还是第二次中断
(0014) unsigned int T1OVF_NUM=0;//用来计定时器T1的溢出次数
(0015) unsigned long int T1_NUM;//T1计的总时钟的个数
(0016) unsigned int VIN;//测到的电压,单位为mv
(0017)
(0018)
(0019) //*****************************************************
(0020) //函数声明
(0021) //*****************************************************
(0022) //void port_init(void);
(0023) void timer0_125Kinit(void);
(0024) //void timer1_init(void)
(0025) //void timer2_250init(void);
(0026) void init_devices(void);
(0027) void usart_tx(unsigned char data);
(0028) void delay_1ms(void);
(0029) void delay_nms(unsigned int n);
(0030) void timer1_ovf_isr(void);
(0031) void int0_isr(void);
(0032) void data_display(unsigned int data);
(0033)
(0034)
(0035)
(0036) void delay_1ms(void)
(0037) {
(0038) unsigned int i;
(0039) for(i=1142;i>0;i--)
_delay_1ms:
i --> R16
004D E706 LDI R16,0x76
004E E014 LDI R17,4
004F C002 RJMP 0x0052
0050 5001 SUBI R16,1
0051 4010 SBCI R17,0
0052 3000 CPI R16,0
0053 0701 CPC R16,R17
0054 F7D9 BNE 0x0050
0055 9508 RET
_delay_nms:
n --> R20
0056 940E0269 CALL push_gset1
0058 01A8 MOVW R20,R16
(0040) ;
(0041) }
(0042) //*****************************************************
(0043) //函数名称:void DELAY_NMS(void)
(0044) //函数功能:延时Nms
(0045) //注意事项:
(0046) //*****************************************************
(0047) void delay_nms(unsigned int n)
(0048) {
(0049) for(;n>0;n--)
0059 C003 RJMP 0x005D
(0050) delay_1ms();
005A DFF2 RCALL _delay_1ms
005B 5041 SUBI R20,1
005C 4050 SBCI R21,0
005D 3040 CPI R20,0
005E 0745 CPC R20,R21
005F F7D1 BNE 0x005A
0060 940E026C CALL pop_gset1
0062 9508 RET
(0051) }
(0052)
(0053)
(0054) void port_init(void)
(0055) {
(0056) PORTA = 0x01;
_port_init:
0063 E081 LDI R24,1
0064 BB8B OUT 0x1B,R24
(0057) DDRA = 0x00;
0065 2422 CLR R2
0066 BA2A OUT 0x1A,R2
(0058) PORTB = 0x00;
0067 BA28 OUT 0x18,R2
(0059) DDRB = 0xFF;
0068 EF8F LDI R24,0xFF
0069 BB87 OUT 0x17,R24
(0060) PORTC = 0x00; //m103 output only
006A BA25 OUT 0x15,R2
(0061) DDRC = 0x00;
006B BA24 OUT 0x14,R2
(0062) PORTD = 0x00;
006C BA22 OUT 0x12,R2
(0063) DDRD = 0xFF;
006D BB81 OUT 0x11,R24
006E 9508 RET
(0064) }
(0065)
(0066) //TIMER0 initialize - prescale:Stop
(0067) // WGM: CTC
(0068) // desired value: 125KHz
(0069) // actual value: Out of range
(0070) void timer0_125Kinit(void)
(0071) {
(0072) TCCR0 = 0x00; //stop
_timer0_125Kinit:
006F 2422 CLR R2
0070 BE23 OUT 0x33,R2
(0073) TCNT0 = 0x00 /*INVALID SETTING*/; //set count
0071 BE22 OUT 0x32,R2
(0074) OCR0 = 0x1F /*INVALID SETTING*/; //set compare
0072 E18F LDI R24,0x1F
0073 BF8C OUT 0x3C,R24
(0075) TIMSK&=~(1<<OCIE0);
0074 B789 IN R24,0x39
0075 7F8D ANDI R24,0xFD
0076 BF89 OUT 0x39,R24
(0076) TCCR0 = 0x19;
0077 E189 LDI R24,0x19
0078 BF83 OUT 0x33,R24
0079 9508 RET
(0077) //TCCR0 = 0x08; //start timer
(0078) }
(0079)
(0080) //TIMER2 initialize - prescale:Stop
(0081) // WGM: CTC
(0082) // desired value: 250Hz
(0083) // actual value: Out of range
(0084) void timer2_250init(void)
(0085) {
(0086) TCCR2 = 0x00; //stop
_timer2_250init:
007A 2422 CLR R2
007B BC25 OUT 0x25,R2
(0087) //ASSR = 0x00; //set async mode
(0088) TCNT2 = 0x00 /*INVALID SETTING*/; //setup
007C BC24 OUT 0x24,R2
(0089) OCR2 = 0xF9 /*INVALID SETTING*/;
007D EF89 LDI R24,0xF9
007E BD83 OUT 0x23,R24
(0090) TIMSK&=~(1<<OCIE2);
007F B789 IN R24,0x39
0080 778F ANDI R24,0x7F
0081 BF89 OUT 0x39,R24
(0091) TCCR2 = 0x1C;
0082 E18C LDI R24,0x1C
0083 BD85 OUT 0x25,R24
0084 9508 RET
(0092) //TCCR2 = 0x08; //start
(0093) }
(0094)
(0095)
(0096)
(0097) void timer1_init(void)
(0098) {
(0099) TCCR1A=0x00;
_timer1_init:
0085 2422 CLR R2
0086 BC2F OUT 0x2F,R2
(0100) TCCR1B=0x00;
0087 BC2E OUT 0x2E,R2
(0101) TCNT1=0X0000;
0088 2433 CLR R3
0089 BC3D OUT 0x2D,R3
008A BC2C OUT 0x2C,R2
(0102) TIMSK|=(1<<TOIE1);
008B B789 IN R24,0x39
008C 6084 ORI R24,4
008D BF89 OUT 0x39,R24
008E 9508 RET
(0103) }
(0104)
(0105)
(0106) void int0_init(void)
(0107) {
(0108) MCUCR|=((1<<ISC01)|(1<<ISC00));
_int0_init:
008F B785 IN R24,0x35
0090 6083 ORI R24,3
0091 BF85 OUT 0x35,R24
(0109) GICR|=(1<<INT0);
0092 B78B IN R24,0x3B
0093 6480 ORI R24,0x40
0094 BF8B OUT 0x3B,R24
0095 9508 RET
_timer1_ovf_isr:
0096 938A ST R24,-Y
0097 939A ST R25,-Y
0098 B78F IN R24,0x3F
0099 938A ST R24,-Y
(0110) }
(0111)
(0112)
(0113)
(0114)
(0115)
(0116) #pragma interrupt_handler timer1_ovf_isr:9
(0117) void timer1_ovf_isr(void)
(0118) {
(0119) T1OVF_NUM++;
009A 91800061 LDS R24,T1OVF_NUM
009C 91900062 LDS R25,T1OVF_NUM+1
009E 9601 ADIW R24,1
009F 93900062 STS T1OVF_NUM+1,R25
00A1 93800061 STS T1OVF_NUM,R24
00A3 9189 LD R24,Y+
00A4 BF8F OUT 0x3F,R24
00A5 9199 LD R25,Y+
00A6 9189 LD R24,Y+
00A7 9518 RETI
(0120)
(0121) //TIMER1 has overflowed
(0122) //TCNT1H = 0x00 /*INVALID SETTING*/; //reload counter high value
(0123) //TCNT1L = 0x00 /*INVALID SETTING*/; //reload counter low value
(0124) }
(0125)
(0126) //UART0 initialize
(0127) // desired baud rate: 9600
(0128) // actual: baud rate:9615 (0.2%)
(0129) // char size: 8 bit
(0130) // parity: Disabled
(0131) void uart0_init(void)
(0132) {
(0133) UCSRB = 0x98; //disable while setting baud rate
_uart0_init:
00A8 E988 LDI R24,0x98
00A9 B98A OUT 0x0A,R24
(0134) UCSRA = 0x20;
00AA E280 LDI R24,0x20
00AB B98B OUT 0x0B,R24
(0135) UCSRC = 0x86;
00AC E886 LDI R24,0x86
00AD BD80 OUT 0x20,R24
(0136) UBRRL = 0x33; //set baud rate lo
00AE E383 LDI R24,0x33
00AF B989 OUT 0x09,R24
(0137) UBRRH = 0x00; //set baud rate hi
00B0 2422 CLR R2
00B1 BC20 OUT 0x20,R2
00B2 9508 RET
_usart_tx:
data --> R20
00B3 940E0269 CALL push_gset1
00B5 2F40 MOV R20,R16
(0138) //UCSRB = 0x00;
(0139) }
(0140)
(0141)
(0142) void usart_tx(unsigned char data)
(0143) {
(0144) UDR=data;
00B6 B94C OUT 0x0C,R20
(0145) while(!(UCSRA&(1<<TXC)))
00B7 9B5E SBIS 0x0B,6
00B8 CFFE RJMP 0x00B7
(0146) ;
(0147) delay_nms(1);
00B9 E001 LDI R16,1
00BA E010 LDI R17,0
00BB DF9A RCALL _delay_nms
00BC 940E026C CALL pop_gset1
00BE 9508 RET
_usart_receive:
d --> R16
00BF 930A ST R16,-Y
00C0 B70F IN R16,0x3F
00C1 930A ST R16,-Y
(0148) }
(0149)
(0150) #pragma interrupt_handler usart_receive:12
(0151) void usart_receive(void)
(0152) {
(0153) unsigned char d;
(0154) d=UDR;
00C2 B10C IN R16,0x0C
(0155) if(d==0x01)
00C3 3001 CPI R16,1
00C4 F419 BNE 0x00C8
(0156) {
(0157) PORTB|=(1<<0);
00C5 9AC0 SBI 0x18,0
(0158) SEI();
00C6 9478 BSET 7
(0159) }
00C7 C002 RJMP 0x00CA
(0160) else
(0161) {
(0162) PORTB&=~(1<<0);
00C8 98C0 CBI 0x18,0
(0163) CLI();
00C9 94F8 BCLR 7
(0164) }
00CA 9109 LD R16,Y+
00CB BF0F OUT 0x3F,R16
00CC 9109 LD R16,Y+
00CD 9518 RETI
_int0_isr:
00CE 940E02A5 CALL push_lset
00D0 940E0267 CALL push_gset2
(0165) }
(0166)
(0167) #pragma interrupt_handler int0_isr:2
(0168) void int0_isr(void)
(0169) {
(0170) if(!N)
00D2 90200060 LDS R2,N
00D4 2022 TST R2
00D5 F449 BNE 0x00DF
(0171) {
(0172) TCCR1B=0X01;//开始内部计数
00D6 E081 LDI R24,1
00D7 BD8E OUT 0x2E,R24
(0173) MCUCR=0X02;//设置外部中断0下降沿产生中断
00D8 E082 LDI R24,2
00D9 BF85 OUT 0x35,R24
(0174) N++;
00DA 2D82 MOV R24,R2
00DB 5F8F SUBI R24,0xFF
00DC 93800060 STS N,R24
(0175) }
00DE C077 RJMP 0x0156
(0176) else
(0177) {
(0178) TCCR1B=0X00;//定时器t1停止工作
00DF 2422 CLR R2
00E0 BC2E OUT 0x2E,R2
(0179) CLI();//关中断,进行数据处理
00E1 94F8 BCLR 7
(0180) //数据处理
(0181) T1_NUM=T1OVF_NUM;
00E2 90200061 LDS R2,T1OVF_NUM
00E4 90300062 LDS R3,T1OVF_NUM+1
00E6 2444 CLR R4
00E7 2455 CLR R5
00E8 92300066 STS T1_NUM+1,R3
00EA 92200065 STS T1_NUM,R2
00EC 92500068 STS T1_NUM+3,R5
00EE 92400067 STS T1_NUM+2,R4
(0182) T1_NUM=(T1_NUM*65536+TCNT1);
00F0 90400067 LDS R4,T1_NUM+2
00F2 90500068 LDS R5,T1_NUM+3
00F4 90200065 LDS R2,T1_NUM
00F6 90300066 LDS R3,T1_NUM+1
00F8 E040 LDI R20,0
00F9 E050 LDI R21,0
00FA E061 LDI R22,1
00FB E070 LDI R23,0
00FC 925A ST R5,-Y
00FD 924A ST R4,-Y
00FE 923A ST R3,-Y
00FF 922A ST R2,-Y
0100 018A MOVW R16,R20
0101 019B MOVW R18,R22
0102 940E022E CALL empy32u
0104 0118 MOVW R2,R16
0105 0129 MOVW R4,R18
0106 B46C IN R6,0x2C
0107 B47D IN R7,0x2D
0108 2488 CLR R8
0109 2499 CLR R9
010A 0C26 ADD R2,R6
010B 1C37 ADC R3,R7
010C 1C48 ADC R4,R8
010D 1C59 ADC R5,R9
010E 92300066 STS T1_NUM+1,R3
0110 92200065 STS T1_NUM,R2
0112 92500068 STS T1_NUM+3,R5
0114 92400067 STS T1_NUM+2,R4
(0183) T1_NUM/=64;
0116 E086 LDI R24,6
0117 E090 LDI R25,0
0118 938A ST R24,-Y
0119 0181 MOVW R16,R2
011A 0192 MOVW R18,R4
011B 940E02D3 CALL lsr32
011D 93100066 STS T1_NUM+1,R17
011F 93000065 STS T1_NUM,R16
0121 93300068 STS T1_NUM+3,R19
0123 93200067 STS T1_NUM+2,R18
(0184) T1_NUM-=10001;
0125 E141 LDI R20,0x11
0126 E257 LDI R21,0x27
0127 E060 LDI R22,0
0128 E070 LDI R23,0
0129 0118 MOVW R2,R16
012A 0129 MOVW R4,R18
012B 1A24 SUB R2,R20
012C 0A35 SBC R3,R21
012D 0A46 SBC R4,R22
012E 0A57 SBC R5,R23
012F 92300066 STS T1_NUM+1,R3
0131 92200065 STS T1_NUM,R2
0133 92500068 STS T1_NUM+3,R5
0135 92400067 STS T1_NUM+2,R4
(0185) VIN=T1_NUM/10;
0137 E04A LDI R20,0xA
0138 E050 LDI R21,0
0139 E060 LDI R22,0
013A E070 LDI R23,0
013B 937A ST R23,-Y
013C 936A ST R22,-Y
013D 935A ST R21,-Y
013E 934A ST R20,-Y
013F 0181 MOVW R16,R2
0140 0192 MOVW R18,R4
0141 940E01BD CALL div32u
0143 93100064 STS VIN+1,R17
0145 93000063 STS VIN,R16
(0186) data_display(VIN);
0147 D013 RCALL _data_display
(0187) //数据处理结束
(0188) T1OVF_NUM=0;
0148 2422 CLR R2
0149 2433 CLR R3
014A 92300062 STS T1OVF_NUM+1,R3
014C 92200061 STS T1OVF_NUM,R2
(0189) TCNT1=0X0000;
014E BC3D OUT 0x2D,R3
014F BC2C OUT 0x2C,R2
(0190) MCUCR|=((1<<ISC01)|(1<<ISC00));//设置外部上升沿中断
0150 B785 IN R24,0x35
0151 6083 ORI R24,3
0152 BF85 OUT 0x35,R24
(0191) N=0;//
0153 92200060 STS N,R2
(0192) PORTB&=~(1<<0);//上位机发0x01,测量一次,停止ad
0155 98C0 CBI 0x18,0
(0193) //SEI();先进行1次采样
(0194) }
0156 940E025E CALL pop_gset2
0158 940E02BC CALL pop_lset
015A 9518 RETI
_data_display:
temp --> Y+0
i --> R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -