Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

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?
 
Link para o comentário
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

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...