| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Функция на асемблер http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=3769 |
Страница 1 от 1 |
| Автор: | million [ Пет Фев 23, 2007 5:58 pm ] |
| Заглавие: | Функция на асемблер |
Здравейте! Опитвам се да си представя и напиша програмка, която да променя в дадени времеви граници една променлива с квадратна функциа у=ах на квадрат или със sin. Ползвам MPLAB и асемблер, но нещо не мога да вдяна как да използвам условните директиви VARIABLE или да се направи цикъл IF и ELSE. Също незнам кокво е точно предпроцесорна команда. Моля, помогнете! |
|
| Автор: | ji4ka [ Съб Фев 24, 2007 10:07 pm ] |
| Заглавие: | |
Не се коси много. Доста джаджи на асемблер съм подкарал обаче и аз още не ги знам тия неща. Иначе простия отговор е :Чети хелпа на MPASM Assembler Help в MPLAB-a. Директивите на асемблера са един вид програмен език за генериране на код - спестяват писане и автоматизират писането на асемблер и го правят по-компактно и прегледно (за последното не е сигурно де). ТЕ НЕ СА САМИЯ КОД!!! Например директивата IF служи за условно включване на дадена "секция " код при компилирането (тая завършена с ENDIF). Най-добре се поразтърси из разни готови проекти на асемблер където са използвани тия неща - ще ти станат по-ясни нещата нагледно. А и в хелпа има примери. Успех! Test equ 1 ;Чрез този запис (0-false/1-true) контролираме по-долу кой код да се компилира IF Test goto testasm ;Ако Test=1 компилатора ще включи този ред ELSE goto start ;Ако Test=0 компилатора ще включи този ред, а не горния ENDIF |
|
| Автор: | ToHu [ Съб Фев 24, 2007 11:09 pm ] |
| Заглавие: | |
Какъв цикъл искаш да реализираш .. не е лошо да схванеш самата идея как работи, след това и тези макроси сигурно ще ти се изяснят. while (PIN_A0) { b++; } btfss 0x05.0 goto $+3 incf b goto $-3 for (a=0;a<5;a++) { b++; } movlw 0x05 movwf a decfsz a goto $+1 goto $+3 incf b goto $-4 Това второто е при условие це не искаш д изпозлваш стойноста на а във самиа цикъл, тъй като С варианта релано променя стойноста на а от 0 до 5, а в този цикъл тя се мени от 5 до 0. Та реалн това отговаря на C код for (a=5;a>0;a--) ... |
|
| Автор: | Ки4о [ Съб Фев 24, 2007 11:16 pm ] |
| Заглавие: | |
@ji4ka ами ако имаш bsf PORTB,Test пак ли ще отиваш да ровиш в хелпа какво е ? Тони даде много хубав пример.Само бих добавил че е хубаво преди да тестваш флаг,промяната на който е следствие от аритметична/логическа операция е хубаво да знаеш какво е било положението на флага: BANKSEL TEMP MOVF TEMP,0 BSF STATUS,Z ;Z=1 Xorlw 0x01 ; BTFSC STATUS,Z GOTO yes_go GOTO AGAIN |
|
| Автор: | Gogo [ Нед Фев 25, 2007 12:41 am ] |
| Заглавие: | |
@Ки4о, според мене това: BSF STATUS,Z е напълно излишно. |
|
| Автор: | ji4ka [ Нед Фев 25, 2007 2:59 am ] | |||||||||
| Заглавие: | ||||||||||
Ами като не знам ще се ровя докато се науча, те затова са хелповете. Просто ми се струва ,че million бърка асемблера с директивите, и че на асемблер може да ползва if else буквално. Може и аз да греша, не ги ползвам много тия директиви. Човека спомена ,че ползва асемблер, а не С. |
||||||||||
| Автор: | Ки4о [ Нед Фев 25, 2007 10:41 am ] |
| Заглавие: | |
Това горното дет съм го написал си е на асемблер.@Gogo - ами ако не знаеш какво е било преди това състоянието на Z |
|
| Автор: | ToHu [ Нед Фев 25, 2007 12:40 pm ] |
| Заглавие: | |
ji4ka сигурно говори за моят пост, това не са примери на С, това е пример как С код който е цикъл може да се компилира на asm, написл съм най простит цикли, които имат този вид на почти всички езици, с изключение на сепараторит, но дали са запетайки, дали е to и др. не е толквоа важно. Ако беше казал конкртно какво иска да проверява с цикъл можеше да сме му дали досега пример как да го реализира. |
|
| Автор: | million [ Нед Фев 25, 2007 3:53 pm ] | |||
| Заглавие: | :) | |||
ji4ka, благодаря за отговора и разбирането, както и на всички други. В книгата на Мл. констр. първа част прочетох за директиви, но никъде не видях пример с IF и ELSE, следователно и не можах да ги подкарам. Предполагам с тях по-лесно ще се изрази квадратна функция. Качвам програмка, която написах за PWM. PWM- то е в по-тесен диапазон. За това съм разбил общия цикъл на две константи и една променлива.Частта, в която моделирам PWM искам да става с функция от моментната до зададената стойност, избрана чрез n- брой натискания на бутона, предполагам с таблица. Но не знам как да го осъществя. Скоро ще премина към хардуер и ще налея първия PIC, като мисля да пропусна мигащия диод П.п. Сигурно има много по-интелигентни начини...
|
||||
| Автор: | ji4ka [ Нед Фев 25, 2007 5:33 pm ] |
| Заглавие: | |
million, Щом си толкова начинаещ забрави за тия директиви, само ще ти забъркат мозъка. Гледай си само командите на асемблера. Цикъл в асемблера се прави само с "goto na4alo" . За изход от цикъла се ползва една от "скип" командите директно или съчетана с друго goto или return. btfsc status,c (или z ,или за пин от порт - PortA,1) ; izhod 4rez uslovie goto na4alo izhod xxxx decfsz Temp,f ;tova e cikyl s broq4 Temp goto na4alo izhod xxxx И не подценявай мигащия диод - с него най лесно ще изучиш циклите. Абе лесно няма, четенето му е майката....и ината също! |
|
| Автор: | ToHu [ Пон Фев 26, 2007 12:02 am ] |
| Заглавие: | |
Какво имаш в предвид "да се ирази квадратна функция" |
|
| Автор: | million [ Пон Фев 26, 2007 12:24 am ] |
| Заглавие: | Като му ... |
Като му кажа увеличи PWM с 1ms, това да не стане на следващия цикъл рязко, а да се пренасочи към друг цикъл, където да тръгне плавно да се увеличава и да достигне широчината от 1ms за реалното време от 2ms. Но незнам нито как да го огранича, нито как да го изразя, нито как се прави умножение на ASM |
|
| Автор: | Dimitar [ Пон Фев 26, 2007 12:33 am ] |
| Заглавие: | |
Аз как правя плавно увеличение на PWM-a: - имаш прекъсване през някакво време - имаш една променлива PWMLimit, която я увеличаваш с да кажем 5% от MIN до MAX стойността на PWM-a на всяко прекъсване (може да приложиш всяка произволна функция на тая промяна) - като зареждаш новата стойност на PWM-а проверяваш дали е по-голяма от PWMLimit и ако е - тогава зареждаш в PWM-а PWMLimit, вместо новата му стоймост. Така като си играеш с времето на прекъсването и броя стъпки, можеш да си направиш какъвто искаш ramp-up за PWM-a. Ама програмирай на С или пък вместо да умножаваш в асемблера - си сметни предварително стойностите с калкулатор и в асемблера ги ползвай като таблица |
|
| Автор: | bkulev [ Вто Фев 27, 2007 4:26 pm ] |
| Заглавие: | |
@milion сам по себе си въпроса за умножението и делението на ASМ е една голяма тема. Зависи от размерноста на числата, от конкретния проц(наличието на инструкции) и др.п. Има разпространени подпрограми за различни такива действия. Освен това ги има във вариант за бързо изпълнение, без оглед на ресурсите и обратно, да заемат по - малко памет без оглед на времето за изпълнение. Изобщо ако ще учиш asm, почни с прости неща, напр. умножение на две еднобайтови числа без знак(сещащ се че резултата ще е двубайтов) и т.н. И докато стигнеш до Floatong point и вече ще си минал на C или нещо друго. Нo не се отчайвай, опита който ще си натрупал от asm ще ти оказва безценна помощ в бъдещето.[/quote] |
|
| Автор: | zaphod [ Вто Фев 27, 2007 7:58 pm ] | |||||||||
| Заглавие: | Re: :) | |||||||||
е па нема да можеш брачет... мисля че жичката правилно отбеляза - бъркаш директиви с команди. директивите не се изпълняват от пика, а от компилатора. създадени са за да ти дадат възможност вместо да смяташ като малоумен разни константи, да предоставиш тази висока чест на компилатора. за да сметнеш синус от пика ти трябва доста ляб да изядеш. обаче като чух какво искаш все пак да правиш, ше ти дам друга идея: ползвай експоненциално схождане. звучи страшно, но реализацията на пика е лесна (за хора които са минали все пак през мигането на диоди). идеята е следната - x+=k*(a-x) където х е величината която искаш да схожда плавно, а е величината към която х се стреми, а к задава инертността с която х следи а. умножението тука е умножение по константа, а то се реализира лесно - със шифтване, а ако константата не е степен на двойката, със шифтване и сумиране. обаче да не бъдем капризни, степен на двойката е съвсем достатъчно за свястно следене. |
||||||||||
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|