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

📄 smoothfilter.asm

📁 提高数据采集可靠性的一种方法--平滑滤波法
💻 ASM
字号:
;可靠性:滑动平均时取最新N次连续采样的平均,具有很好滤除干扰的作用,计算公式为

;	 yk = 1/n(Xk+ Xk-1 + Xk-2 ... + Xk-n+1)
;其中Xk-i(i=0~n-1)为第(k-i)次采样, yk为第k个平均,n为参加平均计算的总采样数。

;清单55               ;40点平均在r18r19,累加和在r5r6r7;20点平均在
;R14R15,累加和在r1r3r4
SLPAV:  PUSH    R26          ;采样在R8R9,采样数据存储区$150--$19F/工作寄存器
;r1--r19&r26 r27
        PUSH    R27
        LDI     R27,1
        LDS     R26,$14F     ;数据存储区首地址$14F
        ADD     R7,R9
        ADC     R6,R8        ;采样加入40点平均累加和
        BRCC    SLP1
        INC     R5           ;有进位,高位字节增1
SLP1:   ADD     R4,R9
        ADC     R3,R8        ;采样加入20点平均累加和
        BRCC    SLP2
        INC     R1           ;有进位,高位字节增1
SLP2:   LD      R16,X
        ST      X+,R9
        MOV     R9,R16       ;置换出最旧采样低位字节
        LD      R16,X
        ST      X+,R8
        MOV     R8,R16       ;置换出最旧采样高位字节
        CPI     R26,$A0
        BRNE    SLPA1
        LDI     R26,$50      ;采样放满存储区后,指针初始化($1a0=$150)
        STS     $14F,R26
        LDS     R16,$A4
        SBRC    R16,4       
        RJMP    SLPA2        ;40点平均时间达到,转
        SBR     R16,$10      ;设置40点平均时间达到标志
        STS     $A4,R16
        RJMP    SLDIV        ;转去计算40点平均
SLPA1:  STS     $14F,R26     ;暂存指针
        LDS     R16,$A4
        SBRS    R16,4
        RJMP    SLPB0        ;还未到40点平均,转
SLPA2:  SUB     R7,R9
        SBC     R6,R8        ;到40点平均后除加上新采样外,还要减去最旧采样
        BRCC    SLDIV        ;够减!
        DEC     R5
SLDIV:  CLR     R12
        LDI     R16,40
        MOV     R11,R16
        CLR     R10
        MOV     R13,R5
        MOV     R14,R6
        MOV     R15,R7
        RCALL   DIV165       ;计算40点平均 
        MOV     R18,R14
        MOV     R19,R15       ;存入r18r19
SLPB0:  CPI     R26,$78
        BRNE    SLPB1
        LDS     R16,$A4
        SBRC    R16,3
        RJMP    SLPB2
        SBR     R16,8        ;建20点平均时间到标志
        STS     $A4,R16
        RJMP    SLPDV        ;
SLPB1:  LDS     R16,$A4
        SBRS    R16,3
        RJMP    SLRET        ;20点平均时间未到
SLPB2:  SUBI    R26,42       ;指针退回42字节,指向20点平均最旧数据
        CPI     R26,$50      ;不小于80,未超出采样数据存储区
        BRCC    SLPB20
        SUBI    R26,-80      ;否则加80调整回$150-$19F
SLPB20: LD      R11,X+       ;
        LD      R10,X
        SUB     R4,R11
        SBC     R3,R10       ;找到20点平均最旧采样,并将其从累加和中减去!
        BRCC    SLPDV
        DEC     R1
SLPDV:  LDI     R16,20
        MOV     R11,R16
        CLR     R10
        CLR     R12
        MOV     R13,R1
        MOV     R14,R3
        MOV     R15,R4
        RCALL   DIV165       ;20点平均在r14r15中
SLRET:  POP     R27
        POP     R26
        RET











;清单101        产生循环冗余检测(CRC)校验码表格子程序
	;本子程序为生成$00--$FF共256个数据之双字节CRC校验码表子程序,生成多项式为
	;P(X)=X16+X15+X2+1=$18005。因每一字节都生成两字节的CRC校验码,故CRC校
