📄 dac.lst
字号:
(0008) /******************************************/
(0009) // 1、使用ICCAVR的终端调试窗口(Terminal),进行通信调试。
(0010) // 2、对ICCAVR的终端调试窗口进行设置,设置串口为com1或com2,
(0011) // 通信波特率为19200(Tools->Environment Options...)。
(0012) // 3、将PC屏幕光标定位于调试窗口中。
(0013) #include <iom8v.h>
(0014) #define fosc 8000000 //晶振8MHZ
(0015) #define baud 19200 //波特率
(0016) /* 字符输出函数 */
(0017) void putchar(unsigned char c)
(0018) {
(0019) while (!(UCSRA&(1<<UDRE)));
_putchar:
c --> R16
00E9 9B5D SBIS 0x0B,5
00EA CFFE RJMP _putchar
(0020) UDR=c;
00EB B90C OUT 0x0C,R16
(0021) }
00EC 9508 RET
(0022) /* 字符输入函数 */
(0023) unsigned char getchar(void)
(0024) {
(0025) while(!(UCSRA& (1<<RXC)));
_getchar:
00ED 9B5F SBIS 0x0B,7
00EE CFFE RJMP _getchar
(0026) return UDR;
00EF B10C IN R16,0x0C
00F0 9508 RET
_puts:
s --> R20
00F1 D08F RCALL push_gset1
00F2 01A8 MOVW R20,R16
(0027) }
(0028) /* 字符串输出函数 */
(0029) void puts(char *s)
(0030) {
00F3 C005 RJMP 0x00F9
(0031) while (*s)
(0032) {
(0033) putchar(*s);
00F4 01FA MOVW R30,R20
00F5 8100 LDD R16,Z+0
00F6 DFF2 RCALL _putchar
(0034) s++;
00F7 5F4F SUBI R20,0xFF
00F8 4F5F SBCI R21,0xFF
00F9 01FA MOVW R30,R20
00FA 8020 LDD R2,Z+0
00FB 2022 TST R2
00FC F7B9 BNE 0x00F4
(0035) }
(0036) putchar(0x0a);//回车换行
00FD E00A LDI R16,0xA
00FE DFEA RCALL _putchar
(0037) putchar(0x0d);
00FF E00D LDI R16,0xD
0100 DFE8 RCALL _putchar
(0038) }
0101 D082 RCALL pop_gset1
0102 9508 RET
(0039) /* UART初始化 */
(0040) void uart_init(void)
(0041) {
(0042) UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
_uart_init:
0103 E188 LDI R24,0x18
0104 B98A OUT 0x0A,R24
(0043) UBRRL=(fosc/16/(baud+1))%256;
0105 E18A LDI R24,0x1A
0106 B989 OUT 0x09,R24
(0044) UBRRH=(fosc/16/(baud+1))/256;
0107 2422 CLR R2
0108 BC20 OUT 0x20,R2
(0045) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
0109 E886 LDI R24,0x86
010A BD80 OUT 0x20,R24
(0046) }
010B 9508 RET
FILE: E:\icc\iccavr\mega8\mega8\DAC\adc.c
(0001) /******************************************/
(0002) /* 广州天河双龙电子公司 */
(0003) /* http://www.sl.com.cn */
(0004) /* ADC驱动程序 */
(0005) /* 作者:ntzwq@wx88.net */
(0006) /* 2002年5月11日 */
(0007) /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
(0008) /******************************************/
(0009) #include<iom8v.h>
(0010) unsigned int adc_rel;//AD转换结果
(0011) unsigned char adc_mux;//AD通道
(0012) extern unsigned int adc_old;
(0013) /* 微秒级延时程序 */
(0014) void delay_us(int time)
(0015) {
(0016) do
(0017) {
(0018) time--;
_delay_us:
time --> R16
010C 5001 SUBI R16,1
010D 4010 SBCI R17,0
(0019) }
(0020) while (time>1);
010E E081 LDI R24,1
010F E090 LDI R25,0
0110 1780 CP R24,R16
0111 0791 CPC R25,R17
0112 F3CC BLT 0x010C
(0021) }
0113 9508 RET
_delay_ms:
time --> R20
0114 D06C RCALL push_gset1
0115 01A8 MOVW R20,R16
(0022) /* 毫秒级延时程序 */
(0023) void delay_ms(unsigned int time)
(0024) {
0116 C005 RJMP 0x011C
(0025) while(time!=0)
(0026) {
(0027) delay_us(1000);
0117 EE08 LDI R16,0xE8
0118 E013 LDI R17,3
0119 DFF2 RCALL _delay_us
(0028) time--;
011A 5041 SUBI R20,1
011B 4050 SBCI R21,0
011C 3040 CPI R20,0
011D 0745 CPC R20,R21
011E F7C1 BNE 0x0117
(0029) }
(0030) }
011F D064 RCALL pop_gset1
0120 9508 RET
(0031) //ADC初始化
(0032) void adc_init(void)
(0033) {
(0034) DDRC=0x00;
_adc_init:
0121 2422 CLR R2
0122 BA24 OUT 0x14,R2
(0035) PORTC=0x00;
0123 BA25 OUT 0x15,R2
(0036) ADCSRA = 0x00;
0124 B826 OUT 0x06,R2
(0037) ADMUX =(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
0125 91800074 LDS R24,_adc_mux
0127 708F ANDI R24,0xF
0128 6480 ORI R24,0x40
0129 B987 OUT 0x07,R24
(0038) ACSR =(1<<ACD);//关闭模拟比较器
012A E880 LDI R24,0x80
012B B988 OUT 0x08,R24
(0039) ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分频
012C EC8E LDI R24,0xCE
012D B986 OUT 0x06,R24
(0040) }
012E 9508 RET
_adc_isr:
012F 922A ST R2,-Y
0130 923A ST R3,-Y
0131 930A ST R16,-Y
0132 931A ST R17,-Y
0133 932A ST R18,-Y
0134 933A ST R19,-Y
0135 938A ST R24,-Y
0136 939A ST R25,-Y
0137 93EA ST R30,-Y
0138 B62F IN R2,0x3F
0139 922A ST R2,-Y
(0041) //ADC完成中断
(0042) #pragma interrupt_handler adc_isr:iv_ADC
(0043) void adc_isr(void)
(0044) {
(0045) static unsigned i;
(0046) adc_rel+=ADC&0x3ff;
013A B184 IN R24,0x04
013B B195 IN R25,0x05
013C 7093 ANDI R25,3
013D 90200075 LDS R2,_adc_rel
013F 90300076 LDS R3,_adc_rel+1
0141 0E28 ADD R2,R24
0142 1E39 ADC R3,R25
0143 92300076 STS _adc_rel+1,R3
0145 92200075 STS _adc_rel,R2
(0047) ADMUX=(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
0147 91800074 LDS R24,_adc_mux
0149 708F ANDI R24,0xF
014A 6480 ORI R24,0x40
014B B987 OUT 0x07,R24
(0048) ADCSRA|=(1<<ADSC);//启动AD转换
014C 9A36 SBI 0x06,6
(0049) if (i<63)
014D 91800072 LDS R24,_adc_old+2
014F 91900073 LDS R25,_adc_old+3
0151 338F CPI R24,0x3F
0152 E0E0 LDI R30,0
0153 079E CPC R25,R30
0154 F430 BCC 0x015B
(0050) i++;
0155 9601 ADIW R24,1
0156 93900073 STS _adc_old+3,R25
0158 93800072 STS _adc_old+2,R24
015A C015 RJMP 0x0170
(0051) else
(0052) {
(0053) adc_old=adc_rel/64;//64点平均滤波
015B E026 LDI R18,6
015C E030 LDI R19,0
015D 91000075 LDS R16,_adc_rel
015F 91100076 LDS R17,_adc_rel+1
0161 D064 RCALL lsr16
0162 93100071 STS _adc_old+1,R17
0164 93000070 STS _adc_old,R16
(0054) i=0;
0166 2422 CLR R2
0167 2433 CLR R3
0168 92300073 STS _adc_old+3,R3
016A 92200072 STS _adc_old+2,R2
(0055) adc_rel=0;
016C 92300076 STS _adc_rel+1,R3
016E 92200075 STS _adc_rel,R2
(0056) }
(0057) }
0170 9029 LD R2,Y+
0171 BE2F OUT 0x3F,R2
0172 91E9 LD R30,Y+
0173 9199 LD R25,Y+
0174 9189 LD R24,Y+
0175 9139 LD R19,Y+
0176 9129 LD R18,Y+
0177 9119 LD R17,Y+
0178 9109 LD R16,Y+
0179 9039 LD R3,Y+
017A 9029 LD R2,Y+
017B 9518 RETI
FILE: E:\icc\iccavr\mega8\mega8\DAC\read_flash.s
(0001) ;unsigned char read_flash(unsigned int add);
(0002) _read_flash::
(0003) mov r31,r17
_read_flash:
017C 2FF1 MOV R31,R17
(0004) mov r30,r16
017D 2FE0 MOV R30,R16
(0005) lpm r16,z
017E 9104 LPM R16,0(Z)
(0006) clr r17
017F 2711 CLR R17
(0007) ret
FILE: <library>
0180 9508 RET
push_gset1:
0181 935A ST R21,-Y
0182 934A ST R20,-Y
0183 9508 RET
pop_gset1:
0184 E0E1 LDI R30,1
pop:
0185 9149 LD R20,Y+
0186 9159 LD R21,Y+
0187 FDE0 SBRC R30,0
0188 9508 RET
0189 9169 LD R22,Y+
018A 9179 LD R23,Y+
018B FDE1 SBRC R30,1
018C 9508 RET
018D 90A9 LD R10,Y+
018E 90B9 LD R11,Y+
018F FDE2 SBRC R30,2
0190 9508 RET
0191 90C9 LD R12,Y+
0192 90D9 LD R13,Y+
0193 FDE3 SBRC R30,3
0194 9508 RET
0195 90E9 LD R14,Y+
0196 90F9 LD R15,Y+
0197 9508 RET
push_lset:
0198 93FA ST R31,-Y
0199 93EA ST R30,-Y
019A 93BA ST R27,-Y
019B 93AA ST R26,-Y
019C 939A ST R25,-Y
019D 938A ST R24,-Y
019E 933A ST R19,-Y
019F 932A ST R18,-Y
01A0 931A ST R17,-Y
01A1 930A ST R16,-Y
01A2 929A ST R9,-Y
01A3 928A ST R8,-Y
01A4 927A ST R7,-Y
01A5 926A ST R6,-Y
01A6 925A ST R5,-Y
01A7 924A ST R4,-Y
01A8 923A ST R3,-Y
01A9 922A ST R2,-Y
01AA 921A ST R1,-Y
01AB 920A ST R0,-Y
01AC B60F IN R0,0x3F
01AD 920A ST R0,-Y
01AE 9508 RET
pop_lset:
01AF 9009 LD R0,Y+
01B0 BE0F OUT 0x3F,R0
01B1 9009 LD R0,Y+
01B2 9019 LD R1,Y+
01B3 9029 LD R2,Y+
01B4 9039 LD R3,Y+
01B5 9049 LD R4,Y+
01B6 9059 LD R5,Y+
01B7 9069 LD R6,Y+
01B8 9079 LD R7,Y+
01B9 9089 LD R8,Y+
01BA 9099 LD R9,Y+
01BB 9109 LD R16,Y+
01BC 9119 LD R17,Y+
01BD 9129 LD R18,Y+
01BE 9139 LD R19,Y+
01BF 9189 LD R24,Y+
01C0 9199 LD R25,Y+
01C1 91A9 LD R26,Y+
01C2 91B9 LD R27,Y+
01C3 91E9 LD R30,Y+
01C4 91F9 LD R31,Y+
01C5 9508 RET
lsr16:
01C6 2322 TST R18
01C7 F021 BEQ 0x01CC
01C8 9516 LSR R17
01C9 9507 ROR R16
01CA 952A DEC R18
01CB CFFA RJMP lsr16
01CC 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -