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

IAR+MSP430+Assembly
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=12667
Страница 1 от 1

Автор:  polinom [ Пон Фев 03, 2014 8:08 pm ]
Заглавие:  IAR+MSP430+Assembly

Реших да се захвана поне с един асемблер на една фамилия както трябва. Избрал съм MSP-то. Викам ще разгледам малко пък за седмица -две ще го загрея. Първо държа да отбележа че IAR го мразя супер много, но има симулатор, и е супер понякога за 10-20 реда код. С инструкциите нямам проблем всички горе-долу го схващам,но тия асемблерски директиви ме :? . Чета "IAR Assembler ™Reference Guide for Texas Instruments’ MSP430 Microcontroller Family", но аз ли съм крив той ли не става, не знам.

Код:
#include <msp430f2272.h>
;-------------------------------------------------------------------------------
                         
;-------------------------------------------------------------------------------
             RSEG    CSTACK                  ; Define stack segment
;-------------------------------------------------------------------------------
             RSEG    CODE                  ; Assemble to Flash memory
;-------------------------------------------------------------------------------
RESET       mov.w   #SFE(CSTACK),SP         ; Initialize stackpointer
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL  ; Stop WDT
SetupP1     bis.b   #001h,&P1DIR            ; P1.0 output
                                            ;
Mainloop    xor.b   #001h,&P1OUT            ; Toggle P1.0
Wait        mov.w   #050000,R15             ; Delay to R15
L1          dec.w   R15                     ; Decrement R15
            jnz     L1                      ; Delay over?
            jmp     Mainloop                ; Again
                                            ;
;-------------------------------------------------------------------------------
            COMMON  INTVEC                  ; Interrupt Vectors
;-------------------------------------------------------------------------------
            ORG     RESET_VECTOR            ; POR, ext. Reset
            DW      RESET
            END

RSEG CSTACK
RSEG- Begins a relocatable segment !?! Това всичко в сегмента ли го бута, или сегмента се загражда от следващият RSEG CODE. Друго то RSEG си иска число значи в CODE и CSTACK са дефинирани някъде. Къде ??
Друго си мислих да направя, но се съм сигурен какво точно да плесна на "org "
Код:
RSEG    CSTACK                  ; Define stack segment
;-------------------------------------------------------------------------------
             org    0x00FF                    ; Assemble to Flash memory
;-------------------------------------------------------------------------------
RESET       mov.w   #0x0600,SP        ; Initialize stackpointer

Не мога да разбера за какво са сложили долу модул за обслужване на прекъсвания. Tе са забранени не би трябвало да се занимавам с тях, като го махна IAR реве с думите "User error: Illegal opcode found on address 0x0"
"DW RESET" за какво е тоя сегмент. Като определението за DW "Generates 16-bit constants".В смисъл то си е RESET си е лейбъл, за пръв път чувам етикет да има стойност. И каква е магическата функция на DW, според това което пише то просто си дефинира константа, да кажем за lookup table. Знам че тук има хора дето са орали и копали с тия процесори, ще се радвам драснат 2-3 реда. Ако може без за коментари от типа "Защо ползвам IAR, MSP430 или защо точно тоя проц".

Автор:  Dimitar [ Пон Фев 03, 2014 9:28 pm ]
Заглавие:  Re: IAR+MSP430+Assembly

polinom, не са ти ясни основни положения за контролерите, така че по-леко с мразенето, защото нямаш основа на която да стъшиш за да мразиш. Отделно пък да мразиш развойна среда ми се струва леко пресилено - би трябвало да имаш предпочитани и не предпочитани такива, ама чак пък да обичаш/мразиш :D .

DW RESET ти дефинира ресет вектора и нищо, че прекъсванията са ти забранени има още един вектор в контролерите - този за рисет. Това е адреса от който контролера тръгва като му пуснеш тока. Ако я изтриеш тая декларация линкера няма да знае къде да ти сложи началото на програмата :) . CSTACK и CODE трябва да дефинирани в линкерския файл на проекта. Не мога сега да се сетя как се казваше тоя файл, ама трябва да е някъде в проекта ти.
Научи ги тия основни положения и после дай да видим какво ще мразим/обичаме :D .

Автор:  polinom [ Пон Фев 03, 2014 11:55 pm ]
Заглавие:  Re: IAR+MSP430+Assembly

Чакай сега, аз никога не съм претендирал за тънък познавач, факта че питам го доказва. Исках много да се занимавам с embedded, но просто започнах работа в друга сфера, за сега нивото ми е на хоби ентусиаст, просто гледам да не ръждясвам. В случая аз проблем с контролера нямам, IAR-a за съм го пипал за пръв и последен път преди 3 години за 1 час.
Преди време в университета имахме вземане даване с MSP430g2231. Кода правеше същото но беше в пъти по-елементарен. ORG <adsress> кода след него и сега като го видях тоя пример, с тия директиви супер ме обърка, иначе да ресет вектора забравих :oops: голям резил. И тоя CSTACK, за какво се инициализира, освен че е стекова памет. Тоя контролер няма ли си хардуерен такъв ? В картата на паметта Main: code memory 0FFFFh-08000h. По начина по който са ми показали излиза, без да инициализирам CSTACK, ORG 0x8000 и кода върви, но когато стека е създаден за да използвам ORG иска се да се измести ,в моя случай org 0x0394, ми върши работа. Явно CODE и CSTACK сe изчисляват по време на линкаването, и линкера явно си знае какво да прави, как, къде и колко да задели. Сега видях че стака може да се променя, в моя случай е 80 и 80 heap. И в края на деня остава големият въпрос " DW RESET" как процедира, тъй като описанието на директивата от 2 реда е следното "Use DC8, DC16, DC24, DC32, DF32, or DF64to create a constant, which means an area of bytes is reserved big enough for the constant." и нищо повече.Вярно е че по време на дебъга RESET e 16433(каквото и да значи). Мога да си го ползвам без да знам защо и да съм щастлив, но не обичам магически работещият код. Виждам че си написал че DW RESET дефинира ресет вектора, той си е дефинирам в хедърният файл, "#define RESET_VECTOR (15 * 2u)".

Автор:  Vesko [ Пон Фев 03, 2014 11:58 pm ]
Заглавие:  Re: IAR+MSP430+Assembly

Dimitar написа:
Ако я изтриеш тая декларация линкера няма да знае къде да ти сложи началото на програмата :)


Само едно уточнение. Началото на програмата за линкера няма нищо общо с ресет вектора. Линкера ще си линкне програмата и без тази декларация. В общи линии на него ме е все тая къде са ресет векторите на процесора. Старт точката обикновено се дефинира с END директивата на асемблера. А може да се линкне програма и без старт поинт....

Автор:  Dimitar [ Вто Фев 04, 2014 2:43 am ]
Заглавие:  Re: IAR+MSP430+Assembly

Цитат:
А може да се линкне програма и без старт поинт....

То за моженето може и да може, ама какъв е смисъла :) .
Цитат:
Виждам че си написал че DW RESET дефинира ресет вектора, той си е дефинирам в хедърният файл, "#define RESET_VECTOR (15 * 2u)".

Тук си прав - недоглеждане от моя страна. Разбира се че "ORG RESET_VECTOR" е ресет вектора - незнам къде съм гледал предния път :).
DW RESET генерира 16 битова константа, която в случая е началото на програмата и пренасочва ресет вектора към въпросния адрес където е началото.

Автор:  polinom [ Пет Фев 07, 2014 3:11 pm ]
Заглавие:  Re: IAR+MSP430+Assembly

Другия въпрос на който не можах да намеря отговор е къде се намира стака? Хардуерният ако има такъв, защото в документацията не видях да пише нещо за "hardware stack". При PIC18 си има такава дефиниция и се знае че стака е 31 нива, с 21 битови клетки, реализиран като отделна структура, но достъпен за четене/запис. При MSP430 липсва , или аз не виждам такава информация. Къде е реализиран, може ли да се достъпи, освен чрез POSH,POP или чрез MOV R7,0(SP) и MOV 2(SP),R6. Мисълта ми е от кой до кой адрес се реализира ?

Автор:  Vesko [ Пет Фев 07, 2014 3:14 pm ]
Заглавие:  Re: IAR+MSP430+Assembly

Стека може да е навсякъде в адресното пространство.

RESET mov.w #SFE(CSTACK),SP ; Initialize stackpointer

Горният ред го инициализира на края на сегмента CSTACK.

Автор:  Vesko [ Пет Фев 07, 2014 3:17 pm ]
Заглавие:  Re: IAR+MSP430+Assembly

Dimitar написа:
Цитат:
А може да се линкне програма и без старт поинт....

То за моженето може и да може, ама какъв е смисъла :) .
Цитат:
Виждам че си написал че DW RESET дефинира ресет вектора, той си е дефинирам в хедърният файл, "#define RESET_VECTOR (15 * 2u)".

Тук си прав - недоглеждане от моя страна. Разбира се че "ORG RESET_VECTOR" е ресет вектора - незнам къде съм гледал предния път :).
DW RESET генерира 16 битова константа, която в случая е началото на програмата и пренасочва ресет вектора към въпросния адрес където е началото.

Точно DW RESET на подходящо място дефинира ресет вектора. "ORG RESET_VECTOR" заедно с дефиницията в хедър файла само посочва "правилното" място.

Автор:  stefan63 [ Пет Фев 07, 2014 5:18 pm ]
Заглавие:  Re: IAR+MSP430+Assembly

....къде се намира стака?

Където го сложиш в рама.
МСП няма нищо общо с ПИК, освен силиция и пластмасата.
Адресното пространство е едно, можеш да изпълняваш иснтрукции от рама дори -
не че ще ти се наложи.

На асемблер стека го набутваш в най-горните адреси на рама(На Си е друго, но там не го разбирам.).
Като се вика процедура - стекпойнтерът потъва към малките адреси. По принцип следиш да не ти набъбне много използвания рам - и да се презапише от стека , или стека да се инфектира от някоя променлива.
Трябва да знаеш кое къде се намира в процесора, как се променя стековия указател . Щом си си харесал ИАР - прочети как се предават параметрите и резултатите между функциите на Си - може да ти потрябва. П

Влез в папката на ИАР-а, подпапка "конфиг". Там за всеки процесор има файл. Тези числа и имена , които се чудиш откъде идват - ги има там, или в хедър файла за процесора.
На тоя етап тези предефинирани неща сигурно ще са ти от полза. По нататък можеш да ги зарежеш :-) .

Две неща за асемблера да знаеш
- в ИАР при заделяне на рам ако трябва да подравняваш на дума, на двойна дума и т.н. - ползвай ALIGN директива.
- ако имаш променлива AAA
mov #10,AAA
и
mov #10,&AAA
ще дадат един и същ резултат - променливата ще добие стойност 10.
Генерираният код обаче е различен. И ако преминеш към процесор с 20 битов адрес ,то първият ред ще се изпълнява коректно, само докато инструкцията се намира в първите 64килобайта. Т

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