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

PIC 16F84 BSF С ПРОМЕНЛИВА ЗА БИТА
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=4421
Страница 1 от 3

Автор:  eddiesoft [ Сря Юни 27, 2007 11:57 pm ]
Заглавие:  PIC 16F84 BSF С ПРОМЕНЛИВА ЗА БИТА

Срещнах следният проблем:
при bsf PORTA, X , когато Х ми е декларирана като константа всичко си работи нормално, но когато е декларирана като променлива ми изпълнява bsf PORTA,0 без значение каква стойност имам записана в Х. Някой сблъсквал ли се е с подобен проблем?


EDDIESoft

Автор:  Dimitar [ Чет Юни 28, 2007 12:07 am ]
Заглавие: 

Ами много ясно, че ще е така - това влиза в опкода на инструкцията при асемблиране. Как може да вкараш там променлива. Аз даже се учудвам, че асемблера не ти дава грешка :) . Това се прави като работиш със целия порт, имаш си shadow на порта някъде в рама и тогава правиш OR на shadow променливата с въпросната променлива и го изкарваш на целия порт. За нулиране пък правиш AND с инвертираната променлива . :)

Автор:  eddiesoft [ Чет Юни 28, 2007 12:45 am ]
Заглавие: 

ДА АМА НЕ. АКО МОЖЕШЕ ТАКА ДА СТАНЕ... НЯМАЩЕ ДА СЕ МЪЧА.
ПРОБЛЕМА Е , ЧЕ ИМАМ ПОДПРОГРАМИ КОИТО ПРАВЯТ КОМУНИКАЦИЯ ПО 1-WIRE ШИНА И ТАМ 2-3 КОМАНГИ МИ УДЪЛЖАВАТ ТАЙМАУТА И НЕ СТАВА. ПОРБЛЕМА ГО РЕШИХ ПО СЛЕДНИЯ НАЧИН: ДЕФИНИРАМ И УНДЕФИНИРАМ КОНСТАНТАТА ТОЧНО ПРЕДИ ДА ЗАПОЧНА РАБОТА. АЗ ПЪРВО СИ ГО НАПРАВИХ ПО СТАНДАРТНИЯ СИ НАЧИН, НО МНОГО МИ ВДИГНА ВРЕМЕНАТА, ТА СЕ НАЛАГА ДА СЕ НАПРАВИ ТОЧНО ТАЗИ ВРЪТКА. СТАНА ПО СЛЕДНИЯ НАЧИН
#DEFINE DS1 0
CALL Reset
MOVLW H'CC'
CALL Write
MOVLW H'99'
CALL Write
.
.
.
.
#UNDEFINE DS1
#DEFINE DS1 1
call Reset
movlw 0xCC
call Write
movlw 0x44
call Write
MOVLW D'50'
CALL WAIT1
......

И КАТО ЗА ПРИМЕР РЕСЕТА

Reset
BSF STATUS,RP0
BCF TRISA,DS1
BCF STATUS,RP0
bcf PORTA,DS1
MOVLW D'50'
CALL WAIT1
bsf PORTA,DS1
BSF STATUS,RP0
BSF TRISA,DS1
BCF STATUS,RP0
MOVLW D'50'
CALL WAIT1
return


Трябва ми една и съща комуникация по два отделни пина....


aaa и @Dimitar, правил съм какви ли не глупости от недооглеждане и компилатора не дава грешки.
опитай се да дефинираш константа Х и после в я използвай като променлива и пиши в нея да видисх че компилатора не го хваща като грешка, нищо че тя си остава със стойността която си е дефинирана. Така че компилатора не хваща доста грешки. Другото което забелязах:
ако дефинирам променливата
X EQU D'42'
И НАПРАВЯ
BSF PORTA,X
ГО ВЪЗПРИЕМА КАТО
BSF PORTA,1

ПРИ
X EQU D'43'
ГО ВЪЗПРИЕМА КАТО
BSF PORTA,2
и т.н
EDDIESoft

Автор:  Dimitar [ Чет Юни 28, 2007 3:19 am ]
Заглавие: 

Само ще те питам тогава - как правят хората 1-wire комуникация с процесори, които немогат да манипулират директно битове? :) . Ама щом казваш - твоя воля. За мен показателен е факта какво правиш 8) . И недей да пишеш с големи букви, защото се възприема за крещене :? .

Автор:  123 [ Чет Юни 28, 2007 8:11 am ]
Заглавие:  Re: PIC 16F84 BSF С ПРОМЕНЛИВА ЗА БИТА

eddiesoft написа:
bsf PORTA, X

Леле ! Това Х влиза в 14-те бита на инструкцията и си е записано във флаша за програмите. Не, че няма как да стане променлива, ама няма да изкара дълго, само докато се скапе от препрограмиране думата.

Автор:  Predator_MF [ Чет Юни 28, 2007 8:57 am ]
Заглавие: 

Цитат:
(...)
...Така че компилатора не хваща доста грешки...
(...)

Не е чак толкова "дуракоустойчив" :D Какво значи в ASM на Microchip променлива, имаш ли идея ? Как дефинираш променлива ? Как я различаваш от константите ? В PDF-а, за всяка инструкция пише синтаксиса и, примерно за BSF пише:
Цитат:
BSF f,b

където F = File (регистър), b = bit (ъъъъ)
като огледаш хубаво около ASM-то на Microchip ще видиш, че дължината на [b] в думата за инструкция е 3 бита - bit7...bit9, като записваш това:
Код:
X EQU D'43'
..
BSF PORTA,X

реално от X се извличат само 3 бита, та резултата би следвало да е само младшите 3 бита от X...

Иначе, може да прочетеш за инструкции от сорта на rrf/rlf, може да са ти от полза в бъдеще

Автор:  valioman [ Чет Юни 28, 2007 9:38 am ]
Заглавие: 

Ивинявам се за офтопика но ......

Чудно ми е защо при наличие на толкова компилатори от по високо ниво се блъскаш с АСМ .
Похвално е че ползваш асемблера но за по -сложни програми това си е чисто губене на време и нерви.Мисля че минах а времената когато се чудиш как да навреш голяма програма в малко флаш в момента си има пикльовци с доста флаш :) и то на доста разумна цена :))

Автор:  darkyp [ Чет Юни 28, 2007 9:46 am ]
Заглавие: 

valioman написа:
Ивинявам се за офтопика но ......

Чудно ми е защо при наличие на толкова компилатори от по високо ниво се блъскаш с АСМ .
Похвално е че ползваш асемблера но за по -сложни програми това си е чисто губене на време и нерви.Мисля че минах а времената когато се чудиш как да навреш голяма програма в малко флаш в момента си има пикльовци с доста флаш :) и то на доста разумна цена :))


С подходящи макроси, процедури и добро / пресметнато дефиниране на променливите от пик-а можеш да изцедиш доста повече (поне според мен) от колкото с език на по високо ниво. А и за 4 или 8 kwords програма в асемблера едва ли ще се изгубиш из редовете. Аз лично за ПИК език от високо ниво ползвам само за прости програми - набързо написана колкото да се види, че става работата. Вярно е, че мнението ми е базирано малко на теория, не толкова на практика.

Автор:  eddiesoft [ Чет Юни 28, 2007 10:23 am ]
Заглавие: 

Добреее. щом ще се хващаме за думата... Не декларирам променлива, а заделям клетка от паметта за GPS или казано на български регистър с общо предназначение, в която клетка се записва някаква стойност в хода на програмата. И в случая ако си запознат малко с MPLAB имаш възможност да декларираш константа. Т.е. да заделиш клетка в която да запишеш определени данни, които не се променят в хода на прграмата.
Цитат:
реално от X се извличат само 3 бита, та резултата би следвало да е само младшите 3 бита от X...

Иначе, може да прочетеш за инструкции от сорта на rrf/rlf, може да са ти от полза в бъдеще


идеята беше че компилатора трябва да използва само младшите 3 бита.... да ма не. използва младшите три бита от адреса, а не от съдържанието на клетката с този адрес!!!!

Цитат:
където F = File (регистър), b = bit (ъъъъ)


как би дефинирал b , при положение, че се налага да го променяш?
правил съм го с отделна прменлива ( ниама да се спирам пак на думата променлива) която я ползвам за маска на регистъра с който работя. идеята беше да може да се променя b в хода на програмата и да се използва в команда от рода bsf f,b!!!! а не да се използват команди от рода на andwf,iorwf,xorwf...
И защо ако се дефинира b като константа в компилатора побитовите команди работят, а като се задели клетка за b и на това b се присвои някакава стойност да кажем от 0 до 7 побитовите команди не работят!!!



И SORRY за главните букви, ама при положение, че има сума проекти за изпълнение и това съм го писал посред нощите доста уморен... просто не ми е направило изобщо впечатление дали са малки или големи

Цитат:
Ивинявам се за офтопика но ......

Чудно ми е защо при наличие на толкова компилатори от по високо ниво се блъскаш с АСМ .
Похвално е че ползваш асемблера но за по -сложни програми това си е чисто губене на време и нерви.Мисля че минах а времената когато се чудиш как да навреш голяма програма в малко флаш в момента си има пикльовци с доста флаш и то на доста разумна цена )


Купил съм си съвсем официално mikroPascal (така и не научих С, работиа от години на Делфи) но когато не ти достигат битова, камо ли байтове... нямаш друг шанс освен асемблер.
аааа и когато имаш застояли около 200 чипа и трябва да направиш 120 еднакви устройства, няма да купуваш нови чипове, при положение че и с тия които имаш можеш да си свършиш работата


EDDIESoft

Автор:  Predator_MF [ Чет Юни 28, 2007 11:08 am ]
Заглавие: 

eddiesoft написа:
Добреее. щом ще се хващаме за думата...
Не декларирам променлива, а заделям клетка от паметта за GPS или казано на български регистър с общо предназначение, в която клетка се записва някаква стойност в хода на програмата.

Не заделяш нищо. Дефинираш константа :
X EQU 0x21
Можеш да дефинираш хиляда ако искаш константи със същата стойност:
Y EQU 0x21
Z EQU 0x21
Това означава ли че си дефинирал 3 променливи ? Не. Означава, че ако ползваш X, Y и Z в [f] на инструкцията (тоест като destination), инструкциите ще работят с един и същи регистър в паметта на процесора.

eddiesoft написа:
И в случая ако си запознат малко с MPLAB имаш възможност да декларираш константа. Т.е. да заделиш клетка в която да запишеш определени данни, които не се променят в хода на прграмата.

Пак същия отговор. Можеш да декларираш още хиляда константи, всичките с различни стойности, това в PIC-а няма да използва нито един байт от GPR-ите, нито от Program Memory.

EQU в асемблера за Microchip (и не само там) дефинира константа, но тя е валидна само в рамките на ASM файла, с прости думи -
Код:
w EQU 0
f  EQU 1
X EQU 0x01
PORTB EQU 0x06

ти улеснява малко работата, като си четеш после кода, е по лесно да разбереш
Код:
movlw X
movwf PORTB,f

отколкото
Код:
movlw 0x01
movwf 0x06,1

И двата кода се "асемблират" по абсолютно еднакъв начин!

Цитат:
идеята беше че компилатора трябва да използва само младшите 3 бита.... да ма не. използва младшите три бита от адреса, а не от съдържанието на клетката с този адрес!!!!

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

В инструкцията BSF f,b - <f> е константа, <b> също е константа, <f> е адреса на регистъра (не самия регистър), в който ще се извърши манипулацията, <b> e номера на бита който ще се вдигне! Няма променливи като го пишеш.

Цитат:
как би дефинирал b , при положение, че се налага да го променяш?

Има няколко начина, единия е да въртиш (rrf/rlf) регистъра и проверяваш bit, другия е да въртиш временен регистър, с който да маскираш променливата която искаш да провериш, има и още няколко начина...

Автор:  eddiesoft [ Чет Юни 28, 2007 1:09 pm ]
Заглавие: 

Уроци по асемблер четени от някоя книжка ли преподаваш? или се заяждаш? или не си наясно във всвки един език за програмиране каква е разликата между константа и променллива? Константата е стойност която не се променя!!! било то цифрова или символна или стрингова.. няма значение. Докато променливата ( ако искаш я наречи с име или буква или регистър... ) е нещо ( бит, байт, клеткаот паметта, регистър... и т.н. защото ти се хващаш за думата) в което могат да се записват различни стойности!!!!
Ако искаш а ти дам по нагледен пример: константата е един камък който мойе да те удари по главата и камъка няма да се промени. т.е. той е константа. а по главата могат да те ударят различни камъни и те си остават константи, докато раните по главата ти се променят по различен начин. т.е. главата ти е променлива. а адреса на таиа променлива е на врата ти отгоре. т.е. ти имаш адрес на променливата. съответно имасх и адрес на камъка, но където и да го слойиш той не се променя. т.е. остава си константа.

ако и от този пример не си разбрал разликата между променлива и константа... здраве му кажи.
или ако си го разбрал и искаш да се заяждаш - това е друга тема и мисля , че не е за тук. имах в началото конкретен въпрос и за жалост никой не даде конкретен отговор. Във Всичките ни писаници ( заяждания) и уоци по асемблер и програмиране не видях конкретен отговор на въпроса ми.

Искам да се извиня на всички които им се виждат безполезни тиа ланканици ( и за мен от тях няма смисъл)


EDDIESoft

Автор:  Predator_MF [ Чет Юни 28, 2007 1:15 pm ]
Заглавие: 

Пич, предавам се наистина, полетяха камъни от всички страни...задаваш въпрос, отваряш нова темичка и всеки решен да помогне (както и аз) пишем, не разбрах кое точно приемаш за заяждане...ти обаче си знаеш своето - мятай си камъните тогава...

PS: Конкретен отговор на въпроса ти дадох 2 пъти, вижда се черно на бяло, инструкциите са rrf и rlf :wink:

Автор:  bobyk [ Чет Юни 28, 2007 1:39 pm ]
Заглавие: 

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


Струвами се че ти не си съвсем наясно.

На твое място не бих държал такъв тон, хората ти казаха няколко пъти как може и как не може да го направиш, твоя си работа. :x

Автор:  eddiesoft [ Чет Юни 28, 2007 2:51 pm ]
Заглавие: 

Цитат:
Струвами се че ти не си съвсем наясно.



Явно никой не чете подред. Сега се връщам от книжарницата . Купих си книгата "PIC микроконтролери" част първа за да ви снимам една страница. Книжарката не м разреши да я снимам там, та се наложи да си я купя.
Явно не четете внимателно pdf файловете и затова ви я качвам на българси

Прикачени файлове:
P10507381.JPG
P10507381.JPG [ 106.59 KiB | Прегледано 1898 пъти ]

Автор:  Dimitar [ Чет Юни 28, 2007 3:28 pm ]
Заглавие: 

eddiesoft - от всякъде се видя, че си нямаш понятие от асемблера на пиковете, нито какво е това опкод и как стават нещата там. Така, че раздавай го малко по-леко с поученията, защото на следващия ти тъп въпрос никой няма да отговори. Факт е, че всички бяха много внимателни и се опитаха да ти обяснят защо неможеш да променяш ПРОГРАМНАТА ПАМЕТ в хода на изпълнение на програмата, ама ти си знаеш твоето. bsf f,b - и трите неща са константи в тая памет и неможеш да ги променяш посмъртно. Има си инструкции в тоя асемблер дето работят с регистри и клетки в рам-а, има си и такива дето работят с константи. В случая bsf e такава, дето работи с константа и въпреки твоите мераци, тя няма как да почне да работи с променлива. Та вземи да четеш книжките дето ги купуваш, вместо да ги снимаш и да ни ги показваш на нас, от които искаш съвети :) .

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