📄 dac_sin.lis
字号:
.module dac_sin.c
.area text(rom, con, rel)
0000 .dbfile E:\产品\开发板\mega128-board\实验程序\数模转换\正弦波\dac_sin.c
0000 .dbfunc e s_ms _s_ms fV
0000 ; t -> R16,R17
.even
0000 _s_ms::
0000 .dbline -1
0000 .dbline 8
0000 ; #include<iom128v.h>
0000 ; #include"math.h"
0000 ; #define uchar unsigned char
0000 ; #define uint unsigned int
0000 ;
0000 ; //延时函数
0000 ; void s_ms(unsigned int t)
0000 ; {
0000 .dbline 9
0000 ; for(;t>1;t--)
0000 02C0 xjmp L5
0002 L2:
0002 .dbline 10
0002 ; {
0002 .dbline 11
0002 ; }
0002 L3:
0002 .dbline 9
0002 0150 subi R16,1
0004 1040 sbci R17,0
0006 L5:
0006 .dbline 9
0006 81E0 ldi R24,1
0008 90E0 ldi R25,0
000A 8017 cp R24,R16
000C 9107 cpc R25,R17
000E C8F3 brlo L2
0010 X0:
0010 .dbline -2
0010 L1:
0010 .dbline 0 ; func end
0010 0895 ret
0012 .dbsym r t 16 i
0012 .dbend
0012 .dbfunc e spi_init _spi_init fV
.even
0012 _spi_init::
0012 .dbline -1
0012 .dbline 16
0012 ; }
0012 ;
0012 ; //SPI初始化
0012 ; void spi_init()
0012 ; {
0012 .dbline 17
0012 ; DDRB=0xf7; //端口设置
0012 87EF ldi R24,247
0014 87BB out 0x17,R24
0016 .dbline 18
0016 ; PORTB=0xff;
0016 8FEF ldi R24,255
0018 88BB out 0x18,R24
001A .dbline 19
001A ; SPSR&=0x00;
001A 2224 clr R2
001C 2EB8 out 0xe,R2
001E .dbline 20
001E ; SPCR=0x5d; //主机模式 方式0 ocs/16
001E 8DE5 ldi R24,93
0020 8DB9 out 0xd,R24
0022 .dbline -2
0022 L6:
0022 .dbline 0 ; func end
0022 0895 ret
0024 .dbend
0024 .dbfunc e spi_send _spi_send fV
0024 ; spi_hi -> R12
0024 ; spi_lo -> R10
0024 ; spi_data -> R16,R17
.even
0024 _spi_send::
0024 0E940000 xcall push_xgset003C
0028 .dbline -1
0028 .dbline 24
0028 ; }
0028 ;
0028 ; void spi_send(uint spi_data)
0028 ; {
0028 .dbline 26
0028 ; uchar spi_lo,spi_hi;
0028 ; spi_lo=spi_data;
0028 A02E mov R10,R16
002A .dbline 27
002A ; spi_hi=spi_data>>8;
002A 6801 movw R12,R16
002C CD2C mov R12,R13
002E DD24 clr R13
0030 .dbline 29
0030 ;
0030 ; PORTB&=~(1<<0); //ss=0
0030 C098 cbi 0x18,0
0032 .dbline 30
0032 ; SPDR=spi_hi; //发送高字节
0032 CFB8 out 0xf,R12
0034 L8:
0034 .dbline 31
0034 ; while(!(SPSR&(1<<SPIF)));
0034 L9:
0034 .dbline 31
0034 779B sbis 0xe,7
0036 FECF rjmp L8
0038 X1:
0038 .dbline 32
0038 ; SPDR=spi_lo; //发送低字节
0038 AFB8 out 0xf,R10
003A L11:
003A .dbline 33
003A ; while(!(SPSR&(1<<SPIF)));
003A L12:
003A .dbline 33
003A 779B sbis 0xe,7
003C FECF rjmp L11
003E X2:
003E .dbline 34
003E ; PORTB|=(1<<0);
003E C09A sbi 0x18,0
0040 .dbline -2
0040 L7:
0040 .dbline 0 ; func end
0040 0C940000 xjmp pop_xgset003C
0044 .dbsym r spi_hi 12 c
0044 .dbsym r spi_lo 10 c
0044 .dbsym r spi_data 16 i
0044 .dbend
0044 .dbfunc e main _main fI
0044 ; aa -> y+4
0044 ; sin_p -> R20,R21
0044 ; pai -> y+0
.even
0044 _main::
0044 2897 sbiw R28,8
0046 .dbline -1
0046 .dbline 41
0046 ; }
0046 ;
0046 ; //使用DAC产生27Hz的正弦波
0046 ; //主要时间消耗在sin的计算上,使用查表会更快
0046 ; //主函数
0046 ; main()
0046 ; {
0046 .dbline 42
0046 ; float pai=0,aa;
0046 00E0 ldi R16,<L15
0048 10E0 ldi R17,>L15
004A 0E940000 xcall elpm32
004E 0883 std y+0,R16
0050 1983 std y+1,R17
0052 2A83 std y+2,R18
0054 3B83 std y+3,R19
0056 .dbline 44
0056 ; int sin_p;
0056 ; s_ms(50000); //等待7512复位
0056 00E5 ldi R16,50000
0058 13EC ldi R17,195
005A D2DF xcall _s_ms
005C .dbline 45
005C ; spi_init();
005C DADF xcall _spi_init
005E .dbline 47
005E ;
005E ; spi_send(0x07ff);
005E 0FEF ldi R16,2047
0060 17E0 ldi R17,7
0062 E0DF xcall _spi_send
0064 46C0 xjmp L17
0066 L16:
0066 .dbline 49
0066 ; while(1)
0066 ; {
0066 .dbline 50
0066 ; pai+=0.1;
0066 2880 ldd R2,y+0
0068 3980 ldd R3,y+1
006A 4A80 ldd R4,y+2
006C 5B80 ldd R5,y+3
006E 00E0 ldi R16,<L19
0070 10E0 ldi R17,>L19
0072 0E940000 xcall elpm32
0076 3A93 st -y,R19
0078 2A93 st -y,R18
007A 1A93 st -y,R17
007C 0A93 st -y,R16
007E 8101 movw R16,R2
0080 9201 movw R18,R4
0082 0E940000 xcall fpadd2
0086 0883 std y+0,R16
0088 1983 std y+1,R17
008A 2A83 std y+2,R18
008C 3B83 std y+3,R19
008E .dbline 51
008E ; sin_p=sin(pai)*2000;
008E 0881 ldd R16,y+0
0090 1981 ldd R17,y+1
0092 2A81 ldd R18,y+2
0094 3B81 ldd R19,y+3
0096 0E940000 xcall _sinf
009A 1801 movw R2,R16
009C 2901 movw R4,R18
009E 00E0 ldi R16,<L20
00A0 10E0 ldi R17,>L20
00A2 0E940000 xcall elpm32
00A6 5A92 st -y,R5
00A8 4A92 st -y,R4
00AA 3A92 st -y,R3
00AC 2A92 st -y,R2
00AE 0E940000 xcall fpmule2
00B2 0E940000 xcall fpint
00B6 A801 movw R20,R16
00B8 .dbline 52
00B8 ; sin_p+=2048; //2048作为中点
00B8 4050 subi R20,0 ; offset = 2048
00BA 584F sbci R21,248
00BC .dbline 53
00BC ; spi_send(sin_p);
00BC 8A01 movw R16,R20
00BE B2DF xcall _spi_send
00C0 .dbline 54
00C0 ; if(pai==6.28) //2pai回零
00C0 2880 ldd R2,y+0
00C2 3980 ldd R3,y+1
00C4 4A80 ldd R4,y+2
00C6 5B80 ldd R5,y+3
00C8 00E0 ldi R16,<L23
00CA 10E0 ldi R17,>L23
00CC 0E940000 xcall elpm32
00D0 3A93 st -y,R19
00D2 2A93 st -y,R18
00D4 1A93 st -y,R17
00D6 0A93 st -y,R16
00D8 8101 movw R16,R2
00DA 9201 movw R18,R4
00DC 0E940000 xcall fpcmp2
00E0 41F4 brne L21
00E2 X3:
00E2 .dbline 55
00E2 ; {pai=0;}
00E2 .dbline 55
00E2 00E0 ldi R16,<L15
00E4 10E0 ldi R17,>L15
00E6 0E940000 xcall elpm32
00EA 0883 std y+0,R16
00EC 1983 std y+1,R17
00EE 2A83 std y+2,R18
00F0 3B83 std y+3,R19
00F2 .dbline 55
00F2 L21:
00F2 .dbline 56
00F2 ; }
00F2 L17:
00F2 .dbline 48
00F2 B9CF xjmp L16
00F4 X4:
00F4 .dbline -2
00F4 L14:
00F4 .dbline 0 ; func end
00F4 2896 adiw R28,8
00F6 0895 ret
00F8 .dbsym l aa 4 D
00F8 .dbsym r sin_p 20 I
00F8 .dbsym l pai 0 D
00F8 .dbend
.area lit(rom, con, rel)
0000 L23:
0000 C3F5C840 .word 0xf5c3,0x40c8
0004 L20:
0004 0000FA44 .word 0x0,0x44fa
0008 L19:
0008 CDCCCC3D .word 0xcccd,0x3dcc
000C L15:
000C 00000000 .word 0x0,0x0
0010 ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -