Отговори на тема  [ 8 мнения ] 
МАС инструкция при dsPIC30F4013 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение МАС инструкция при dsPIC30F4013
Интересно ми е как се изпълнява следната инструкция - умножение с натрупване - МАС
Постановката е следната:
2 масива данни - започващи от адреси 0x0900 и 0x0D00 съответно в X и Y пространствата на контролера с стойности arr1[8]={1,2,3,4,5,6,7,8};
и arr2[8]={1,2,3,4,5,6,7,8}; и се тества как работи МАС инструкцията.
Програмката е следната:

_MyFunction:
mov #_arr1, W8 ; W8 = @arr1, point to a first element of array
mov #_arr2, W10 ; W10 = @arr2, point to a first element of array

clr A,[W8]+=2, W4 ,[W10]+=2, W5 ; clear ACCA ,fletch data from 0x0900 into W4 and inc pointer+2
; fletch data from 0x0D00 into W5 and inc pointer+2
DO #7,end6 ; do 7+1 times

MAC W4*W5, A , [W8], W4 ,[W10], W5 ; ACCA=ACCA+W4*W5

end6: nop
return
След нулирането на ACCA и извличането на първите данни : W4=1; W5=1; ACCA=0; W8=0x0902; W10=0x0D02 - О.К
След първи МАС: W4=2; W5=2; ACCA=2; W8=0x0904; W10=0x0D04 8O Защо АССА =2 ? 0+1*1=1
След втори МАС: W4=3; W5=3; ACCA=А; W8=0x0906; W10=0x0D06 8O Защо АССА =10 ? 1+2*2=5
След трети МАС: W4=4; W5=4; ACCA=1С; W8=0x0908; W10=0x0D08 8O

В края на крайща се оказва че резултат се изменя като ACCA=ACCA+2*W4*W5 което не го пише в документацията. Ама може и аз да бъркам някъде та ако някой колега се е сблъсквал с подобен камък нека сподели


Нед Сеп 07, 2008 8:40 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
Да не работи в режим на фиксирана точка? Ако имаш късмет някъде из контролните регистри може да има бит който да избира м/у цели и fractional числа.
RTFM


Нед Сеп 07, 2008 11:02 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
И при двата режима :
IF: Integer or Fractional Multiplier Mode Select bit
1 = Integer mode enabled for DSP multiply operations
0 = Fractional mode enabled for DSP multiply operations
Както и :
US: Unsigned or Signed Multiplier Mode Select bit
1 = Unsigned mode enabled for DSP multiply operations
0 = Signed mode enabled for DSP multiply operations

Пробвах какви ли не комбинации - резултата е един и същ :(


Нед Сеп 07, 2008 11:47 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
На симулатор или на истинското желязо? :)

P.S. Това да няма смесено умножение на Signed x Unsigned е тАпня.


Нед Сеп 07, 2008 12:03 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Ами това за сега е на симулатора - т.е искам да си пренапиша едно Фурие от С на асемблер и да ползвам вградените инструкции за тази цел. Тъпото е следното:
На първата картинка дават какво е МАС инструкцията, а на втората - дават пример.В цялата работа като се умножат 0х1111 и 0х2222 резултата е 0х2468642 което е половината от съдържанието на акумолатора А ,а не-> 0х48D0C84 и не мога да го разбера защо още един път умножава по 2 ? Ще се помъча още малко и ако не - смяна на платформата щото нямам нерви.


Прикачени файлове:
mac2.jpg
mac2.jpg [ 37.47 KiB | Прегледано 1114 пъти ]
mac.jpg
mac.jpg [ 30.24 KiB | Прегледано 1116 пъти ]
Нед Сеп 07, 2008 12:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
И на желязото се държи по същия начин както и на симулатора :?


Нед Сеп 07, 2008 2:25 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
W4 = 0x0001 = 2^(-15) (Формат Q15);
W5 = 0x0001 = 2^(-15) (Формат Q15);
W4*W5 = 2^((-15) + (-15)) = 2^(-30) (Формат Q31) = 0x00000002;

Провери си конфигурацията както woody каза в началото.

_________________
Най-опасният враг на истината и свободата е мнозинството.


Нед Сеп 07, 2008 5:45 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
Ки4о написа:
не мога да го разбера защо още един път умножава по 2 ?


Не е сложно. Като умножиш 1.15 със 1.15 (един бит за цяла част + знак, петнадесет след точката) се получава резултат 2.30. За да се нормализира към 1.31 се налага един шифт на ляво.

Дали установяваш бита IF според ритуала? Виж за пример най-добре, а ако това не даде резултат попрегледай и errata-та, за всеки случай.


Пон Сеп 08, 2008 9:17 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 8 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни