Altana Tubes > Blog > PIC16F627A/628A/648A > Memória EEPROM

13.0 A Memória de Dados EEPROM dos microcontroladores PIC16F627A, PIC16F628A e PIC16F648A

Tradução: Maria Elisa - Assessoria em Inglês e Alemão 

Revisão: Renato Kodaira

A memória de dados EEPROM dos microcontroladores PIC16F627A, PIC16F628A e PIC16F648A é acessível para leitura e escrita durante a operação normal (toda a faixa de VDD). Esta memória não é diretamente mapeada no espaço de arquivos do registrador. Ao invés disso, ela é endereçada indiretamente através dos Registradores de Funções Especiais (SFRs). Existem quatro SFRs utilizados para ler e escrever nesta memória. Estes registradores são:

  • EECON
  • EECON2 (Não é um registrador fisicamente implementado)
  • EEDATA
  • EEADR

a EEDATA contém os dados de 8 bits para escrita/ leitura e a EEADR contém o endereço da posição na qual a EEPROM é acessada. os dispositivos PIC16F627A/628A possuem 128 bytes de dados EEPROM com uma faixa de endereços do 0h até 7Fh. O dispositivo PIC16F648A possui 256 bytes de dados EEPROM, com uma faixa de endereços de 0h até FFh.

A memória de dados EEPROM permite a leitura e a escrita do byte. A escrita de um byte apaga automaticamente a posição e escreve os novos dados (erase before write = apagar antes da escrita). A memória de dados EEPROM é projetada para muitos ciclos de apagar/ escrever. O tempo de escrita é controlado por um temporizador on-chip (no próprio chip). O tempo de escrita irá variar com a voltagem e a temperatura, e também de chip para chip. Por favor, consulte as especificações AC para limites exatos.

Quando o dispositivo possui proteção de código, a CPU pode continuar a ler e escrever na memória de dados EEPROM. Um programador de dispositivo não pode mais acessar esta memória.

Informações adicionais sobre a memória EEPROM estão disponíveis no "Manual de Referência de Média Ordem PIC®" (DS33023).

REGISTRADOR 13.1: EEDATA - REGISTRADOR DE DADOS DA EEPROM (ENDEREÇO:9Ah)

 
R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x
EEDAT7 EEDAT6 EEDAT5 EEDAT4 EEDAT3 EEDAT2 EEDAT1 EEDAT0
bit 7             bit 0

 
bit 7-0
 
EEDATn: Valor do byte para a Escrita ou a Leitura da posição da memória de dados EEPROM.
 
  Legenda:
R = bit de leitura
W = bit de escrita
U = bit não implementado (unimplemented), lido como '0'
-n = valor na POR
'1' = bit está ativado
'0' = bit está apagado
x = bit é desconhecido

REGISTRADOR 13.2: EEADR - REGISTRADOR DE ENDEREÇO DA EEPROM (ENDEREÇO:9Bh)

 
R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x
EEADR7 EEADR6 EEADR5 EEADR4 EEADR3 EEADR2 EEADR1 EEADR0
bit 7             bit 0

 
bit 7 PIC16F627A/628A
  Endereço não Implementado: Deve ser colocado em '0'
  PIC16F648A
  EEADR: Colocado em '1' especifica as 128 posições superiores (128 - 256) da Operação de Leitura/ Escrita da EEPROM
 
bit 6-0
 
EEADR: Especifica uma das 128 posições da Operação de Leitura/ Escrita da EEPROM
 
  Legenda:
R = bit de leitura
W = bit de escrita
U = bit não implementado (unimplemented), lido como '0'
-n = valor na POR
'1' = bit está ativado
'0' = bit está apagado
x = bit é desconhecido

13.1 EEADR

O registrador EEADR do PIC16F648A endereça 256 bytes de dados EEPROM. Todos os oito bits no registrador (EEADR<7:0>) são requisitados.

O registrador EEADR dos PIC16F627A/628A endereça somente os primeiros 128 bytes de dados EEPROM, então só sete dos oito bits no registrador (EEADR<6:0>) são requisitados. O bit superior tem seu endereço decodificado. Isto significa que este bit deve estar sempre em '0' para assegurar que o endereço esteja no espaço de memória de 128 bytes.

13.2 Registradores EECON1 e EECON2

O EECON1 é o registrador de controle com quatro bits de baixa ordem implementados fisicamente. Os quatro bits superiores são inexistentes e são lidos como '0's.

Os bits de controle RD e WR iniciam a leitura (read) e a escrita (write), respectivamente. Estes bits não podem ser apagados, somente ativados, pelo software. Eles são apagados pelo hardware na conclusão da operação de leitura ou escrita. A inabilidade de apagar o bit WR com o software previne o encerramento acidental e prematuro da operação de escrita.

O bit WREN, quando ativado, permitirá uma operação de escrita. Ao se ligar o equipamento, o bit WREN está apagado. O bit WRERR é ativado quando uma operação de escrita é interrompida por uma Reinicialização MCLR ou por uma Reinicialização de esgotamento de tempo do WDT durante a operação normal. Nestas situações, após a reinicialização, o usuário pode checar o bit WRERRR e reescrever a posição. Os dados e o endereço não serão modificados nos registradores EEDATA e EEADR.

O bit sinalizador de interrupção EEIF no registrador PIR1 é ativado quando a escrita estiver completa. Este bit deve ser apagado pelo software.

O EECON2 não é um registrador físico. A leitura do EECON2 retornará todos os bits como zeros. O registrador EECON2 é utilizado exclusivamente na sequência de escrita dos dados EEPROM.

REGISTRADOR 13.3: EECON1 - REGISTRADOR 1 DE CONTROLE DA EEPROM (ENDEREÇO:9Ch)

 
U-0 U-0 U-0 U-0 R/W-x R/W-0 R/S-0 R/S-0
--- --- --- --- WRERR WREN WR RD
bit 7             bit 0
 

 
bit 7-4
 
Não implementado: lido como '0'
 
bit 3 WRERR: Bit Sinalizador de Erro na EEPROM
  1 = Uma operação de escrita é encerrada prematuramente (qualquer Reinicialização MCLR, qualquer Reinicialização WDT durante a operação normal, ou Reinicialização BOR)
  0 = Operação de escrita completada.
 
bit 2 WREN: Bit de Habilitação da Escrita na EEPROM
  1 = Permite ciclos de escrita
  0 = Inibe a escrita na memória de dados EEPROM
 
bit 1 WR: Bit de Controle da Escrita
  1 = Inicia um ciclo de escrita. (O bit é apagado pelo hardware assim que a escrita estiver completa. O bit WR somente pode ser ativado - não apagado - pelo software).
  0 = O ciclo de escrita na memória de dados EEPROM está completo.
 
bit 0 RD: Bit de Controle da Leitura
  1 = Inicia uma leitura da EEPROM (A leitura leva um ciclo. O RD é apagado pelo hardware. O bit RD somente pode ser ativado - não apagado - pelo software)
  0 = Não inicia uma leitura da EEPROM
 
  Legenda:
R = bit de leitura
W = bit de escrita
U = bit não implementado (unimplemented), lido como '0'
-n = valor na POR
'1' = bit está ativado
'0' = bit está apagado
x = bit é desconhecido

13.3 Leitura da Memória de Dados EEPROM

Para se ler a posição da memória de dados, o usuário deve escrever o endereço no registrador EEADR e depois ativar o bit de controle RD (EECON1<0>). Os dados estão disponíveis, no ciclo imediatamente seguinte, no registrador EEDATA, portanto eles podem ser lidos na próxima instrução. O EEDATA manterá este valor até uma outra leitura, ou até que ele seja escrito pelo usuário (durante uma operação de escrita).

EXEMPLO 13.1: LEITURA DE DADOS DA EEPROM

  BSF STATUS, RP0        ;Banco 1
  MOVLW CONFIG_ADDR 
  MOVWF EEADR            ;Endereço para leitura  
  BSF EECON1, RD         ;Leitura EE
  MOVF EEDATA, W         ;W = EEDATA
  BCF STATUS, RP0        ;Banco 0
   

13.4 Escrita na Memória de Dados EEPROM

Para se escrever em uma posição da memória de dados EEPROM, o usuário deve primeiramente escrever o endereço no registrador EEADR e os dados no registrador EEDATA. Depois o usuário deve seguir uma sequência específica para inicializar a escrita em cada byte.

EXEMPLO 13.2: ESCRITA DE DADOS NA EEPROM


  BSF STATUS, RP0        ;Banco 1
  BSF EECON1, WREN       ;Habilita escrita
  BCF INTCON, GIE        ;Desabilita interrupções
  BTFSC INTCON,GIE       ;Ver AN576
  GOTO $-2
  
  ;******** Início da sequência requerida ********
  MOVLW 55h ;
  MOVWF EECON2           ;Escreve 55h
  MOVLW AAh ;
  MOVWF EECON2           ;Escreve AAh
  BSF EECON1,WR          ;Ativa o bit WR
  ;********  Fim da sequência requerida   ********  

  BSF INTCON, GIE        ;Habilita interrupções
   

A escrita não inicializará se a sequência acima não for seguida com exatidão (escrever a 55h no EECON2, escrever a AAh no EECON2, depois ativar o bit WR) para cada byte. Recomendamos fortemente que as interrupções sejam desabilitadas durante este segmento de código. Uma contagem de ciclos é executada durante a sequência requerida. Qualquer número que não for igual à quantidade de ciclos necessária para executar a sequência requerida anulará a escrita dos dados na EEPROM.

Além disso, o bit WREN no EECON1 deve estar ativado para habilitar a escrita. Este mecanismo previne escritas acidentais na memória de dados EEPROM devido a uma eventual (inesperada) execução de código (i.e. programas perdidos). O usuário deve manter o bit WREN apagado o tempo todo, exceto ao atualizar a EEPROM. O bit WREN não é apagado pelo hardware.

Após iniciada uma sequência de escrita, apagar o bit WREN não afetara este ciclo de escrita. O bit WR terá sua ativação inibida a menos que o bit WREN seja ativado.

Ao se completar o ciclo de escrita, o bit WR é apagado pelo hardware e o bit EE de Sinalização de Interrupção por Finalização de Escrita (EEIF) é ativado. O usuário pode tanto habilitar esta interrupção como inativar este bit. O bit EEIF nos registradores PIR1 deve ser apagado pelo software.

13.5 Verificação da Escrita

Dependendo da aplicação, é boa prática de programação verificar se o valor escrito na Memória de Dados EEPROM (Exemplo 13.3) corresponde ao desejado. Isso deve ser feito nas aplicações em que um bit EEPROM será solicitado quase até o seu limite de especificação.

EXEMPLO 13.3: VERIFICAÇÃO DA ESCRITA


  BSF STATUS, RP0      ;Banco 1
  MOVF EEDATA, W
  BSF EECON1, RD       ;Lê o valor que 
                       ;foi escrito
  ;
  ;O valor escrito (no registrador W) e
  ;o que foi lido (em EEDATA) são o mesmo?
  ;
  SUBWF EEDATA, W     
  BTFSS STATUS, Z      ;A diferença é 0?
  GOTO WRITE_ERR       ;NÃO, Erro na escrita
                       ;SIM, Escrita bem sucedida  
                       ;Continuar o programa
    

 

13.6 Proteção contra Escrita Espúria

Existem condições nas quais o dispositivo pode não aceitar escrever na memória de dados EEPROM. A fim de proteger contra escritas espúrias na EEPROM, vários mecanismos têm sido inseridos. Na ativação, o WREN é apagado. Também quando habilitado, o Temporizador de Ativação (72 ms de duração) previne a escrita na EEPROM.

