Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Умножение двухбайтовых чисел для AtTiny2313, Проблема при эмуляции 
V
    Опции темы
Arcanum
Дата 6.11.2011, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 1.11.2011

Репутация: нет
Всего: нет



Нашёл на одном сайте функцию умножения байтовых чисел с двухбайтовым результатом.
содрал и переделал под себя. макрос выполняет вспомогательную функцию
Код

.MACRO MULD
   MOV R16,@1
   MOV R17,@0
   MOV R18,@2
   RCALL mul08s
   MOV @0,R17
   MOV @1,R16
   MOV @2,R18
.ENDMACRO

/*
; Register variables:
;  Call:  var10 r16 = 8bit multiplicand
;         var11 r17 = <don't care>
;         var20 r18 = 8bit multiplier
;         lc r19    = <don't care> (high register must be allocated)
;
;  Result:var1[r17:r16 ] = 16bit result of var10 r16 * var20 r18
;         var20 r18      = <not changed>
;         lc    r19      = 0
;
; Size  = 9 words
; Clock = 64 cycles (+ret)
; Stack = 0 byte

*/

mul08u:      sub   r17,r17   ;initialize variables
      ldi   r19,9      ; r19 = 9;
      brcc   PC+2      ;---- car19urating loop
      add   r17,r18   ;
      ror   r17      ;
      ror   r16      ;
      dec   r19      ;if (--r19 > 0)
      brne   PC-5      ; continue loop;
      ret



mul08s:      clr   r19      ; Optional fast signed helper
      tst   r16      ;  process with fast unsinged routine
      brpl   PC+3
      inc   r19
      neg   r16
      tst   r18
      brpl   PC+3
      inc   r19
      neg   r18
      bst   r19,0
      rcall   mul08u
      brtc   PC+5
      com   r16
      com   r17
      adc   r16,r19
      adc   r17,r19
      ret



так вот эта процедура вызывается из моего кода два раза:

Код

.def minsH = r20 ; старщий регистр переменной суперминут
.def minsL = r21 ; младший регистр переменной суперминут

.def stepsH = r22 ; старщий регистр переменной супершагов
.def stepsL = r23 ; младший регистр переменной супершагов

.def TmpVar = r24 ; регистр переменной часов

SetTimeMinute:
; загрузка минут и константы
LDS MinsL, RamMinute ; загрузили из ОЗУ минуты
LDI TmpVar, StepsToMin
; теперь умножение
MULD MinsH, MinsL, TmpVar ; младший, страший, константа
;тут плохо считает
; загрузка шагов и константы
LDS StepsL, RamSteps ; загрузили из ОЗУ пройденые шаги
LDI TmpVar, MinPerHour
; теперь умножение
MULD StepsH, StepsL, TmpVar ; младший, страший, константа
; тут считает отлично.


вот MULD MinsH, MinsL, TmpVar выдаёт порнографию
при умножении 02 * A4 = FF48 а не 0148
а MULD StepsH, StepsL, TmpVar считает правильно
раз 10 проверял
вроде всё аналогично но что за на фиг?! всю ночь с этим мучался
PM MAIL   Вверх
UniBomb (Online)
Дата 6.11.2011, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Цитата(Arcanum @  6.11.2011,  08:09 Найти цитируемый пост)
при умножении 02 * A4 = FF48 а не 0148

Эта функция для знакового умножения двух чисел. При этом старший бит определяет знак числа. A4 можно представить как 164 беззнаковое или как -92. Соответсвенно и результат получается знаковым.

Посему либо приводи результат к беззнаковому представлению, либо ищи функцию беззнакового умножения.

Для второго пути поищи книги "Микроконтроллеры? Это же просто!" за авторством товарища Фрунзе А.В. Там в том числе в третьем и четвёртом томе разбираются вопросы арифметических операций над знаковыми и беззнаковыми числами. Единственное что - все примеры на асме для ПИКовый мк, но переделать их под АВР ассемблер не составит труда.


--------------------
PM MAIL ICQ Skype   Вверх
Arcanum
Дата 7.11.2011, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 1.11.2011

Репутация: нет
Всего: нет



Спасибо! всё понял и нашёл функцию для без знаковых вычислений. переделал. работает.


Это сообщение отредактировал(а) Arcanum - 7.11.2011, 06:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.