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

Четене-модификация-запис проблеми?
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=6050
Страница 1 от 1

Автор:  WDW [ Съб Авг 23, 2008 1:07 am ]
Заглавие:  Четене-модификация-запис проблеми?

Здравейте,
опитвам се да си изясня физическата същност на тази особеност.
Постановката е 4 свето диода към маса !
А кода е следният:

#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
org 0
TEST EQU H'20'
Start:
AA nop
bsf STATUS,RP0 ; select Register Page 1
clrf TRISC
;bcf TRISC,1 ; make IO Pin C0 an output
;bcf TRISC,0
bcf STATUS,RP0 ; back to Register Page 0
;
MOVLW B'0000'
MOVWF TEST
NOP
NOP
NOP
BB bsf TEST,0 ; turn on LED C0 (DS1)
MOVF TEST,W
MOVWF PORTC
nop
bsf PORTC,0
NOP
bsf PORTC,1
nop
bsf PORTC,2
nop
bsf PORTC,3
nop
BSF PORTC,0
NOP
BSF PORTC,1
NOP
BSF TEST,2 ;

MOVF TEST,W
;MOVWF PORTC
NOP
BSF PORTC,1
NOP
;IORWF PORTC,F
goto $ ; wait here

Защо след последния BSF остава да свети само този светодиод, а останалите загасват?
Нали след всяка такава инструкция първо се чете порта, а пък аз вече съм установил битовете в 1. Т.е. той трябва да прочете 1 и да запише отново 1. А на практика не става така.
Как си решавате проблема с портовете когато трябва да управлявате отделните битове?

- Примерно имам софтуерен UART(или I2C) и там трябва да работя с BSF/BCF директно (нямам друг начин). Значи ли това че с всеки един приет/предаден бит ще променям и останалите изводи от порта?
Има ли начин да се заобиколи проблема?
Казват да се работи с масков регистър (пробата ми с TEST регистъра от сорса), но когато имам UART (I2C) ми изглежда невъзможно. :?

Автор:  fan [ Съб Авг 23, 2008 10:11 am ]
Заглавие: 

Здравей!
За да тръгне работата, като за начало конфигурирай всички пинове да са I/O(защото при първоначален пуск RA0 - RA4, RC0 - RA3, RC6, RC7, RB4,RB5 са конфигурирани като аналогови входове) - влизаш в BANK2 и допълваш сл. два реда:
clrf ANSEL
clrf ANSELH
Обърни повече внимание на вградените модули!
Успех!

Автор:  WDW [ Пон Авг 25, 2008 12:22 am ]
Заглавие: 

Да, прав си! От толкова много периферия и човек може да се обърка.
Но това е в сила само когато портовете са конфигурирани като входове. И всяко четене на бит от порта ще ми връща нула, ако не съм обърнал внимание на ANSEL регистъра.
Когато обаче са изходи това не ме бърка.
Така проблема четене-модификация-запис си остава с пълна сила.

Автор:  rumen65 [ Пон Авг 25, 2008 4:53 pm ]
Заглавие: 

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

Автор:  WDW [ Вто Авг 26, 2008 12:11 am ]
Заглавие: 

rumen65 написа:
Именно в това е проблема. Инструкцията за четене, модификация и запис, първо прочита порта (той е конфигуриран като аналогов и там са само 0), след това вдига конкретния бит и го записва в изхода.


Направих и този опит - нулирах ANSEL и ANSELH , но резултатът е същият.
Установяването на всеки следващ бит нулира предходния. :x
Четох някъде че съветват да се поставят НОП-ове между всеки BSF за да се даде време да се установят нивата на портовете, но и това не помага.
А до сега този проблем не ми се е появал толкова отчетливо?!

Автор:  VSU [ Вто Авг 26, 2008 1:19 am ]
Заглавие: 

WDW, я пробвай ей така
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

TEST EQU H'20'

org 0

Start:


BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
CLRF PORTC ;Init PORTC
BSF STATUS,RP1 ;Bank 2
CLRF ANSEL ;digital I/O
BSF STATUS,RP0 ;Bank 1
BCF STATUS,RP1 ;
MOVLW 00 ;
MOVWF TRISC ;as outputs
BCF STATUS,RP0 ;Bank 0

MOVLW B'0000'
MOVWF TEST
NOP
NOP
NOP
BB bsf TEST,0 ; turn on LED C0 (DS1)
MOVF TEST,W
MOVWF PORTC
nop
bsf PORTC,0
NOP
bsf PORTC,1
nop
bsf PORTC,2
nop
bsf PORTC,3
nop
BSF PORTC,0
NOP
BSF PORTC,1
NOP
BSF TEST,2 ;

MOVF TEST,W
;MOVWF PORTC
NOP
BSF PORTC,1
NOP
;IORWF PORTC,F
goto $ ; wait here


end

Автор:  plameniv [ Вто Авг 26, 2008 1:20 am ]
Заглавие:  Хех

WDW написа:
rumen65 написа:
Именно в това е проблема. Инструкцията за четене, модификация и запис, първо прочита порта (той е конфигуриран като аналогов и там са само 0), след това вдига конкретния бит и го записва в изхода.


Направих и този опит - нулирах ANSEL и ANSELH , но резултатът е същият.
Установяването на всеки следващ бит нулира предходния. :x
Четох някъде че съветват да се поставят НОП-ове между всеки BSF за да се даде време да се установят нивата на портовете, но и това не помага.
А до сега този проблем не ми се е появал толкова отчетливо?!

Това нулиране се прави веднъж в началото на програмата !!!
Я пусни целия код и ще се умува по него !

Автор:  WDW [ Вто Авг 26, 2008 11:57 pm ]
Заглавие: 

Благодаря ! :wink:
VSU написа:
WDW, я пробвай ей така



BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
CLRF PORTC ;Init PORTC
BSF STATUS,RP1 ;Bank 2
CLRF ANSEL ;digital I/O
BSF STATUS,RP0 ;Bank 1
BCF STATUS,RP1 ;
MOVLW 00 ;
MOVWF TRISC ;as outputs
BCF STATUS,RP0 ;Bank 0



end


Проблемът ми се беше в неправилното обръщение към банките! :oops:
Не съм обърнал внимание че тези регистри са в Банк2.
Но какво се случва с тази инструкция след като не е коректно зададена? Защо компилатора не се сърди?
Задължително ли е при старт да правя тази инициализация за Банк0, както си го направил ?

В крайна сметка ефекта R-M-W не е толкова страшен след като осигуриш нужното време за установяване на състоянията и спокойно можеш да си работиш с BSF и BCF върху портовете!?! :idea:

Автор:  WDW [ Чет Авг 28, 2008 6:03 pm ]
Заглавие: 

След компилация ми дава тези съобщения:

Message[302] .. WORLD.ASM 37 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] ..WORLD.ASM 43 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] ..WORLD.ASM 44 : Register in operand not in bank 0. Ensure that bank bits are correct.

Защо след като са оправени адресиранията на банките?
Или компилатора не следи това нещо и за всяк банка различна от 0 - плюе тези съобщения?

Автор:  darkyp [ Съб Авг 30, 2008 7:10 am ]
Заглавие: 

WDW написа:
След компилация ми дава тези съобщения:

Message[302] .. WORLD.ASM 37 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] ..WORLD.ASM 43 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] ..WORLD.ASM 44 : Register in operand not in bank 0. Ensure that bank bits are correct.

Защо след като са оправени адресиранията на банките?
Или компилатора не следи това нещо и за всяк банка различна от 0 - плюе тези съобщения?


Защото компилатора не може да знае кога точно ще попаднеш на ред 37, 43 или 44 (и дали ще си сетнал правилно банката в този момент) и ти напомня че адресираш памет от друга банка. Тези съобщения можеш да си ги изключиш. При по-дълга програма стават досадни.

Автор:  woody [ Съб Авг 30, 2008 12:19 pm ]
Заглавие: 

А най-вероятно има директива с която подсказваш каква е текущата банка.

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