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

Регистриран на: Сря Дек 06, 2006 9:05 pm
Мнения: 92
Местоположение: София
Мнение Функция на асемблер
Здравейте! Опитвам се да си представя и напиша програмка, която да променя в дадени времеви граници една променлива с квадратна функциа у=ах на квадрат или със sin. Ползвам MPLAB и асемблер, но нещо не мога да вдяна как да използвам условните директиви VARIABLE или да се направи цикъл IF и ELSE. Също незнам кокво е точно предпроцесорна команда. Моля, помогнете!


Пет Фев 23, 2007 5:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
Не се коси много. Доста джаджи на асемблер съм подкарал обаче и аз още не ги знам тия неща. Иначе простия отговор е :Чети хелпа на 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


Съб Фев 24, 2007 10:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Какъв цикъл искаш да реализираш .. не е лошо да схванеш самата идея как работи, след това и тези макроси сигурно ще ти се изяснят.

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--) ...


Съб Фев 24, 2007 11:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
@ji4ka ами ако имаш bsf PORTB,Test пак ли ще отиваш да ровиш в хелпа какво е ?

Тони даде много хубав пример.Само бих добавил че е хубаво преди да тестваш флаг,промяната на който е следствие от аритметична/логическа операция е хубаво да знаеш какво е било положението на флага:
BANKSEL TEMP
MOVF TEMP,0
BSF STATUS,Z ;Z=1
Xorlw 0x01 ;
BTFSC STATUS,Z
GOTO yes_go
GOTO AGAIN


Съб Фев 24, 2007 11:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
@Ки4о, според мене това: BSF STATUS,Z е напълно излишно.


Нед Фев 25, 2007 12:41 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
Ки4о написа:
@ji4ka ами ако имаш bsf PORTB,Test пак ли ще отиваш да ровиш в хелпа какво е ?

Ами като не знам ще се ровя докато се науча, те затова са хелповете. Просто ми се струва ,че million бърка асемблера с директивите, и че на асемблер може да ползва if else буквално. Може и аз да греша, не ги ползвам много тия директиви.
Човека спомена ,че ползва асемблер, а не С.


Нед Фев 25, 2007 2:59 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Това горното дет съм го написал си е на асемблер.@Gogo - ами ако не знаеш какво е било преди това състоянието на Z :wink: Слагам го за всеки случай


Нед Фев 25, 2007 10:41 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
ji4ka сигурно говори за моят пост, това не са примери на С, това е пример как С код който е цикъл може да се компилира на asm, написл съм най простит цикли, които имат този вид на почти всички езици, с изключение на сепараторит, но дали са запетайки, дали е to и др. не е толквоа важно. Ако беше казал конкртно какво иска да проверява с цикъл можеше да сме му дали досега пример как да го реализира.


Нед Фев 25, 2007 12:40 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Сря Дек 06, 2006 9:05 pm
Мнения: 92
Местоположение: София
Мнение :)
ji4ka, благодаря за отговора и разбирането, както и на всички други. В книгата на Мл. констр. първа част прочетох за директиви, но никъде не видях пример с IF и ELSE, следователно и не можах да ги подкарам.
Предполагам с тях по-лесно ще се изрази квадратна функция.

Качвам програмка, която написах за PWM. PWM- то е в по-тесен диапазон. За това съм разбил общия цикъл на две константи и една променлива.Частта, в която моделирам PWM искам да става с функция от моментната до зададената стойност, избрана чрез n- брой натискания на бутона, предполагам с таблица. Но не знам как да го осъществя. Скоро ще премина към хардуер и ще налея първия PIC, като мисля да пропусна мигащия диод :)

П.п. Сигурно има много по-интелигентни начини...


Прикачени файлове:
_first.jpg
_first.jpg [ 127.95 KiB | Прегледано 1817 пъти ]
6.asm [1.83 KiB]
207 пъти
Нед Фев 25, 2007 3:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
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

И не подценявай мигащия диод - с него най лесно ще изучиш циклите.
Абе лесно няма, четенето му е майката....и ината също!


Нед Фев 25, 2007 5:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Какво имаш в предвид "да се ирази квадратна функция"


Пон Фев 26, 2007 12:02 am
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Сря Дек 06, 2006 9:05 pm
Мнения: 92
Местоположение: София
Мнение Като му ...
Като му кажа увеличи PWM с 1ms, това да не стане на следващия цикъл рязко, а да се пренасочи към друг цикъл, където да тръгне плавно да се увеличава и да достигне широчината от 1ms за реалното време от 2ms. Но незнам нито как да го огранича, нито как да го изразя, нито как се прави умножение на ASM :cry: И това плавно увеличение си го представям със SIN или кв. функция.


Пон Фев 26, 2007 12:24 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение 
Аз как правя плавно увеличение на PWM-a:
- имаш прекъсване през някакво време
- имаш една променлива PWMLimit, която я увеличаваш с да кажем 5% от MIN до MAX стойността на PWM-a на всяко прекъсване (може да приложиш всяка произволна функция на тая промяна)
- като зареждаш новата стойност на PWM-а проверяваш дали е по-голяма от PWMLimit и ако е - тогава зареждаш в PWM-а PWMLimit, вместо новата му стоймост.

Така като си играеш с времето на прекъсването и броя стъпки, можеш да си направиш какъвто искаш ramp-up за PWM-a.
Ама програмирай на С или пък вместо да умножаваш в асемблера - си сметни предварително стойностите с калкулатор и в асемблера ги ползвай като таблица :) .


Пон Фев 26, 2007 12:33 am
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Сря Яну 25, 2006 12:47 pm
Мнения: 305
Местоположение: Varna
Мнение 
@milion
:) "нито как се прави умножение на ASM" - ето дойдохме си на думата

сам по себе си въпроса за умножението и делението на ASМ е една голяма тема. Зависи от размерноста на числата, от конкретния проц(наличието на инструкции) и др.п. Има разпространени подпрограми за различни такива действия. Освен това ги има във вариант за бързо изпълнение, без оглед на ресурсите и обратно, да заемат по - малко памет без оглед на времето за изпълнение. Изобщо ако ще учиш asm, почни с прости неща, напр. умножение на две еднобайтови числа без знак(сещащ се че резултата ще е двубайтов) и т.н. И докато стигнеш до Floatong point и вече ще си минал на C или нещо друго. Нo не се отчайвай, опита който ще си натрупал от asm ще ти оказва безценна помощ в бъдещето.[/quote]


Вто Фев 27, 2007 4:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение Re: :)
million написа:
Скоро ще премина към хардуер и ще налея първия PIC, като мисля да пропусна мигащия диод :)

е па нема да можеш брачет...
мисля че жичката правилно отбеляза - бъркаш директиви с команди. директивите не се изпълняват от пика, а от компилатора. създадени са за да ти дадат възможност вместо да смяташ като малоумен разни константи, да предоставиш тази висока чест на компилатора.
за да сметнеш синус от пика ти трябва доста ляб да изядеш. обаче като чух какво искаш все пак да правиш, ше ти дам друга идея: ползвай експоненциално схождане. звучи страшно, но реализацията на пика е лесна (за хора които са минали все пак през мигането на диоди). идеята е следната - x+=k*(a-x)
където х е величината която искаш да схожда плавно, а е величината към която х се стреми, а к задава инертността с която х следи а. умножението тука е умножение по константа, а то се реализира лесно - със шифтване, а ако константата не е степен на двойката, със шифтване и сумиране. обаче да не бъдем капризни, степен на двойката е съвсем достатъчно за свястно следене.


Вто Фев 27, 2007 7:58 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 15 мнения ] 

Кой е на линия

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


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

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