📄 test_7135.lst
字号:
__start:
__text_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 940E0180 CALL _main
_exit:
004C CFFF RJMP _exit
FILE: test_7135.c
(0001) //*************************************************
(0002) //测试功能:7135的ad功能。
(0003) //测试方法:注意:采集到的电压单位为mv
(0004) //测试结果:ok
(0005) //时钟频率:外部8m
(0006) //管脚分配:1脚(pb0)接7135的25,4脚(pb3)接7135的22
(0007) //16脚(pd2)接7135的21
(0008) //注意事项:基准电压为:1v.输入电压不大于2v
(0009) //完成时间:2009.03.17
(0010) //**************************************************
(0011)
(0012) //**************************************************
(0013) //头文件
(0014) //**************************************************
(0015) #include <iom16v.h>
(0016) #include <macros.h>
(0017) //**************************************************
(0018)
(0019)
(0020) //*****************************************************
(0021) //全局变量定义
(0022) //*****************************************************
(0023) unsigned char N=0;//用来区别是第一次外部中断还是第二次中断
(0024) unsigned int T1OVF_NUM=0;//用来计定时器T1的溢出次数
(0025) unsigned long int T1_NUM;//T1计的总时钟的个数
(0026) unsigned int VIN;//测到的电压,单位为mv
(0027)
(0028) //*****************************************************
(0029) //函数声明
(0030) //*****************************************************
(0031) void DELAY_1MS(void);
(0032) void DELAY_NMS(unsigned int n);
(0033) void PORT_INIT(void);
(0034) void INT0_INIT(void);
(0035) void T1_INIT(void);
(0036) void T0_125K(void);
(0037) void USART_INIT(void);
(0038) void USART_TX(unsigned char data);
(0039) void DATA_DISPLAY(unsigned int data);
(0040)
(0041) //*****************************************************
(0042) //函数名称:void DELAY_1MS(void)
(0043) //函数功能:延时1ms
(0044) //注意事项:i=143*n-2
(0045) //*****************************************************
(0046) void DELAY_1MS(void)
(0047) {
(0048) unsigned int i;
(0049) 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 940E0251 CALL push_gset1
0058 01A8 MOVW R20,R16
(0050) ;
(0051) }
(0052) //*****************************************************
(0053) //函数名称:void DELAY_NMS(void)
(0054) //函数功能:延时Nms
(0055) //注意事项:
(0056) //*****************************************************
(0057) void DELAY_NMS(unsigned int n)
(0058) {
(0059) for(;n>0;n--)
0059 C003 RJMP 0x005D
(0060) 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 940E0254 CALL pop_gset1
0062 9508 RET
(0061) }
(0062) //*****************************************************
(0063) //函数名称:void INT0_INIT(void)
(0064) //函数功能:int0初始化,上升沿产生中断,使能中断
(0065) //注意事项:未开总中断
(0066) //*****************************************************
(0067) void PORT_INIT(void)
(0068) {
(0069) DDRB=0X09;
_PORT_INIT:
0063 E089 LDI R24,0x9
0064 BB87 OUT 0x17,R24
(0070) PORTB=0X00;
0065 2422 CLR R2
0066 BA28 OUT 0x18,R2
(0071) DDRD=0X00;
0067 BA21 OUT 0x11,R2
(0072) PORTD=0XFF;
0068 EF8F LDI R24,0xFF
0069 BB82 OUT 0x12,R24
006A 9508 RET
(0073) }
(0074)
(0075) //**********************************************************
(0076) //函数名称:void T0_250K(void)
(0077) //函数功能:t0工作于CTC模式,产生250k方波
(0078) //注意事项:一分频,pb3(oc0)接7135 clk
(0079) //**********************************************************
(0080) void T0_125K(void)
(0081) {
(0082) TCCR0=0X00;
_T0_125K:
006B 2422 CLR R2
006C BE23 OUT 0x33,R2
(0083) TCNT0=0X00;
006D BE22 OUT 0x32,R2
(0084) OCR0=31;
006E E18F LDI R24,0x1F
006F BF8C OUT 0x3C,R24
(0085) TIMSK&=~(1<<OCIE0);
0070 B789 IN R24,0x39
0071 7F8D ANDI R24,0xFD
0072 BF89 OUT 0x39,R24
(0086) TCCR0=0X19;
0073 E189 LDI R24,0x19
0074 BF83 OUT 0x33,R24
0075 9508 RET
(0087) }
(0088) //*****************************************************
(0089) //函数名称:void INT0_INIT(void)
(0090) //函数功能:int0初始化,上升沿产生中断,使能中断
(0091) //注意事项:未开总中断
(0092) //*****************************************************
(0093) void INT0_INIT(void)
(0094) {
(0095) MCUCR|=((1<<ISC01)|(1<<ISC00));
_INT0_INIT:
0076 B785 IN R24,0x35
0077 6083 ORI R24,3
0078 BF85 OUT 0x35,R24
(0096) GICR|=(1<<INT0);
0079 B78B IN R24,0x3B
007A 6480 ORI R24,0x40
007B BF8B OUT 0x3B,R24
007C 9508 RET
_INT0_INTERRUPT:
007D 940E028D CALL push_lset
007F 940E024F CALL push_gset2
(0097) }
(0098) //*****************************************************
(0099) //函数名称:void INT0_INTERRUPT(void)
(0100) //函数功能:中断处理,N+1
(0101) //注意事项:
(0102) //*****************************************************
(0103) #pragma interrupt_handler INT0_INTERRUPT:2
(0104) void INT0_INTERRUPT(void)
(0105) {
(0106) if(!N)
0081 90200060 LDS R2,N
0083 2022 TST R2
0084 F449 BNE 0x008E
(0107) {
(0108) TCCR1B=0X01;//开始内部计数
0085 E081 LDI R24,1
0086 BD8E OUT 0x2E,R24
(0109) MCUCR=0X02;//设置外部中断0下降沿产生中断
0087 E082 LDI R24,2
0088 BF85 OUT 0x35,R24
(0110) N++;
0089 2D82 MOV R24,R2
008A 5F8F SUBI R24,0xFF
008B 93800060 STS N,R24
(0111) }
008D C077 RJMP 0x0105
(0112) else
(0113) {
(0114) TCCR1B=0X00;//定时器t1停止工作
008E 2422 CLR R2
008F BC2E OUT 0x2E,R2
(0115) CLI();//关中断,进行数据处理
0090 94F8 BCLR 7
(0116) //数据处理
(0117) T1_NUM=T1OVF_NUM;
0091 90200061 LDS R2,T1OVF_NUM
0093 90300062 LDS R3,T1OVF_NUM+1
0095 2444 CLR R4
0096 2455 CLR R5
0097 92300066 STS T1_NUM+1,R3
0099 92200065 STS T1_NUM,R2
009B 92500068 STS T1_NUM+3,R5
009D 92400067 STS T1_NUM+2,R4
(0118) T1_NUM=(T1_NUM*65536+TCNT1);
009F 90400067 LDS R4,T1_NUM+2
00A1 90500068 LDS R5,T1_NUM+3
00A3 90200065 LDS R2,T1_NUM
00A5 90300066 LDS R3,T1_NUM+1
00A7 E040 LDI R20,0
00A8 E050 LDI R21,0
00A9 E061 LDI R22,1
00AA E070 LDI R23,0
00AB 925A ST R5,-Y
00AC 924A ST R4,-Y
00AD 923A ST R3,-Y
00AE 922A ST R2,-Y
00AF 018A MOVW R16,R20
00B0 019B MOVW R18,R22
00B1 940E0216 CALL empy32u
00B3 0118 MOVW R2,R16
00B4 0129 MOVW R4,R18
00B5 B46C IN R6,0x2C
00B6 B47D IN R7,0x2D
00B7 2488 CLR R8
00B8 2499 CLR R9
00B9 0C26 ADD R2,R6
00BA 1C37 ADC R3,R7
00BB 1C48 ADC R4,R8
00BC 1C59 ADC R5,R9
00BD 92300066 STS T1_NUM+1,R3
00BF 92200065 STS T1_NUM,R2
00C1 92500068 STS T1_NUM+3,R5
00C3 92400067 STS T1_NUM+2,R4
(0119) T1_NUM/=64;
00C5 E086 LDI R24,6
00C6 E090 LDI R25,0
00C7 938A ST R24,-Y
00C8 0181 MOVW R16,R2
00C9 0192 MOVW R18,R4
00CA 940E02BB CALL lsr32
00CC 93100066 STS T1_NUM+1,R17
00CE 93000065 STS T1_NUM,R16
00D0 93300068 STS T1_NUM+3,R19
00D2 93200067 STS T1_NUM+2,R18
(0120) T1_NUM-=10001;
00D4 E141 LDI R20,0x11
00D5 E257 LDI R21,0x27
00D6 E060 LDI R22,0
00D7 E070 LDI R23,0
00D8 0118 MOVW R2,R16
00D9 0129 MOVW R4,R18
00DA 1A24 SUB R2,R20
00DB 0A35 SBC R3,R21
00DC 0A46 SBC R4,R22
00DD 0A57 SBC R5,R23
00DE 92300066 STS T1_NUM+1,R3
00E0 92200065 STS T1_NUM,R2
00E2 92500068 STS T1_NUM+3,R5
00E4 92400067 STS T1_NUM+2,R4
(0121) VIN=T1_NUM/10;
00E6 E04A LDI R20,0xA
00E7 E050 LDI R21,0
00E8 E060 LDI R22,0
00E9 E070 LDI R23,0
00EA 937A ST R23,-Y
00EB 936A ST R22,-Y
00EC 935A ST R21,-Y
00ED 934A ST R20,-Y
00EE 0181 MOVW R16,R2
00EF 0192 MOVW R18,R4
00F0 940E01A5 CALL div32u
00F2 93100064 STS VIN+1,R17
00F4 93000063 STS VIN,R16
(0122) DATA_DISPLAY(VIN);
00F6 D052 RCALL _DATA_DISPLAY
(0123) //数据处理结束
(0124) T1OVF_NUM=0;
00F7 2422 CLR R2
00F8 2433 CLR R3
00F9 92300062 STS T1OVF_NUM+1,R3
00FB 92200061 STS T1OVF_NUM,R2
(0125) TCNT1=0X0000;
00FD BC3D OUT 0x2D,R3
00FE BC2C OUT 0x2C,R2
(0126) MCUCR|=((1<<ISC01)|(1<<ISC00));//设置外部上升沿中断
00FF B785 IN R24,0x35
0100 6083 ORI R24,3
0101 BF85 OUT 0x35,R24
(0127) N=0;//
0102 92200060 STS N,R2
(0128) PORTB&=~(1<<0);//上位机发0x01,测量一次,停止ad
0104 98C0 CBI 0x18,0
(0129) //SEI();先进行1次采样
(0130) }
0105 940E0246 CALL pop_gset2
0107 940E02A4 CALL pop_lset
0109 9518 RETI
(0131) }
(0132) //**************************************************
(0133) //函数名称:void T1_INIT(void)
(0134) //函数功能:内部定时
(0135) //注意事项,定时器未工作,定时器工作,需+TCCR1B=0X01;
(0136) //**************************************************
(0137) void T1_INIT(void)
(0138) {
(0139) TCCR1A=0X00;
_T1_INIT:
010A 2422 CLR R2
010B BC2F OUT 0x2F,R2
(0140) TCNT1=0X0000;
010C 2433 CLR R3
010D BC3D OUT 0x2D,R3
010E BC2C OUT 0x2C,R2
(0141) TIMSK|=(1<<TOIE1);
010F B789 IN R24,0x39
0110 6084 ORI R24,4
0111 BF89 OUT 0x39,R24
0112 9508 RET
_T1_OVF:
0113 938A ST R24,-Y
0114 939A ST R25,-Y
0115 B78F IN R24,0x3F
0116 938A ST R24,-Y
(0142) }
(0143) //**************************************************
(0144) //函数名称:void T1_OVF(void)
(0145) //函数功能:ti溢出处理
(0146) //注意事项:
(0147) //**************************************************
(0148) #pragma interrupt_handler T1_OVF:9
(0149) void T1_OVF(void)
(0150) {
(0151) T1OVF_NUM++;
0117 91800061 LDS R24,T1OVF_NUM
0119 91900062 LDS R25,T1OVF_NUM+1
011B 9601 ADIW R24,1
011C 93900062 STS T1OVF_NUM+1,R25
011E 93800061 STS T1OVF_NUM,R24
0120 9189 LD R24,Y+
0121 BF8F OUT 0x3F,R24
0122 9199 LD R25,Y+
0123 9189 LD R24,Y+
0124 9518 RETI
(0152) }
(0153) //*****************************************************
(0154) //函数名称:void USART_INIT(void)
(0155) //函数功能:8M,波特率9600
(0156) //注意事项:
(0157) //*****************************************************
(0158) void USART_INIT(void)
(0159) {
(0160) UBRR=0X33;//fosc=8mhz,波特率9600
_USART_INIT:
0125 E383 LDI R24,0x33
0126 B989 OUT 0x09,R24
(0161) UCSRA=0X20;
0127 E280 LDI R24,0x20
0128 B98B OUT 0x0B,R24
(0162) UCSRC=0X86;
0129 E886 LDI R24,0x86
012A BD80 OUT 0x20,R24
(0163) UCSRB=0X98;
012B E988 LDI R24,0x98
012C B98A OUT 0x0A,R24
012D 9508 RET
_USART_TX:
data --> R20
012E 940E0251 CALL push_gset1
0130 2F40 MOV R20,R16
(0164) }
(0165) //*****************************************************
(0166) //函数名称:void USART_INIT(void)
(0167) //函数功能:8M,波特率9600
(0168) //注意事项:
(0169) //*****************************************************
(0170) void USART_TX(unsigned char data)
(0171) {
(0172) UDR=data;
0131 B94C OUT 0x0C,R20
(0173) while(!(UCSRA&(1<<TXC)))
0132 9B5E SBIS 0x0B,6
0133 CFFE RJMP 0x0132
(0174) ;
(0175) DELAY_NMS(1);
0134 E001 LDI R16,1
0135 E010 LDI R17,0
0136 DF1F RCALL _DELAY_NMS
0137 940E0254 CALL pop_gset1
0139 9508 RET
_usart_receive:
d --> R16
013A 930A ST R16,-Y
013B B70F IN R16,0x3F
013C 930A ST R16,-Y
(0176) }
(0177) //*****************************************************
(0178) //函数名称:void USART_INIT(void)
(0179) //函数功能:下位机收到0x01,则进行1次ad转换
(0180) //注意事项:
(0181) //*****************************************************
(0182) #pragma interrupt_handler usart_receive:12
(0183) void usart_receive(void)
(0184) {
(0185) unsigned char d;
(0186) d=UDR;
013D B10C IN R16,0x0C
(0187) if(d==0x01)
013E 3001 CPI R16,1
013F F419 BNE 0x0143
(0188) {
(0189) PORTB|=(1<<0);
0140 9AC0 SBI 0x18,0
(0190) SEI();
0141 9478 BSET 7
(0191) }
0142 C002 RJMP 0x0145
(0192) else
(0193) {
(0194) PORTB&=~(1<<0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -