Перейти к содержанию

поиогите с делением для 8051 на АСМ


Klima

Рекомендуемые сообщения

нужен алгоритм самого быстрого и самого экономного по отношению ресурсов МК дедения многобайтных чисел

нужно програмка для Адука для быстрого деления

программа по возможности должна делить разные обёмы чисел максимальные размеры делимого и делителя в основном 4/2

3/2 байта

перед входом хотелось бы производить настройку с какими числами будет вестись вычисление

я уже написал програмку по делению в стоолбик по алгоритму описанному в книге "МК это же просто!"

все повторяющиеся действия я закрутил в цыклы в общей сложности программа делит FF FF FF FFh на 01h за 5-6 тысяч машынных циклов

хотелось бы делить быстрее дето хотябы сократить до 2000-3000 если ето возможно, если не возможно сообщите мне!

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

все повторяющиеся действия я закрутил в цыклы в общей сложности программа делит FF FF FF FFh на 01h за 5-6 тысяч машынных циклов

хотелось бы делить быстрее дето хотябы сократить до 2000-3000 если ето возможно, если не возможно сообщите мне!

А вроде деление производится вычитанием и сдвигом влево и анализом флага переноса?

Поищи алгоритм в инете.

Нужна книга буржуйская "ПО для микропроцессоров 8080 и 8085". Там тоже должно объяснено быть.

Вот на сайте атмела:

http://www.atmel.com/dyn/resources/prod_do...nts/doc0936.pdf показана блок-схема деления 16/16 без знака и со знаком. Там где-то даже исходник для АВРки на их сайте среди application notes лежит.

Изменено пользователем Speccy
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

все повторяющиеся действия я закрутил в цыклы в общей сложности программа делит FF FF FF FFh на 01h за 5-6 тысяч машынных циклов

хотелось бы делить быстрее дето хотябы сократить до 2000-3000 если ето возможно, если не возможно сообщите мне!

А вроде деление производится вычитанием и сдвигом влево и анализом флага переноса?

Поищи алгоритм в инете.

Нужна книга буржуйская "ПО для микропроцессоров 8080 и 8085". Там тоже должно объяснено быть.

Вот на сайте атмела:

http://www.atmel.com/dyn/resources/prod_do...nts/doc0936.pdf показана блок-схема деления 16/16 без знака и со знаком. Там где-то даже исходник для АВРки на их сайте среди application notes лежит.

Не читав ссылки предлагаю на обозрение моё чюдовище делит удобно но не сильно быстро как хотелось удалось немного ето асё подправить на быструю руку и вот что получилось:

SAVE_R1: ds 1	;для деления нужно
SAVE_R0: ds 1	;для деления нужно
SAVE_R02: ds 1	;для деления нужно
BYTE_DIV: ds 1	;для деления нужно и для сложения вычитания (указатель размера в байтах операндов)
SAVE_DIV: ds 1

;************************************************************************************************
;ДЛЯ ДЕЛЕНИЯ НУЖНО УКАЗАТЬ МЕСТО РОСПОЛОЖЕНИЯ ДЕЛИТЕЛЯ ДЕЛИМОГО И КОЛИЧЕСТВО БАЙТ ДЕЛИМОГО
;MOV R0 - DELIMOE
;MOV R1 - DELITEL
;MOV BYTE_DIV - КОЛИЧЕСТВО БАЙТ ДЕЛИМОГО
;SAVE_DIV - РЕЗУЛЬТАТ
;
;ПРОЦЕДУРУ МОЖНА УСКОРИТЬ ЕСЛИ ЗАНОСИТЬ ДЕЛИТЕЛЬ В СТАРШЫЕ РОЗРЯДЫ МЕСТА РАСПОЛОЖЕНИЯ ДЕЛИТЕЛЯ
;И УЧИТЫВАТЬ ЕТО ПРИ ЗАНИСЕНИИ В РЕГИСТР "в"  значения 
;если смещён делитель на байт tогда в него заносится значение = (количество смещ.байт) х (8) +1
;
;
;*************************************************************************************************
DIVADE:;**		MЕСТО ВХОДА		**
;*************************************************************************************************
MOV SAVE_R1,R1
MOV SAVE_R0,R0

MOV A,R1
MOV R6,BYTE_DIV
DEC R6
ADD A,R6		; (КОЛИЧЕСТВО БАЙТ ДЕЛИМОГО) -1
MOV SAVE_R02,a
MOV R0,A

MOV B,#1;----------------------------------------------------!!!!!


CLR C

M1:
MOV A,@R0
JB ACC.7,BEGIN_DIV
MOV R6,BYTE_DIV
M2:
MOV A,@R1
RLC A
MOV @R1,A

INC R1
DJNZ R6,M2

MOV A,R1
CLR C
SUBB A,BYTE_DIV
MOV R1,A

INC B

JMP M1

BEGIN_DIV:

MOV R1,SAVE_R1
MOV R0,SAVE_R0

CALL MINUS

JC BACK
setb c
JMP sdvig_chast
BACK:
MOV R1,SAVE_R1
MOV R0,SAVE_R0

CALL SUMMA
CLR C

sdvig_chast:
MOV R0,SAVE_DIV
MOV R6,BYTE_DIV
schast:
MOV A,@R0
rlc a
MOV @R0,A

INC R0
djnz R6,schast

MOV R1,SAVE_R02
sdvig_del:
MOV R6,BYTE_DIV		; КОЛИЧЕСТВО БАЙТ ДЕЛИМОГО
s_del:

MOV A,@r1
RRC A
MOV @r1,A

dec r1
djnz R6,s_del

djnz b,begin_div

;*************************************************************
RET		;;**		  MЕСТО ВЫХОДА		**
;*************************************************************


MINUS:
MOV R6,BYTE_DIV
CLR C
MIN1:
MOV A,@R0
SUBB A,@R1
MOV @R0,A

INC R0
INC R1
djnz R6,MIN1
RET

SUMMA:
MOV R6,BYTE_DIV
CLR C
SUM1:
MOV A,@R0
ADDC A,@R1
MOV @R0,A

INC R0
INC R1
DJNZ R6,SUM1
RET
;===============================================

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Действительно закон работает: чем меньше код тем дольше работает и наоборот, но не всегда.

Сложно с ходу понять без комментариев, но когда начал в голове "отлаживать" то обнаружил что могу застрять сразу же. В самом начале когда анализируется 7-й бит значения взятого косвенно из R0 (не разобрался зачем) может начаться деление а может выполниться сдвиг делителя с увеличением регистра B. При этом R0 не меняется и всё начинается сначала. Так что? Если 7-й бит сброшен то деление никогда не начнётся?

Ну даже если начнётся и всё остальное работает то без комментариев сложно разобраться.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Действительно закон работает: чем меньше код тем дольше работает и наоборот, но не всегда.

Сложно с ходу понять без комментариев, но когда начал в голове "отлаживать" то обнаружил что могу застрять сразу же. В самом начале когда анализируется 7-й бит значения взятого косвенно из R0 (не разобрался зачем) может начаться деление а может выполниться сдвиг делителя с увеличением регистра B. При этом R0 не меняется и всё начинается сначала. Так что? Если 7-й бит сброшен то деление никогда не начнётся?

Ну даже если начнётся и всё остальное работает то без комментариев сложно разобраться.

извиняюс в порыве забыл написать исправляюс:

;************************************************************************************************
;ДЛЯ ДЕЛЕНИЯ НУЖНО УКАЗАТЬ МЕСТО РОСПОЛОЖЕНИЯ ДЕЛИТЕЛЯ ДЕЛИМОГО И КОЛИЧЕСТВО БАЙТ ДЕЛИМОГО
;MOV R0 - DELIMOE
;MOV R1 - DELITEL
;MOV BYTE_DIV - КОЛИЧЕСТВО БАЙТ ДЕЛИМОГО
;SAVE_DIV - РЕЗУЛЬТАТ
;
;ПРОЦЕДУРУ МОЖНА УСКОРИТЬ ЕСЛИ ЗАНОСИТЬ ДЕЛИТЕЛЬ В СТАРШЫЕ РОЗРЯДЫ МЕСТА РАСПОЛОЖЕНИЯ ДЕЛИТЕЛЯ
;И УЧИТЫВАТЬ ЕТО ПРИ ЗАНИСЕНИИ В РЕГИСТР "в"  значения 
;если смещён делитель на байт tогда в него заносится значение = (количество смещ.байт) х (8) +1
;
;
;*************************************************************************************************
DIVADE:;**		MЕСТО ВХОДА		**
;*************************************************************************************************
MOV SAVE_R1,R1
MOV SAVE_R0,R0

MOV A,R1
MOV R6,BYTE_DIV
DEC R6
ADD A,R6; (КОЛИЧЕСТВО БАЙТ ДЕЛИМОГО) -1
MOV SAVE_R02,a
MOV R0,A

MOV B,#1;----------------------------------------------------!!!!!


CLR C

M1:	;это моё новшество -  мне стало както трудно думать что если делениее в столбик 
;начнётся когда делитель окажется не ровно под старшыми разрядами делимого 
;поетому я для начяла сдвигаю делитель к старшым разрядам делимого выглядит примерно так:
MOV A,@R0;
JB ACC.7,BEGIN_DIV; 1010 1010 1010 1010 1010 0101 0101 0101| 0000 0001 0000 0001 
		; 			  0000 0001 0000 0001|________________
MOV R6,BYTE_DIV;						 |				это и есть для меня ето стрёмное место
;								поетому я начл сдвигать делитель 
;								адресуеммый косвенно через "R0"
;								пока не станет такая вот картина:
; 1010 1010 1010 1010 1010 0101 0101 0101| 0000 0001 0000 0001 	
; 1000 0000 1000 0000				 |________________		А рег "В" будет увеличеватся ровно на то 
;						 |				количество едениц на сколько разрядов 
;								будет сдвинут делитель. Это нужно для 
;								того чтобы знать сколько раз производить 
;								вычитания
M2:
MOV A,@R1;сам сдвиг делителя
RLC A;
MOV @R1,A

INC R1
DJNZ R6,M2

MOV A,R1; на силу вспомнил зачем это я сюда впёр
CLR C; это востановление начяльного адреса делителя хотя я теперь не понимаю зачем так было мудрить можна было 
SUBB A,BYTE_DIV; проще	MOV R1,SAVE_R1
MOV R1,A;

INC B

JMP M1;цикл

BEGIN_DIV:; это деление по схеме из учебника только с доработкой для мобильности

MOV R1,SAVE_R1;востановить адрес делителя
MOV R0,SAVE_R0;востановить адрес делимого

CALL MINUS; вычесть из делимого сдвинутый делитель

JC BACK;если рез отриццателен востановить делимое посредсвам програмки BACK:
setb c;если вычитание положытельно нужно занести 1 в чястное производное и задвинкть его для этого и 
; используется флаг переноса
JMP sdvig_chast
BACK:
MOV R1,SAVE_R1;востановить адрес делителя
MOV R0,SAVE_R0;востановить адрес делимого

CALL SUMMA; востановление делимого посредствам сумирования его с делителем
CLR C;если вычитание отриццательно нужно занести 0 в чястное производное и задвинуть его для этого и 
; используется флаг переноса

sdvig_chast:; собственно сам сдвиг чстного 
MOV R0,SAVE_DIV;востановить адрес делимого
MOV R6,BYTE_DIV;Задать количество интерация выходя из размера делимого
schast:
MOV A,@R0
rlc a
MOV @R0,A

INC R0
djnz R6,schast

MOV R1,SAVE_R02
sdvig_del:; собственно сам сдвиг делителя
MOV R6,BYTE_DIV; Задать количество интерация выходя из размера делимого (КОЛИЧЕСТВО БАЙТ ДЕЛИМОГО)
s_del:

MOV A,@r1
RRC A
MOV @r1,A

dec r1
djnz R6,s_del

djnz b,begin_div

;*********************************************************************************************************************************
RET;;**		  MЕСТО ВЫХОДА		**
;*********************************************************************************************************************************
; результат будет лежать: 	MOV R0,SAVE_DIV;  MOV @R0,РЕЗУЛЬТАТ
; остаток на месте делимого
;***************************************************************************************************************************
;______________________________________________________Здесь подпр. вычитания и сумирования

MINUS:
MOV R6,BYTE_DIV
CLR C
MIN1:
MOV A,@R0
SUBB A,@R1
MOV @R0,A

INC R0
INC R1
djnz R6,MIN1
RET

SUMMA:
MOV R6,BYTE_DIV
CLR C
SUM1:
MOV A,@R0
ADDC A,@R1
MOV @R0,A

INC R0
INC R1
DJNZ R6,SUM1
RET
;===============================================

Для удобности и читабельности лутше файл использовать:

asmik.txt

Изменено пользователем Klima
Ссылка на комментарий
Поделиться на другие сайты

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Вот написал.

Проверял в Single-Chip Machine 2.02.19.2

Оказалось эмулятор глючит! Не всегда он корректно отрабатывает команды. У меня например искажается содержимое ОЗУ безо всякой причины. Хотел разделить AA55FFFFFFh на B2AEh и получил дулю.

Зато разделил FFFFFFh на 01h за 50000 с лишним тактов, что для адука, работающего в 12 раз быстрее составит около 4.4 тысяч тактов.

;===================================================================
;----------------------- DIV_BIG_NUMBERS ---------------------------
;"Подпрограмма деления многобайтных чисел без знака" by Speccy on 27.12.06
;Программист должен определить в программе следующие переменные:
;	DIVIDEND_ADR	DATA	;адрес мл. байта делимого
;	DIVISOR_ADR		DATA	;адрес мл. байта делителя
;	REMAINDER_ADR	DATA	;адрес мл. байта остатка
;	DIVIDEND_SIZE	DATA	;размер в байтах делимого (1..31 dec)
;	DIVISOR_SIZE	DATA	;размер в байтах делителя и остатка (1..31 dec)
;	LOOP_COUNTER	DATA	;счётчик циклов (=[DIVIDEND_SIZE]*8+1)
;	CMP_OR_SUB		BIT	;бит-флаг для выполнения Compare(=0) или Subtract(=1)
;	DIV_BY_ZERO		BIT	;бит-признак деления на ноль(=1).
;
;Длина чисел составляет от 1 до 31 байта включительно.
;Числа в памяти распологаются по правилу: младший адрес - младший байт
;После выполнения подпрограммы частное находится на месте делимого.
;Если происходит попытка деления на ноль то подпрограмма возвращает взведенный флаг DIV_BY_ZERO и не выполняет никаких действий.
;Подпрограмма не влияет на регистры и флаги.
;===================================================================

DIV_BIG_NUMBERS:
	push  PSW
	push  ACC
	push  000h
	push  001h
	push  B

	lcall ?DIVISOR_ZERO
	jnb   DIV_BY_ZERO,DIV_PREPARE
	ljmp  DIV_EXIT
DIV_PREPARE:
	mov   R0,REMAINDER_ADR
	mov   B,DIVISOR_SIZE
CLEAR_REMAINDER:
	mov   @R0,#000h
	inc   R0
	djnz  B,CLEAR_REMAINDER

	mov   A,DIVIDEND_SIZE
	rl	A
	rl	A
	rl	A
	inc   A
	mov   LOOP_COUNTER,A
	clr   C
DIV_LOOP:
	mov   R0,DIVIDEND_ADR
	mov   B,DIVIDEND_SIZE
	lcall SHIFT_LEFT_LOOP

	djnz  LOOP_COUNTER,DIV_CONTINUE
	ljmp  DIV_EXIT

DIV_CONTINUE:
	mov   R0,REMAINDER_ADR
	mov   B,DIVISOR_SIZE
	lcall SHIFT_LEFT_LOOP
	jc	DIV_SUBTRACT

	clr   CMP_OR_SUB
	lcall CMP_SUB
	jnc   DIV_SUBTRACT
	clr   C
	ljmp  DIV_LOOP
DIV_SUBTRACT:
	setb  CMP_OR_SUB
	lcall CMP_SUB
	setb  C
	ljmp  DIV_LOOP
DIV_EXIT:
	pop   B
	pop   001h
	pop   000h
	pop   ACC
	pop   PSW
	ret

CMP_SUB:	mov   B,DIVISOR_SIZE
	mov   R0,REMAINDER_ADR
	mov   R1,DIVISOR_ADR
	clr   C

CMP_SUB_LOOP:
	mov   A,@R0
	subb  A,@R1
	jnb   CMP_OR_SUB,CMP_SUB_CONT
	mov   @R0,A
CMP_SUB_CONT:
	inc   R0
	inc   R1
	djnz  B,CMP_SUB_LOOP

	ret

SHIFT_LEFT_LOOP:
	mov   A,@R0
	rlc   A
	mov   @R0,A
	inc   R0
	djnz  B,SHIFT_LEFT_LOOP
	ret

?DIVISOR_ZERO:
	setb  DIV_BY_ZERO
	mov   R0,DIVISOR_ADR
	mov   B,DIVISOR_SIZE
	mov   A,#000h
?DIVISOR_ZERO_LOOP:
	orl   A,@R0
	inc   R0
	djnz  B,?DIVISOR_ZERO_LOOP
	jz	?DIVISOR_ZERO_EXIT
	clr   DIV_BY_ZERO
?DIVISOR_ZERO_EXIT:
	ret

Файл для эмуля:

Короче, код работает но в эмуле SCM этой версии отлаживается с глюками. Зависит фиг знает от чего. Например если смотреть от метки CMP_SUB то загрузка в R0 - ok, загрузка в R1 - ok, загрузка B портит содержимое R0 :blink: А если B загружать перед R0,R1 то всё нормально. И всё в таком духе.

Добавил в код одну строчку - исправил баг.

Пользовался для отладки программой MCStudio. Теперь все делит корректно.

div_big.zip

Изменено пользователем Speccy
Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Вот написал.

Проверял в Single-Chip Machine 2.02.19.2

Оказалось эмулятор глючит! Не всегда он корректно отрабатывает команды. У меня например искажается содержимое ОЗУ безо всякой причины. Хотел разделить AA55FFFFFFh на B2AEh и получил дулю.

Зато разделил FFFFFFh на 01h за 50000 с лишним тактов, что для адука, работающего в 12 раз быстрее составит около 4.4 тысяч тактов.

Файл для эмуля:

Короче, код работает но в эмуле SCM этой версии отлаживается с глюками. Зависит фиг знает от чего. Например если смотреть от метки CMP_SUB то загрузка в R0 - ok, загрузка в R1 - ok, загрузка B портит содержимое R0 :blink: А если B загружать перед R0,R1 то всё нормально. И всё в таком духе.

Добавил в код одну строчку - исправил баг.

Пользовался для отладки программой MCStudio. Теперь все делит корректно.

человеческоее спааааа сиба но я наберксь наглости попросить пояснения к кодам написать

если не составит сложности

пока нет возможности проверить твой код на роботе проблемы плату угробил с адуком и плиской спартан 3 пока не знаю чё начяльство скажет но стрёмно :o

взял попутал контакт питания и супервизора напряжения на адуке и 7,5 вольт пустил на контакт супервизора

трындец весь день колбасит чё скажут

Изменено пользователем Klima
Ссылка на комментарий
Поделиться на другие сайты

взял попутал контакт питания и супервизора напряжения на адуке и 7,5 вольт пустил на контакт супервизора

трындец весь день колбасит чё скажут

Эт нормально. Я тоже убивал адук с и плис, но только статикой.

Ничего никто мне не сказал. Ну и тоже особо не стал распространяться.

div_big_comment.zip

я в математике не разобрался пока, просто тупо реализовал алгоритм из пдфника атмела.

Расширил так сказать для деления чисел произвольной длины.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...