Форум за електроника Форуми Форум за електроника

Форум за електроника
Български форум за електроника, ремонти, схеми, документация
 
 Въпроси/ОтговориВъпроси/Отговори   ТърсенеТърсене   ГрупиГрупи   Регистрирайте сеРегистрирайте се 
 ПрофилПрофил   Влезте, за да видите съобщенията сиВлезте, за да видите съобщенията си   ВходВход 

Service Manual Search :   Enhanced by: Jabse.com : българската търсачка
Въпрос за банките памет на PIC16F877A
Иди на страница Предишна  1, 2, 3, 4, 5  Следваща
 
Създайте нова тема   Напишете отговор    Форум за електроника Форуми -> Общи приказки - Just talking
Предишната тема :: Следващата тема  
Автор Съобщение
Комбинатор
Опитен потребител
Опитен потребител


Регистриран на: 31 Окт 2007
Мнения: 310

МнениеПуснато на: Съб Фев 23, 2008 17:11    Заглавие: Отговорете с цитат

Май има нещо дето не ми харесва, пробвай така.


org h'0005'
Procedure1: nop;

pagesel Procedure 2 ; Компилатора си настройва регистъра
call Procedure2; ;за избор на страница на Proc.2
;;;;return-а на call Procedure2 ще върне PC-тук
pagesel Procedure 3
call Procedure3

org h'0800'

Procedure2: nop
return ; връща адреса на &(call Procedure2 +1) в page0

Procedure3 nop
goto Procedure5

Procedure5 nop
return


Последната промяна е направена от Комбинатор на Съб Фев 23, 2008 18:12; мнението е било променяно общо 1 път
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
emil74
Опитен потребител
Опитен потребител


Регистриран на: 16 Мар 2007
Мнения: 1106

МнениеПуснато на: Съб Фев 23, 2008 17:46    Заглавие: Отговорете с цитат

Така не може. Никъде няма прехвърляне на страниците.
Ето кодът:
...
org 0x005
btfsc BUSY ;USLOVIE "PRO4ETI?"
call STR_SIGNAL ;DA, OTIDI ZA 4ETENE
clrf WORK_COUNTER ;#RESETVANE NA BROJA4A
goto FIND_ASCII



org 0x800
STR_SIGNAL
bsf BUSY ;#Linijata e zaeta
clrf PORTC ;Izgasi PORTC
clrf PORTD ;Izgasi PORTD
movf PORTB,w
movwf ASSIGN_BUFFER ;Zapi6i PORTB

End_byte
bcf STATUS,Z
movf ASSIGN_BUFFER,w
xorlw B'00000000'
btfss STATUS,Z
goto Start_byte ;Ne
goto ENDING ;Da, kraj na priemaneto

Start_byte
bcf STATUS,Z
movf ASSIGN_BUFFER,w
xorlw B'11111111'
btfss STATUS,Z
goto ENDING ;Ne, kraj na priemaneto(smu6tenie e)
bcf BUSY ;Da, Osvobodi se za priemane sledva6t BYTE

call Check_Line

;==========================================
clrf SYM_COUNTER

Set_SYM1
bsf BUSY
incf SYM_COUNTER,f
movf PORTB,w
movwf ASSIGN_BUFFER ;Zapi6i PORTB kato adres na reda
movf ASSIGN_BUFFER,w
BCF STATUS,6 ;
BSF STATUS,5 ;
movwf SYM1
bcf STATUS,5
bcf BUSY

call Check_Line
;--------------------------------------------
Set_SYM2
movf PORTB,w
movwf ASSIGN_BUFFER ;Zapi6i PORTB
movf ASSIGN_BUFFER,w
xorlw B'00000000'
btfsc STATUS,Z
goto ENDING ;Ne, kraj na priemaneto

bsf BUSY
incf SYM_COUNTER,f
movf PORTB,w
movwf ASSIGN_BUFFER ;Zapi6i PORTB
movf ASSIGN_BUFFER,w
BCF STATUS,6
BSF STATUS,5
movwf SYM2
bcf STATUS,5
bcf BUSY
call Check_Line

Set_SYM3
movf PORTB,w
movwf ASSIGN_BUFFER ;Zapi6i PORTB
movf ASSIGN_BUFFER,w
xorlw B'00000000'
btfsc STATUS,Z
goto ENDING ;Ne, kraj na priemaneto

bsf BUSY
incf SYM_COUNTER,f
movf PORTB,w
movwf ASSIGN_BUFFER ;Zapi6i PORTB
movf ASSIGN_BUFFER,w
BCF STATUS,6 ;
BSF STATUS,5 ;
movwf SYM3
bcf STATUS,5
goto ENDING



;=====================================
Check_Line
btfss STR ;otpusnata STR linija?
goto Check_Line ;Ne, proveri otnovo

Loop_here
btfsc STR ;Signal za priemane?
goto Loop_here ;Ne
return
;=====================================

ENDING bcf BUSY
return


Това е основната част от кода. В един момент от основната програма става обръщане към подпрограмата, разположена в стр. 1. Осъществява го <call STR_SIGNAL>. После връщането в стр.0 става от подпрограмата ENDING:

ENDING bcf BUSY
return

Междинното call->return е в "Check_Line", което е подпрограма, сверяваща условие за преминаване, свързано с промяна на нивото на "STROBE" на паралелния порт, през който правя комуникацията. Всичко работеше добре, но се наложи разширяване на програмата и забих в драките... Very Happy

Това е програма за изобразяване на SCROLL текст с главни и малки букви(кирилица и латиница), размер 8x12 или 16x24 точки и големина на текста до 160 символа, като въвеждането става по мой протокол през паралелния порт.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
Комбинатор
Опитен потребител
Опитен потребител


Регистриран на: 31 Окт 2007
Мнения: 310

МнениеПуснато на: Съб Фев 23, 2008 18:59    Заглавие: Отговорете с цитат

probwaj taka
org 0x005
btfsc BUSY ;USLOVIE "PRO4ETI?"
goto a1;
goto a2
a1
pagesel STR_SIGNAL;
call STR_SIGNAL ;DA, OTIDI ZA 4ETENE
goto continue
a2
clrf WORK_COUNTER ;#RESETVANE NA BROJA4A
continue goto FIND_ASCII
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
woodoman
Активен потребител
Активен потребител


Регистриран на: 03 Яну 2008
Мнения: 67

МнениеПуснато на: Нед Фев 24, 2008 22:55    Заглавие: Отговорете с цитат

Здравей. Извинявай за закъснението но нямах достап до нет. Когато имаш обращение към странища от програмната памет различна от нулевата посредством CALL и GOTO трябва да заредиш данните за банката в регистър PCLATH<3,4>. При връщането с RETURN не се изисква посочване на банка дори и ако връщането е в банка различна от нулевата.
В първия ти случай:

ORG H'0005'

Procedure1
BCF PCLATH,4
BSF PCLATH,3

goto Procedure 3
.....
Procedure2

ORG H'0800'
Procedure 3
goto Procedure 2

Прехода от процедура3 към процедура2 става без допълнителна настройка.

При втория ти случай:
ORG H'0005'

Procedure1 call Procedure 2
.....
Procedure2

ORG H'0800'

Procedure 2
BCF PCLATH,4
BSF PCLATH,3

goto Procedure3

Procedure 3 return

Т.е. ако имах преход с GOTO или обращение към подпрограма с CALL трябва да съобразиш каде се намира адреса на прехода или обращението. Ако той е в банка различна от 0 преди това се зарежда кода на банката в регистър PCLATH<3,4>.
Банка 1 - 01
Банка 2 - 10
Банка 3 - 11
_________________
Нека да си помагаме взаимно. Защото ако не си помогнем ние няма кой да ни помогне.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
woodoman
Активен потребител
Активен потребител


Регистриран на: 03 Яну 2008
Мнения: 67

МнениеПуснато на: Вто Фев 26, 2008 12:56    Заглавие: Отговорете с цитат

Хей приятел какво стана с програмата. До каде я докара. Very Happy
_________________
Нека да си помагаме взаимно. Защото ако не си помогнем ние няма кой да ни помогне.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
Комбинатор
Опитен потребител
Опитен потребител


Регистриран на: 31 Окт 2007
Мнения: 310

МнениеПуснато на: Вто Фев 26, 2008 19:08    Заглавие: Отговорете с цитат

Аз се мъча да уча борланд 6 билдер
точно интерфейсите USB , COM , LPT
ИИИ ММИИ Е много трудно , а той ако си е написал
програмата под win , се чудя кво мога да му помогна.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
emil74
Опитен потребител
Опитен потребител


Регистриран на: 16 Мар 2007
Мнения: 1106

МнениеПуснато на: Вто Фев 26, 2008 20:45    Заглавие: Отговорете с цитат

Извинявайте, че не отговорих веднага. Програмата тръгна, НО. Отнякъде изрових едни "стратегии" за промяна на страниците и използвах следното:

MOVLW B'00001000'
MOVWF PCLATH -за страница 1

clrf PCLATH -застраница 0

Единственото, което установих е, че имам проблем при използване на call->return между две страници и затова преструктурирах програмата, така че да използвам само goto. Има още по нещо за доизглаждане, но главното е, че работи. Разбрах и причината за проблема: Има толкова много call->return , че превъртам стека и програмата "забравя" адреса за връщане. В общи линии се лиших от сън две нощи, но стана.

Сега имам за задача да намаля обема на програмата. Един интересен проблем е следната ситуация: Имам една и съща проверка на много места. Искам да я направя като отделна продедура, която се извиква с call, но ако условието не е изпълнено, необходимо е да продължи с goto. Как да направя програмата да забрави, че е имало call и да продължи коректно с goto? Под "коректно" разбирам да не сбърка, доколкото има последващо обръщане с call.

Примерно:


call Verify
bsf BUSY
....

Verify btfss CONTROL,0
return
goto Next_procedure
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
Niakoi
Опитен потребител
Опитен потребител


Регистриран на: 20 Авг 2006
Мнения: 350
Местожителство: Каръктаун

МнениеПуснато на: Вто Фев 26, 2008 22:06    Заглавие: Отговорете с цитат

Например: като направиш проверката в отделната процедура, ако условието е изпълнено, връщаш се от процедурата с:
RETLW 1
а ако не е изпълнено:
RETLW 0
и като се върнеш, си проверяваш дали имаш "0" или "1" във W-регистъра.
Може да има и други начини, но не се сещам в момента.

И пак те съветвам: вместо да проявяваш висша форма на мазохизъм, да се лишаваш от сън, да имаш проблеми със страници, банки и тем-подобни гадости, смени тая 16-ка с 18-ка (18F452). После ще си говорим пак...
_________________
Жица, на която не виждам двата края, не я пипам!
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
woodoman
Активен потребител
Активен потребител


Регистриран на: 03 Яну 2008
Мнения: 67

МнениеПуснато на: Вто Фев 26, 2008 23:07    Заглавие: Отговорете с цитат

Вярно е че стека се препълвава, но това става не от много CALL в програмата а когато се използват един във друг т.е. използваш повече от 8 инструкции CALL без да използваш RETURN или RETLW. Това за проверката която искаш да направиш като подпрограма, ако е дълга има смисъл да я правиш ако е с една или две команди няма смисъл. Може да постъпеш както те е посъветвал Niakoi. Но неможе да използваш CALL и после да не ползваш RETURN или RETLW, така адреса за възврат остава в стека. Ако ти трябва конкретно решение прати целия код на проверката и ще видим какво ще измислим. Smile
_________________
Нека да си помагаме взаимно. Защото ако не си помогнем ние няма кой да ни помогне.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
Niakoi
Опитен потребител
Опитен потребител


Регистриран на: 20 Авг 2006
Мнения: 350
Местожителство: Каръктаун

МнениеПуснато на: Сря Фев 27, 2008 11:20    Заглавие: Отговорете с цитат

woodoman написа:
Но неможе да използваш CALL и после да не ползваш RETURN или RETLW, така адреса за възврат остава в стека.
Може, но на 18-та серия. Там указателя на стека е регистър (STKPTR), който можеш да си го четеш и записваш по твое усмотрение. В твоя случай, преди да излезеш от процедурата без RETURN, пишеш:

decf STKPTR

и готово.
_________________
Жица, на която не виждам двата края, не я пипам!
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
Потърси "Въпрос за банките памет на PIC16F877A" в магазин за електроника Pulsator.bg : БЕЗПЛАТНА ДОСТАВКА над 90 лв.

Покажи мнения от преди:   
Потърси "Въпрос за банките памет на PIC16F877A" в Интернет



Създайте нова тема   Напишете отговор    Форум за електроника Форуми -> Общи приказки - Just talking Часовете са според зоната GMT + 2 Часа
Иди на страница Предишна  1, 2, 3, 4, 5  Следваща
Страница 3 от 5

 
Към:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети