Например TDA7294

Форум РадиоКот • Просмотр темы - Команды деления в AVR нет, а мне ОЧЕНЬ надо разделить
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн авг 18, 2025 08:06:01

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 31 ]    , 2
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Команды деления в AVR нет, а мне ОЧЕНЬ надо разделить
СообщениеДобавлено: Вс авг 15, 2010 08:46:10 
Встал на лапы

Зарегистрирован: Пт мар 13, 2009 13:11:56
Сообщений: 123
Откуда: Минск
Рейтинг сообщения: 0
SII ,я уж было очень обрадовался, увидев вторую подпрограмку деления. Но с ней, похоже что-то не то...
начинаеться так:
DivWord:
ldi R22, 17
cp R21, R19
brcs _DWRet
...
кончаеться так:
_DWRet: ret

Тоесть если R21, R19 не равны, то конец всему делению :dont_know:
Похоже самому сочинять прийдёться , методом вычитания...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Команды деления в AVR нет, а мне ОЧЕНЬ надо разделить
СообщениеДобавлено: Вс авг 15, 2010 18:03:28 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 41
Зарегистрирован: Пт янв 30, 2009 14:50:35
Сообщений: 635
Откуда: Солнечногорск
Рейтинг сообщения: 0
Там brcs, а не brne/breq -- речь не о равенстве, а о больше/меньше (это нужно, чтобы понять, а поместится ли частное в два байта). Хотя вряд ли эта подпрограмма самая оптимальная -- писал её в спешке, причём только начав работать с АВРками, т.е. толком ещё не зная систему команд. Ну а помедитировать лениво -- работает же в реальных изделиях :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Команды деления в AVR нет, а мне ОЧЕНЬ надо разделить
СообщениеДобавлено: Вс авг 15, 2010 20:12:43 
Встал на лапы

Зарегистрирован: Пт мар 13, 2009 13:11:56
Сообщений: 123
Откуда: Минск
Рейтинг сообщения: 0
Ну счас еще раз помедетировал в AVR Studio... Делимое обычно ж больше делителя...
Как я понимаю R19 старшие разряды, R16 младшие разряды делимого.
Хотя я для проверки всё равно в делимое 0ХFFFF загнал, а в делитель 0X5555, должно ровно 3 получиться. Пробовал и наоборот в делимое 0Х5555, в длитель 0XFFFF, так тоже, совсем не то выходит...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Команды деления в AVR нет, а мне ОЧЕНЬ надо разделить
СообщениеДобавлено: Пн авг 16, 2010 01:02:00 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 41
Зарегистрирован: Пт янв 30, 2009 14:50:35
Сообщений: 635
Откуда: Солнечногорск
Рейтинг сообщения: 0
Не знаю, что Вы делали. У меня всё работает (проверено на АТмеге-162). Вот собственно проверяющий код:

Код:
        ldi     R16, 0xFF
        ldi     R17, 0xFF
        clr     R18
        clr     R19
        ldi     R20, 0x55
        ldi     R21, 0x55
        call    DivWord


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Команды деления в AVR нет, а мне ОЧЕНЬ надо разделить
СообщениеДобавлено: Пн авг 16, 2010 12:06:35 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 878
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 6066
Откуда: Minsk
Рейтинг сообщения: 0
VIY писал(а):


Судя по задаче, за которую взялся топикстартер и которая - увы - пока превышает его возможности, для апроксимации следует применять плавающую арифметику, что еще несколько сложнее. Ну поделит он 16 бит на 16 бит, получит частное и остаток. А что потом делать с этим остатком - съесть с маслом или на хлеб намазывать - XZ. Для следующей операции нужен результат предыдущей - число, а не 2 никак не связанных числа - частное и остаток.
Поэтому надо сначала проанализировать задачу на алгоритмическом уровне, определиться, что сделать в целых числах, что в плавучке. А уж затем исходя из вечного противоречия - расход памяти vs быстродействие -и необходимой точности искать метод решения.
У меня был печальный опыт - надо было сделать прогу для процессора, который выбрали до меня ( и без меня ) и который просто физически не способен был решить эту задачу. Пришлось извращаться - применил нестандартную 3-байтовую плавучку, размазывал вычисления по времени ( измерили точку - вычислили часть выражения - измерили 2-ю точку - продолжили вычисление выражения и т.д. ). Издели пошло в серию и выпущено несколько сотен экземпляров, но мне бы не хотелось в страшном сне увидеть тот мой код :-(
Лично мой совет - сначала заняться чем-либо попроще. Ну и читать литературу. Она иногда сеет свет.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Команды деления в AVR нет, а мне ОЧЕНЬ надо разделить
СообщениеДобавлено: Пн авг 16, 2010 15:15:27 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 41
Зарегистрирован: Пт янв 30, 2009 14:50:35
Сообщений: 635
Откуда: Солнечногорск
Рейтинг сообщения: 0
Jack_A писал(а):
Лично мой совет - сначала заняться чем-либо попроще. Ну и читать литературу. Она иногда сеет свет.


И обязательно разбираться с "низкоуровневыми" алгоритмами (те же операции умножения и деления "ручками", а не с помощью команд процессора), даже если используемый процессор умеет их делать сам или доступны выполняющие их чужие подпрограммы: понимание принципов никогда не помешает, а иногда может и помочь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Команды деления в AVR нет, а мне ОЧЕНЬ надо разделить
СообщениеДобавлено: Пн авг 16, 2010 17:32:25 
Встал на лапы

Зарегистрирован: Пт мар 13, 2009 13:11:56
Сообщений: 123
Откуда: Минск
Рейтинг сообщения: 0
Полностью согласен!
SII , Ваша пограмма четко и быстро работает. Ошибка у Вас только с подписанием регистров в начале...
; Параметры:
;
; R19:R16 - делимое
; R21:R20 - делитель
R19 нужно исправить на R17


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Команды деления в AVR нет, а мне ОЧЕНЬ надо разделить
СообщениеДобавлено: Пн авг 16, 2010 17:41:28 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 41
Зарегистрирован: Пт янв 30, 2009 14:50:35
Сообщений: 635
Откуда: Солнечногорск
Рейтинг сообщения: 0
Всё подписано нормально, читать просто надо внимательно:

Код:
; =======================
;
; Беззнаковое деление четырёхбайтовой величины на двухбайтовую
;
; =======================


В операции целочисленного умножения произведение имеет удвоенную разрядность по сравнению с сомножителями, в операции деления делимое имеет вдвое большую разрядность, чем делитель, частное и остаток. Языки высокого уровня просто маскируют сей факт, но от этого он никуда не исчезает. Почитайте, например, описание команд MUL, IMUL, DIV и IDIV в современных процессорах ПК. Так и в этой подпрограмме: делимое имеет размер 4 байта и занимает 4 регистра подряд, что и отражено записью R19:R16.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Команды деления в AVR нет, а мне ОЧЕНЬ надо разделить
СообщениеДобавлено: Пн авг 16, 2010 17:51:54 
Встал на лапы

Зарегистрирован: Пт мар 13, 2009 13:11:56
Сообщений: 123
Откуда: Минск
Рейтинг сообщения: 0
Ай, шо-то Вы сильно умное для меня тут пишете. :)
Вот ,что я сегодня на работе по бырику написал. Конечно быстродействие будет не очень , если делимое во много раз больше делителя будет... Но меня пока устраивет, а остаток, легко умножить на 10, и потом опять разделить и записать после запятой, необходимое кол-во раз :)

Код:
.include"tn2313def.inc"
.cseg
.org 0
 ldi r16,RamEnd   
 out SPL,r16
; R17H R16L ДЕЛИМОЕ/ОСТАТОК
; R19H R18L ДЕЛИТЕЛЬ
; R21H R20L РЕЗУЛЬТАТ
   LDI R17,0XFF
   LDI R16,0XFF
   LDI R19,0
   LDI R18,6
   RCALL DEL

CICL:
    RJMP CICL

DEL:
   CP R17,R19
   BRSH BOL_H
   RJMP  RET_DEL
 BOL_H:
    CP R16,R18
    BRSH MIN_DEL
    RJMP MEN_L

RET_DEL:
    RET
MIN_DEL:
   CLC
   SUB R16,R18
   BRCS DEC_H
RET_DEC_H:
   SUB R17,R19
   INC R20
   BRNE DEL
   INC R21
   RJMP DEL
DEC_H:
   DEC R17
   RJMP RET_DEC_H
MEN_L:
   CP R17,R19
   BREQ  RET_DEL
   RJMP MIN_DEL


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Команды деления в AVR нет, а мне ОЧЕНЬ надо разделить
СообщениеДобавлено: Вт авг 17, 2010 10:54:11 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 878
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 6066
Откуда: Minsk
Рейтинг сообщения: 2
SII писал(а):
И обязательно разбираться с "низкоуровневыми" алгоритмами (те же операции умножения и деления "ручками", а не с помощью команд процессора)

Когда в том же проекте мне понадобилась быстрая и точная п.п SQRT ( на счету был каждый байт и каждая микросекунда) я долго мудрил на бумаге и экспериментировал в Excel`е, вспомнил из 6 класса, что (a-b)*(a+b) ~ a^2 , если b сильно меньше a, в результате получил то, что хотел. Потом мне сказали, что это алгоритм Герона, который жил еще во времена Архимеда и еще водяными насосами баловался. "Какой удар со стороны классика! "
(С) О.Бендер


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Команды деления в AVR нет, а мне ОЧЕНЬ надо разделить
СообщениеДобавлено: Вт авг 17, 2010 20:01:47 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 41
Зарегистрирован: Пт янв 30, 2009 14:50:35
Сообщений: 635
Откуда: Солнечногорск
Рейтинг сообщения: 0
Угу, знание подобных вещей иногда сильно помогает. Не уверен, что сам вспомнил бы про корень...


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 31 ]    , 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y