📄 m64.lst
字号:
__start:
__text_start:
5D EFCF LDI R28,0xFF
5E E1D0 LDI R29,0x10
5F BFCD OUT 0x3D,R28
60 BFDE OUT 0x3E,R29
61 51CE SUBI R28,0x1E
62 40D0 SBCI R29,0
63 EA0A LDI R16,0xAA
64 8308 STD Y+0,R16
65 2400 CLR R0
66 E2EE LDI R30,0x2E
67 E0F1 LDI R31,1
68 E011 LDI R17,1
69 32EE CPI R30,0x2E
6A 07F1 CPC R31,R17
6B F011 BEQ 0x006E
6C 9201 ST R0,Z+
6D CFFB RJMP 0x0069
6E 8300 STD Z+0,R16
6F E8EC LDI R30,0x8C
70 E0F0 LDI R31,0
71 E0A0 LDI R26,0
72 E0B1 LDI R27,1
73 E010 LDI R17,0
74 E000 LDI R16,0
75 BF0B OUT 0x3B,R16
76 3BEA CPI R30,0xBA
77 07F1 CPC R31,R17
78 F021 BEQ 0x007D
79 95C8 LPM
7A 9631 ADIW R30,1
7B 920D ST R0,X+
7C CFF9 RJMP 0x0076
7D 940E 0534 CALL _main
_exit:
7F CFFF RJMP _exit
FILE: C:\DOCUME~1\ZDH\桌面\JOHU_2~1.180\digital_duoji\buhuo\main.c
(0001) //////////////////////////////
(0002) ////////////////////////////// 61493为近似180度
(0003)
(0004) #include <iom64v.h>
(0005) #include <macros.h>
(0006)
(0007) #define PREVSONG BIT(2)
(0008) #define NEXTSONG BIT(3)
(0009) #define VOLDOWN BIT(4)
(0010) #define VOLUP BIT(5)
(0011) #define STOP BIT(6)
(0012)
(0013) #define R_pwm0 BIT(4)
(0014) #define R_pwm1 BIT(5)
(0015) #define L_pwm0 BIT(6)
(0016) #define L_pwm1 BIT(7)
(0017)
(0018)
(0019) long ADCjohu=0;
(0020) int ms=0;
(0021) long xx=0;
(0022) int adc=0;
(0023)
(0024) #define REF 483
(0025) unsigned char lvbo=0;
(0026) long lvbo_num=0;
(0027)
(0028) unsigned char pwm_pingjun=100;//平均速度
(0029) unsigned char Rpwm0=0;
(0030) unsigned char Rpwm1=0;
(0031) unsigned char Lpwm0=0;
(0032) unsigned char Lpwm1=0;
(0033) unsigned char all=0, a=0,b=0,c=0,d=0,e=0,f=0;
(0034) #define CIR 1
(0035) #define LINE 2
(0036) long jiaodu=0,juli=0;
(0037) int time=0;
(0038) unsigned char sec=0;
(0039)
(0040) unsigned int temp1=0, temp2=0;
(0041) unsigned char count1=0;//0表示一个捕获周期完成,1:准备捕获,2:第一次捕获,3:第二次捕获
(0042)
(0043) unsigned char shang_johu=0;//
(0044)
(0045)
(0046) void port_init(void)
(0047) {
(0048) PORTA = 0x00;
_port_init:
80 2422 CLR R2
81 BA2B OUT 0x1B,R2
(0049) DDRA = 0x00;
82 BA2A OUT 0x1A,R2
(0050) PORTB = 0x00;
83 BA28 OUT 0x18,R2
(0051) DDRB = 0x00;
84 BA27 OUT 0x17,R2
(0052) PORTC = 0x00; //m103 output only
85 BA25 OUT 0x15,R2
(0053) DDRC = 0x00;
86 BA24 OUT 0x14,R2
(0054) PORTD = 0x00;
87 BA22 OUT 0x12,R2
(0055) DDRD = 0x00;
88 BA21 OUT 0x11,R2
(0056) PORTE = 0x00;
89 B823 OUT 0x03,R2
(0057) DDRE = 0x00;
8A B822 OUT 0x02,R2
(0058) PORTF = 0x00;
8B 9220 0062 STS 0x0062,R2
(0059) DDRF = 0x00;
8D 9220 0061 STS 0x0061,R2
(0060) PORTG = 0x00;
8F 9220 0065 STS 0x0065,R2
(0061) DDRG = 0x00;
91 9220 0064 STS 0x0064,R2
93 9508 RET
(0062) }
(0063)
(0064) //TIMER2 initialize - prescale:64
(0065) // WGM: Normal
(0066) // desired value: 1mSec
(0067) // actual value: 1.000mSec (0.0%)
(0068) void timer2_init(void)
(0069) {
(0070) TCCR2 = 0x00; //stop
_timer2_init:
94 2422 CLR R2
95 BC25 OUT 0x25,R2
(0071) TCNT2 = 0x83; //setup
96 E883 LDI R24,0x83
97 BD84 OUT 0x24,R24
(0072) OCR2 = 0x7D;
98 E78D LDI R24,0x7D
99 BD83 OUT 0x23,R24
(0073) TCCR2 = 0x03; //start
9A E083 LDI R24,3
9B BD85 OUT 0x25,R24
9C 9508 RET
_timer0_ovf_isr:
9D 920A ST R0,-Y
9E 921A ST R1,-Y
9F 922A ST R2,-Y
A0 923A ST R3,-Y
A1 924A ST R4,-Y
A2 925A ST R5,-Y
A3 926A ST R6,-Y
A4 927A ST R7,-Y
A5 928A ST R8,-Y
A6 929A ST R9,-Y
A7 930A ST R16,-Y
A8 931A ST R17,-Y
A9 932A ST R18,-Y
AA 933A ST R19,-Y
AB 938A ST R24,-Y
AC 939A ST R25,-Y
AD B60F IN R0,0x3F
AE 920A ST R0,-Y
AF 940E 07EB CALL push_xgsetF00C
(0074) }
(0075)
(0076)
(0077) #pragma interrupt_handler timer0_ovf_isr:11
(0078) void timer0_ovf_isr(void)
(0079) {
(0080) TCNT0 = 0x83; //reload counter value
B1 E883 LDI R24,0x83
B2 BF82 OUT 0x32,R24
(0081) if (time>500){sec++;time=0;}
B3 EF84 LDI R24,0xF4
B4 E091 LDI R25,1
B5 9020 0125 LDS R2,time
B7 9030 0126 LDS R3,time+1
B9 1582 CP R24,R2
BA 0593 CPC R25,R3
BB F45C BGE 0x00C7
BC 9180 0127 LDS R24,sec
BE 5F8F SUBI R24,0xFF
BF 9380 0127 STS sec,R24
C1 2422 CLR R2
C2 2433 CLR R3
C3 9230 0126 STS time+1,R3
C5 9220 0125 STS time,R2
(0082) time++;
C7 9180 0125 LDS R24,time
C9 9190 0126 LDS R25,time+1
CB 9601 ADIW R24,1
CC 9390 0126 STS time+1,R25
CE 9380 0125 STS time,R24
(0083) ADCjohu=ADCL;
D0 B024 IN R2,0x04
D1 2433 CLR R3
D2 2444 CLR R4
D3 2455 CLR R5
D4 9230 0101 STS ADCjohu+1,R3
D6 9220 0100 STS ADCjohu,R2
D8 9250 0103 STS ADCjohu+3,R5
DA 9240 0102 STS ADCjohu+2,R4
(0084) ADCjohu|=ADCH << 8;
DC B025 IN R2,0x05
DD 2433 CLR R3
DE 2C32 MOV R3,R2
DF 2422 CLR R2
E0 2444 CLR R4
E1 FC37 SBRC R3,7
E2 9440 COM R4
E3 2455 CLR R5
E4 FC47 SBRC R4,7
E5 9450 COM R5
E6 9080 0102 LDS R8,ADCjohu+2
E8 9090 0103 LDS R9,ADCjohu+3
EA 9060 0100 LDS R6,ADCjohu
EC 9070 0101 LDS R7,ADCjohu+1
EE 2862 OR R6,R2
EF 2873 OR R7,R3
F0 2884 OR R8,R4
F1 2895 OR R9,R5
F2 9270 0101 STS ADCjohu+1,R7
F4 9260 0100 STS ADCjohu,R6
F6 9290 0103 STS ADCjohu+3,R9
F8 9280 0102 STS ADCjohu+2,R8
(0085) ///////////////////////////////////////////////////////////////////平均值滤波 1毫秒采样滤波,10毫秒输出
(0086) if (lvbo==0) {lvbo_num=ADCjohu/2;lvbo++;return;}
FA 9020 010C LDS R2,lvbo
FC 2022 TST R2
FD F4D1 BNE 0x0118
FE E042 LDI R20,2
FF E050 LDI R21,0
100 E060 LDI R22,0
101 E070 LDI R23,0
102 0183 MOVW R16,R6
103 0194 MOVW R18,R8
104 937A ST R23,-Y
105 936A ST R22,-Y
106 935A ST R21,-Y
107 934A ST R20,-Y
108 940E 0777 CALL div32s
10A 9310 010E STS lvbo_num+1,R17
10C 9300 010D STS lvbo_num,R16
10E 9330 0110 STS lvbo_num+3,R19
110 9320 010F STS lvbo_num+2,R18
112 9180 010C LDS R24,lvbo
114 5F8F SUBI R24,0xFF
115 9380 010C STS lvbo,R24
117 C077 RJMP 0x018F
(0087) if (lvbo<10) {lvbo_num+=ADCjohu/2;lvbo++;return;}
118 9180 010C LDS R24,lvbo
11A 308A CPI R24,0xA
11B F560 BCC 0x0148
11C E042 LDI R20,2
11D E050 LDI R21,0
11E E060 LDI R22,0
11F E070 LDI R23,0
120 9120 0102 LDS R18,ADCjohu+2
122 9130 0103 LDS R19,ADCjohu+3
124 9100 0100 LDS R16,ADCjohu
126 9110 0101 LDS R17,ADCjohu+1
128 937A ST R23,-Y
129 936A ST R22,-Y
12A 935A ST R21,-Y
12B 934A ST R20,-Y
12C 940E 0777 CALL div32s
12E 9040 010F LDS R4,lvbo_num+2
130 9050 0110 LDS R5,lvbo_num+3
132 9020 010D LDS R2,lvbo_num
134 9030 010E LDS R3,lvbo_num+1
136 0E20 ADD R2,R16
137 1E31 ADC R3,R17
138 1E42 ADC R4,R18
139 1E53 ADC R5,R19
13A 9230 010E STS lvbo_num+1,R3
13C 9220 010D STS lvbo_num,R2
13E 9250 0110 STS lvbo_num+3,R5
140 9240 010F STS lvbo_num+2,R4
142 9180 010C LDS R24,lvbo
144 5F8F SUBI R24,0xFF
145 9380 010C STS lvbo,R24
147 C047 RJMP 0x018F
(0088) else lvbo=0;/**/
148 2422 CLR R2
149 9220 010C STS lvbo,R2
(0089) //////////////////////////////////////////////////////////////////////////////
(0090) if ( (ADCjohu<REF-6) || (ADCjohu>REF+6))
14B ED4D LDI R20,0xDD
14C E051 LDI R21,1
14D E060 LDI R22,0
14E E070 LDI R23,0
14F 9040 0102 LDS R4,ADCjohu+2
151 9050 0103 LDS R5,ADCjohu+3
153 9020 0100 LDS R2,ADCjohu
155 9030 0101 LDS R3,ADCjohu+1
157 1624 CP R2,R20
158 0635 CPC R3,R21
159 0646 CPC R4,R22
15A 0657 CPC R5,R23
15B F04C BLT 0x0165
15C EE49 LDI R20,0xE9
15D E051 LDI R21,1
15E E060 LDI R22,0
15F E070 LDI R23,0
160 1542 CP R20,R2
161 0553 CPC R21,R3
162 0564 CPC R22,R4
163 0575 CPC R23,R5
164 F524 BGE 0x0189
(0091) {
(0092) //ADCjohu-=511-10;//-511+31-3.27371 -10
(0093) xx=xx+ADCjohu-REF;//
165 9040 0102 LDS R4,ADCjohu+2
167 9050 0103 LDS R5,ADCjohu+3
169 9020 0100 LDS R2,ADCjohu
16B 9030 0101 LDS R3,ADCjohu+1
16D 9080 0108 LDS R8,xx+2
16F 9090 0109 LDS R9,xx+3
171 9060 0106 LDS R6,xx
173 9070 0107 LDS R7,xx+1
175 0C62 ADD R6,R2
176 1C73 ADC R7,R3
177 1C84 ADC R8,R4
178 1C95 ADC R9,R5
179 EE43 LDI R20,0xE3
17A E051 LDI R21,1
17B E060 LDI R22,0
17C E070 LDI R23,0
17D 1A64 SUB R6,R20
17E 0A75 SBC R7,R21
17F 0A86 SBC R8,R22
180 0A97 SBC R9,R23
181 9270 0107 STS xx+1,R7
183 9260 0106 STS xx,R6
185 9290 0109 STS xx+3,R9
187 9280 0108 STS xx+2,R8
(0094) }
(0095) ms=1;
189 E081 LDI R24,1
18A E090 LDI R25,0
18B 9390 0105 STS ms+1,R25
18D 9380 0104 STS ms,R24
18F 940E 07F2 CALL pop_xgsetF00C
191 9009 LD R0,Y+
192 BE0F OUT 0x3F,R0
193 9199 LD R25,Y+
194 9189 LD R24,Y+
195 9139 LD R19,Y+
196 9129 LD R18,Y+
197 9119 LD R17,Y+
198 9109 LD R16,Y+
199 9099 LD R9,Y+
19A 9089 LD R8,Y+
19B 9079 LD R7,Y+
19C 9069 LD R6,Y+
19D 9059 LD R5,Y+
19E 9049 LD R4,Y+
19F 9039 LD R3,Y+
1A0 9029 LD R2,Y+
1A1 9019 LD R1,Y+
1A2 9009 LD R0,Y+
1A3 9518 RETI
(0096) //ADCjohu==ADCL;
(0097) //PORTD=ADCjohu;
(0098) }
(0099)
(0100) //ADC initialize
(0101) // Conversion time: 3uS
(0102) void adc_init(void)
(0103) {
(0104) ADCSRA = 0x00; //disable adc
_adc_init:
1A4 2422 CLR R2
1A5 B826 OUT 0x06,R2
(0105) ADMUX = 0x01; //select adc input 0
1A6 E081 LDI R24,1
1A7 B987 OUT 0x07,R24
(0106) ACSR = 0x80;
1A8 E880 LDI R24,0x80
1A9 B988 OUT 0x08,R24
(0107) // ADCSRB = 0x00;
(0108) ADCSRA = 0xEf;
1AA EE8F LDI R24,0xEF
1AB B986 OUT 0x06,R24
1AC 9508 RET
_adc_isr:
1AD 922A ST R2,-Y
1AE B62F IN R2,0x3F
1AF 922A ST R2,-Y
(0109) }
(0110)
(0111) #pragma interrupt_handler adc_isr:22
(0112) void adc_isr(void)
(0113) {
(0114) //conversion complete, read value (int) using...
(0115) // value=ADCL; //Read 8 low bits first (important)
(0116) // value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
(0117) //ADCjohu==ADCL;
(0118) //ADCjohu|=(int)ADCH << 8;
(0119) //PORTD=ADCjohu;
(0120) //adc=1;
(0121) PORTA=ADCL;
1B0 B024 IN R2,0x04
1B1 BA2B OUT 0x1B,R2
1B2 9029 LD R2,Y+
1B3 BE2F OUT 0x3F,R2
1B4 9029 LD R2,Y+
1B5 9518 RETI
(0122)
(0123) }
(0124)
(0125) //call this routine to initialize all peripherals
(0126) void init_devices(void)
(0127) {
(0128) //stop errant interrupts until set up
(0129) CLI(); //disable all interrupts
_init_devices:
1B6 94F8 BCLR 7
(0130) XDIV = 0x00; //xtal divider
1B7 2422 CLR R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -