Ir ao conteúdo
  • Cadastre-se
test man*~

Assembly Program Counter, PCLATH, 877A, Stack, Interrupção

Recommended Posts

Pessoal estou com uma dúvida, o MPLAB (Template) e o datasheet sugerem o salvamento (quando uma interrupção ocorre) e a recuperação (antes do retorno) do PCLATH...
 
;------------------------------ Datasheet ------------------------------; MOVWF W_TEMP         ; Copy W to TEMP registerSWAPF STATUS,W       ; Swap status to be saved into W CLRF  STATUS         ; bank 0, regardless of current bank, Clears IRP,RP1,RP0MOVWF STATUS_TEMP    ; Save status to bank zero STATUS_TEMP registerMOVF  PCLATH, W      ; Only required if using pages 1, 2 and/or 3  <<<------------<<<------------MOVWF PCLATH_TEMP    ; Save PCLATH into W                          <<<------------<<<------------CLRF  PCLATH         ; Page zero, regardless of current page::(ISR)               ; (Insert user code here):MOVF  PCLATH_TEMP, W ; Restore PCLATH      <<<------------<<<------------MOVWF PCLATH         ; Move W into PCLATH  <<<------------<<<------------SWAPF STATUS_TEMP,W  ; Swap STATUS_TEMP register into W                     ; (sets bank to original state)MOVWF STATUS         ; Move W into STATUS registerSWAPF W_TEMP,F       ; Swap W_TEMPSWAPF W_TEMP,W       ; Swap W_TEMP into W

Quando uma interrupção ocorre o endereço completo do Program Counter (PC+1 > 13 bits) é salvo na pilha (Stack)... Então por que salvar o conteúdo do PCLATH?

Mesmo que eu altere a página de memória dentro da ISR eu não estarei alterando o endereço salvo na pilha, por isso eu não entendo a necessidade de salvar o PCLATH...

Dando uma lida eu percebi que mesmo eu escrevendo no PCLATH o PCH (Program Counter Bits mais significativos) só é atualizado quando a função GOTO ou CALL é executada e aparentemente RETFIE ignora o PCLATH (usa apenas o que está na pilha)... Whaa? 
 
Por que salvar o conteúdo do PCLATH?
 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Não sei se é isso mas após quebrar a cabeça pensei em um possível porquê...

Vamos supor que em um ponto do programa o usuário vai fazer uma chamada:



pagesel  rotina  ; Ajusta os 2 bits (4:3) do PCLATH
call     rotina  ; Vai para o endereço da rotina > 11 bits (10:0) do endereço 
                 ; vem do OPCODE e dois (12:11) do PCLATH (4:3) 


 

Porém se uma interrupção ocorre após o pagesel



pagesel  rotina  ; Ajusta os 2 bits (4:3) do PCLATH
 
;**INTERRUPÇÃO** <<--------<<-------
 
call     rotina  ; Vai para o endereço da rotina > 11 bits (10:0) do endereço 
                 ; vem do OPCODE e dois (12:11) do PCLATH (4:3) 


 

com ela contendo uma instrução para alterar os 2 bits (4:3) do PCLATH, quando o programa retornar (RETFIE) e for executar a instrução CALL o programa irá pular para um endereço errado (em outra página de memória)...

 

Acho que é por isso que o datasheet sugere salvar e recuperar o PCLATH...

 

Uma coisa interessante foi que, ao procurar o motivo pela internet, encontrei várias pessoas criticando a aquitetura dos PICs de 8 bits e dizendo que a dos microcontroladores da ATMEL é bem melhor UAHuHAuHUAhUhuHauhUAh  :D

 

8HqvtZc.png

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×