для начала протестируем кольцевой буфер по вышеприведенному алгоритму.
с кольцевыми буферами раньше не работал. пришло время познакомится.
Код: Выделить всё
.include "m8Adef.inc"
.dseg
MyArray: .byte 12
.cseg
.org 0
rjmp RESET
rjmp EXT_INT0
rjmp EXT_INT1
rjmp TIM2_COMP
rjmp TIM2_OVF
rjmp TIM1_CAPT
rjmp TIM1_COMPA
rjmp TIM1_COMPB
rjmp TIM1_OVF
rjmp TIM0_OVF
rjmp SPI_STC
rjmp USART_RXC
rjmp USART_UDRE
rjmp USART_TXC
rjmp AD
rjmp EE_RDY
rjmp ANA_COMP
rjmp TWSI
rjmp SPM_RDY
;RESET:
EXT_INT0:
EXT_INT1:
TIM2_COMP:
TIM2_OVF:
TIM1_CAPT:
TIM1_COMPA:
TIM1_COMPB:
TIM1_OVF:
TIM0_OVF:
SPI_STC:
USART_RXC:
USART_UDRE:
USART_TXC:
AD:
EE_RDY:
ANA_COMP:
TWSI:
SPM_RDY:
reti
RESET:
ldi R16,Low(RAMEND) ;инициализация стека
out SPL,R16
ldi R16,High(RAMEND) ;инициализация стека
out SPH,R16
;Настройка порта B
ldi R16,0
out DDRB,R16
;Настройка порта D
ldi R16,255
out DDRD,R16
;Настройка порта C
ldi R16,0b00001100
out DDRC,R16
ldi R16,0 ;сброс указателя запись
ldi R17,0 ;сброс указателя считывание
ldi R18,0 ;сброс счетчика буфера
Main: sbis PINC,0 ;кнопка запись нажата?
rjmp A2
rcall Delay
sbis PINC,0 ;кнопка запись нажата?
rjmp A2
rcall Input
A1: sbic PINC,0 ;кнопка запись отпущенна?
rjmp A1
A2:
sbis PINC,1 ;кнопка считывание нажата?
rjmp B2
rcall Delay
sbis PINC,1 ;кнопка считывание нажата?
rjmp B2
rcall Output
B1: sbic PINC,1 ;кнопка считывание отпущенна?
rjmp B1
B2:
cpi R18,12
brsh C1
cbi PORTC,2 ;выключить индикатор "буфер занят"
rjmp C2
C1: sbi PORTC,2 ;включить индикатор "буфер занят"
C2:
cpi R18,0
breq D1
cbi PORTC,3 ;выключить индикатор "буфер пуст"
rjmp D2
D1: sbi PORTC,3 ;включить индикатор "буфер пуст"
ldi R16,0 ;сброс указателя запись
ldi R17,0 ;сброс указателя считывание
D2: rjmp Main
Delay: ldi R19,0
F1: cpi R19,10
brsh F3
inc R19
ldi R20,0
F2: cpi R20,10
brsh F1
inc R20
rjmp F2
F3: ret
Input: cpi R18,12
brlo H1
rjmp H3
H1: ldi ZH,High(MyArray)
ldi ZL,Low(MyArray)
ldi R19,0
add ZL,R16
adc ZH,R19
in R19,PINB
st Z,R19
inc R18
inc R16
cpi R16,12
brsh H2
rjmp H3
H2: ldi R16,0 ;сброс указателя запись
H3: ret
Output: cpi R18,1
brsh K1
rjmp K3
K1: ldi ZH,High(MyArray)
ldi ZL,Low(MyArray)
ldi R19,0
add ZL,R17
adc ZH,R19
ld R19,Z
out PORTD,R19
dec R18
inc R17
cpi R17,12
brsh K2
rjmp K3
K2: ldi R17,0 ;сброс указателя считывание
K3: ret
А таким, что вольтметр переменного тока проектируем - в состав которого будут входить аналоговые МС.Pavel_1978 писал(а):А каким боком данная тема относится к разделу форума "Аналоговая техника"?
orinoko писал(а):Ваша программа совершенно нечитаема.
СЦБист писал(а):Может найти несколько аплитудных значений, а потом найти их среднее значение ?
Вот её воплощение. Может возьмёте что-то себе на заметку.СЦБист писал(а):Решил собрать простенький вольтметр переменного тока.
В голову пришла такая идея.
...................
Спасибо.orinoko писал(а):Вот её воплощение.
Как-же извлечь корень к примеру байтного числа ?orinoko писал(а):Да шо вы говорите? На асме
А поиск что, отменили? За минуту находится.СЦБист писал(а):Как-же извлечь корень
Код: Выделить всё
;*******************************************************************************
*********************
;*
;* Подпрограмма вычисления квадратного корня для 24-ти битного аргумента *
;* (c) 1998 Alexander Trush http://trush.da.ru trush@ropnet.ru 2:5020/392.40
;*
; Вы можете свободно использовать, распространять, модифицировать этот
; код до тех пор, пока вы указываете моё авторство и распространяете
; это требование. Кроме того, я хотел бы получать уведомление о
; применении этого кода по e-mail (trush@kbotd.ru).
sqrt24: ldi mask,1; Используем маску в регистре, т.к. команды EORI нет...
ldi count,12; Последний бит значения корня не требует специального
; подхода - есть запас от потери битов аж 4 бита
clr16 work_h, work_l
clr16 dist_h, dist_l; Очистка накопителя значения корня
sqrt24_1: cpi src_h, 64
cpc work_l, dist_l
cpc work_h, dist_h
brcs sqrt24_2
subi src_h, 64
sbc work_l, dist_l
sbc work_h, dist_h
sqrt24_2: rol dist_l
rol dist_h
eor dist_l, mask; Инверсия младшего бита значания корня,
; т.к. при заёме должны писать 0, и 1 при отсутствии
lsl src_l; Сдвиг аргумента на 2 бита
rol src_m; work_h:work_l:src_h:src_m:src_l <<= 2
rol src_h
rol work_l
rol work_h
lsl src_l
rol src_m
rol src_h
rol work_l
rol work_h
dec count; Получили ли все биты значения корня кроме последнего?..
brne sqrt24_1
cp dist_l, work_l
cpc dist_h, work_h
adc dist_l, src_m; Команды ADCI нет, а src_m точно здесь равен 0
adc dist_h, src_m
ret
;******************************************************************************Что это за последние формулы . Нечего не понялЛеонид Иванович писал(а):Кроме того, RMS можно вычислять и без извлечения корня, используя только умножение и деление.