|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 2:00 am
PIC 16F84 BSF С ПРОМЕНЛИВА ЗА БИТА
| Автор |
Съобщение |
|
eddiesoft
Ранг: Минаващ
Регистриран на: Нед Фев 04, 2007 5:44 pm Мнения: 90
|
 PIC 16F84 BSF С ПРОМЕНЛИВА ЗА БИТА
Срещнах следният проблем:
при bsf PORTA, X , когато Х ми е декларирана като константа всичко си работи нормално, но когато е декларирана като променлива ми изпълнява bsf PORTA,0 без значение каква стойност имам записана в Х. Някой сблъсквал ли се е с подобен проблем?
EDDIESoft
|
| Сря Юни 27, 2007 11:57 pm |
|
 |
|
Dimitar
Ранг: Форумен бог
Регистриран на: Пет Ное 12, 2004 3:38 pm Мнения: 9103 Местоположение: Chicago, IL
|
Ами много ясно, че ще е така - това влиза в опкода на инструкцията при асемблиране. Как може да вкараш там променлива. Аз даже се учудвам, че асемблера не ти дава грешка  . Това се прави като работиш със целия порт, имаш си shadow на порта някъде в рама и тогава правиш OR на shadow променливата с въпросната променлива и го изкарваш на целия порт. За нулиране пък правиш AND с инвертираната променлива . 
|
| Чет Юни 28, 2007 12:07 am |
|
 |
|
eddiesoft
Ранг: Минаващ
Регистриран на: Нед Фев 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 |
|
 |
|
Dimitar
Ранг: Форумен бог
Регистриран на: Пет Ное 12, 2004 3:38 pm Мнения: 9103 Местоположение: Chicago, IL
|
Само ще те питам тогава - как правят хората 1-wire комуникация с процесори, които немогат да манипулират директно битове?  . Ама щом казваш - твоя воля. За мен показателен е факта какво правиш  . И недей да пишеш с големи букви, защото се възприема за крещене  .
|
| Чет Юни 28, 2007 3:19 am |
|
 |
|
123
Ранг: Новодошъл
Регистриран на: Пет Апр 13, 2007 10:50 am Мнения: 105 Местоположение: Перник
|
 Re: PIC 16F84 BSF С ПРОМЕНЛИВА ЗА БИТА
Леле ! Това Х влиза в 14-те бита на инструкцията и си е записано във флаша за програмите. Не, че няма как да стане променлива, ама няма да изкара дълго, само докато се скапе от препрограмиране думата.
|
| Чет Юни 28, 2007 8:11 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Не е чак толкова "дуракоустойчив"  Какво значи в ASM на Microchip променлива, имаш ли идея ? Как дефинираш променлива ? Как я различаваш от константите ? В PDF-а, за всяка инструкция пише синтаксиса и, примерно за BSF пише:
където F = File (регистър), b = bit (ъъъъ)
като огледаш хубаво около ASM-то на Microchip ще видиш, че дължината на [b] в думата за инструкция е 3 бита - bit7...bit9, като записваш това:
реално от X се извличат само 3 бита, та резултата би следвало да е само младшите 3 бита от X...
Иначе, може да прочетеш за инструкции от сорта на rrf/rlf, може да са ти от полза в бъдеще
|
| Чет Юни 28, 2007 8:57 am |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Ивинявам се за офтопика но ......
Чудно ми е защо при наличие на толкова компилатори от по високо ниво се блъскаш с АСМ .
Похвално е че ползваш асемблера но за по -сложни програми това си е чисто губене на време и нерви.Мисля че минах а времената когато се чудиш как да навреш голяма програма в малко флаш в момента си има пикльовци с доста флаш  и то на доста разумна цена  )
|
| Чет Юни 28, 2007 9:38 am |
|
 |
|
darkyp
Ранг: Ориентиран
Регистриран на: Пон Дек 12, 2005 6:03 pm Мнения: 263 Местоположение: София
|
С подходящи макроси, процедури и добро / пресметнато дефиниране на променливите от пик-а можеш да изцедиш доста повече (поне според мен) от колкото с език на по високо ниво. А и за 4 или 8 kwords програма в асемблера едва ли ще се изгубиш из редовете. Аз лично за ПИК език от високо ниво ползвам само за прости програми - набързо написана колкото да се види, че става работата. Вярно е, че мнението ми е базирано малко на теория, не толкова на практика.
|
| Чет Юни 28, 2007 9:46 am |
|
 |
|
eddiesoft
Ранг: Минаващ
Регистриран на: Нед Фев 04, 2007 5:44 pm Мнения: 90
|
Добреее. щом ще се хващаме за думата... Не декларирам променлива, а заделям клетка от паметта за GPS или казано на български регистър с общо предназначение, в която клетка се записва някаква стойност в хода на програмата. И в случая ако си запознат малко с MPLAB имаш възможност да декларираш константа. Т.е. да заделиш клетка в която да запишеш определени данни, които не се променят в хода на прграмата.
идеята беше че компилатора трябва да използва само младшите 3 бита.... да ма не. използва младшите три бита от адреса, а не от съдържанието на клетката с този адрес!!!! как би дефинирал b , при положение, че се налага да го променяш? правил съм го с отделна прменлива ( ниама да се спирам пак на думата променлива) която я ползвам за маска на регистъра с който работя. идеята беше да може да се променя b в хода на програмата и да се използва в команда от рода bsf f,b!!!! а не да се използват команди от рода на andwf,iorwf,xorwf... И защо ако се дефинира b като константа в компилатора побитовите команди работят, а като се задели клетка за b и на това b се присвои някакава стойност да кажем от 0 до 7 побитовите команди не работят!!! И SORRY за главните букви, ама при положение, че има сума проекти за изпълнение и това съм го писал посред нощите доста уморен... просто не ми е направило изобщо впечатление дали са малки или големи
Купил съм си съвсем официално mikroPascal (така и не научих С, работиа от години на Делфи) но когато не ти достигат битова, камо ли байтове... нямаш друг шанс освен асемблер.
аааа и когато имаш застояли около 200 чипа и трябва да направиш 120 еднакви устройства, няма да купуваш нови чипове, при положение че и с тия които имаш можеш да си свършиш работата
EDDIESoft
|
| Чет Юни 28, 2007 10:23 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Не заделяш нищо. Дефинираш константа : 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, другия е да въртиш временен регистър, с който да маскираш променливата която искаш да провериш, има и още няколко начина...
|
| Чет Юни 28, 2007 11:08 am |
|
 |
|
eddiesoft
Ранг: Минаващ
Регистриран на: Нед Фев 04, 2007 5:44 pm Мнения: 90
|
Уроци по асемблер четени от някоя книжка ли преподаваш? или се заяждаш? или не си наясно във всвки един език за програмиране каква е разликата между константа и променллива? Константата е стойност която не се променя!!! било то цифрова или символна или стрингова.. няма значение. Докато променливата ( ако искаш я наречи с име или буква или регистър... ) е нещо ( бит, байт, клеткаот паметта, регистър... и т.н. защото ти се хващаш за думата) в което могат да се записват различни стойности!!!!
Ако искаш а ти дам по нагледен пример: константата е един камък който мойе да те удари по главата и камъка няма да се промени. т.е. той е константа. а по главата могат да те ударят различни камъни и те си остават константи, докато раните по главата ти се променят по различен начин. т.е. главата ти е променлива. а адреса на таиа променлива е на врата ти отгоре. т.е. ти имаш адрес на променливата. съответно имасх и адрес на камъка, но където и да го слойиш той не се променя. т.е. остава си константа.
ако и от този пример не си разбрал разликата между променлива и константа... здраве му кажи.
или ако си го разбрал и искаш да се заяждаш - това е друга тема и мисля , че не е за тук. имах в началото конкретен въпрос и за жалост никой не даде конкретен отговор. Във Всичките ни писаници ( заяждания) и уоци по асемблер и програмиране не видях конкретен отговор на въпроса ми.
Искам да се извиня на всички които им се виждат безполезни тиа ланканици ( и за мен от тях няма смисъл)
EDDIESoft
|
| Чет Юни 28, 2007 1:09 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Пич, предавам се наистина, полетяха камъни от всички страни...задаваш въпрос, отваряш нова темичка и всеки решен да помогне (както и аз) пишем, не разбрах кое точно приемаш за заяждане...ти обаче си знаеш своето - мятай си камъните тогава...
PS: Конкретен отговор на въпроса ти дадох 2 пъти, вижда се черно на бяло, инструкциите са rrf и rlf 
|
| Чет Юни 28, 2007 1:15 pm |
|
 |
|
bobyk
Ранг: Ориентиран
Регистриран на: Пон Яну 09, 2006 11:32 am Мнения: 276 Местоположение: Kozloduy
|
Струвами се че ти не си съвсем наясно.
На твое място не бих държал такъв тон, хората ти казаха няколко пъти как може и как не може да го направиш, твоя си работа. 
|
| Чет Юни 28, 2007 1:39 pm |
|
 |
|
eddiesoft
Ранг: Минаващ
Регистриран на: Нед Фев 04, 2007 5:44 pm Мнения: 90
|
Явно никой не чете подред. Сега се връщам от книжарницата . Купих си книгата "PIC микроконтролери" част първа за да ви снимам една страница. Книжарката не м разреши да я снимам там, та се наложи да си я купя.
Явно не четете внимателно pdf файловете и затова ви я качвам на българси
|
| Чет Юни 28, 2007 2:51 pm |
|
 |
|
Dimitar
Ранг: Форумен бог
Регистриран на: Пет Ное 12, 2004 3:38 pm Мнения: 9103 Местоположение: Chicago, IL
|
eddiesoft - от всякъде се видя, че си нямаш понятие от асемблера на пиковете, нито какво е това опкод и как стават нещата там. Така, че раздавай го малко по-леко с поученията, защото на следващия ти тъп въпрос никой няма да отговори. Факт е, че всички бяха много внимателни и се опитаха да ти обяснят защо неможеш да променяш ПРОГРАМНАТА ПАМЕТ в хода на изпълнение на програмата, ама ти си знаеш твоето. bsf f,b - и трите неща са константи в тая памет и неможеш да ги променяш посмъртно. Има си инструкции в тоя асемблер дето работят с регистри и клетки в рам-а, има си и такива дето работят с константи. В случая bsf e такава, дето работи с константа и въпреки твоите мераци, тя няма как да почне да работи с променлива. Та вземи да четеш книжките дето ги купуваш, вместо да ги снимаш и да ни ги показваш на нас, от които искаш съвети  .
|
| Чет Юни 28, 2007 3:28 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|