;验码表格长度为512字节。程序中规定将其放在片内SRAM$100--$2FF之中。也可将该
	;表存放地址作为子程序的入口条件,在主程序中规定存放地址。使用的单片机为MEGA8
	;/16/128;若使用8515单片机,须使用外部扩展SRAM;本子程序产生的CRC校验码表,
	;可直接烧录到FLASH,或写入EEPROM,或另行作为文件保存。
;若采用4字节的CRC校验码,表格长度达1024字节,则必须使用MEGA103/128等高档AVR
;单片机,或外扩SRAM的8515;故若处理的位序列信息不是很长,或对CRC检测的实时性
;要求不是很强,不必采用查表处理方式。
CRCTABL:LDI	 XH,$01          ;CRC-CODE-TABLE -GENERATING SUBPROGRAM
CLR	 XL              ;CRCTABLE FROM $100 TO $2FF
CLR	 R16             ;USE MEGA8/16/128
	  LDI	 R17,$05
	  LDI	 R18,$80	        ;P(X)=$18005
CRCT0:LDI	 R19,8	
	  CLR	 R14
	  CLR	 R15             ;add  2bytes $00 behind a Bi(from $00 to $FF)
CRCT1:LSL	 R14
	  ROL	 R15
	  ROL	 R16
	  BRCC	 CRCT2
	  EOR	 R14,R17
	  EOR	 R15,R18
CRCT2:DEC     R19
	  BRNE	 CRCT1
	  ST	     X+,R14
	  ST	     X+,R15
	  INC	 R16
	  BRNE   CRCT0
	  RET











;清单102	    快速生成位序列CRC校验码/或对接收位序列进行循环冗余检测子程序
	;100字节位序列m0,m1,m2,m3,m4,...m98,m99在发送方以递推方式生成CRC校验码子程序
	;或在接收方对该序列进行CRC检测之子程序
	;在发送方,本程序为CRC校验码生成子程序。将此位序列除以生成多项式P(X)
	;=X16+X15+X2+1,将生成的CRC校验码(即余式)装入位序列的最高低位字节
    ;(冲掉m0,m1),将最终处理的位序列发送出去。
	;在接收方,本程序为CRC检测子程序。将接收到的位序列除以生成多项式P(X)
	;=X16+X15+X2+1,若将原位序列最低两位字节m0,m1恢复,即除得的余式(R15R14)
;与原始位序列最低两位字节m1,m0对应相等,则为正确接收。
    ;本程序中循环次数为98,比位序列字节数少2。因为位序列最低两个字节m0,m1直
;接作为(第一个)余式,不对它们查取CRC校验码。 
;X为按字节寻址位序列指针,
;查取CRC校验码表格先按字计算其地址(基地址+偏移量),地址增倍后变为按字节寻址。       
CRCOUT:LDI	XH,$1            ;THE BIT SEQUENCE IS IN $100---$163(100 BYTES)
	  CLR	XL               ;TOTAL  100 BYTES
	  LDI	R16,$62          ;THE DATA BLOCK  LENGTH IS  98(=100-2)
	  LD 	R14,X+           ;m0
	  LD	    R15,X+           ;m1
CRCO1:LD	    R13,X+           ;fetch m2 at the first!
      LDI	ZH,HIGH(DATA5)
	  LDI	ZL,LOW(DATA5)
	  ADD	R30,R13
	  CLR	R13
	  ADC	R31,R13          
LSL	R30
ROL	R31              ;point to the CRC CODE!
	  LPM	   
	  EOR	R14,R0
	  ADIW	R30,1
	  LPM	
	  EOR	R15,R0           ;CRC CODE IN R14&R15(HIGH)!
	  DEC	R16
	  BRNE	CRCO1   
	  ST	S   $101,R15
  STS   $100,R14          ;将生成的CRC校验码放在位序列最低两位字节中
	  RET	                 ;或恢复出位序列最低两位字节并将其送回 
DATA5:.DB  $00,$00,$80,$05    ;THE CRC CODE TABLE
	  .DB  $80,$0F,$00,$0A    ;与清单101中SRAM$100--$2FF单元内容完全相同!
	  .DB  $80,$1B,$00,$1E
	;......................	;其余略
       end

⌨️ 快捷键说明

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