Группа: Новичок
Сообщений: 9
Регистрация: 18-04-06
Пользователь №: 16 244

|
Вот исходник, может чего усовершенствуете, поможете: А так вроде работает ; ;----------------------------------------------------------------------------; ; FIR Filter 300-8000 ;----------------------------------------------------------------------------; ; Note1: ATMega16 @ 8MHz ; .include "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m16def.inc" ; tn26def This file is contained in "AVR Family Assembler". .include "C:\Program Files\Atmel\vpsrc\avr.inc" .include "C:\Program Files\Atmel\vpsrc\vp_def.inc" ; коэффициенты .equ k23=-7 .equ k22=-8 .equ k21=-8 .equ k20=-8 .equ k19=-9 .equ k18=-9 .equ k17=-9 .equ k16=-9 .equ k15=-10 .equ k14=-10 .equ k13=-10 .equ k12=255 .equ k11=-10 .equ k10=-10 .equ k9=-10 .equ k8=-9 .equ k7=-9 .equ k6=-9 .equ k5=-9 .equ k4=-8 .equ k3=-8 .equ k2=-8 .equ k1=-7 .equ max=65 ;----------------------------------------------------------; ; Program code .cseg outi SPL, LOW(RAMEND) outi SPH, HIGH(RAMEND) rcall cl_data rcall init_io ;---------------------------------------; ; Main loop (38.5kHz)
main:
sbis ADCSR, 4 ;Wait for EOC rjmp PC-1 ;/ sbi ADCSR, 4 ;Clear ADIF in EL, ADCH ;Read A/D data sbi ADCSR, 6 ;// start new A/D conversion outi TCNT1L, 0x0 outi OCR1BH, 0x0 subi EL,45 ; out OCR1BL, EH ;Update analog output
ldiw Y, 0x70 clrw B ; clrw C ;сохраненные отчеты ; clrw A ;отчеты из памяти
; Cl_Data процедура для очистки памяти данных вначале фильтрации
; addi YL, 41 ; ori YL, 0x80 ; andi YL, 0xBF ;===================================== ;Z - регистр для загрузки последнего отчета ;В - регистр содержащий знчение костанты ;C - регистр для загрузки предпоследнего разряда, ; для того чтобы потом загрузить предпоследний отчет в последний ; таким образом отчеты здвигаются на один вправо ;===================================== ; k23 ld AL, Y+ ; загрузка в ZL 23 отчета - адрес х70 ldi DL,k23 cp DL,ZL ; если результат больше 0 тогда коэф считается отрицательным brcc PC+3 mul DL,AL rjmp PC+2 mulsu DL,AL addw B,T0 ld CL, Y ; загрузка в DL 22 отчета - адрес х71 st -Y,CL ; X23<-X22 inc YL ; B:=X(23)*k23 ; в X(23) записывается X(22), ; т.е. в память по ядресу x70 заноситься значение X(22) ;k22 ldi DL,k22 ld AL, Y+ ; загрузка в ZL 23 отчета - адрес х70 cp DL,ZL ; если результат больше 0 тогда коэф считается отрицательным brcc PC+3 mul DL,AL ; беззнаковое умножение rjmp PC+2 mulsu DL,AL ; DL < 0 , AL - беззнаковое addw B,T0 ld CL, Y ; загрузка в СL 21 отчета из адрес х72 st -Y,CL ; X22<-X21 inc YL ;k21 ;х72 ldi DL,k21 rcall summ ; k20 ldi DL, k20 ; ZL=20,х73 rcall summ ; k19 ldi DL, k19 ; ZL=19,х74 rcall summ ; k18 = -1 ldi DL,k18 rcall summ ; k17 ldi DL,k17 rcall summ ; k16 ; ZL=16,х77 ldi DL,k16 rcall summ ; k15 ; ZL=15,х78 ldi DL,k15 rcall summ ; k14 ; ZL=14,х79 ldi DL,k14 rcall summ ; k13 ; ZL=13,х7A ldi DL,k13 rcall summ ; k12 ; ZL=12,х7B ldi DL,k12 ld AL, Y+ ; загрузка в ZL 23 отчета - адрес х70 mul DL,AL ; беззнаковое умножение addw B,T0 ld CL, Y ; загрузка в СL 21 отчета из адрес х72 st -Y,CL ; X22<-X21 inc YL ; k11 ; ZL=11,х7C ldi DL,k11 rcall summ ; k10 ; ZL=10,х7D ldi DL,k10 rcall summ ; k9 ; ZL=9,х7E ldi DL,k9 rcall summ ; k8 ; ZL=8,х7F ldi DL,k8 rcall summ ; k7 ; ZL=7,х80 ldi DL,k7 rcall summ ; k6 ; ZL=6,х81 ldi DL,k6 rcall summ ; k5 ; ZL=5,х82 ldi DL,k5 rcall summ ; k4 ; ZL=4,х83 ldi DL,k4 rcall summ ; k3 ; ZL=3,х84 ldi DL,k3 rcall summ ; k2 ; ZL=2,х85 ldi DL,k2 ld AL, Y+ ; загрузка в ZL 23 отчета - адрес х70 cp DL,ZL ; если результат больше 0 тогда коэф считается отрицательным brcc PC+3 mul DL,AL ; беззнаковое умножение rjmp PC+2 mulsu DL,AL ; addw B,T0 ; AL загружается в регистр CL, чтобы в следующим цикле ; отот отчет был перед другим входным сигналом mov CL,EL ; CL=1,входное значение st -Y,CL ; X2<-X1 ; k1 ldi DL,k1 cp DL,ZL ; если результат больше 0 тогда коэф считается отрицательным brcc PC+3 mul DL,CL ; беззнаковое умножение rjmp PC+2 mulsu DL,CL ; DL < 0 , AL - беззнаковое addw B,T0 ; проверка на отрицательный результат ; sbis ADCH, 3 ; subi BH,220 st X, BH ; cp BH,ZH ; если результат больше 0 тогда коэф считается отрицательным ; brcc PC+3 mov EH,BH ; в EН записывается сумма произведений DL=k1*x1+k2*x2+...+k23*x23 ; rjmp PC+2 ; mov EH,EL rjmp main
; Очистка памяти для загрузки значений отчетов cl_data: ldi BL,0b10000000 ldiw Y,0x87 st -Y, BL inc BL cpi YL, 0x70 brne PC-3 ret
; Операция суммирования summ: ; k22 ld AL, Y+ ; загрузка в ZL 23 отчета - адрес х70 cp DL,ZL ; если результат больше 0 тогда коэф считается отрицательным brcc PC+3 mul DL,AL ; беззнаковое умножение rjmp PC+2 mulsu DL,AL ; DL < 0 , AL - беззнаковое addw B,T0 ld CL, Y ; загрузка в СL 21 отчета из адрес х72 st -Y,CL ; X22<-X21 inc YL ; B:=X(22)*k22 ; в X(22) записывается X(21), ; т.е. в память по ядресу x71 заноситься значение X(21) ret ret ;---------------------------------------; ; Initialize peripherals
init_io: clr _0 clr _255 dec _255
ldi AL, 0b10100111 mov _NTRL, AL
outi MCUCR, 0b01000000 ;Disable pull-ups
out PORTA, _0 ;АЦП out DDRA, _0
outi PORTB, 0b11110000 ; SCK, MISO, MOSI outi DDRB, 0b11110000 ; outi DDRD, 0b00010000 ; OC1 - выход ЦАП
;A/D converter outi ADMUX, 0b11100111 ;Ch:7, Vref:2.56V (Можно еще попробовать) outi ADCSR, 0b11010101 ;Clock:одиночный режим 8000000/32/13=19230 Гц запуск
outi TCCR1A, 0b00110001 ;00-отключен OC1A ;11-OC1B работает в инертированном режиме 1 при совпадении TC1 ;00-не используется ;01-WGM11,WGM10-8 битная Phase Correct PWM(ШИМ с точной фазой) ;// 8 bit Correct PWM, using COM1B Установка ШИМ работает вывод В, неинвертированный ШИМ OCB1 outi TCNT1H, 0x00 outi TCNT1L, 0x00 ;// set counter1 to zero Счетный регистр обнуляется outi TIFR, 0x04 ;// clear counter1 overflow flag флаг разрешения прерывания по переполнению ТС1 outi TIMSK, 0b00001100 ;1-флаг разрешения прерывания по совпадению TC1B ;// enable counter1 overflow interrupt флаг прерывания по переполнению ТС1 outi TCCR1B,0b00000001 ;0-отключена схема подавления помех ;0-сохр счетного регистра по спаду ;0-не используется ;00-WGM13,WGM12-8 разрядная ШИМ ;001-clkI/O=8МГц-тактовая частота счетчика ;// counter1 clock prescale = 1 8000000/256/2=15625 Гц частота дискретизации ШИМ outi OCR1BH, 0x00 ;// set output compare register B to zero Регистр сравнения очистим outi OCR1BL, 0x00 ldi ZL, max ldi ZH, 250 ret
|