Отговори на тема  [ 36 мнения ]  Отиди на страница 1, 2, 3  Следваща
PIC 16F84 BSF С ПРОМЕНЛИВА ЗА БИТА 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение PIC 16F84 BSF С ПРОМЕНЛИВА ЗА БИТА
Срещнах следният проблем:
при bsf PORTA, X , когато Х ми е декларирана като константа всичко си работи нормално, но когато е декларирана като променлива ми изпълнява bsf PORTA,0 без значение каква стойност имам записана в Х. Някой сблъсквал ли се е с подобен проблем?


EDDIESoft


Сря Юни 27, 2007 11:57 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение 
Ами много ясно, че ще е така - това влиза в опкода на инструкцията при асемблиране. Как може да вкараш там променлива. Аз даже се учудвам, че асемблера не ти дава грешка :) . Това се прави като работиш със целия порт, имаш си shadow на порта някъде в рама и тогава правиш OR на shadow променливата с въпросната променлива и го изкарваш на целия порт. За нулиране пък правиш AND с инвертираната променлива . :)


Чет Юни 28, 2007 12:07 am
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение 
ДА АМА НЕ. АКО МОЖЕШЕ ТАКА ДА СТАНЕ... НЯМАЩЕ ДА СЕ МЪЧА.
ПРОБЛЕМА Е , ЧЕ ИМАМ ПОДПРОГРАМИ КОИТО ПРАВЯТ КОМУНИКАЦИЯ ПО 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


Чет Юни 28, 2007 12:45 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение 
Само ще те питам тогава - как правят хората 1-wire комуникация с процесори, които немогат да манипулират директно битове? :) . Ама щом казваш - твоя воля. За мен показателен е факта какво правиш 8) . И недей да пишеш с големи букви, защото се възприема за крещене :? .


Чет Юни 28, 2007 3:19 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Апр 13, 2007 10:50 am
Мнения: 105
Местоположение: Перник
Мнение Re: PIC 16F84 BSF С ПРОМЕНЛИВА ЗА БИТА
eddiesoft написа:
bsf PORTA, X

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


Чет Юни 28, 2007 8:11 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Цитат:
(...)
...Така че компилатора не хваща доста грешки...
(...)

Не е чак толкова "дуракоустойчив" :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, може да са ти от полза в бъдеще


Чет Юни 28, 2007 8:57 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Ивинявам се за офтопика но ......

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


Чет Юни 28, 2007 9:38 am
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пон Дек 12, 2005 6:03 pm
Мнения: 263
Местоположение: София
Мнение 
valioman написа:
Ивинявам се за офтопика но ......

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


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


Чет Юни 28, 2007 9:46 am
Профил ICQ YIM
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение 
Добреее. щом ще се хващаме за думата... Не декларирам променлива, а заделям клетка от паметта за 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


Чет Юни 28, 2007 10:23 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
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, другия е да въртиш временен регистър, с който да маскираш променливата която искаш да провериш, има и още няколко начина...


Чет Юни 28, 2007 11:08 am
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение 
Уроци по асемблер четени от някоя книжка ли преподаваш? или се заяждаш? или не си наясно във всвки един език за програмиране каква е разликата между константа и променллива? Константата е стойност която не се променя!!! било то цифрова или символна или стрингова.. няма значение. Докато променливата ( ако искаш я наречи с име или буква или регистър... ) е нещо ( бит, байт, клеткаот паметта, регистър... и т.н. защото ти се хващаш за думата) в което могат да се записват различни стойности!!!!
Ако искаш а ти дам по нагледен пример: константата е един камък който мойе да те удари по главата и камъка няма да се промени. т.е. той е константа. а по главата могат да те ударят различни камъни и те си остават константи, докато раните по главата ти се променят по различен начин. т.е. главата ти е променлива. а адреса на таиа променлива е на врата ти отгоре. т.е. ти имаш адрес на променливата. съответно имасх и адрес на камъка, но където и да го слойиш той не се променя. т.е. остава си константа.

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

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


EDDIESoft


Чет Юни 28, 2007 1:09 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Пич, предавам се наистина, полетяха камъни от всички страни...задаваш въпрос, отваряш нова темичка и всеки решен да помогне (както и аз) пишем, не разбрах кое точно приемаш за заяждане...ти обаче си знаеш своето - мятай си камъните тогава...

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


Чет Юни 28, 2007 1:15 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Пон Яну 09, 2006 11:32 am
Мнения: 276
Местоположение: Kozloduy
Мнение 
Цитат:
ако и от този пример не си разбрал разликата между променлива и константа... здраве му кажи.


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

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


Чет Юни 28, 2007 1:39 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение 
Цитат:
Струвами се че ти не си съвсем наясно.



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


Прикачени файлове:
P10507381.JPG
P10507381.JPG [ 106.59 KiB | Прегледано 1871 пъти ]
Чет Юни 28, 2007 2:51 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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


Чет Юни 28, 2007 3:28 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 36 мнения ]  Отиди на страница 1, 2, 3  Следваща

Кой е на линия

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


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

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