📄 dac_sin.lst
字号:
__start:
__text_start:
60 EFCF LDI R28,0xFF
61 E1D0 LDI R29,0x10
62 BFCD OUT 0x3D,R28
63 BFDE OUT 0x3E,R29
64 51CE SUBI R28,0x1E
65 40D0 SBCI R29,0
66 EA0A LDI R16,0xAA
67 8308 STD Y+0,R16
68 2400 CLR R0
69 E0E0 LDI R30,0
6A E0F1 LDI R31,1
6B E011 LDI R17,1
6C 30E0 CPI R30,0
6D 07F1 CPC R31,R17
6E F011 BEQ 0x0071
6F 9201 ST R0,Z+
70 CFFB RJMP 0x006C
71 8300 STD Z+0,R16
72 ECE0 LDI R30,0xC0
73 E0F0 LDI R31,0
74 E0A0 LDI R26,0
75 E0B1 LDI R27,1
76 E010 LDI R17,0
77 E000 LDI R16,0
78 BF0B OUT 0x3B,R16
79 3CE0 CPI R30,0xC0
7A 07F1 CPC R31,R17
7B F021 BEQ 0x0080
7C 95C8 LPM
7D 9631 ADIW R30,1
7E 920D ST R0,X+
7F CFF9 RJMP 0x0079
80 940E 00A5 CALL _main
_exit:
82 CFFF RJMP _exit
FILE: E:\产品\开发板\mega128-board\实验程序\数模转换\正弦波\dac_sin.c
(0001) #include<iom128v.h>
(0002) #include"math.h"
(0003) #define uchar unsigned char
(0004) #define uint unsigned int
(0005)
(0006) //延时函数
(0007) void s_ms(unsigned int t)
(0008) {
(0009) for(;t>1;t--)
_s_ms:
t --> R16
83 C002 RJMP 0x0086
84 5001 SUBI R16,1
85 4010 SBCI R17,0
86 E081 LDI R24,1
87 E090 LDI R25,0
88 1780 CP R24,R16
89 0791 CPC R25,R17
8A F3C8 BCS 0x0084
8B 9508 RET
(0010) {
(0011) }
(0012) }
(0013)
(0014) //SPI初始化
(0015) void spi_init()
(0016) {
(0017) DDRB=0xf7; //端口设置
_spi_init:
8C EF87 LDI R24,0xF7
8D BB87 OUT 0x17,R24
(0018) PORTB=0xff;
8E EF8F LDI R24,0xFF
8F BB88 OUT 0x18,R24
(0019) SPSR&=0x00;
90 2422 CLR R2
91 B82E OUT 0x0E,R2
(0020) SPCR=0x5d; //主机模式 方式0 ocs/16
92 E58D LDI R24,0x5D
93 B98D OUT 0x0D,R24
94 9508 RET
_spi_send:
spi_hi --> R12
spi_lo --> R10
spi_data --> R16
95 940E 015D CALL push_xgset003C
(0021) }
(0022)
(0023) void spi_send(uint spi_data)
(0024) {
(0025) uchar spi_lo,spi_hi;
(0026) spi_lo=spi_data;
97 2EA0 MOV R10,R16
(0027) spi_hi=spi_data>>8;
98 0168 MOVW R12,R16
99 2CCD MOV R12,R13
9A 24DD CLR R13
(0028)
(0029) PORTB&=~(1<<0); //ss=0
9B 98C0 CBI 0x18,0
(0030) SPDR=spi_hi; //发送高字节
9C B8CF OUT 0x0F,R12
(0031) while(!(SPSR&(1<<SPIF)));
9D 9B77 SBIS 0x0E,7
9E CFFE RJMP 0x009D
(0032) SPDR=spi_lo; //发送低字节
9F B8AF OUT 0x0F,R10
(0033) while(!(SPSR&(1<<SPIF)));
A0 9B77 SBIS 0x0E,7
A1 CFFE RJMP 0x00A0
(0034) PORTB|=(1<<0);
A2 9AC0 SBI 0x18,0
A3 940C 0152 JMP pop_xgset003C
_main:
aa --> Y,+4
sin_p --> R20
pai --> Y,+0
A5 9728 SBIW R28,0x8
(0035) }
(0036)
(0037) //使用DAC产生27Hz的正弦波
(0038) //主要时间消耗在sin的计算上,使用查表会更快
(0039) //主函数
(0040) main()
(0041) {
(0042) float pai=0,aa;
A6 E908 LDI R16,0x98
A7 E010 LDI R17,0
A8 940E 013E CALL elpm32
AA 8308 STD Y+0,R16
AB 8319 STD Y+1,R17
AC 832A STD Y+2,R18
AD 833B STD Y+3,R19
(0043) int sin_p;
(0044) s_ms(50000); //等待7512复位
AE E500 LDI R16,0x50
AF EC13 LDI R17,0xC3
B0 DFD2 RCALL _s_ms
(0045) spi_init();
B1 DFDA RCALL _spi_init
(0046)
(0047) spi_send(0x07ff);
B2 EF0F LDI R16,0xFF
B3 E017 LDI R17,7
B4 DFE0 RCALL _spi_send
B5 C046 RJMP 0x00FC
(0048) while(1)
(0049) {
(0050) pai+=0.1;
B6 8028 LDD R2,Y+0
B7 8039 LDD R3,Y+1
B8 804A LDD R4,Y+2
B9 805B LDD R5,Y+3
BA E904 LDI R16,0x94
BB E010 LDI R17,0
BC 940E 013E CALL elpm32
BE 933A ST R19,-Y
BF 932A ST R18,-Y
C0 931A ST R17,-Y
C1 930A ST R16,-Y
C2 0181 MOVW R16,R2
C3 0192 MOVW R18,R4
C4 940E 01E1 CALL fpadd2
C6 8308 STD Y+0,R16
C7 8319 STD Y+1,R17
C8 832A STD Y+2,R18
C9 833B STD Y+3,R19
(0051) sin_p=sin(pai)*2000;
CA 8108 LDD R16,Y+0
CB 8119 LDD R17,Y+1
CC 812A LDD R18,Y+2
CD 813B LDD R19,Y+3
CE 940E 0573 CALL _sinf
D0 0118 MOVW R2,R16
D1 0129 MOVW R4,R18
D2 E900 LDI R16,0x90
D3 E010 LDI R17,0
D4 940E 013E CALL elpm32
D6 925A ST R5,-Y
D7 924A ST R4,-Y
D8 923A ST R3,-Y
D9 922A ST R2,-Y
DA 940E 03FB CALL fpmule2
DC 940E 021D CALL fpint
DE 01A8 MOVW R20,R16
(0052) sin_p+=2048; //2048作为中点
DF 5040 SUBI R20,0
E0 4F58 SBCI R21,0xF8
(0053) spi_send(sin_p);
E1 018A MOVW R16,R20
E2 DFB2 RCALL _spi_send
(0054) if(pai==6.28) //2pai回零
E3 8028 LDD R2,Y+0
E4 8039 LDD R3,Y+1
E5 804A LDD R4,Y+2
E6 805B LDD R5,Y+3
E7 E80C LDI R16,0x8C
E8 E010 LDI R17,0
E9 940E 013E CALL elpm32
EB 933A ST R19,-Y
EC 932A ST R18,-Y
ED 931A ST R17,-Y
EE 930A ST R16,-Y
EF 0181 MOVW R16,R2
F0 0192 MOVW R18,R4
F1 940E 041E CALL fpcmp2
F3 F441 BNE 0x00FC
(0055) {pai=0;}
FILE: <library>
F4 E908 LDI R16,0x98
F5 E010 LDI R17,0
F6 940E 013E CALL elpm32
F8 8308 STD Y+0,R16
F9 8319 STD Y+1,R17
FA 832A STD Y+2,R18
FB 833B STD Y+3,R19
FC CFB9 RJMP 0x00B6
FD 9628 ADIW R28,0x8
FE 9508 RET
push_arg4:
FF 933A ST R19,-Y
100 932A ST R18,-Y
push_arg2:
101 931A ST R17,-Y
102 930A ST R16,-Y
103 9508 RET
mod16s:
104 9468 BSET 6
105 92DA ST R13,-Y
106 2ED1 MOV R13,R17
107 C004 RJMP 0x010C
div16s:
108 94E8 BCLR 6
109 92DA ST R13,-Y
10A 2ED1 MOV R13,R17
10B 26D3 EOR R13,R19
10C FF17 SBRS R17,7
10D C004 RJMP 0x0112
10E 9510 COM R17
10F 9500 COM R16
110 5F0F SUBI R16,0xFF
111 4F1F SBCI R17,0xFF
112 FF37 SBRS R19,7
113 C004 RJMP 0x0118
114 9530 COM R19
115 9520 COM R18
116 5F2F SUBI R18,0xFF
117 4F3F SBCI R19,0xFF
118 940E 0125 CALL xdiv16u
11A FED7 SBRS R13,7
11B C004 RJMP 0x0120
11C 9510 COM R17
11D 9500 COM R16
11E 5F0F SUBI R16,0xFF
11F 4F1F SBCI R17,0xFF
120 90D9 LD R13,Y+
121 9508 RET
mod16u:
122 9468 BSET 6
123 C001 RJMP xdiv16u
div16u:
124 94E8 BCLR 6
xdiv16u:
125 92EA ST R14,-Y
126 92FA ST R15,-Y
127 938A ST R24,-Y
128 24EE CLR R14
129 24FF CLR R15
12A E180 LDI R24,0x10
12B 0F00 LSL R16
12C 1F11 ROL R17
12D 1CEE ROL R14
12E 1CFF ROL R15
12F 16E2 CP R14,R18
130 06F3 CPC R15,R19
131 F018 BCS 0x0135
132 1AE2 SUB R14,R18
133 0AF3 SBC R15,R19
134 9503 INC R16
135 958A DEC R24
136 F7A1 BNE 0x012B
137 F416 BRTC 0x013A
138 2D0E MOV R16,R14
139 2D1F MOV R17,R15
13A 9189 LD R24,Y+
13B 90F9 LD R15,Y+
13C 90E9 LD R14,Y+
13D 9508 RET
elpm32:
13E 93EA ST R30,-Y
13F 93FA ST R31,-Y
140 920A ST R0,-Y
141 2FE0 MOV R30,R16
142 2FF1 MOV R31,R17
143 95D8 ELPM
144 2D00 MOV R16,R0
145 9631 ADIW R30,1
146 95D8 ELPM
147 2D10 MOV R17,R0
148 9631 ADIW R30,1
149 95D8 ELPM
14A 2D20 MOV R18,R0
14B 9631 ADIW R30,1
14C 95D8 ELPM
14D 2D30 MOV R19,R0
14E 9009 LD R0,Y+
14F 91F9 LD R31,Y+
150 91E9 LD R30,Y+
151 9508 RET
pop_xgset003C:
152 90A9 LD R10,Y+
153 90B9 LD R11,Y+
154 90C9 LD R12,Y+
155 90D9 LD R13,Y+
156 9508 RET
push_xgsetF0FC:
157 937A ST R23,-Y
158 936A ST R22,-Y
push_xgset30FC:
159 935A ST R21,-Y
15A 934A ST R20,-Y
push_xgset00FC:
15B 92FA ST R15,-Y
15C 92EA ST R14,-Y
push_xgset003C:
15D 92DA ST R13,-Y
15E 92CA ST R12,-Y
15F 92BA ST R11,-Y
160 92AA ST R10,-Y
161 9508 RET
push_xgsetF00C:
162 937A ST R23,-Y
163 936A ST R22,-Y
164 935A ST R21,-Y
165 934A ST R20,-Y
166 92BA ST R11,-Y
167 92AA ST R10,-Y
168 9508 RET
pop_xgsetF00C:
169 90A9 LD R10,Y+
16A 90B9 LD R11,Y+
16B 9149 LD R20,Y+
16C 9159 LD R21,Y+
16D 9169 LD R22,Y+
16E 9179 LD R23,Y+
16F 9508 RET
neg32:
170 9500 COM R16
171 9510 COM R17
172 9520 COM R18
173 9530 COM R19
174 5F0F SUBI R16,0xFF
175 4F1F SBCI R17,0xFF
176 4F2F SBCI R18,0xFF
177 4F3F SBCI R19,0xFF
178 9508 RET
fpsub:
179 9468 BSET 6
17A C001 RJMP fpadd_alt
fpadd:
17B 94E8 BCLR 6
fpadd_alt:
17C 940E 0383 CALL saveR8toR25
17E 940E 0319 CALL unpacks
180 F409 BNE 0x0182
181 C047 RJMP 0x01C9
182 2EE6 MOV R14,R22
183 2ED5 MOV R13,R21
184 2EC4 MOV R12,R20
185 2EB3 MOV R11,R19
186 2EA2 MOV R10,R18
187 2E91 MOV R9,R17
188 2E80 MOV R8,R16
189 8100 LDD R16,Z+0
18A 8111 LDD R17,Z+1
18B 8122 LDD R18,Z+2
18C 8133 LDD R19,Z+3
18D 940E 0319 CALL unpacks
18F F409 BNE 0x0191
190 C043 RJMP 0x01D4
191 2F84 MOV R24,R20
192 2F95 MOV R25,R21
193 198C SUB R24,R12
194 099D SBC R25,R13
195 F0B9 BEQ 0x01AD
196 F472 BPL 0x01A5
197 9590 COM R25
198 9580 COM R24
199 9601 ADIW R24,1
19A 2D4C MOV R20,R12
19B 2D5D MOV R21,R13
19C 3188 CPI R24,0x18
19D F5B0 BCC 0x01D4
19E 9535 ASR R19
19F 9527 ROR R18
1A0 9517 ROR R17
1A1 9507 ROR R16
1A2 9701 SBIW R24,1
1A3 F7D1 BNE 0x019E
1A4 C008 RJMP 0x01AD
1A5 3188 CPI R24,0x18
1A6 F510 BCC 0x01C9
1A7 94B5 ASR R11
1A8 94A7 ROR R10
1A9 9497 ROR R9
1AA 9487 ROR R8
1AB 9701 SBIW R24,1
1AC F7D1 BNE 0x01A7
1AD 2766 CLR R22
1AE F02E BRTS 0x01B4
1AF 0D08 ADD R16,R8
1B0 1D19 ADC R17,R9
1B1 1D2A ADC R18,R10
1B2 1D3B ADC R19,R11
1B3 C009 RJMP 0x01BD
1B4 1A80 SUB R8,R16
1B5 0A91 SBC R9,R17
1B6 0AA2 SBC R10,R18
1B7 0AB3 SBC R11,R19
1B8 2D08 MOV R16,R8
1B9 2D19 MOV R17,R9
1BA 2D2A MOV R18,R10
1BB 2D3B MOV R19,R11
1BC 2333 TST R19
1BD F41A BPL 0x01C1
1BE 940E 0170 CALL neg32
1C0 E860 LDI R22,0x80
1C1 940E 033E CALL normalize_and_pack
1C3 C002 RJMP 0x01C6
1C4 940E 036C CALL pack
1C6 940E 0392 CALL restoreR8toR25
1C8 9508 RET
1C9 8100 LDD R16,Z+0
1CA 8111 LDD R17,Z+1
1CB 8122 LDD R18,Z+2
1CC 8133 LDD R19,Z+3
1CD F7C6 BRTC 0x01C6
1CE 940E 0321 CALL tstR16_R19
1D0 F3A9 BEQ 0x01C6
1D1 E840 LDI R20,0x80
1D2 2734 EOR R19,R20
1D3 CFF2 RJMP 0x01C6
1D4 2D08 MOV R16,R8
1D5 2D19 MOV R17,R9
1D6 2D2A MOV R18,R10
1D7 2D3B MOV R19,R11
1D8 2D4C MOV R20,R12
1D9 2D5D MOV R21,R13
1DA 2D6E MOV R22,R14
1DB 2333 TST R19
1DC F73A BPL 0x01C4
1DD 940E 0170 CALL neg32
1DF E860 LDI R22,0x80
1E0 CFE3 RJMP 0x01C4
fpadd2:
1E1 93FA ST R31,-Y
1E2 93EA ST R30,-Y
1E3 2FEC MOV R30,R28
1E4 2FFD MOV R31,R29
1E5 9632 ADIW R30,2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -