Acesso Indireto à Memória Registro FSR

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Acesso Indireto à Memória Registro FSR

Mensagempor MOR_AL » 16 Out 2012 16:54

Olá pessoal!
Estou fazendo um firmware, onde ocorreu um caso interessante.
Tem uma rotina que usa o registro FSR, que especifica o endereço do byte na RAM. Como sabemos, este registro é usado para acessarmos a RAM em modo indireto.
Até aí tudo bem.
Ocorre que dentro dessa rotina, estou chamando outra rotina que usa outra vez o tal registro FSR.
Para que não ocorra confusão com os valores acessados, devo salvar o valor do endereço (que se encontra no registro FSR) antes de entrar na segunda rotina. Quando sair da segunda rotina poderei recuperar o endereço anteriormente salvo, que estava sendo usado na primeira rotina.

Aí veio a dúvida!!!!

Posso ler diretamente o endereço que se encontra no registro FSR, ou só mesmo fazendo de modo indireto?

O manual não informa, explicitamente, se isso é possível ou não.
O máximo que encontrei foi uma instrução BTFSS FSR,4.
Essa instrução lê o bit 5 do registro FSR.
Alguém já teve que ler o tal registro? É possível fazê-lo diretamente como MOVF FSR,W?

[]'s
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: Acesso Indireto à Memória Registro FSR

Mensagempor EvandrPic » 16 Out 2012 20:13

MOR_AL, não sei se entendi bem tua dúvida mas é possível ler FSR sim...
Vou colocar uma "rotina de inicialização da RAM" do livro Conectando o PIC, talvez ajude.
Código: Selecionar todos
     ; Esta rotina limpa a RAM do Banco 0, indo de 0X20 a 0X7F

     MOVLW   0X20           ; Aponta o endereçamento indireto para
     MOVWF   FSR            ; a primeira posição da RAM

LIMPA_RAM
     CLRF    INDF           ; Limpa a posição
     INCF    FSR,F          ; Incrementa o ponteiro para a próxima posição
     MOVF    FSR,W          ; Salva o conteúdo de FSR em W
     XORLW   0X80           ; Compara o ponteiro com a última posição +1
     BTFSS   STATUS,Z       ; Já limpou todas as posições?
     GOTO    LIMPA_RAM      ; Não. Volta e limpa a próxima posição



MOR_AL escreveu:Olá pessoal!
Estou fazendo um firmware, onde ocorreu um caso interessante.
Tem uma rotina que usa o registro FSR, que especifica o endereço do byte na RAM. Como sabemos, este registro é usado para acessarmos a RAM em modo indireto.
Até aí tudo bem.
Ocorre que dentro dessa rotina, estou chamando outra rotina que usa outra vez o tal registro FSR.
Para que não ocorra confusão com os valores acessados, devo salvar o valor do endereço (que se encontra no registro FSR) antes de entrar na segunda rotina. Quando sair da segunda rotina poderei recuperar o endereço anteriormente salvo, que estava sendo usado na primeira rotina.

Aí veio a dúvida!!!!

Posso ler diretamente o endereço que se encontra no registro FSR, ou só mesmo fazendo de modo indireto?

O manual não informa, explicitamente, se isso é possível ou não.
O máximo que encontrei foi uma instrução BTFSS FSR,4.
Essa instrução lê o bit 5 do registro FSR.
Alguém já teve que ler o tal registro? É possível fazê-lo diretamente como MOVF FSR,W?

[]'s
MOR_AL
Editado pela última vez por EvandrPic em 16 Out 2012 20:34, em um total de 2 vezes.
EvandrPic
Dword
 
Mensagens: 2116
Registrado em: 31 Mar 2010 15:05

Mensagempor vtrx » 16 Out 2012 20:19

Pelo que sei,o FSR é um 'pointer' do endereço do registro,mas o registro em sí fica no INDF.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor EvandrPic » 16 Out 2012 20:32

Exatamente vtrx... conforme exemplo que citei no post anterior:
"Apaga-se o registro (INDF), incrementa o apontador (FSR) e verifica se é a última posição da RAM."

Mas é possível lê-lo ( o FSR ) como qualquer registrador...

MOR_AL escreveu:Aí veio a dúvida!!!!

Posso ler diretamente o endereço que se encontra no registro FSR, ou só mesmo fazendo de modo indireto?
...
Alguém já teve que ler o tal registro? É possível fazê-lo diretamente como MOVF FSR,W?
MOR_AL



vtrx escreveu:Pelo que sei,o FSR é um 'pointer' do endereço do registro,mas o registro em sí fica no INDF.
EvandrPic
Dword
 
Mensagens: 2116
Registrado em: 31 Mar 2010 15:05

Mensagempor andre_luis » 17 Out 2012 07:41

MOR_AL,


Se estiver programando em C, se possível, procura por alguma API do compilador que faça o acesso direto ao SFR, caso exista.



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor MOR_AL » 17 Out 2012 10:13

Acho o seguinte:
1 - Deve ser possível ler o conteúdo do registro FSR porque ele está presente nos 4 bancos do mapa de memória dos registradores SFR e GPR.
2 - Deve ser possível ler o registro FSR, porque a instrução que se encontra em um exemplo do manual é BTFSS FSR,4 e ela lê um bit desse registro.
3 - EvandrPic. Sua rotina incrementa o registro, o que fornece mais uma dica, mas ela não está lendo e recuperando diretamente o valor. Talvez para escrever, primeiramente o registro é lido. Neste caso seria uma dica, mas não explícita.
Parece que terei que fazer um exemplo com a instrução MOVF FSR,W e ver se funciona.

Por outro lado ...

1 - O livro do Fábio, "Microcontroladores PIC Técnicas Avançadas", página 103. Na definição de FSR e INDF. Parece que estão trocados.
2 - Livro idem. Página 268. Definição correta, mas não há indicação formal que o registro pode ser lido, apenas alterado.
3 - Manual do PIC16F628(A). Mostra um exemplo com o registro podendo ser alterado e lido um bit dele, mas não encontrei uma lida direta dele.


VTRX.
Parece que SFR é um pointer, mas também é um registro e como tal deve ser permitido lê-lo e escrever nele. O registro INDF não está presente no mapa de registros do banco.

André.
Infelizmente comecei a aprender programação com a linguagem Fortran, que se parece muito com a BASIC. Depois veio o Matlab, que também se parece com a linguagem BASIC. Por esse motivo me mantive nela. Até estudei C, mas acho a BASIC mais fácil. Então não tenho condições de seguir sua sugestão, mas valeu pela dica.

Bom, pessoal.
Vou fazer um programinha simples para testar e aí eu posto aqui. Não queria fazer isso, mas vai esclarecer minha dúvida de uma vez.
Grato a todos.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor MOR_AL » 17 Out 2012 13:41

Fiz um programinha em assembler e testei no MPLAB/MPASM.
Funcionou na simulação.
Basicamente:
1 - Escrevi, via acesso indireto, 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9 na memória rasc com 10 posições.
2 - Neste ponto, o registro FSR apontava para rasc+9 .
3 - Salvei o conteúdo de FSR em FSRrasc. LI FSR e escrevi em FSRrasc.
4 - Alterei o conteúdo de FSR para rasc.
5 - Li o valor do registro FSRrasc e escrevi em FSR.
6 - Lí os valores dos registros rasc (desde o índice 9 até o índice 0). Sempre comparando com o valor esperado.
7 - Caso estivessem corretas as comparações, o bit "certo" era setado. Caso estivesse alguma comparação errada, o bit "erro" era setado.
8 - Simulei no MPASM e o bit certo foi setado.
Isso indica que o registro FSR foi lido corretamente no ítem 3.

Seguem os arquivos do teste. O JPG contém o fluxograma.
Imagem
http://d01.megashares.com/dl/JZNwydR/__FSR_Teste.rar

Valeu pessoal.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor EvandrPic » 17 Out 2012 15:19

MOR_AL, você leu a rotina que coloquei?
Isso funciona... está lá...
Código: Selecionar todos
MOVF    FSR,W          ; Salva o conteúdo de FSR em W

Você pode salvar um valor qualquer em FSR:
Código: Selecionar todos
MOVWF   FSR            ; salva o conteúdo de W em FSR

Você pode incrementar esse registrador:
Código: Selecionar todos
INCF    FSR,F          ; Incrementa o ponteiro para a próxima posição

Pode comparar, lê bit, etc...
Enfim, pode fazer qualquer operação... como qualquer registrador.


MOR_AL escreveu:Parece que terei que fazer um exemplo com a instrução MOVF FSR,W e ver se funciona.
MOR_AL
EvandrPic
Dword
 
Mensagens: 2116
Registrado em: 31 Mar 2010 15:05

Mensagempor MOR_AL » 17 Out 2012 17:09

EvandrPic escreveu:MOR_AL, você leu a rotina que coloquei?
Isso funciona... está lá...
Código: Selecionar todos
MOVF    FSR,W          ; Salva o conteúdo de FSR em W

...
Enfim, pode fazer qualquer operação... como qualquer registrador.
...


É. Eu ví a primeira e a segunda instrução referenciando o FSR e concluí que não havia mais instrução lendo o FSR.
Mas agora que você enfatizou eu percebi....
Nem precisava ter feito o programinha, mas de qualquer jeito tá aí!!
Valeu pela dica. Eu tenho que ficar mais esperto, hehehe!!!
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor EvandrPic » 17 Out 2012 17:11

ok.... :lol:

MOR_AL escreveu:
EvandrPic escreveu:MOR_AL, você leu a rotina que coloquei?
Isso funciona... está lá...
Código: Selecionar todos
MOVF    FSR,W          ; Salva o conteúdo de FSR em W

...
Enfim, pode fazer qualquer operação... como qualquer registrador.
...


É. Eu ví a primeira e a segunda instrução referenciando o FSR e concluí que não havia mais instrução lendo o FSR.
Mas agora que você enfatizou eu percebi....
Nem precisava ter feito o programinha, mas de qualquer jeito tá aí!!
Valeu pela dica. Eu tenho que ficar mais esperto, hehehe!!!
MOR_AL
EvandrPic
Dword
 
Mensagens: 2116
Registrado em: 31 Mar 2010 15:05


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x