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

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

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


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

МнениеПуснато на: Чет Фев 21, 2008 16:43    Заглавие: Отговорете с цитат

Продължавам да имам проблем, но мисля, че сега става дума за нещо друго: Ако прехвърлям съдържанието на регстър от една банка, в това на друга, къде трябва да стане смяната на банките?

Пример: SYM_BUFFER е в банка 0 (CBLOCK 0x20),
a SYM1 е в банка 1 (CBLOCK 0xA0) и сорсът е:


movf SYM1,w
movwf SYM_BUFFER
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
woodoman
Активен потребител
Активен потребител


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

МнениеПуснато на: Чет Фев 21, 2008 18:19    Заглавие: Отговорете с цитат

Здравей. Първо иниализираш банка1 местиш съдържанието от регистъра от банка1 в работния. После инициализираш банка0 и прехвърляш работния в съответния регистър.
BSF STATUS,5
BCF STATUS,6

movf SYM1,w
BCF STATUS,5
movwf SYM_BUFFER
Ако преди тези команди е била инициализирана банка1 STATUS<5>=1 STATUS<6>=0 може да пропуснеш първите два реда.
_________________
Нека да си помагаме взаимно. Защото ако не си помогнем ние няма кой да ни помогне.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
emil74
Опитен потребител
Опитен потребител


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

МнениеПуснато на: Чет Фев 21, 2008 20:36    Заглавие: Отговорете с цитат

woodoman, благодаря ти много! Така тръгна. Сега ми стана ясно какъв е проблемът. Всъщност, при всяко обръщане към променлива трябва да се съобразявам в коя банка работя. Направих прехвърлянията и програмата тръгна! Скоро ще ми се наложи да питам за прехвърлянето и на страниците от програмната памет, защото и там ми е малко неясна ситуацията. А програмата е вече почти на границата на първата страница.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
emil74
Опитен потребител
Опитен потребител


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

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

Ето какво ме интересува и за страниците на програмната памет. Има два случая, които ме интересуват. Едната част на програмата е разположена в страница 0, а другата в страница 1. Къде и как става обръщането към съответните подпрограми:

ORG H'0005'

Procedure1 goto Procedure 3
.....
Procedure2

ORG H'0800'
Procedure 3 goto Procedure 2

Това е първият случай. При него Procedure1(това е етикет) от страница 0 се обръща към Procedure 3 от страница 1, която пък връща към Procedure 2, отново от страница 0

И втори случай:

ORG H'0005'

Procedure1 call Procedure 2
.....
Procedure2

ORG H'0800'

Procedure 2 goto Procedure3

Procedure 3 return


Във втория случай има обръщане от стр.0 към подпрограма от стр.1, друго обръщане в рамките на същата страница и връщане към стр.0 с return.
Намерих сто начина за смяна, но нито един не тръгва както трябва.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
Комбинатор
Опитен потребител
Опитен потребител


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

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

ORG H'0005'
pagesel Procedure 3
Procedure1 goto Procedure 3
.....
Procedure2

ORG H'0800'
pagesel Procedure 2
Procedure 3 goto Procedure 2

Това е първият случай. При него Procedure1(това е етикет) от страница 0 се обръща към Procedure 3 от страница 1, която пък връща към Procedure 2, отново от страница 0

И втори случай:

ORG H'0005'
pagesel Procedure 2
Procedure1 call Procedure 2
.....
Procedure2

ORG H'0800'
pagesel Procedure 3
Procedure 2 goto Procedure3

Procedure 3 return

Тъй като CALL е команда която зарежда своя адрес PUSH
В стека ( LIFO) адреса си е пълен независимо в коя банка си и каде си го заврял.
С return тои излиза POP точно на &(PC(call)+1);

при банките е същото само че исползваш banksel


banksel TRISB ;Избираш TRISB Bank (1)
clrf TRISB ;чистиш PortB като изходи
banksel INTCON ;Избираш INTCON Bank (0)
bsf INTCON, GIE ;Разрешаваш Global Int's
bsf INTCON, T0IE ;разрешаваш Timer0 Int
Има и по елегантни начини но си ги чети сам.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
emil74
Опитен потребител
Опитен потребител


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

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

Ако под "елегантни" имаш предвид начина с макросите или директното обръщане към страниците с настройка на PCLATH, това не ми успява. Или не схващам тези идеи, или има нещо, което навсякъде премълчават, а аз не го прочитам между редовете.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
Комбинатор
Опитен потребител
Опитен потребител


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

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

Значи по трудно е и се исползва за по други случай.
Ако работиш с MPLAB има описани нещата в help-а.
Когато стигнеш до толкова големи масиви от данни,
че да не можеш да ги побираш в една програмна страница.
Тогава има описание как става.
Но аз от много време пиша на С и много от нещата сам позабравил.
Минавай на език от по горно ниво, защото е много трудно да се следи всичко.
Код:

#include "C:\AtTiny26\Example\main.h"
char bite=0x00;
#bit   bita1=bite.0
long int  temp;
int tmp1=0x07,tmp2=0xD0;

void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_wdt(WDT_36MS);
bita1=1;
   // TODO: USER CODE!!
   temp=tmp1<<8;
   temp=temp|tmp2;   
while(1){
if(!input(PIN_B0)&& bita1){
 bita1=0;
 delay_ms(temp);
       output_high(PIN_B5);
       output_low(PIN_B4);
       restart_wdt();             
}
else if(input(PIN_B0)){
       bita1=1;
      output_high(PIN_B4);
      output_low(PIN_B5);
      restart_wdt();
};
 restart_wdt();
   // TODO: USER CODE!!
};
}


това например се пише за 10 минути.
Ето ти примерно как звучи на асемблер.
Код:

PIC C COMPILER               22-Ôåâðóàðè-08 19:07                       Page 1

Line   PC    Opcode
0001   00000  0025  MOVWF  05
0002   00001  0A18  GOTO   018
0003   00002  0A03  GOTO   003
0004             .................... #include "C:\AtTiny26\Example\main.h"
0005             .................... #include <12C509.h>
0006             .................... //////// Standard Header file for the PIC12C509 device ////////////////
0007             .................... #device PIC12C509
0105             .................... #list
0106             .................... 
0107             .................... 
0108             .................... #FUSES WDT                      //Watch Dog Timer
0109             .................... #FUSES INTRC                    //Internal RC Osc
0110             .................... #FUSES NOPROTECT                //Code not protected from reading
0111             .................... #FUSES NOMCLR                   //Master Clear pin used for I/O
0112             .................... 
0113             .................... #use delay(clock=4000000,RESTART_WDT)
0114   00003  0213  MOVF   13,W
0115   00004  0643  BTFSC  03.2
0116   00005  0A17  GOTO   017
0117   00006  0C01  MOVLW  01
0118   00007  0028  MOVWF  08
0119   00008  0CBF  MOVLW  BF
0120   00009  0027  MOVWF  07
0121   0000A  0004  CLRWDT
0122   0000B  02E7  DECFSZ 07,F
0123   0000C  0A0A  GOTO   00A
0124   0000D  02E8  DECFSZ 08,F
0125   0000E  0A08  GOTO   008
0126   0000F  0C4A  MOVLW  4A
0127   00010  0027  MOVWF  07
0128   00011  02E7  DECFSZ 07,F
0129   00012  0A11  GOTO   011
0130   00013  0000  NOP
0131   00014  0004  CLRWDT
0132   00015  02F3  DECFSZ 13,F
0133   00016  0A06  GOTO   006
0134   00017  0800  RETLW  00
0135             .................... 
0136             .................... 
0137             .................... char bite=0x00;
0138   00019  006C  CLRF   0C
0139             .................... #bit   bita1=bite.0
0140             .................... long int  temp;
0141             .................... int tmp1=0x07,tmp2=0xD0;
0142   0001A  0C07  MOVLW  07
0143   0001B  002F  MOVWF  0F
0144   0001C  0CD0  MOVLW  D0
0145   0001D  0030  MOVWF  10
0146             .................... 
0147             .................... void main()
0148             .................... {
0149   00018  0064  CLRF   04
0150             .................... 
0151             ....................    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_wdt(WDT_36MS);
0152   00020  0C08  MOVLW  08
0153   00021  0002  OPTION
0154   00022  0C09  MOVLW  09
0155   00023  0027  MOVWF  07
0156   00024  0C07  MOVLW  07
0157   00025  0061  CLRF   01
0158   00026  0C0F  MOVLW  0F
0159   00027  0002  OPTION
0160   00028  0004  CLRWDT
0161   00029  0207  MOVF   07,W
0162   0002A  0002  OPTION
0163             .................... bita1=1;
0164   0002B  050C  BSF    0C.0
0165             ....................    // TODO: USER CODE!!
0166             ....................    temp=tmp1<<8; 
0167   0002C  020F  MOVF   0F,W
0168   0002D  002E  MOVWF  0E
0169   0002E  006D  CLRF   0D
0170             ....................    temp=temp|tmp2;   
0171   0002F  0210  MOVF   10,W
0172   00030  012D  IORWF  0D,F
0173             .................... while(1){
0174             .................... if(!input(PIN_B0)&& bita1){
0175   00031  0511  BSF    11.0
0176   00032  0211  MOVF   11,W
0177   00033  0006  TRIS   6
0178   00034  0606  BTFSC  06.0
0179   00035  0A50  GOTO   050
0180   00036  070C  BTFSS  0C.0
0181   00037  0A50  GOTO   050
0182             ....................  bita1=0;
0183   00038  040C  BCF    0C.0
0184             ....................  delay_ms(temp);
0185   00039  020E  MOVF   0E,W
0186   0003A  0032  MOVWF  12
0187   0003B  02B2  INCF   12,F
0188   0003C  00F2  DECF   12,F
0189   0003D  0643  BTFSC  03.2
0190   0003E  0A43  GOTO   043
0191   0003F  0CFF  MOVLW  FF
0192   00040  0033  MOVWF  13
0193   00041  0903  CALL   003
0194   00042  0A3C  GOTO   03C
0195   00043  020D  MOVF   0D,W
0196   00044  0033  MOVWF  13
0197   00045  0903  CALL   003
0198             ....................        output_high(PIN_B5);
0199   00046  04B1  BCF    11.5
0200   00047  0211  MOVF   11,W
0201   00048  0006  TRIS   6
0202   00049  05A6  BSF    06.5
0203             ....................        output_low(PIN_B4);
0204   0004A  0491  BCF    11.4
0205   0004B  0211  MOVF   11,W
0206   0004C  0006  TRIS   6
0207   0004D  0486  BCF    06.4
0208             ....................        restart_wdt();             
0209   0004E  0004  CLRWDT
0210             .................... }
0211             .................... else if(input(PIN_B0)){
0212   0004F  0A5F  GOTO   05F
0213   00050  0511  BSF    11.0
0214   00051  0211  MOVF   11,W
0215   00052  0006  TRIS   6
0216   00053  0706  BTFSS  06.0
0217   00054  0A5F  GOTO   05F
0218             ....................        bita1=1;
0219   00055  050C  BSF    0C.0
0220             ....................       output_high(PIN_B4);
0221   00056  0491  BCF    11.4
0222   00057  0211  MOVF   11,W
0223   00058  0006  TRIS   6
0224   00059  0586  BSF    06.4
0225             ....................       output_low(PIN_B5);
0226   0005A  04B1  BCF    11.5
0227   0005B  0211  MOVF   11,W
0228   0005C  0006  TRIS   6
0229   0005D  04A6  BCF    06.5
0230             ....................       restart_wdt(); 
0231   0005E  0004  CLRWDT
0232             .................... };
0233             ....................  restart_wdt(); 
0234   0005F  0004  CLRWDT
0235             ....................    // TODO: USER CODE!!
0236             .................... };
0237   00060  0A31  GOTO   031
0238             .................... }
0239   00061  0003  SLEEP

