Отговори на тема  [ 9 мнения ] 
проблем с MOVWF 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 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


Прикачени файлове:
Untitled.jpg
Untitled.jpg [ 258.4 KiB | Прегледано 4049 пъти ]
Сря Авг 08, 2018 1:13 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: проблем с MOVWF
Код:
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  ;зареди W с числото(константа) D'7'
  MOVWF A2  ;запиши W в регистър с адрес ==D'2' ,който е PCL , тук би трябвало да гърмиш
  MOVLW A2 ;;зареди W с числото(константа) D'2'
  NOP
  NOP
  NOP
  CLRF A2

  GOTO CALC

END


Клетките от паметта ...слагай им по-смислени имена 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 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.

Код:
Application Example 2 - banksel
  #include p16f877a.inc   ;Include standard header file
                          ;for the selected device.

  banksel TRISB           ;Since this register is in bank 1,
                          ;not default bank 0, banksel is
                          ;used to ensure bank bits are correct.
  clrf    TRISB           ;Clear TRISB. Sets PORTB to outputs.
  banksel PORTB           ;banksel used to return to bank 0,
                          ;where PORTB is located.
  movlw   0x55            ;Set PORTB value.
  movwf   PORTB
  goto    $
  end                     ;All programs must have an end.


Сря Авг 08, 2018 6:50 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: проблем с MOVWF
Не е добре променливите да ги "обявяваш" с константи за адреси. Има си директиви за разполагане на твои променливи в регистър-файла.
Ако си мислил А1 и А2 да са адреси на твои променливи
- в 16Ф84 свободните клетки РАМ започват от адреси D'12'.
- на адреси 2 и 7 има специални регистри;

Когато утре смениш процесора, свободните клетки ще се разполагат на друго място ,от друг начален адрес и ще ти се наложи ред по ред да променяш "обявите" на променливите . Ще има недоглеждания и съответно - недоспивания. Остави асемблера да се оправя - той затова е там :D .
Та започни да четеш - поне описанието на директивите. На днешно време - рядко се почва от асемблер , но си има предимства - така по-пълно ще схванеш концепциите в контролерите.
Има си и недостатъци...


Сря Авг 08, 2018 7:33 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение Re: проблем с MOVWF
asen_c написа:
Здравейте
Моля за помощ с тази команда.
Приложен изпращам 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


Асемблерът си работи правилно и изпълнява точно каквото си му казал. Очевидно не си разбрал правилно какво точно изпълняват тия команди. Проблемът ти с MOVWF A2 идва от това, че ти очакваш А2 да приеме стойността на А1, което няма как да стане в твоя случай. Ако искаш това да стане трябва да декларираш адрес от паметта, на който да отговаря А2. Ти всъщност точно това си направил, но на адрес 2 е PCL, и ти няма как да го промениш това. Трябва да използваш адреси, които са свободни и са предвидени точно за тая работа. За твоя процесор тия адреси започват от 0х0C. Правилният начин е да декларираш A2 EQU Н'0С' и след това ако искаш да присвоиш някаква стойност на А2 - пишеш някъде в програмата:
MOVLW "стойност някаква"
MOVWF A2


Сря Авг 08, 2018 11:59 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: проблем с MOVWF
MOLVW A1 - вземаш А1 (неговият адрес) ако А1 е 0х20 се записва 0х20 във W
MOVF A1,W - вземаш стойността записана на адрес А1 (във W се записва, каквото има на адрес 0x20)

_________________
https://github.com/slav4ocom/


Сря Авг 08, 2018 6:11 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 08, 2018 12:58 am
Мнения: 2
Мнение Re: проблем с MOVWF
Благодаря за съдействието
CarBeta е разбрал какво искам да направа и къде бъркам ( мерси). Мислех, че по начина по който ги дефиинирам А1, А2 задавам стойности на самия регистър, а не адрес на регистъра.
да наистина искам да ползвам А1 и А2 като променливи. Не мога да разбера мога ли да ги дефинирам (в началото на програмата) тези променливи без да оказвам конкретна клетка от паметта. Т.е. да остава асемблера да решава.
Мерси предварително.


Чет Авг 09, 2018 12:14 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 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

_________________
https://github.com/slav4ocom/


Чет Авг 09, 2018 12:39 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: проблем с MOVWF
Код:
#include p16f877a.inc  ;Include standard header file
                         ;for the selected device.

group1  udata  0x20      ;group1 data stored at locations
                         ;starting at 0x20.
  group1_var1  res  1    ;group1_var1 located at 0x20.
  group1_var2  res  1    ;group1_var2 located at 0x21.

group2  udata            ;Declaration of group2 data. The
                         ;addresses for variables under
  group2_var1  res  1    ;this data section are allocated
  group2_var2  res  1    ;automatically by the linker.

RST     CODE     0x0      ;The code section named RST
                          ;is placed at program memory
                          ;location 0x0


Чет Авг 09, 2018 7:09 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 9 мнения ] 

Кой е на линия

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


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

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