В принципе, правильно, но если учесть, что
BREQ - строго равно
BRLO - строго меньше
операцию BRSH можно не проводить.
Надо попробовать. Если не трудно покажите пример.Alexeyslav писал(а):А что мешает сначала вычесть значения, а потом решать на основе разницы с учетом знака? Определить события для "больше" и "меньше" если через эти два не пройдет - значит "в интервале".
Код: Выделить всё
MAIN:
LDS XH,$70
LDS XL,$71
LDS YH,$80
LDS YL,$81
IN R22,PORTC
ANDI R22,$F8
;Еще вопрос по этой же программе. При сравнении двух чисел из Х и Y регистров необходимо
; сделать вычитание между этими регистровыми парами.
; Если разность чисел меньше числа 3, то эта разность должна приравниваться к 0
; ( т. е как бы числа все равно совпадают).
;Я сделал пока так: если числа из XL - YL, XH- YH точно совпадают, то конфигурация порта С такая:
; sbi PORTC, 0
; cbi PORTC, 1
; cbi PORTC, 2
;а если не совпадают, тогда я провожу вычитание между младшими байтами регистровых пар XL и YL.
;*****************************************************
; ANDI XL,$FC
; ANDI YL,$FC ; в данном конкретном случае можно убрать незначащие разряды, но
; это не будет общим случаем. Для чисел не кратных степени 2 так делать уже нельзя
LDI R18,HIGH(11) ;
LDI R19,LOW(11) ; для примера
LDI R20,HIGH(-11) ;
LDI R21,LOW(-11) ; для примера
SUB XL,YL
SBC XH,YH
CP XL,R19
CPC XH,R18
BRGE J2
CP XL,R21
CPC XH,R20
BRLT J3
J1:
SBR R22,$01
OUT PORTC,R22
; sbi PORTC, 0
; cbi PORTC, 1
; cbi PORTC, 2
rjmp main
J2:
SBR R22,$02
OUT PORTC,R22
; cbi PORTC, 0
; sbi PORTC, 1
; cbi PORTC, 2
rjmp main
J3:
SBR R22,$04
OUT PORTC,R22
; cbi PORTC, 0
; cbi PORTC, 1
; sbi PORTC, 2
rjmp main
AlexeyslavAlexeyslav писал(а): Вместо того, чтобы читать с порта, отведи регистр в котором производи все изменения и выводи в порт только из него
При всем моё уважении...BOB51 писал(а):А зачем таймер перезагружать, тем более без остановки счета?![]()
Достаточно режима прерывания по совпадению с аппаратным сбросом таймера (CTC) - а значения менять в OCR1A.
Код: Выделить всё
R1 = делимое
Rw = R1
Rw <<= 3
Rw -= R1
Rw <<= 3
Rw += R1
Rw <<= 3
Rw -= R1
Rw <<= 4
Rw += R1
Rw += 7287
Rw >>= 16
Если R1>= 9378 то Rw++
Результат деления в Rw
Ещё раз, вы видели какая там погрешность? Специально посчитал: 0,013%.akl писал(а):По мне, искусственное введение погрешности при вычислении - зло.
Ещё не хватало сидеть крутить что-то (для достижения "моей точности" надо будет установить с точностью до 0,5 мВ), ставить многооборотный потенциометр и, по-хорошему, шунтирующую ёмкость. В данном случае не подходит потому что опора — напряжение питания.akl писал(а):Установить для исполнения 3,3V опорное напряжение 3.072V, для 5V - 4.096V
Пффф... проще взять из аппнота "16 / 16 = 16 + 16 bit unsigned (Code Optimized)". Или вкурить что Kavka предложил.akl писал(а):Да, будут 32-разрядные числа, но Вы же пишете на великом и могучем.
А зря. Местами было конструктивно.akl писал(а):Удалил.
Ну, ёлки-палки. И куча народу повелось.Gudd-Head писал(а):Как насчёт размяться математикой?![]()
Камень: Мега (аппаратный умножитель).
2. Почти "в лоб": умножить на 825 и потом просто отбросить младший байт (поделить на 256).
Как вам изврат?![]()
Код: Выделить всё
;******************************************************************************
;* Unsigned multiply of two 16bits numbers with 24bits result.
;* r18:r17:r16 = r23:r22 * r21:r20
;* STATISTICS
;* Cycles : 14 + ret
;* Words : 10 + ret
;* Register usage: r0 to r1, r16 to r18 and r20 to r23 (9 registers)
;******************************************************************************
mul16x16_24:
mul r23, r21 ; ah * bh
mov r18, r0
mul r22, r20 ; al * bl
movw r17:r16, r1:r0
mul r23, r20 ; ah * bl
add r17, r0
adc r18, r1
mul r21, r22 ; bh * al
add r17, r0
adc r18, r1
ret