Configuration Fuses:
   Word  1: 0FEE   INTRC WDT NOPROTECT NOMCLR
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Комбинатор
Опитен потребител
Опитен потребител


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

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

А това за макросите.
погледни как се прави с макрос с аргументи.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
emil74
Опитен потребител
Опитен потребител


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

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

Отново нещо не стана. Има една "подробност" която съм изпуснал.

org h'0005'

Procedure1 call Procedure2

.....

org h'0800'

Procedure2 call Procedure3
.....
return

Procedure3 .....
goto Procedure5

Procedure5 .....
return



При това пложение има обръщане от стр.0 към стр.1 с call. После в рамките на стр.1 има още едно обръщане с call и едно с goto. След връщането от второто call, става и връщане в стр.0. Алгоритъмът работи докато всичко е в рамките на стр.0. Но след като организирам стр.1 и настава хаос.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
Комбинатор
Опитен потребител
Опитен потребител


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

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

Отново нещо не стана. Има една "подробност" която съм изпуснал.

org h'0005'

Procedure1 call Procedure2 ; стека има адреса 1 ред-Процед1 h'0005'

.....

org h'0800'

Procedure2 call Procedure3 : новия адрес на стека е 1 ред-процед2,,,,ред-2 процед1
.....
return ; връщаш се в процед2 1ред =процед1 h'0800'

Procedure3 ..... ; goto Procedure5 ;
Procedure5 ..... ; return ;ретурна връща адреса 1ред=процед1 и с в банката на h'00005'



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

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



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

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