| Микроконтролери и електроника 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 ] | |||||||||
| Заглавие: | ||||||||||
Направих и този опит - нулирах ANSEL и ANSELH , но резултатът е същият. Установяването на всеки следващ бит нулира предходния. Четох някъде че съветват да се поставят НОП-ове между всеки 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 [ Вто Авг 26, 2008 11:57 pm ] | |||||||||
| Заглавие: | ||||||||||
Благодаря !
Проблемът ми се беше в неправилното обръщение към банките! Не съм обърнал внимание че тези регистри са в Банк2. Но какво се случва с тази инструкция след като не е коректно зададена? Защо компилатора не се сърди? Задължително ли е при старт да правя тази инициализация за Банк0, както си го направил ? В крайна сметка ефекта R-M-W не е толкова страшен след като осигуриш нужното време за установяване на състоянията и спокойно можеш да си работиш с BSF и BCF върху портовете!?! |
||||||||||
| Автор: | 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 ] | |||||||||
| Заглавие: | ||||||||||
Защото компилатора не може да знае кога точно ще попаднеш на ред 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/ |
|