Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

МАС инструкция при dsPIC30F4013
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=6084
Страница 1 от 1

Автор:  Ки4о [ Нед Сеп 07, 2008 8:40 am ]
Заглавие:  МАС инструкция при 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 което не го пише в документацията. Ама може и аз да бъркам някъде та ако някой колега се е сблъсквал с подобен камък нека сподели

Автор:  woody [ Нед Сеп 07, 2008 11:02 am ]
Заглавие: 

Да не работи в режим на фиксирана точка? Ако имаш късмет някъде из контролните регистри може да има бит който да избира м/у цели и fractional числа.
RTFM

Автор:  Ки4о [ Нед Сеп 07, 2008 11:47 am ]
Заглавие: 

И при двата режима :
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

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

Автор:  woody [ Нед Сеп 07, 2008 12:03 pm ]
Заглавие: 

На симулатор или на истинското желязо? :)

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

Автор:  Ки4о [ Нед Сеп 07, 2008 12:13 pm ]
Заглавие: 

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

Прикачени файлове:
mac2.jpg
mac2.jpg [ 37.47 KiB | Прегледано 1122 пъти ]
mac.jpg
mac.jpg [ 30.24 KiB | Прегледано 1124 пъти ]

Автор:  Ки4о [ Нед Сеп 07, 2008 2:25 pm ]
Заглавие: 

И на желязото се държи по същия начин както и на симулатора :?

Автор:  Zdrav [ Нед Сеп 07, 2008 5:45 pm ]
Заглавие: 

W4 = 0x0001 = 2^(-15) (Формат Q15);
W5 = 0x0001 = 2^(-15) (Формат Q15);
W4*W5 = 2^((-15) + (-15)) = 2^(-30) (Формат Q31) = 0x00000002;

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

Автор:  woody [ Пон Сеп 08, 2008 9:17 am ]
Заглавие: 

Ки4о написа:
не мога да го разбера защо още един път умножава по 2 ?


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

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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/