|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 8:15 am
|
Страница 1 от 1
|
[ 9 мнения ] |
|
| Автор |
Съобщение |
|
asen_c
Ранг: Минаващ
Регистриран на: Сря Авг 08, 2018 12:58 am Мнения: 2
|
 проблем с MOVWF
Здравейте Моля за помощ с тази команда. Приложен изпращам Screen shot на малка програмка, за онагледяване. Проблема е, че командата не записва информацията от W в F a взима стойността регистъра F и я ползва за адрес на регистър в който записва. Очевидно в момента се уча ( и то в началото) и предварително благодаря за разбирането и съдействието. кода е:
LIST p=16F84 #include <p16f84.inc> W EQU 0 ;PRI ZAPIS V 'W' F EQU 1 ;PRI ZAPIS V 'F' A1 EQU D'7' A2 EQU D'2'
ORG H'0000' BSF STATUS, RP0 MOVLW B'10010001' MOVWF OPTION_REG CALC CLRW MOVLW A1 MOVWF A2 MOVLW A2 NOP NOP NOP CLRF A2
GOTO CALC
END
|
| Сря Авг 08, 2018 1:13 am |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: проблем с MOVWF
Клетките от паметта ...слагай им по-смислени имена A1_oboroti , A2_impulsi,... На константите също - cA3_impulsizaoborot . Ти коректно си пипнал банк бита RP0, и реално програмата ще запише OPTION_REG ,а не TMR0. Обаче програмата Асемблер (на Майкрочип) иска всеки път да 'и укажеш със служебна директива в коя банка си/или искаш да си. Не си спомням дали самата директива генерира реда 'BSF STATUS,RP0' . Директивата май беше BANKSEL
Последна промяна stefan63 на Сря Авг 08, 2018 7:05 am, променена общо 1 път
|
| Сря Авг 08, 2018 6:26 am |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: проблем с MOVWF
banksel - Generate Bank Selecting Code Syntax banksel label Description This directive is an instruction to the assembler and linker to generate bank selecting code to set the bank to the bank containing the designated label. Only one label should be specified. No operations can be performed on label. This label must have been previously defined. The linker will generate the appropriate bank selecting code: For 12-bit instruction width (PIC10F, some PIC12/PIC16) devices, the appropriate bit set/clear instructions on the FSR will be generated. For 14-bit instruction width (most PIC12/PIC16) devices, bit set/clear instructions on the STATUS register will be generated. For PIC16 extended and PIC18 devices, a movlb will be generated. If the device contains only one bank of RAM, no instructions will be generated.
|
| Сря Авг 08, 2018 6:50 am |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: проблем с MOVWF
Не е добре променливите да ги "обявяваш" с константи за адреси. Има си директиви за разполагане на твои променливи в регистър-файла. Ако си мислил А1 и А2 да са адреси на твои променливи - в 16Ф84 свободните клетки РАМ започват от адреси D'12'. - на адреси 2 и 7 има специални регистри; Когато утре смениш процесора, свободните клетки ще се разполагат на друго място ,от друг начален адрес и ще ти се наложи ред по ред да променяш "обявите" на променливите . Ще има недоглеждания и съответно - недоспивания. Остави асемблера да се оправя - той затова е там  . Та започни да четеш - поне описанието на директивите. На днешно време - рядко се почва от асемблер , но си има предимства - така по-пълно ще схванеш концепциите в контролерите. Има си и недостатъци...
|
| Сря Авг 08, 2018 7:33 am |
|
 |
|
CarBeta
Ранг: Форумен бог
Регистриран на: Пет Май 01, 2009 4:01 pm Мнения: 1438
|
 Re: проблем с MOVWF
Асемблерът си работи правилно и изпълнява точно каквото си му казал. Очевидно не си разбрал правилно какво точно изпълняват тия команди. Проблемът ти с MOVWF A2 идва от това, че ти очакваш А2 да приеме стойността на А1, което няма как да стане в твоя случай. Ако искаш това да стане трябва да декларираш адрес от паметта, на който да отговаря А2. Ти всъщност точно това си направил, но на адрес 2 е PCL, и ти няма как да го промениш това. Трябва да използваш адреси, които са свободни и са предвидени точно за тая работа. За твоя процесор тия адреси започват от 0х0C. Правилният начин е да декларираш A2 EQU Н'0С' и след това ако искаш да присвоиш някаква стойност на А2 - пишеш някъде в програмата: MOVLW "стойност някаква" MOVWF A2
|
| Сря Авг 08, 2018 11:59 am |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: проблем с MOVWF
MOLVW A1 - вземаш А1 (неговият адрес) ако А1 е 0х20 се записва 0х20 във W MOVF A1,W - вземаш стойността записана на адрес А1 (във W се записва, каквото има на адрес 0x20)
|
| Сря Авг 08, 2018 6:11 pm |
|
 |
|
asen_c
Ранг: Минаващ
Регистриран на: Сря Авг 08, 2018 12:58 am Мнения: 2
|
 Re: проблем с MOVWF
Благодаря за съдействието CarBeta е разбрал какво искам да направа и къде бъркам ( мерси). Мислех, че по начина по който ги дефиинирам А1, А2 задавам стойности на самия регистър, а не адрес на регистъра. да наистина искам да ползвам А1 и А2 като променливи. Не мога да разбера мога ли да ги дефинирам (в началото на програмата) тези променливи без да оказвам конкретна клетка от паметта. Т.е. да остава асемблера да решава. Мерси предварително.
|
| Чет Авг 09, 2018 12:14 am |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: проблем с MOVWF
Точно това ти обаснявам, че ти си взел адреса на регистъра вместо неговото състояние. Тук не се работи с променливи, а само с указатели към регистри от паметта. със MOVF A1,W четеш съдържанието на регистър с адрес А1 все едно си написъл MOVF D'7',W . Това ти трябва. със MOVLW A1 четеш адреса на регистъра. Ако A1 EQU D'7' , то все едно си написъл MOVLW D'7' И отделно че на адрес 7 което е 0x07 има някакъв регистър от контролера, не свободен RAM. Трябва да видиш кои са за RAM. CarBeta ти е написал, 0x0C това е D'12'. Малко не ми се връзва по скоро 0xC0 ще да е, но ти го провери. Но това е в общи линии. edit : да 0х0С е за 16F84
|
| Чет Авг 09, 2018 12:39 am |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: проблем с MOVWF
|
| Чет Авг 09, 2018 7:09 am |
|
|
|
Страница 1 от 1
|
[ 9 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|