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

📄 zero.s

📁 工业开关量检测模块的原代码,带断线检测功能
💻 S
字号:
	.module zero.c
	.area text(rom, con, rel)
	.dbfile D:\报警系统设计资料\报警系统软件\测量模块基于CAN的系统网程序\电流CAN网\zero.c
	.dbfunc e zero_ref _zero_ref fV
;     Ad_Ze_Data -> y+108
;             ta -> R10
;        Ze_temp -> y+104
;        temp_dd -> R12
;         Ad_buf -> y+100
;          Ad_Ze -> y+0
;              j -> R14
;              i -> R10
	.even
_zero_ref::
	xcall push_gset5
	sbiw R28,63
	sbiw R28,49  ; offset = 112
	.dbline -1
	.dbline 5
; #include "main.h"
; extern  unsigned char  tempL,tempH;
; extern  unsigned int Ad_Ze_Buf[11];
; void zero_ref(void)
; { 
	.dbline 10
;   unsigned char ta,i,j,temp_dd;
;   unsigned int Ad_Ze[50];
;   float Ad_Ze_Data;
;   long Ad_buf,Ze_temp;
;   Ad_buf=0;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	subi R30,156  ; addi 100
	sbci R31,255
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 12
;   
;   spi_write(RD_Id_Reg);                
	ldi R16,96
	xcall _spi_write
	.dbline 13
;   ta=spi_read();
	xcall _spi_read
	mov R10,R16
	.dbline 15
;   
;   if((ta&0x0f)!=0x0a)
	mov R24,R10
	andi R24,15
	cpi R24,10
	breq L8
	.dbline 16
;   RESET;                              
	jmp 0x000
	xjmp L9
L8:
	.dbline 19
;   
;   else
;   {
	.dbline 20
;   spi_write(WR_Con_Reg);                                 
	ldi R16,16
	xcall _spi_write
	.dbline 21
;   spi_write(ConHreg_u_mask);             
	ldi R16,16
	xcall _spi_write
	.dbline 22
;   spi_write(ConLreg_ref_mask|ConLreg_buf_mask);   
	ldi R16,144
	xcall _spi_write
	.dbline 24
;   
;   spi_write(WR_Io_Reg);                
	ldi R16,40
	xcall _spi_write
	.dbline 25
;   spi_write(0x00);                     
	clr R16
	xcall _spi_write
	.dbline 27
;   
;   spi_write(WR_Mod_Reg);               
	ldi R16,8
	xcall _spi_write
	.dbline 28
;   spi_write(ModHreg_md2_mask);           
	ldi R16,128
	xcall _spi_write
	.dbline 29
;   spi_write(ModLreg_fs0_mask|ModLreg_fs1_mask|ModLreg_fs2_mask|ModLreg_fs3_mask);
	ldi R16,15
	xcall _spi_write
L10:
	.dbline 32
L11:
	.dbline 31
; 
;    while(!PINB3)                       
	.dbline 33
;    ;
;   spi_write(WR_Mod_Reg);                     
	ldi R16,8
	xcall _spi_write
	.dbline 34
;   spi_write(ModHreg_md2_mask|ModHreg_md0_mask);
	ldi R16,160
	xcall _spi_write
	.dbline 35
;   spi_write(ModLreg_fs0_mask|ModLreg_fs1_mask|ModLreg_fs2_mask|ModLreg_fs3_mask);
	ldi R16,15
	xcall _spi_write
L13:
	.dbline 38
L14:
	.dbline 37
;   
;    while(!PINB3)                     
	.dbline 39
;    ;
;   spi_write(WR_Con_Reg);              
	ldi R16,16
	xcall _spi_write
	.dbline 40
;   spi_write(ConHreg_u_mask);
	ldi R16,16
	xcall _spi_write
	.dbline 41
;   spi_write(ConLreg_ref_mask|ConLreg_buf_mask);
	ldi R16,144
	xcall _spi_write
	.dbline 43
;    
;   spi_write(WR_Mod_Reg);              
	ldi R16,8
	xcall _spi_write
	.dbline 44
;   spi_write(0x00);  
	clr R16
	xcall _spi_write
	.dbline 45
;   spi_write(ModLreg_fs0_mask|ModLreg_fs1_mask|ModLreg_fs2_mask|ModLreg_fs3_mask);
	ldi R16,15
	xcall _spi_write
	.dbline 46
;  }
L9:
	.dbline 48
; 
; chan_change(0); 
	clr R16
	xcall _chan_change
	.dbline 49
; delay_ms(1000);
	ldi R16,1000
	ldi R17,3
	xcall _delay_ms
	.dbline 50
; for(j=0;j<50;j++)
	clr R14
	xjmp L19
L16:
	.dbline 51
; {
	.dbline 52
; for(i=0;i<11;i++)
	clr R10
	xjmp L23
L20:
	.dbline 53
	.dbline 54
	xcall _conves_ad
	.dbline 55
	lds R18,_tempH
	lds R16,_tempL
	xcall _char_int
	ldi R24,2
	mul R24,R10
	movw R30,R0
	ldi R24,<_Ad_Ze_Buf
	ldi R25,>_Ad_Ze_Buf
	add R30,R24
	adc R31,R25
	std z+1,R17
	std z+0,R16
	.dbline 56
L21:
	.dbline 52
	inc R10
L23:
	.dbline 52
	mov R24,R10
	cpi R24,11
	brlo L20
	.dbline 57
	xcall _filter
	ldi R24,2
	mul R24,R14
	movw R30,R0
	movw R24,R28
	add R30,R24
	adc R31,R25
	std z+1,R17
	std z+0,R16
	.dbline 58
L17:
	.dbline 50
	inc R14
L19:
	.dbline 50
	mov R24,R14
	cpi R24,50
	brlo L16
	.dbline 59
; {
; conves_ad();
; Ad_Ze_Buf[i] = char_int(tempL,tempH);
; }
; Ad_Ze[j] = filter();                            //冒泡排序滤波
; }
; for(i=0;i<50;i++)
	clr R10
	xjmp L27
L24:
	.dbline 60
	.dbline 61
	ldi R24,2
	mul R24,R10
	movw R30,R0
	movw R24,R28
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	clr R4
	clr R5
	movw R30,R28
	subi R30,156  ; addi 100
	sbci R31,255
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	subi R30,156  ; addi 100
	sbci R31,255
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
	.dbline 62
L25:
	.dbline 59
	inc R10
L27:
	.dbline 59
	mov R24,R10
	cpi R24,50
	brlo L24
	.dbline 64
; {
; Ad_buf +=Ad_Ze[i];                             //重复50次 以保证基准点测量的准确性
; }
; 
; asm("nop");
	nop
	.dbline 65
; asm("nop");
	nop
	.dbline 66
; Ad_Ze_Data=Ad_buf/50.0;
	movw R30,R28
	subi R30,156  ; addi 100
	sbci R31,255
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	xcall long2fp
	movw R2,R16
	movw R4,R18
	ldi R16,<L28
	ldi R17,>L28
	xcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	movw R16,R2
	movw R18,R4
	xcall fpdiv2
	movw R30,R28
	subi R30,148  ; addi 108
	sbci R31,255
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 67
; Ze_temp=Ad_Ze_Data*1000;                       //放大1000倍
	ldi R16,<L29
	ldi R17,>L29
	xcall lpm32
	movw R24,R28
	subi R24,148  ; offset = 108
	sbci R25,255
	st -y,R25
	st -y,R24
	xcall fpmule1
	xcall fpint
	movw R30,R28
	subi R30,152  ; addi 104
	sbci R31,255
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 69
; 
; temp_dd = (Ze_temp&0xff000000)>>24;            //数据高八位存入EEROM的00地址
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,255
	movw R30,R28
	subi R30,152  ; addi 104
	sbci R31,255
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	and R16,R20
	and R17,R21
	and R18,R22
	and R19,R23
	ldi R24,24
	ldi R25,0
	st -y,R24
	xcall lsr32
	mov R12,R16
	.dbline 70
; EEPROMwrite(0x01,temp_dd);
	mov R18,R12
	ldi R16,1
	ldi R17,0
	xcall _EEPROMwrite
	.dbline 72
; 
; temp_dd = (Ze_temp&0x00ff0000)>>16;            
	ldi R20,0
	ldi R21,0
	ldi R22,255
	ldi R23,0
	movw R30,R28
	subi R30,152  ; addi 104
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R12,R4
	.dbline 73
; EEPROMwrite(0x02,temp_dd);
	mov R18,R12
	ldi R16,2
	ldi R17,0
	xcall _EEPROMwrite
	.dbline 75
; 
; temp_dd = (Ze_temp&0x00ff00)>>8;
	ldi R20,0
	ldi R21,255
	ldi R22,0
	ldi R23,0
	movw R30,R28
	subi R30,152  ; addi 104
	sbci R31,255
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	and R16,R20
	and R17,R21
	and R18,R22
	and R19,R23
	ldi R24,8
	ldi R25,0
	st -y,R24
	xcall asr32
	mov R12,R16
	.dbline 76
; EEPROMwrite(0x03,temp_dd);
	mov R18,R12
	ldi R16,3
	ldi R17,0
	xcall _EEPROMwrite
	.dbline 78
; 
; temp_dd = (Ze_temp&0x00ff);
	ldi R20,255
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	subi R30,152  ; addi 104
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	mov R12,R2
	.dbline 79
; EEPROMwrite(0x04,temp_dd);
	mov R18,R2
	ldi R16,4
	ldi R17,0
	xcall _EEPROMwrite
	.dbline 80
; EEPROMwrite(0x09,0x5a);
	ldi R18,90
	ldi R16,9
	ldi R17,0
	xcall _EEPROMwrite
	.dbline 81
; asm("nop");
	nop
	.dbline 82
; asm("nop");
	nop
	.dbline 83
; PORTB|=0x20;                                  //点亮运行指示灯 表示基准点测量已完成
	sbi 0x5,5
	.dbline -2
L7:
	adiw R28,63
	adiw R28,49  ; offset = 112
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym l Ad_Ze_Data 108 D
	.dbsym r ta 10 c
	.dbsym l Ze_temp 104 L
	.dbsym r temp_dd 12 c
	.dbsym l Ad_buf 100 L
	.dbsym l Ad_Ze 0 A[100:50]i
	.dbsym r j 14 c
	.dbsym r i 10 c
	.dbend
	.area lit(rom, con, rel)
L29:
	.word 0x0,0x447a
L28:
	.word 0x0,0x4248

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -