|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 6:15 am
|
Страница 1 от 1
|
[ 11 мнения ] |
|
Четене-модификация-запис проблеми?
| Автор |
Съобщение |
|
WDW
Ранг: Популярен
Регистриран на: Сря Окт 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 |
|
 |
|
fan
Ранг: Почетен член
Регистриран на: Съб Окт 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 |
|
 |
|
WDW
Ранг: Популярен
Регистриран на: Сря Окт 26, 2005 12:36 am Мнения: 353
|
Да, прав си! От толкова много периферия и човек може да се обърка.
Но това е в сила само когато портовете са конфигурирани като входове. И всяко четене на бит от порта ще ми връща нула, ако не съм обърнал внимание на ANSEL регистъра.
Когато обаче са изходи това не ме бърка.
Така проблема четене-модификация-запис си остава с пълна сила.
_________________ Сичкото що е транзистор за илядо и пестотин волта се е BU ...
|
| Пон Авг 25, 2008 12:22 am |
|
 |
|
rumen65
Ранг: Новодошъл
Регистриран на: Чет Окт 06, 2005 2:06 pm Мнения: 194 Местоположение: Sofia
|
Именно в това е проблема. Инструкцията за четене, модификация и запис, първо прочита порта (той е конфигуриран като аналогов и там са само 0), след това вдига конкретния бит и го записва в изхода.
|
| Пон Авг 25, 2008 4:53 pm |
|
 |
|
WDW
Ранг: Популярен
Регистриран на: Сря Окт 26, 2005 12:36 am Мнения: 353
|
Направих и този опит - нулирах ANSEL и ANSELH , но резултатът е същият.
Установяването на всеки следващ бит нулира предходния.
Четох някъде че съветват да се поставят НОП-ове между всеки BSF за да се даде време да се установят нивата на портовете, но и това не помага.
А до сега този проблем не ми се е появал толкова отчетливо?!
_________________ Сичкото що е транзистор за илядо и пестотин волта се е BU ...
|
| Вто Авг 26, 2008 12:11 am |
|
 |
|
VSU
Ранг: Напреднал
Регистриран на: Нед Авг 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 |
|
 |
|
plameniv
Ранг: Форумен бог
Регистриран на: Нед Окт 10, 2004 9:55 am Мнения: 1718
|
 Хех
Това нулиране се прави веднъж в началото на програмата !!!
Я пусни целия код и ще се умува по него !
_________________ Избийте баламите и тарикатите сами ще умрат!
Няма невъзможни работи - има много трудни работи!
----------------------------------------------------------------------------------
"Я в Москве с киркой уран найду, при такой повышенной зарплате" !
|
| Вто Авг 26, 2008 1:20 am |
|
 |
|
WDW
Ранг: Популярен
Регистриран на: Сря Окт 26, 2005 12:36 am Мнения: 353
|
Благодаря !
Проблемът ми се беше в неправилното обръщение към банките!
Не съм обърнал внимание че тези регистри са в Банк2.
Но какво се случва с тази инструкция след като не е коректно зададена? Защо компилатора не се сърди?
Задължително ли е при старт да правя тази инициализация за Банк0, както си го направил ?
В крайна сметка ефекта R-M-W не е толкова страшен след като осигуриш нужното време за установяване на състоянията и спокойно можеш да си работиш с BSF и BCF върху портовете!?! 
_________________ Сичкото що е транзистор за илядо и пестотин волта се е BU ...
|
| Вто Авг 26, 2008 11:57 pm |
|
 |
|
WDW
Ранг: Популярен
Регистриран на: Сря Окт 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 |
|
 |
|
darkyp
Ранг: Ориентиран
Регистриран на: Пон Дек 12, 2005 6:03 pm Мнения: 263 Местоположение: София
|
Защото компилатора не може да знае кога точно ще попаднеш на ред 37, 43 или 44 (и дали ще си сетнал правилно банката в този момент) и ти напомня че адресираш памет от друга банка. Тези съобщения можеш да си ги изключиш. При по-дълга програма стават досадни.
|
| Съб Авг 30, 2008 7:10 am |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
А най-вероятно има директива с която подсказваш каква е текущата банка.
|
| Съб Авг 30, 2008 12:19 pm |
|
|
|
Страница 1 от 1
|
[ 11 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|