A sequência de inicialização da escrita e o bit WREN juntos ajudam a prevenir uma escrita acidental durante um brown-out, uma falha de energia ou um mal-funcionamento do software.

13.7 Utilizando a Memória de Dados EEPROM

A memória de dados EEPROM consiste em uma matriz de bytes endereçáveis de alta confiabilidade que foi otimizada para o armazenamento de informações que se alteram frequentemente (p. ex. variáveis de programa ou outros dados que são carregados com frequência). Quando as variáveis em uma seção mudam frequentemente, enquanto as variáveis em uma outra seção não se alteram, é possível exceder o número total de ciclos de escrita na EEPROM (especificação D124) sem exceder a quantidade total de ciclos de escrita em um único byte (especificações D120 e D120A). Se for este o caso, então uma revalidação (refresh) da matriz deve ser executada. Por este motivo, as variáveis que não se alteram frequentemente (tais como constantes, IDs, calibrações, etc.) devem ser armazenadas na memória de programa Flash.

Uma rotina simples de atualização da memória de dados EEPROM é apresentada no Exemplo 13.4.

Nota:
Caso a memória de dados EEPROM seja somente utilizada para armazenar constantes e/ou dados que raramente se alteram, uma atualização da matriz provavelmente não é necessária. Veja a especificação D124.

EXEMPLO 13.4: ROTINA DE REVALIDAÇÃO DA MEMÓRIA DE DADOS EEPROM


       BANKSEL 0X80           ;Seleciona o Banco 1
       CLRF EEADR             ;Inicia no endereço 0
       BCF INTCON, GIE        ;Desabilita as interrupções
       BTFSC INTCON, GIE      ;Veja AN576
       GOTO $ - 2
       BSF EECON1, WREN       ;Habilita a escrita na EEPROM
  Loop
       BSF EECON1, RD         ;Recupera o dado em EEDATA
       MOVLW 0x55             ;Primeiro passo da sequência requerida  
       MOVWF EECON2           ;
       MOVLW 0xAA             ;Segundo passo da sequência requerida
       MOVWF EECON2 
       BSF EECON1, WR         ;Inicia a sequência de escrita
       BTFSC EECON1, WR       ;Aguarda o final da escrita
       GOTO $ - 1
	   
  #IFDEF __16F648A            ;256 bytes no 16F648A
       INCFSZ EEADR, f        ;Verifica o final da memória
  #ELSE                       ;128 bytes no 16F627A/628A
       INCF EEADR, f          ;Próximo endereço
       BTFSS EEADR, 7         ;Verifica o final da memória
  #ENDIF                      ;Fim da compilação condicional
       GOTO Loop              ;Repete para todas as posições
       BCF EECON1, WREN       ;Desabilita a escrita na EEPROM
       BSF INTCON, GIE        ;Habilita as interrupções (opcional)
    

13.8 Operação da Memória de Dados EEPROM durante a Proteção de Código

Quando o dispositivo possui proteção de código, a CPU está apta a executar a leitura e a escrita dos dados na memória de dados EEPROM.

TABELA 13.1: REGISTRADORES/BITS ASSOCIADOS À MEMÓRIA DE DADOS EEPROM

Endereço Nome Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor na Reinicialização de Power-On Valor em Todas as Outras Reinicializações
9Ah EEDATA Registrador de Dados da EEPROM xxxx xxxx uuuu uuuu
9Bh EEADR Registrador de Endereço da EEPROM xxxx xxxx uuuu uuuu
9Ch EECON1 --- --- --- --- WRERR WREN WR RD ---- x000 ---- q000
9Dh EECON2(1) Registrador 2 de Controle da EEPROM ---- ---- ---- ----

Legenda:
x = desconhecido
u = inalterado
- = não implementado, lido como '0'
q = o valor depende da condição
células sombreadas = não utilizadas pela memória de dados EEPROM

Nota 1:
O EECON2 não é um registrador físico.

<-Anterior Índice Próximo->