 |
Форум за електроника Български форум за електроника, ремонти, схеми, документация
|
| Предишната тема :: Следващата тема |
| Автор |
Съобщение |
emil74 Опитен потребител


Регистриран на: 16 Мар 2007 Мнения: 1111
|
Пуснато на: Вто Фев 19, 2008 2:53 Заглавие: Въпрос за банките памет на PIC16F877A |
|
|
Налага ми се да пиша програма, в която има доста променливи. Забелязах, че от един момент престана да работи програмата и установих, че това се получава, когато променливите SYM1...SYMn не са дефинирани в нулевата банка, а в 1 и 2:
CBLOCK H'A0' ; 1RAM starts at address A0h
SYM1
SYM2
......
SYMn
ENDC
Тогава спира да работи следната проверка:
bcf STATUS,Z
movf SYM1,w
xorlw H'73'
btfsc STATUS,Z
goto S2
Във файла за грешките има съобщения за настройка на битовете за банките
Доста търсих, но не можах да намеря нещо, от което да разбера, къде и КАК трябва да се работи с променливите, за да не се получава такъв проблем. Тоест: къде настройвам банката (STATUS,RP0 STATUS,RP1)? |
|
| Върнете се в началото |
|
 |
Комбинатор Опитен потребител

Регистриран на: 31 Окт 2007 Мнения: 310
|
Пуснато на: Вто Фев 19, 2008 9:47 Заглавие: |
|
|
PCLATH<4> и PCLATH<3>
С тези 2 флага на регистъра настройваш
Програмната дума към коя банка да се обръща.
Това става само ръчно и софтуерно.
Причината е в невъзможноста в 14 битовата
програмна дума да се инициализира по голям адрес,
да съдържа и кода на операцията и същевременно и 8 бита данни.
Затова PCLATH<4> и PCLATH<3> се добавя в началото на думата.
На дявам се да се изразявам правилно, защото тези неща ги пише в даташета на процессора и то на англииски. А аз не съм преводач.
P.S А ще забележиш че статус регистъра се дублира в всяка банка.
И поне към него няма нужда от настройка на банката
ORG 0x500
BCF PCLATH,4
BSF PCLATH,3 ;Select page 1;(800h-FFFh)
CALL SUB1_P1 ;Call subroutine in: ;page 1 (800h-FFFh):
ORG 0x900 ;page 1 (800h-FFFh)
SUB1_P1: ;called subroutine;page 1 (800h-FFFh):
RETURN ;return to;Call subroutine;in page 0;(000h-7FFh)
2.4 Program Memory Paging
All PIC16F87XA devices are capable of addressing a
continuous 8K word block of program memory. The
CALL and GOTO instructions provide only 11 bits of
address to allow branching within any 2K program
memory page. When doing a CALL or GOTO instruction,
the upper 2 bits of the address are provided by
PCLATH<4:3>. When doing a CALL or GOTO instruction,
the user must ensure that the page select bits are
programmed so that the desired program memory
page is addressed. If a return from a CALL instruction
(or interrupt) is executed, the entire 13-bit PC is popped
off the stack. Therefore, manipulation of the
PCLATH<4:3> bits is not required for the RETURN
instructions (which POPs the address from the stack). |
|
| Върнете се в началото |
|
 |
Niakoi Опитен потребител

Регистриран на: 20 Авг 2006 Мнения: 356 Местожителство: Каръктаун
|
Пуснато на: Вто Фев 19, 2008 15:29 Заглавие: |
|
|
Комбинатора е прав, но това е за програмната памет. А за твоя случай - погледни в дейташита: в STATUS регистъра има два бита RP0 и RP1. Виж какво пише за тях.
За да ти работи проверката:
bcf STATUS,Z
bsf STATUS,RP0
movf SYM1,w
bcf STATUS,RP0
xorlw H'73'
btfsc STATUS,Z
goto S2
По-добър вариант е, да сложиш на местото на тоя пик един 18F452 (пасва точно на крачетата) и да (ще) забравиш за съществуването на 16-ките. _________________ Жица, на която не виждам двата края, не я пипам! |
|
| Върнете се в началото |
|
 |
Комбинатор Опитен потребител

Регистриран на: 31 Окт 2007 Мнения: 310
|
Пуснато на: Вто Фев 19, 2008 15:32 Заглавие: |
|
|
Да така е но за мен е лош навик исползването на
RP0 и RP1
А когато DB
или там каквото исползваш
масива ти надхвърли SRAM-а на една банка
и се наложи прехвърлянето в друга тогава става лошо,
защото се налага ръчно да сменяш банките с RP0 и RP1
но mikrochip имат апнотки за такива случай.
А нещо не схващам примера,
виждам че си проверяваш Z bita при XOR
но това няма да даде грашка в която и банка да работиш
Освен грешни данни в W , от друга банка
Последната промяна е направена от Комбинатор на Вто Фев 19, 2008 15:55; мнението е било променяно общо 1 път |
|
| Върнете се в началото |
|
 |
Niakoi Опитен потребител

Регистриран на: 20 Авг 2006 Мнения: 356 Местожителство: Каръктаун
|
Пуснато на: Вто Фев 19, 2008 15:50 Заглавие: |
|
|
Комбинатор, човека проверява, дали променливата е равна на 73h. Кой флаг предлагаш да проверява след XOR!?
И как се обръщаш към променлива в рам-а на адрес А0h, без да ползваш RP битовете? _________________ Жица, на която не виждам двата края, не я пипам! |
|
| Върнете се в началото |
|
 |
Комбинатор Опитен потребител

Регистриран на: 31 Окт 2007 Мнения: 310
|
Пуснато на: Вто Фев 19, 2008 16:01 Заглавие: |
|
|
Сори в момента работя с референций ,класове и темподобни, опитвам се да синхронизирам процеси и ми идва малко в повече
разговора за пикльто.
Не виждам проблема в кода му, ако е в вярната банка
И сега погледнах датата на този проц
ако SIMN n<=80
Последната промяна е направена от Комбинатор на Вто Фев 19, 2008 16:10; мнението е било променяно общо 1 път |
|
| Върнете се в началото |
|
 |
Niakoi Опитен потребител

Регистриран на: 20 Авг 2006 Мнения: 356 Местожителство: Каръктаун
|
Пуснато на: Вто Фев 19, 2008 16:08 Заглавие: |
|
|
 _________________ Жица, на която не виждам двата края, не я пипам! |
|
| Върнете се в началото |
|
 |
Комбинатор Опитен потребител

Регистриран на: 31 Окт 2007 Мнения: 310
|
Пуснато на: Вто Фев 19, 2008 16:15 Заглавие: |
|
|
Да прав си има 2 регистри единия е в банка 0
а другата в банка 1 |
|
| Върнете се в началото |
|
 |
woodoman Активен потребител

Регистриран на: 03 Яну 2008 Мнения: 67
|
Пуснато на: Сря Фев 20, 2008 19:48 Заглавие: |
|
|
Така писан кода променливата SYM1 е деклалирана в банка1. При преместване на съдържанието в работния регистър ще се прехвърли стойноста на регистър с адрес 20 от банка0. За да фонкционира правилно програмата трябва преди обрщение към съответния регистър да се инициализира правилната банка. Това става както са писали чрез битове RP0 и RP1 на регистър STATUS<5,6>. В съответния случай преди съответния блок от команди трябва да се постави:
BCF STATUS,6 ;
BSF STATUS,5 ;Избира се банка1
bcf STATUS,Z
movf SYM1,w
xorlw H'73'
btfsc STATUS,Z
goto S2
BCF STATUS,5
Ако след този блок се проверяват регистри намиращи се в банка1 последната команда може да не се пише.
Ако те интересува нещо друго пиши. _________________ Нека да си помагаме взаимно. Защото ако не си помогнем ние няма кой да ни помогне. |
|
| Върнете се в началото |
|
 |
emil74 Опитен потребител


Регистриран на: 16 Мар 2007 Мнения: 1111
|
Пуснато на: Сря Фев 20, 2008 21:23 Заглавие: |
|
|
| Мисля, че последното ще свърши работа. Не бях сигурен само къде точно посочвам банките. Ще променя програмата и ще напиша какъв е резултатът. |
|
| Върнете се в началото |
|
 |
|
|
Не Можете да пускате нови теми Не Можете да отговаряте на темите Не Можете да променяте съобщенията си Не Можете да изтривате съобщенията си Не Можете да гласувате в анкети
|
|