📄 smoothfilter.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 + -