📄 init.s
字号:
.module init.c
.area text(rom, con, rel)
.dbfile D:\hujie\init.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 26
; // init.c
; //
;
; #include <io8515v.h>
; #include <macros.h>
; #include "1602LCD.h"
; #include "PID.h"
; #include "main.h"
;
; // ADC寄存器
; #define ADCCR (*(volatile unsigned char *) 0x4000) // ADC控制器
; #define ADCH (*(volatile unsigned char *) 0x4001) // 高4位寄存器
; #define ADCL (*(volatile unsigned char *) 0x4000) // 低8位寄存器
; // DAC寄存器
; #define DAC1 (*(volatile unsigned char *) 0x8000) // 通道1
; #define DAC2 (*(volatile unsigned char *) 0x8001) // 通道2
; #define DAC3 (*(volatile unsigned char *) 0x8002) // 通道3
; #define DAC4 (*(volatile unsigned char *) 0x8003) // 通道4
; #define DACEN (*(volatile unsigned char *) 0xc000) // 转换开始
;
; //#define K0 32.76 // DAC转换系数
; //#define K1 2.01 // ADC转换系数
;
; // 端口初始化
; void port_init(void)
; {
.dbline 27
; PORTA = 0xFF;
ldi R24,255
out 0x1b,R24
.dbline 28
; DDRA = 0x00;
clr R2
out 0x1a,R2
.dbline 29
; PORTB = 0xFF;
out 0x18,R24
.dbline 30
; DDRB = 0xFF;
out 0x17,R24
.dbline 31
; PORTC = 0xFF;
out 0x15,R24
.dbline 32
; DDRC = 0x00;
out 0x14,R2
.dbline 33
; PORTD = 0xFF;
out 0x12,R24
.dbline 34
; DDRD = 0x04;
ldi R24,4
out 0x11,R24
.dbline -2
.dbline 35
; }
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer0_init _timer0_init fV
.even
_timer0_init::
.dbline -1
.dbline 38
; // TIMER0初始化
; void timer0_init(void)
; {
.dbline 39
; TCCR0 = 0x00; //stop timer
clr R2
out 0x33,R2
.dbline 40
; TCNT0 = 0xD9; //set count value
ldi R24,217
out 0x32,R24
.dbline 41
; TCCR0 = 0x05; //start timer
ldi R24,5
out 0x33,R24
.dbline -2
.dbline 42
; }
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 45
; // TIMER1初始化
; void timer1_init(void)
; {
.dbline 46
; TCCR1A = 0x00;
clr R2
out 0x2f,R2
.dbline 47
; TCCR1B = 0x00; //stop
out 0x2e,R2
.dbline 48
; OCR1AH = 0x07;
ldi R24,7
out 0x2b,R24
.dbline 49
; OCR1AL = 0xD0;
ldi R24,208
out 0x2a,R24
.dbline 50
; OCR1BH = 0x07;
ldi R24,7
out 0x29,R24
.dbline 51
; OCR1BL = 0xD0;
ldi R24,208
out 0x28,R24
.dbline 52
; TCNT1H = 0xF8; //setup
ldi R24,248
out 0x2d,R24
.dbline 53
; TCNT1L = 0x30;
ldi R24,48
out 0x2c,R24
.dbline 54
; TCCR1B = 0x02; //start Timer
ldi R24,2
out 0x2e,R24
.dbline -2
.dbline 55
; }
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e data_init _data_init fV
; i -> R20,R21
; data -> R22,R23
.even
_data_init::
rcall push_gset2
mov R22,R16
mov R23,R17
.dbline -1
.dbline 58
; // 数据格式转换
; void data_init(unsigned int data)
; {
.dbline 61
; int i;
;
; for(i=4;i>=0;i--)
ldi R20,4
ldi R21,0
L5:
.dbline 62
.dbline 63
ldi R18,10
ldi R19,0
mov R16,R22
mov R17,R23
rcall mod16u
ldi R24,<_value_table
ldi R25,>_value_table
mov R30,R20
mov R31,R21
add R30,R24
adc R31,R25
std z+0,R16
.dbline 64
ldi R18,10
ldi R19,0
mov R16,R22
mov R17,R23
rcall div16u
mov R22,R16
mov R23,R17
.dbline 65
L6:
.dbline 61
subi R20,1
sbci R21,0
.dbline 61
cpi R20,0
ldi R30,0
cpc R21,R30
brge L5
.dbline -2
.dbline 66
; {
; value_table[i]=data%10;
; data/=10;
; }
; }
L4:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 I
.dbsym r data 22 i
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
rcall push_gset1
sbiw R28,6
.dbline -1
.dbline 70
;
; // 初始化
; void init_devices(void)
; {
.dbline 71
; CLI();
cli
.dbline 72
; port_init();
rcall _port_init
.dbline 73
; timer0_init();
rcall _timer0_init
.dbline 74
; timer1_init();
rcall _timer1_init
.dbline 75
; LCD_init();
rcall _LCD_init
.dbline 77
;
; MCUCR = 0xC2; // 外部SRAM访问
ldi R24,194
out 0x35,R24
.dbline 78
; GIMSK = 0x40; // INT0中断
ldi R24,64
out 0x3b,R24
.dbline 79
; TIMSK = 0x82; // T/C0、T/C1中断
ldi R24,130
out 0x39,R24
.dbline 81
;
; ADCCR=0x60; // 开启ADC
ldi R24,96
sts 16384,R24
.dbline 82
; ADCCR=0x40;
ldi R24,64
sts 16384,R24
.dbline 84
;
; DAC1=0; // 开启DAC通道1
clr R2
sts 32768,R2
.dbline 85
; DAC2=0; // 开启DAC通道2
sts 32769,R2
.dbline 86
; DAC3=0; // 开启DAC通道3
sts 32770,R2
.dbline 87
; DAC4=DAC4_value; // 开启DAC通道4
lds R2,_DAC4_value
sts 32771,R2
.dbline 88
; DACEN=0;
clr R2
sts 49152,R2
.dbline 90
;
; LCD_write_string(0,0,"O:0020 R:0000 mA");
ldi R24,<L10
ldi R25,>L10
std y+1,R25
std y+0,R24
clr R18
clr R16
rcall _LCD_write_string
.dbline 91
; LCD_write_string(0,1," ^ +/-ing...");
ldi R24,<L11
ldi R25,>L11
std y+1,R25
std y+0,R24
ldi R18,1
clr R16
rcall _LCD_write_string
.dbline 92
; value=20;
ldi R24,20
ldi R25,0
sts _value+1,R25
sts _value,R24
.dbline 93
; ADC_GD=20*K1;
ldi R16,<L14
ldi R17,>L14
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
lds R4,_K1+2
lds R5,_K1+2+1
lds R2,_K1
lds R3,_K1+1
st -y,R5
st -y,R4
st -y,R3
st -y,R2
rcall mpy32f
mov R30,R28
mov R31,R29
std z+2,R16
std z+3,R17
std z+4,R18
std z+5,R19
mov R30,R28
mov R31,R29
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L15
ldi R17,>L15
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall cmp32f
brlt L12
mov R30,R28
mov R31,R29
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L15
ldi R17,>L15
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall sub32f
rcall fp2int
mov R20,R16
mov R21,R17
subi R20,0 ; offset = 32768
sbci R21,128
rjmp L13
L12:
mov R30,R28
mov R31,R29
ldd R16,z+2
ldd R17,z+3
ldd R18,z+4
ldd R19,z+5
rcall fp2int
mov R20,R16
mov R21,R17
L13:
sts _ADC_GD+1,R21
sts _ADC_GD,R20
.dbline 94
; DAC=7882;
ldi R24,7882
ldi R25,30
sts _DAC+1,R25
sts _DAC,R24
.dbline 95
; SEI();
sei
.dbline -2
.dbline 96
; }
L9:
adiw R28,6
rcall pop_gset1
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 2
rjmp _int0_isr
.area text(rom, con, rel)
.dbfile D:\hujie\init.c
.dbfunc e int0_isr _int0_isr fV
; jj -> R12,R13
; ii -> R10,R11
.even
_int0_isr::
rcall push_lset
rcall push_gset4
.dbline -1
.dbline 100
; // 读取ADC转换值 启动AD在PID运算后
; #pragma interrupt_handler int0_isr:2
; void int0_isr(void)
; {
.dbline 104
; unsigned int ii;
; unsigned int jj;
; //external interupt on INT0
; ii=ADCL;
lds R10,16384
clr R11
.dbline 105
; delay_nus(1);
ldi R16,1
ldi R17,0
rcall _delay_nus
.dbline 106
; jj=ADCH;
lds R12,16385
clr R13
.dbline 107
; ADC=jj;
sts _ADC+1,R13
sts _ADC,R12
.dbline 108
; ADC<<=8;
mov R2,R12
mov R3,R13
mov R3,R2
clr R2
sts _ADC+1,R3
sts _ADC,R2
.dbline 109
; ADC|=ii;
or R2,R10
or R3,R11
sts _ADC+1,R3
sts _ADC,R2
.dbline 110
; arv_ADC+=(unsigned long)ADC;
clr R4
clr R5
lds R8,_arv_ADC+2
lds R9,_arv_ADC+2+1
lds R6,_arv_ADC
lds R7,_arv_ADC+1
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
sts _arv_ADC+1,R7
sts _arv_ADC,R6
sts _arv_ADC+2+1,R9
sts _arv_ADC+2,R8
.dbline 111
; arv_count++;
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
lds R4,_arv_count+2
lds R5,_arv_count+2+1
lds R2,_arv_count
lds R3,_arv_count+1
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
sts _arv_count+1,R3
sts _arv_count,R2
sts _arv_count+2+1,R5
sts _arv_count+2,R4
.dbline -2
.dbline 112
; }
L16:
rcall pop_gset4
rcall pop_lset
.dbline 0 ; func end
reti
.dbsym r jj 12 i
.dbsym r ii 10 i
.dbend
.area vector(rom, abs)
.org 14
rjmp _timer0_ovf_isr
.area text(rom, con, rel)
.dbfile D:\hujie\init.c
.dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
.even
_timer0_ovf_isr::
rcall push_lset
rcall push_gset2
sbiw R28,18
.dbline -1
.dbline 117
;
; // 1s显示一次数据
; #pragma interrupt_handler timer0_ovf_isr:8
; void timer0_ovf_isr(void)
; {
.dbline 118
; SEI();
sei
.dbline 119
; TCNT0 = 0xD9; //reload counter value
ldi R24,217
out 0x32,R24
.dbline 120
; time_count++;
lds R24,_time_count
subi R24,255 ; addi 1
sts _time_count,R24
.dbline 121
; if(time_count==100)
cpi R24,100
breq X0
rjmp L18
X0:
.dbline 122
; {
.dbline 123
; time_count=0;
clr R2
sts _time_count,R2
.dbline 124
; LCD_display(9,0,4,arv_ADC/arv_count/K1);
lds R4,_arv_count+2
lds R5,_arv_count+2+1
lds R2,_arv_count
lds R3,_arv_count+1
lds R8,_arv_ADC+2
lds R9,_arv_ADC+2+1
lds R6,_arv_ADC
lds R7,_arv_ADC+1
st -y,R5
st -y,R4
st -y,R3
st -y,R2
mov R16,R6
mov R17,R7
mov R18,R8
mov R19,R9
rcall div32u
mov R30,R28
mov R31,R29
std z+10,R16
std z+11,R17
std z+12,R18
std z+13,R19
ldi R16,<L22
ldi R17,>L22
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
mov R30,R28
mov R31,R29
; stack offset 4
ldd R2,z+14
ldd R3,z+15
ldd R4,z+16
ldd R5,z+17
lsr R5
ror R4
ror R3
ror R2
mov R16,R2
mov R17,R3
mov R18,R4
mov R19,R5
rcall long2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall mpy32fs
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
mov R30,R28
mov R31,R29
; stack offset 4
ldd R2,z+14
ldd R3,z+15
ldd R4,z+16
ldd R5,z+17
and R2,R20
and R3,R21
and R4,R22
and R5,R23
mov R16,R2
mov R17,R3
mov R18,R4
mov R19,R5
rcall long2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall add32fs
lds R4,_K1+2
lds R5,_K1+2+1
lds R2,_K1
lds R3,_K1+1
st -y,R5
st -y,R4
st -y,R3
st -y,R2
rcall div32f
mov R30,R28
mov R31,R29
std z+14,R16
std z+15,R17
std z+16,R18
std z+17,R19
mov R30,R28
mov R31,R29
ldd R2,z+14
ldd R3,z+15
ldd R4,z+16
ldd R5,z+17
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L23
ldi R17,>L23
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall cmp32f
brlt L20
mov R30,R28
mov R31,R29
ldd R2,z+14
ldd R3,z+15
ldd R4,z+16
ldd R5,z+17
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L23
ldi R17,>L23
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall sub32f
rcall fp2long
mov R2,R16
mov R3,R17
mov R4,R18
mov R5,R19
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,128
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
mov R30,R28
mov R31,R29
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
rjmp L21
L20:
mov R30,R28
mov R31,R29
ldd R16,z+14
ldd R17,z+15
ldd R18,z+16
ldd R19,z+17
rcall fp2long
mov R30,R28
mov R31,R29
std z+6,R16
std z+7,R17
std z+8,R18
std z+9,R19
L21:
mov R30,R28
mov R31,R29
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
std y+2,R2
std y+3,R3
std y+4,R4
std y+5,R5
ldi R24,4
std y+0,R24
clr R18
ldi R16,9
rcall _LCD_display
.dbline 125
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
sts _arv_ADC+1,R21
sts _arv_ADC,R20
sts _arv_ADC+2+1,R23
sts _arv_ADC+2,R22
.dbline 126
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
sts _arv_count+1,R21
sts _arv_count,R20
sts _arv_count+2+1,R23
sts _arv_count+2,R22
.dbline 127
L18:
.dbline -2
.dbline 128
; arv_ADC=0;
; arv_count=0;
; }
; }
L17:
adiw R28,18
rcall pop_gset2
rcall pop_lset
.dbline 0 ; func end
reti
.dbend
.area vector(rom, abs)
.org 12
rjmp _timer1_ovf_isr
.area text(rom, con, rel)
.dbfile D:\hujie\init.c
.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
; jj -> y+4
; ii -> <dead>
; iii -> y+0
.even
_timer1_ovf_isr::
rcall push_lset
sbiw R28,8
.dbline -1
.dbline 132
; // 0.01s采集并发送控制数值
; #pragma interrupt_handler timer1_ovf_isr:7
; void timer1_ovf_isr(void)
; {
.dbline 137
; long iii;
; unsigned int ii;
; float jj;
;
; TCNT1H=Time1>>8;
lds R2,_Time1
lds R3,_Time1+1
mov R2,R3
clr R3
out 0x2d,R2
.dbline 138
; TCNT1L=Time1&0xff;
lds R24,_Time1
lds R25,_Time1+1
andi R25,0
out 0x2c,R24
.dbline 140
; // PID函数
; PID(ADC-ADC_GD);
lds R2,_ADC_GD
lds R3,_ADC_GD+1
lds R16,_ADC
lds R17,_ADC+1
sub R16,R2
sbc R17,R3
rcall _PID
.dbline 141
; DAC3=DAC>>8; // 写DAC3寄存器
lds R2,_DAC
lds R3,_DAC+1
mov R2,R3
clr R3
sts 32770,R2
.dbline 142
; DAC2=DAC&0x0FF; // 写DAC4寄存器
lds R24,_DAC
lds R25,_DAC+1
andi R25,0
sts 32769,R24
.dbline 143
; DACEN=0; // 开始DA转换
clr R2
sts 49152,R2
.dbline 145
;
; ADCCR=0x60; // 启动ADC
ldi R24,96
sts 16384,R24
.dbline 146
; ADCCR=0x40;
ldi R24,64
sts 16384,R24
.dbline 147
; PORTB^=0x01;
ldi R24,1
in R2,0x18
eor R2,R24
out 0x18,R2
.dbline -2
.dbline 148
; }
L24:
adiw R28,8
rcall pop_lset
.dbline 0 ; func end
reti
.dbsym l jj 4 D
.dbsym l ii 1 i
.dbsym l iii 0 L
.dbend
.area lit(rom, con, rel)
L23:
.word 0x0,0x4f00
L22:
.word 0x0,0x4000
L15:
.word 0x0,0x4700
L14:
.word 0x0,0x41a0
.area data(ram, con, rel)
.dbfile D:\hujie\init.c
L11:
.blkb 17
.area idata
.byte 32,32,32,32,32,94,32,43,47,45,'i,'n,'g,46,46,46
.byte 0
.area data(ram, con, rel)
.dbfile D:\hujie\init.c
L10:
.blkb 17
.area idata
.byte 'O,58,48,48,50,48,32,'R,58,48,48,48,48,32,'m,'A
.byte 0
.area data(ram, con, rel)
.dbfile D:\hujie\init.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -