| Микроконтролери и електроника 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 ] |
| Заглавие: | |
Ами много ясно, че ще е така - това влиза в опкода на инструкцията при асемблиране. Как може да вкараш там променлива. Аз даже се учудвам, че асемблера не ти дава грешка |
|
| Автор: | 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 комуникация с процесори, които немогат да манипулират директно битове? |
|
| Автор: | 123 [ Чет Юни 28, 2007 8:11 am ] | |||||||||
| Заглавие: | Re: PIC 16F84 BSF С ПРОМЕНЛИВА ЗА БИТА | |||||||||
Леле ! Това Х влиза в 14-те бита на инструкцията и си е записано във флаша за програмите. Не, че няма как да стане променлива, ама няма да изкара дълго, само докато се скапе от препрограмиране думата. |
||||||||||
| Автор: | Predator_MF [ Чет Юни 28, 2007 8:57 am ] | |||||||||||||||||||||||||||
| Заглавие: | ||||||||||||||||||||||||||||
Не е чак толкова "дуракоустойчив"
където F = File (регистър), b = bit (ъъъъ) като огледаш хубаво около ASM-то на Microchip ще видиш, че дължината на [b] в думата за инструкция е 3 бита - bit7...bit9, като записваш това:
реално от X се извличат само 3 бита, та резултата би следвало да е само младшите 3 бита от X... Иначе, може да прочетеш за инструкции от сорта на rrf/rlf, може да са ти от полза в бъдеще |
||||||||||||||||||||||||||||
| Автор: | valioman [ Чет Юни 28, 2007 9:38 am ] |
| Заглавие: | |
Ивинявам се за офтопика но ...... Чудно ми е защо при наличие на толкова компилатори от по високо ниво се блъскаш с АСМ . Похвално е че ползваш асемблера но за по -сложни програми това си е чисто губене на време и нерви.Мисля че минах а времената когато се чудиш как да навреш голяма програма в малко флаш в момента си има пикльовци с доста флаш |
|
| Автор: | darkyp [ Чет Юни 28, 2007 9:46 am ] | |||||||||
| Заглавие: | ||||||||||
С подходящи макроси, процедури и добро / пресметнато дефиниране на променливите от пик-а можеш да изцедиш доста повече (поне според мен) от колкото с език на по високо ниво. А и за 4 или 8 kwords програма в асемблера едва ли ще се изгубиш из редовете. Аз лично за ПИК език от високо ниво ползвам само за прости програми - набързо написана колкото да се види, че става работата. Вярно е, че мнението ми е базирано малко на теория, не толкова на практика. |
||||||||||
| Автор: | eddiesoft [ Чет Юни 28, 2007 10:23 am ] | |||||||||||||||||||||||||||
| Заглавие: | ||||||||||||||||||||||||||||
Добреее. щом ще се хващаме за думата... Не декларирам променлива, а заделям клетка от паметта за GPS или казано на български регистър с общо предназначение, в която клетка се записва някаква стойност в хода на програмата. И в случая ако си запознат малко с MPLAB имаш възможност да декларираш константа. Т.е. да заделиш клетка в която да запишеш определени данни, които не се променят в хода на прграмата.
идеята беше че компилатора трябва да използва само младшите 3 бита.... да ма не. използва младшите три бита от адреса, а не от съдържанието на клетката с този адрес!!!!
как би дефинирал 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 ] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Заглавие: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Не заделяш нищо. Дефинираш константа : X EQU 0x21 Можеш да дефинираш хиляда ако искаш константи със същата стойност: Y EQU 0x21 Z EQU 0x21 Това означава ли че си дефинирал 3 променливи ? Не. Означава, че ако ползваш X, Y и Z в [f] на инструкцията (тоест като destination), инструкциите ще работят с един и същи регистър в паметта на процесора.
Пак същия отговор. Можеш да декларираш още хиляда константи, всичките с различни стойности, това в PIC-а няма да използва нито един байт от GPR-ите, нито от Program Memory. EQU в асемблера за Microchip (и не само там) дефинира константа, но тя е валидна само в рамките на ASM файла, с прости думи -
ти улеснява малко работата, като си четеш после кода, е по лесно да разбереш
отколкото
И двата кода се "асемблират" по абсолютно еднакъв начин!
Това не е компилатор, а асемблер, тук няма променливи, ще ти го кажа за десети път - има само инструкции и константи. Променливите са в главата на програмиста, а регистрите са вътре в чипа. В инструкцията BSF f,b - <f> е константа, <b> също е константа, <f> е адреса на регистъра (не самия регистър), в който ще се извърши манипулацията, <b> e номера на бита който ще се вдигне! Няма променливи като го пишеш.
Има няколко начина, единия е да въртиш (rrf/rlf) регистъра и проверяваш bit, другия е да въртиш временен регистър, с който да маскираш променливата която искаш да провериш, има и още няколко начина... |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Автор: | eddiesoft [ Чет Юни 28, 2007 1:09 pm ] |
| Заглавие: | |
Уроци по асемблер четени от някоя книжка ли преподаваш? или се заяждаш? или не си наясно във всвки един език за програмиране каква е разликата между константа и променллива? Константата е стойност която не се променя!!! било то цифрова или символна или стрингова.. няма значение. Докато променливата ( ако искаш я наречи с име или буква или регистър... ) е нещо ( бит, байт, клеткаот паметта, регистър... и т.н. защото ти се хващаш за думата) в което могат да се записват различни стойности!!!! Ако искаш а ти дам по нагледен пример: константата е един камък който мойе да те удари по главата и камъка няма да се промени. т.е. той е константа. а по главата могат да те ударят различни камъни и те си остават константи, докато раните по главата ти се променят по различен начин. т.е. главата ти е променлива. а адреса на таиа променлива е на врата ти отгоре. т.е. ти имаш адрес на променливата. съответно имасх и адрес на камъка, но където и да го слойиш той не се променя. т.е. остава си константа. ако и от този пример не си разбрал разликата между променлива и константа... здраве му кажи. или ако си го разбрал и искаш да се заяждаш - това е друга тема и мисля , че не е за тук. имах в началото конкретен въпрос и за жалост никой не даде конкретен отговор. Във Всичките ни писаници ( заяждания) и уоци по асемблер и програмиране не видях конкретен отговор на въпроса ми. Искам да се извиня на всички които им се виждат безполезни тиа ланканици ( и за мен от тях няма смисъл) EDDIESoft |
|
| Автор: | Predator_MF [ Чет Юни 28, 2007 1:15 pm ] |
| Заглавие: | |
Пич, предавам се наистина, полетяха камъни от всички страни...задаваш въпрос, отваряш нова темичка и всеки решен да помогне (както и аз) пишем, не разбрах кое точно приемаш за заяждане...ти обаче си знаеш своето - мятай си камъните тогава... PS: Конкретен отговор на въпроса ти дадох 2 пъти, вижда се черно на бяло, инструкциите са rrf и rlf |
|
| Автор: | bobyk [ Чет Юни 28, 2007 1:39 pm ] | |||||||||
| Заглавие: | ||||||||||
Струвами се че ти не си съвсем наясно. На твое място не бих държал такъв тон, хората ти казаха няколко пъти как може и как не може да го направиш, твоя си работа. |
||||||||||
| Автор: | 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/ |
|