⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init.s

📁 本设计以ATMEL公司生产的AT90S8515作为控制核心
💻 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 + -