📄 mydesign.lst
字号:
__text_start:
__start:
007C E5CF LDI R28,0x5F
007D E0D2 LDI R29,2
007E BFCD OUT 0x3D,R28
007F BFDE OUT 0x3E,R29
0080 51C0 SUBI R28,0x10
0081 40D0 SBCI R29,0
0082 EA0A LDI R16,0xAA
0083 8308 STD Y+0,R16
0084 2400 CLR R0
0085 EFE7 LDI R30,0xF7
0086 E0F0 LDI R31,0
0087 E011 LDI R17,1
0088 30EE CPI R30,0xE
0089 07F1 CPC R31,R17
008A F011 BEQ 0x008D
008B 9201 ST R0,Z+
008C CFFB RJMP 0x0088
008D 8300 STD Z+0,R16
008E E6E0 LDI R30,0x60
008F E0F0 LDI R31,0
0090 E6A0 LDI R26,0x60
0091 E0B0 LDI R27,0
0092 E010 LDI R17,0
0093 3FE7 CPI R30,0xF7
0094 07F1 CPC R31,R17
0095 F021 BEQ 0x009A
0096 95C8 LPM
0097 9631 ADIW R30,1
0098 920D ST R0,X+
0099 CFF9 RJMP 0x0093
009A D245 RCALL _main
_exit:
009B CFFF RJMP _exit
FILE: D:\hujie\init.c
(0001) // init.c
(0002) //
(0003)
(0004) #include <io8515v.h>
(0005) #include <macros.h>
(0006) #include "1602LCD.h"
(0007) #include "PID.h"
(0008) #include "main.h"
(0009)
(0010) // ADC寄存器
(0011) #define ADCCR (*(volatile unsigned char *) 0x4000) // ADC控制器
(0012) #define ADCH (*(volatile unsigned char *) 0x4001) // 高4位寄存器
(0013) #define ADCL (*(volatile unsigned char *) 0x4000) // 低8位寄存器
(0014) // DAC寄存器
(0015) #define DAC1 (*(volatile unsigned char *) 0x8000) // 通道1
(0016) #define DAC2 (*(volatile unsigned char *) 0x8001) // 通道2
(0017) #define DAC3 (*(volatile unsigned char *) 0x8002) // 通道3
(0018) #define DAC4 (*(volatile unsigned char *) 0x8003) // 通道4
(0019) #define DACEN (*(volatile unsigned char *) 0xc000) // 转换开始
(0020)
(0021) //#define K0 32.76 // DAC转换系数
(0022) //#define K1 2.01 // ADC转换系数
(0023)
(0024) // 端口初始化
(0025) void port_init(void)
(0026) {
(0027) PORTA = 0xFF;
_port_init:
009C EF8F LDI R24,0xFF
009D BB8B OUT 0x1B,R24
(0028) DDRA = 0x00;
009E 2422 CLR R2
009F BA2A OUT 0x1A,R2
(0029) PORTB = 0xFF;
00A0 BB88 OUT 0x18,R24
(0030) DDRB = 0xFF;
00A1 BB87 OUT 0x17,R24
(0031) PORTC = 0xFF;
00A2 BB85 OUT 0x15,R24
(0032) DDRC = 0x00;
00A3 BA24 OUT 0x14,R2
(0033) PORTD = 0xFF;
00A4 BB82 OUT 0x12,R24
(0034) DDRD = 0x04;
00A5 E084 LDI R24,4
00A6 BB81 OUT 0x11,R24
(0035) }
00A7 9508 RET
(0036) // TIMER0初始化
(0037) void timer0_init(void)
(0038) {
(0039) TCCR0 = 0x00; //stop timer
_timer0_init:
00A8 2422 CLR R2
00A9 BE23 OUT 0x33,R2
(0040) TCNT0 = 0xD9; //set count value
00AA ED89 LDI R24,0xD9
00AB BF82 OUT 0x32,R24
(0041) TCCR0 = 0x05; //start timer
00AC E085 LDI R24,5
00AD BF83 OUT 0x33,R24
(0042) }
00AE 9508 RET
(0043) // TIMER1初始化
(0044) void timer1_init(void)
(0045) {
(0046) TCCR1A = 0x00;
_timer1_init:
00AF 2422 CLR R2
00B0 BC2F OUT 0x2F,R2
(0047) TCCR1B = 0x00; //stop
00B1 BC2E OUT 0x2E,R2
(0048) OCR1AH = 0x07;
00B2 E087 LDI R24,7
00B3 BD8B OUT 0x2B,R24
(0049) OCR1AL = 0xD0;
00B4 ED80 LDI R24,0xD0
00B5 BD8A OUT 0x2A,R24
(0050) OCR1BH = 0x07;
00B6 E087 LDI R24,7
00B7 BD89 OUT 0x29,R24
(0051) OCR1BL = 0xD0;
00B8 ED80 LDI R24,0xD0
00B9 BD88 OUT 0x28,R24
(0052) TCNT1H = 0xF8; //setup
00BA EF88 LDI R24,0xF8
00BB BD8D OUT 0x2D,R24
(0053) TCNT1L = 0x30;
00BC E380 LDI R24,0x30
00BD BD8C OUT 0x2C,R24
(0054) TCCR1B = 0x02; //start Timer
00BE E082 LDI R24,2
00BF BD8E OUT 0x2E,R24
(0055) }
00C0 9508 RET
_data_init:
i --> R20
data --> R22
00C1 DB85 RCALL push_gset2
00C2 2F60 MOV R22,R16
00C3 2F71 MOV R23,R17
(0056) // 数据格式转换
(0057) void data_init(unsigned int data)
(0058) {
(0059) int i;
(0060)
(0061) for(i=4;i>=0;i--)
00C4 E044 LDI R20,4
00C5 E050 LDI R21,0
(0062) {
(0063) value_table[i]=data%10;
00C6 E02A LDI R18,0xA
00C7 E030 LDI R19,0
00C8 2F06 MOV R16,R22
00C9 2F17 MOV R17,R23
00CA DAD0 RCALL mod16u
00CB EF8C LDI R24,0xFC
00CC E090 LDI R25,0
00CD 2FE4 MOV R30,R20
00CE 2FF5 MOV R31,R21
00CF 0FE8 ADD R30,R24
00D0 1FF9 ADC R31,R25
00D1 8300 STD Z+0,R16
(0064) data/=10;
00D2 E02A LDI R18,0xA
00D3 E030 LDI R19,0
00D4 2F06 MOV R16,R22
00D5 2F17 MOV R17,R23
00D6 DAC6 RCALL div16u
00D7 2F60 MOV R22,R16
00D8 2F71 MOV R23,R17
00D9 5041 SUBI R20,1
00DA 4050 SBCI R21,0
00DB 3040 CPI R20,0
00DC E0E0 LDI R30,0
00DD 075E CPC R21,R30
00DE F73C BGE 0x00C6
(0065) }
(0066) }
00DF DB48 RCALL pop_gset2
00E0 9508 RET
_init_devices:
00E1 DB4E RCALL push_gset1
00E2 9726 SBIW R28,6
(0067)
(0068) // 初始化
(0069) void init_devices(void)
(0070) {
(0071) CLI();
00E3 94F8 BCLR 7
(0072) port_init();
00E4 DFB7 RCALL _port_init
(0073) timer0_init();
00E5 DFC2 RCALL _timer0_init
(0074) timer1_init();
00E6 DFC8 RCALL _timer1_init
(0075) LCD_init();
00E7 D666 RCALL _LCD_init
(0076)
(0077) MCUCR = 0xC2; // 外部SRAM访问
00E8 EC82 LDI R24,0xC2
00E9 BF85 OUT 0x35,R24
(0078) GIMSK = 0x40; // INT0中断
00EA E480 LDI R24,0x40
00EB BF8B OUT 0x3B,R24
(0079) TIMSK = 0x82; // T/C0、T/C1中断
00EC E882 LDI R24,0x82
00ED BF89 OUT 0x39,R24
(0080)
(0081) ADCCR=0x60; // 开启ADC
00EE E680 LDI R24,0x60
00EF 93804000 STS 0x4000,R24
(0082) ADCCR=0x40;
00F1 E480 LDI R24,0x40
00F2 93804000 STS 0x4000,R24
(0083)
(0084) DAC1=0; // 开启DAC通道1
00F4 2422 CLR R2
00F5 92208000 STS 0x8000,R2
(0085) DAC2=0; // 开启DAC通道2
00F7 92208001 STS 0x8001,R2
(0086) DAC3=0; // 开启DAC通道3
00F9 92208002 STS 0x8002,R2
(0087) DAC4=DAC4_value; // 开启DAC通道4
00FB 90200082 LDS R2,0x82
00FD 92208003 STS 0x8003,R2
(0088) DACEN=0;
00FF 2422 CLR R2
0100 9220C000 STS 0xC000,R2
(0089)
(0090) LCD_write_string(0,0,"O:0020 R:0000 mA");
0102 E781 LDI R24,0x71
0103 E090 LDI R25,0
0104 8399 STD Y+1,R25
0105 8388 STD Y+0,R24
0106 2722 CLR R18
0107 2700 CLR R16
0108 D6F4 RCALL _LCD_write_string
(0091) LCD_write_string(0,1," ^ +/-ing...");
0109 E680 LDI R24,0x60
010A E090 LDI R25,0
010B 8399 STD Y+1,R25
010C 8388 STD Y+0,R24
010D E021 LDI R18,1
010E 2700 CLR R16
010F D6ED RCALL _LCD_write_string
(0092) value=20;
0110 E184 LDI R24,0x14
0111 E090 LDI R25,0
0112 9390010D STS _value+1,R25
0114 9380010C STS _value,R24
(0093) ADC_GD=20*K1;
0116 E206 LDI R16,0x26
0117 E010 LDI R17,0
0118 DB43 RCALL lpm32
0119 933A ST R19,-Y
011A 932A ST R18,-Y
011B 931A ST R17,-Y
011C 930A ST R16,-Y
011D 90400085 LDS R4,0x85
011F 90500086 LDS R5,0x86
0121 90200083 LDS R2,0x83
0123 90300084 LDS R3,0x84
0125 925A ST R5,-Y
0126 924A ST R4,-Y
0127 923A ST R3,-Y
0128 922A ST R2,-Y
0129 DD1A RCALL mpy32f
012A 2FEC MOV R30,R28
012B 2FFD MOV R31,R29
012C 8302 STD Z+2,R16
012D 8313 STD Z+3,R17
012E 8324 STD Z+4,R18
012F 8335 STD Z+5,R19
0130 2FEC MOV R30,R28
0131 2FFD MOV R31,R29
0132 8022 LDD R2,Z+2
0133 8033 LDD R3,Z+3
0134 8044 LDD R4,Z+4
0135 8055 LDD R5,Z+5
0136 925A ST R5,-Y
0137 924A ST R4,-Y
0138 923A ST R3,-Y
0139 922A ST R2,-Y
013A E202 LDI R16,0x22
013B E010 LDI R17,0
013C DB1F RCALL lpm32
013D 933A ST R19,-Y
013E 932A ST R18,-Y
013F 931A ST R17,-Y
0140 930A ST R16,-Y
0141 DCD1 RCALL cmp32f
0142 F0C4 BLT 0x015B
0143 2FEC MOV R30,R28
0144 2FFD MOV R31,R29
0145 8022 LDD R2,Z+2
0146 8033 LDD R3,Z+3
0147 8044 LDD R4,Z+4
0148 8055 LDD R5,Z+5
0149 925A ST R5,-Y
014A 924A ST R4,-Y
014B 923A ST R3,-Y
014C 922A ST R2,-Y
014D E202 LDI R16,0x22
014E E010 LDI R17,0
014F DB0C RCALL lpm32
0150 933A ST R19,-Y
0151 932A ST R18,-Y
0152 931A ST R17,-Y
0153 930A ST R16,-Y
0154 DC19 RCALL sub32f
0155 DB7E RCALL fp2int
0156 2F40 MOV R20,R16
0157 2F51 MOV R21,R17
0158 5040 SUBI R20,0
0159 4850 SBCI R21,0x80
015A C009 RJMP 0x0164
015B 2FEC MOV R30,R28
015C 2FFD MOV R31,R29
015D 8102 LDD R16,Z+2
015E 8113 LDD R17,Z+3
015F 8124 LDD R18,Z+4
0160 8135 LDD R19,Z+5
0161 DB72 RCALL fp2int
0162 2F40 MOV R20,R16
0163 2F51 MOV R21,R17
0164 93500109 STS _ADC_GD+1,R21
0166 93400108 STS _ADC_GD,R20
(0094) DAC=7882;
0168 EC8A LDI R24,0xCA
0169 E19E LDI R25,0x1E
016A 93900107 STS _DAC+1,R25
016C 93800106 STS _DAC,R24
(0095) SEI();
016E 9478 BSET 7
(0096) }
016F 9626 ADIW R28,6
0170 DAC2 RCALL pop_gset1
0171 9508 RET
_int0_isr:
jj --> R12
ii --> R10
0172 DAFD RCALL push_lset
0173 DAD9 RCALL push_gset4
(0097) // 读取ADC转换值 启动AD在PID运算后
(0098) #pragma interrupt_handler int0_isr:2
(0099) void int0_isr(void)
(0100) {
(0101) unsigned int ii;
(0102) unsigned int jj;
(0103) //external interupt on INT0
(0104) ii=ADCL;
0174 90A04000 LDS R10,0x4000
0176 24BB CLR R11
(0105) delay_nus(1);
0177 E001 LDI R16,1
0178 E010 LDI R17,0
0179 D6FA RCALL _delay_nus
(0106) jj=ADCH;
017A 90C04001 LDS R12,0x4001
017C 24DD CLR R13
(0107) ADC=jj;
017D 92D0010B STS _ADC+1,R13
017F 92C0010A STS _ADC,R12
(0108) ADC<<=8;
0181 2C2C MOV R2,R12
0182 2C3D MOV R3,R13
0183 2C32 MOV R3,R2
0184 2422 CLR R2
0185 9230010B STS _ADC+1,R3
0187 9220010A STS _ADC,R2
(0109) ADC|=ii;
0189 282A OR R2,R10
018A 283B OR R3,R11
018B 9230010B STS _ADC+1,R3
018D 9220010A STS _ADC,R2
(0110) arv_ADC+=(unsigned long)ADC;
018F 2444 CLR R4
0190 2455 CLR R5
0191 9080008A LDS R8,0x8A
0193 9090008B LDS R9,0x8B
0195 90600088 LDS R6,0x88
0197 90700089 LDS R7,0x89
0199 0C62 ADD R6,R2
019A 1C73 ADC R7,R3
019B 1C84 ADC R8,R4
019C 1C95 ADC R9,R5
019D 92700089 STS 0x89,R7
019F 92600088 STS 0x88,R6
01A1 9290008B STS 0x8B,R9
01A3 9280008A STS 0x8A,R8
(0111) arv_count++;
01A5 E041 LDI R20,1
01A6 E050 LDI R21,0
01A7 E060 LDI R22,0
01A8 E070 LDI R23,0
01A9 9040008E LDS R4,0x8E
01AB 9050008F LDS R5,0x8F
01AD 9020008C LDS R2,0x8C
01AF 9030008D LDS R3,0x8D
01B1 0E24 ADD R2,R20
01B2 1E35 ADC R3,R21
01B3 1E46 ADC R4,R22
01B4 1E57 ADC R5,R23
01B5 9230008D STS 0x8D,R3
01B7 9220008C STS 0x8C,R2
01B9 9250008F STS 0x8F,R5
01BB 9240008E STS 0x8E,R4
(0112) }
01BD DA6E RCALL pop_gset4
01BE DAC8 RCALL pop_lset
01BF 9518 RETI
_timer0_ovf_isr:
01C0 DAAF RCALL push_lset
01C1 DA85 RCALL push_gset2
01C2 9762 SBIW R28,0x12
(0113)
(0114) // 1s显示一次数据
(0115) #pragma interrupt_handler timer0_ovf_isr:8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -