| Микроконтролери и електроника 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 След втори МАС: W4=3; W5=3; ACCA=А; W8=0x0906; W10=0x0D06 След трети МАС: W4=4; W5=4; ACCA=1С; W8=0x0908; W10=0x0D08 В края на крайща се оказва че резултат се изменя като 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 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 ] | |||||||||
| Заглавие: | ||||||||||
Не е сложно. Като умножиш 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/ |
|