LusoRobótica - Robótica em Português

Sistemas específicos => PIC => Tópico iniciado por: iyahdub em 01 de Agosto de 2012, 10:31

Título: ASM SFR STATUS (Funcionamento do RP0 e RP1)
Enviado por: iyahdub em 01 de Agosto de 2012, 10:31
Ver se consigo explicar-me.
Estou a tentar compreender completamente, como usar o Enderecamento directo , e a diferenca, ja agora, do indirecto...
Acrescentei estas intrucoes ao codigo original exemplo (Mais para usar em conjunto com o debugger e tentar compreender e "documentar" o funcionamento do chip em relacao ao programa.

Alguem me pode explicar por exemplo, se eu quiser acender os 5 ledds , por exemplo ... Como usaria o RP0, Como parte do STATUS em relacao ao codigo ?!
Porque ainda nao consegui perceber muito bem esta funcao do register !
O Sena usa um codigo que me fez pensar e realizar que afinal nao tinha percebido bem este detalhe ainda( e muitos outros, mas um de cada vez lol)

Ja digeri o funcionamento dos SFR's PCL e PCLATCH ( que nos da o tal total teorico de 8192 divididos pelos 13 bits, sendo os 8 LSB no PCL ...,ais ou menos lol). Portanto nem tudo esta mal !





Código: [Seleccione]
#include <p16F887.inc>
__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

     org 0
Start:
     bsf     STATUS,RP0  ; escolher Register 1
     bcf     TRISD,0     ;  Pin RD0 Como Output
     bcf     STATUS,RP0  ; Clear Register Bank 0
     bsf     PORTD,0     ; activar LED RD0 (DS0)
     bcf PORTD,0
     bcf     STATUS,RP0
     bsf     STATUS,RP0  ; escolher Register 1
     bcf     TRISD,1     ;  Pin RD1 Como Output
     bcf     STATUS,RP0  ; back to Register Bank 0
     bsf     PORTD,1     ; activar LED RD1 (DS1)
     bcf PORTD,1
     bcf     STATUS,RP0
     bsf     STATUS,RP0  ; escolher Register 1
     bcf     TRISD,2    ;  Pin RD2 Como Output
     bcf     STATUS,RP0  ; back to Register Bank 0
     bsf     PORTD,2     ; activar LED RD2 (DS2)
     bcf PORTD,2
     bcf     STATUS,RP0
     bsf     STATUS,RP0  ; escolher Register 1
     bcf     TRISD,3    ;  Pin RD3 Como Output
     bcf     STATUS,RP0  ; back to Register Bank 0
     bsf     PORTD,3     ; activar LEDRD3 (DS3)
     bcf PORTD,3
     bcf     STATUS,RP0
     bsf     STATUS,RP0  ; escolher Register 1
     bcf     TRISD,4    ;  Pin RD4 Como Output
     bcf     STATUS,RP0  ; back to Register Bank 0
     bsf     PORTD,4     ; activar LED RD4 (DS4)
     bcf PORTD,4
     bcf     STATUS,RP0
     goto    Start      ; wait here
     end
     

PS- Acho que estou a comecar a perceber...Acho !!
Título: Re: ASM SFR STATUS (Funcionamento do RP0 e RP1)
Enviado por: maurosmartins em 01 de Agosto de 2012, 13:14
Olá iyahdub,

se bem que tenha achado a tua pergunta um tanto ao quanto confusa vou ver se clarifico...

Se consultares o datasheet do PIC em questão vais ver que a memória RAM do mesmo está dividida em quatro bancos.

Os bits RP0 e RP1 do registo STATUS permitem-te alternar entre os quatro escolhendo a combinação certa, por exemplo para ires para o banco 1 tens de meter os bits (RP1:RP0) = 01 o que implica Bank 1 (80h-FFh)

é o que tens no código, basicamente eu só faria uma coisa para optimizar....

em vez de estares constantemente a mudar para o banco 1 e dps regressar ao 0, eu mudaria para o 1 faria todas as operações possiveis de fazer na altura (neste caso mudar todos os TRIS) e dps disso é que regressaria ao banco0.

@sena, se quiseres dizer mais alguma coisa ou explicar melhor.....

Cumps, Mauro.
Título: Re: ASM SFR STATUS (Funcionamento do RP0 e RP1)
Enviado por: iyahdub em 01 de Agosto de 2012, 15:10
Consegues explicar iisso em codigo?! Se puderes agradecia...
Estou a usar MPASM...
Eu sei que e confuso , porque nao percebo bem como e que entao e distribuida, nem como...
Ou como usar correctamente. Dai estar a tentar perceber
Obrigada por o interesseem ajudar !
Título: Re: ASM SFR STATUS (Funcionamento do RP0 e RP1)
Enviado por: maurosmartins em 01 de Agosto de 2012, 15:46
Olá novamente,

então para inicializar o porto D todo como saída e dps escrever-lhe qq coisa poderia escrever o seguinte código.

Código: [Seleccione]
#include <p16F887.inc>
__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

org 0x00

Start:

     bsf     STATUS,RP0  ; escolher Register 1

     MOVLW 0x00          ;carregar o registo W com 0

     MOVWF TRISD         ;inicializar o registo TRISD com 0 (atraves de W)

     bcf     STATUS,RP0  ; Voltar ao Bank 0

     MOVLW b'10101010'   ;Padrao com que quero acender os LEDs (um sim um nao)

     MOVWF PORTD        ;escrever para o porto D

     GOTO $              ; Salta para a mesma instrução (ciclo infinito)

     end                ;fim

Espero que ajude, qq duvida é só dizer

Mauro.
Título: Re: ASM SFR STATUS (Funcionamento do RP0 e RP1)
Enviado por: Sérgio_Sena em 02 de Agosto de 2012, 09:45
iyahdub,

o endereçamento directo/indirecto até bastante simples, depois de entenderes o princípio da coisa. Lê bem o capítulo no meu manual sobre isso, a meu ver está lá devidamente explicado. Se não chegar, eu respondo ao resto aqui. O datasheet do micro também é jeitoso.

Como estás a programar em Assembly, é natural que tenhamos de nos preocupar com o endereçamento. Faz parte do processo.
Como, infelizmente, a memória RAM destes PIC de gama baixa está toda particionada, temos que andar a saltar de banco-em-banco para conseguir usar os registos. (um dos pontos a favor do AVR)

No endereçamento podes usar o switch dos bancos, através do RP0-RP1-Status e trabalhar com o PCL-PCLATH, e no indirecto com o IRP e FSR-INDF.
São formas diferentes de o fazer, e o seu uso depende mesmo da tua aplicação.
Se queres trabalhar com um registo apenas, então RP0-RP1-Status. Se queres trabalhar com arrays na memória, então FSR-INDF é o caminho a seguir.


O MPLAB tem várias macros internas para ajudar nos trabalhos. Uma delas é o BANKSEL, que te ajuda a mudar de bancos quando necessário.
Basta apenas fazer BANKSEL TRISA, para mudar "automaticamente" para o banco onde está o TRISA.

Não precisas de mudar de banco de cada vez que usas um registo. É claro que podes, mas não há essa necessidade.
Podes ver onde estão os registos e se o seguinte com que vais trabalhar está no mesmo banco que o anterior, então poupas passos e memória.

Para ver as macros disponiveis no MPLAB, ver o HELP file do mesmo.
Título: Re: ASM SFR STATUS (Funcionamento do RP0 e RP1)
Enviado por: iyahdub em 02 de Agosto de 2012, 23:17
HHH, agora comeca a fazer sentido .
Desde entao estive a ler com muita calma e estudar outros codigos e era mais ou menos nessa direccao que me estava achar !
Nao consegui formular a pergunta muito bem porque ainda nao sabia o que perguntar
Obrigado !
PS-Sena,  O teu codigo do exemplo ajudou bastante ja que tem mais uns passos que ajudam a perceber melhor.

@Mauro - Obrigado, agradeco ajuda !!
Título: Re: ASM SFR STATUS (Funcionamento do RP0 e RP1)
Enviado por: iyahdub em 02 de Agosto de 2012, 23:47
Ah, Sena - assim e muito mais facil, ja que o BANKSEL faz tudo pro pessoal... Incluindo o STATUS !

Depois de ler a explicacao

Código: [Seleccione]
#include <p16F887.inc>
__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

     org 0
Start:
     

  banksel TRISD           ;Pelos vistos comeca no banco 1 ,
                                  ;e nao o 0: Isto para assegurar   
                                  ;nunca cruzar dados (pelo que percebo)...
  clrf        TRISD           ;Limpa TRISD.  PORTD como saida.
  banksel  PORTD          ;banksel usa agora o banco 0,
                                  ;aonde a PORTD esta.
  movlw    0x55            ;Valor para PORTD .
  movwf   PORTD
  clrf        PORTD
  goto      Start
  end                           ; end.


 
Título: Re: ASM SFR STATUS (Funcionamento do RP0 e RP1)
Enviado por: Sérgio_Sena em 02 de Agosto de 2012, 23:49
boa! ;D
Título: Re: ASM SFR STATUS (Funcionamento do RP0 e RP1)
Enviado por: iyahdub em 02 de Agosto de 2012, 23:53
E engracado ou nao, consegui agora perceber plenamente o Status !!
E o mesmo que o Banksel faz por tras por nos: {rimeiro manda para o banco um, e a seguir temos que chamar de novo para o 0, de forma a podermos inserir o novo bloco de instrucoes...
Dai o Sena dizer que isso e coisa que os ATMEL fazem de diferente.


Esta cena de ter o debugger disponivel da um jeito incrivel para perceber isto como deve de ser...



Obrigada !
Mais duvidas em breve...lol
Título: Re: ASM SFR STATUS (Funcionamento do RP0 e RP1)
Enviado por: Sérgio_Sena em 03 de Agosto de 2012, 01:15
Podes ver todo esse processo apenas som o SIMULATOR do MPLAB.
O Debbuger também funciona,mas estás a ver os registos internos do micro em "tempo-real".
Título: Re: ASM SFR STATUS (Funcionamento do RP0 e RP1)
Enviado por: iyahdub em 03 de Agosto de 2012, 01:24
Sim eu sei , Sena... Mas nao sei porque , ele costuma aprvalhar comigo, enquanto o PickIt2 nunca aparvalha... O MPLAB SIM tem ajudado em varios codigos, mas parece ter muito mais do que eu vejo...
O Debugger pelo PickIt e mais porque um homem ve os leds acender, etc, devagarinho ( porque a tempo real um homem nem ve essas quebras off dos leds).
Coisa que o SIM nao faz, correcto ?

E Mauro, o teu codigo ajudou tb... fixe ter-vos a explicarem -me, pq sozinho nao ia la tao depressa !

PS- Foi engracado teres mencionado o endereco do Bank 1 (80h-FFh), porque vi um exemplo que usa o endereco direco, atraves de uma definicao pelo menos ? Tipo STATUS equ 80h , ou parecido !!
Devagar hei-de la chegar !! lol