Отговори на тема  [ 11 мнения ] 
Четене-модификация-запис проблеми? 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Окт 26, 2005 12:36 am
Мнения: 353
Мнение Четене-модификация-запис проблеми?
Здравейте,
опитвам се да си изясня физическата същност на тази особеност.
Постановката е 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) ми изглежда невъзможно. :?

_________________
Сичкото що е транзистор за илядо и пестотин волта се е BU ...


Съб Авг 23, 2008 1:07 am
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

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


Съб Авг 23, 2008 10:11 am
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Окт 26, 2005 12:36 am
Мнения: 353
Мнение 
Да, прав си! От толкова много периферия и човек може да се обърка.
Но това е в сила само когато портовете са конфигурирани като входове. И всяко четене на бит от порта ще ми връща нула, ако не съм обърнал внимание на ANSEL регистъра.
Когато обаче са изходи това не ме бърка.
Така проблема четене-модификация-запис си остава с пълна сила.

_________________
Сичкото що е транзистор за илядо и пестотин волта се е BU ...


Пон Авг 25, 2008 12:22 am
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 06, 2005 2:06 pm
Мнения: 194
Местоположение: Sofia
Мнение 
Именно в това е проблема. Инструкцията за четене, модификация и запис, първо прочита порта (той е конфигуриран като аналогов и там са само 0), след това вдига конкретния бит и го записва в изхода.


Пон Авг 25, 2008 4:53 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Окт 26, 2005 12:36 am
Мнения: 353
Мнение 
rumen65 написа:
Именно в това е проблема. Инструкцията за четене, модификация и запис, първо прочита порта (той е конфигуриран като аналогов и там са само 0), след това вдига конкретния бит и го записва в изхода.


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

_________________
Сичкото що е транзистор за илядо и пестотин волта се е BU ...


Вто Авг 26, 2008 12:11 am
Профил ICQ
Ранг: Напреднал
Ранг: Напреднал

Регистриран на: Нед Авг 14, 2005 1:08 pm
Мнения: 433
Местоположение: Казанлък
Мнение 
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


Последна промяна VSU на Вто Авг 26, 2008 1:22 am, променена общо 2 пъти



Вто Авг 26, 2008 1:19 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Окт 10, 2004 9:55 am
Мнения: 1718
Мнение Хех
WDW написа:
rumen65 написа:
Именно в това е проблема. Инструкцията за четене, модификация и запис, първо прочита порта (той е конфигуриран като аналогов и там са само 0), след това вдига конкретния бит и го записва в изхода.


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

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

_________________
Избийте баламите и тарикатите сами ще умрат!
Няма невъзможни работи - има много трудни работи!
----------------------------------------------------------------------------------
"Я в Москве с киркой уран найду, при такой повышенной зарплате" !


Вто Авг 26, 2008 1:20 am
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Окт 26, 2005 12:36 am
Мнения: 353
Мнение 
Благодаря ! :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:

_________________
Сичкото що е транзистор за илядо и пестотин волта се е BU ...


Вто Авг 26, 2008 11:57 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Окт 26, 2005 12:36 am
Мнения: 353
Мнение 
След компилация ми дава тези съобщения:

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 - плюе тези съобщения?

_________________
Сичкото що е транзистор за илядо и пестотин волта се е BU ...


Чет Авг 28, 2008 6:03 pm
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пон Дек 12, 2005 6:03 pm
Мнения: 263
Местоположение: София
Мнение 
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 (и дали ще си сетнал правилно банката в този момент) и ти напомня че адресираш памет от друга банка. Тези съобщения можеш да си ги изключиш. При по-дълга програма стават досадни.


Съб Авг 30, 2008 7:10 am
Профил ICQ YIM
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
А най-вероятно има директива с която подсказваш каква е текущата банка.


Съб Авг 30, 2008 12:19 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 11 мнения ] 

Кой е на линия

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


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

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