Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

проблем с MOVWF
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=16073
Страница 1 от 1

Автор:  asen_c [ Сря Авг 08, 2018 1:13 am ]
Заглавие:  проблем с 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 | Прегледано 4057 пъти ]

Автор:  stefan63 [ Сря Авг 08, 2018 6:26 am ]
Заглавие:  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 6:50 am ]
Заглавие:  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.

Автор:  stefan63 [ Сря Авг 08, 2018 7:33 am ]
Заглавие:  Re: проблем с MOVWF

Не е добре променливите да ги "обявяваш" с константи за адреси. Има си директиви за разполагане на твои променливи в регистър-файла.
Ако си мислил А1 и А2 да са адреси на твои променливи
- в 16Ф84 свободните клетки РАМ започват от адреси D'12'.
- на адреси 2 и 7 има специални регистри;

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

Автор:  CarBeta [ Сря Авг 08, 2018 11:59 am ]
Заглавие:  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

Автор:  slav4o.com [ Сря Авг 08, 2018 6:11 pm ]
Заглавие:  Re: проблем с MOVWF

MOLVW A1 - вземаш А1 (неговият адрес) ако А1 е 0х20 се записва 0х20 във W
MOVF A1,W - вземаш стойността записана на адрес А1 (във W се записва, каквото има на адрес 0x20)

Автор:  asen_c [ Чет Авг 09, 2018 12:14 am ]
Заглавие:  Re: проблем с MOVWF

Благодаря за съдействието
CarBeta е разбрал какво искам да направа и къде бъркам ( мерси). Мислех, че по начина по който ги дефиинирам А1, А2 задавам стойности на самия регистър, а не адрес на регистъра.
да наистина искам да ползвам А1 и А2 като променливи. Не мога да разбера мога ли да ги дефинирам (в началото на програмата) тези променливи без да оказвам конкретна клетка от паметта. Т.е. да остава асемблера да решава.
Мерси предварително.

Автор:  slav4o.com [ Чет Авг 09, 2018 12:39 am ]
Заглавие:  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

Автор:  stefan63 [ Чет Авг 09, 2018 7:09 am ]
Заглавие:  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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/