Gravação frequente em memória não volátil

10

Estou projetando um dispositivo que ajusta automaticamente sua posição física à medida que a temperatura muda. Se o dispositivo foi desligado ou a energia foi desconectada, o dispositivo precisa se lembrar da última temperatura e posição. Tenho a capacidade de armazenar esses valores na EEPROM, mas o problema é que a posição e a temperatura podem estar mudando muito rapidamente. Se eu escrevesse o temp e pos na EEPROM após cada alteração, isso (1) diminuiria um pouco o firmware e (2) provavelmente mataria a EEPROM após um ano ou dois. Então, a meu ver, minhas opções são as seguintes ...

1) use um capacitor / bateria para manter o dispositivo ligado por um curto período de tempo após a perda de energia, para que eu possa gravar os valores na EEPROM somente naquele momento. Eu não gosto disso porque a diretoria está com muita fome de energia e isso exigiria um grande limite. E não tenho muito espaço livre. E não quero o custo adicional de uma bateria e um suporte de bateria / ou uma tampa grande.

2) use F-RAM em vez de EEPROM para que eu possa escrever trilhões de vezes sem desgastá-lo. Não gosto dessa opção porque a FRAM é um pouco mais cara que a EEPROM e isso é para um produto de produção (não apenas um).

3) Escreva apenas a posição e a temperatura a cada 5 minutos ou mais. Dessa forma, eu sempre tenho uma posição / temperatura relativamente recente registrada, mas não estou escrevendo a cada segundo, para que meu programa não fique lento e a EEPROM não morra tão rápido. Esta parece ser a minha melhor opção.

Alguém mais tem alguma sugestão em que não estou pensando?

PICyourBrain
fonte
5
Só uma pergunta. Se o dispositivo ajusta automaticamente sua posição física, por que você precisa se lembrar da última temperatura? Quando você liga o dispositivo novamente, ele não atualiza a temperatura e ajusta sua posição?
Daniel Grillo
11
Eu concordo com o Daniel. E se você desligar e a temperatura ambiente mudar drasticamente? Ao ligar, se você usasse a última temperatura / posição salva, estaria no local errado de qualquer maneira e o dispositivo acabaria se movendo independentemente. Existe outro requisito que não esteja listado na sua pergunta?
31411 Dave
Qual é a especificação da EEPROM - quantos ciclos de gravação?
Jason S

Respostas:

10

O que você precisa é de uma técnica chamada nivelamento de desgaste . Ele não grava seus dados todas as vezes no mesmo local na EEPROM, mas usa algum algoritmo para usar locais diferentes. Eu li sobre algoritmos complexos de nivelamento de desgaste, mas não sabia por que o método simples a seguir não funcionaria.

Adicione aos seus dados um contador de 24 bits, para que seu bloco de dados tenha, por exemplo, 8 bytes de comprimento. As páginas em um 24AA64 têm 32 bytes de comprimento, portanto, uma EEPROM de 64kb contém 256 páginas. A partir da folha de dados:

"Ao fazer uma gravação com menos de 32 bytes, os dados no restante da página são atualizados juntamente com os bytes de dados que estão sendo gravados. Isso forçará a página inteira a suportar um ciclo de gravação, por esse motivo a resistência é especificada por página."

portanto, não faz sentido usar blocos de dados menores que uma página de 32 bytes.

Olhe para o balcão da primeira página. Se for zero, você utilizou o número máximo de ciclos de gravação para essa página, para passar para a próxima página e verificar esse contador. Repita até encontrar um contador> zero. Essa é a página que você está usando no momento. As EEPROMs da Microchip possuem uma resistência de 1 milhão de ciclos, que você pode aumentar para 256 milhões com o exemplo dado de no máximo 32 bytes por bloco em uma EEPROM de 64kb. Isso deve ser suficiente para durar mais que o seu produto: 40 anos se você escrever uma vez a cada 5 segundos (!).

Você deseja inicializar sua EEPROM no primeiro uso. Como você sabe quando é isso? Use a última página para escrever uma assinatura exclusiva na inicialização. Verifique em cada inicialização se a assinatura está lá. Se não for, o dispositivo precisa ser inicializado. Você pode predefinir o contador em cada página com 0xF4240 (para 1 milhão) ou limpar tudo para 0xFF e gravar o 0xF4240 quando usar a página pela primeira vez.
É necessário inicializar uma EEPROM porque, às vezes, um certo padrão é gravado nele no processo de produção / teste.

editar
O nivelamento de desgaste deve resolver seus problemas, mas ainda quero comentar sobre a solução do capacitor. Você diz que a placa está com muita energia, mas talvez você possa isolar a energia do microcontrolador / EEPROM do resto da placa com um diodo. Então você provavelmente precisará de apenas alguns mA quando a energia principal acabar. O 24AA64 grava uma página em menos de 5ms, depois a 10mA e uma queda de tensão permitida de 100mV, que você precisará

C=ItΔV=10mA5ms100mV=500μF

Fácil com uma pequena supercap.


folha de dados de leitura adicional 24AA64
Tutorial de resistência da EEPROM

stevenvh
fonte
A resistência da EEPROM é fornecida por página (pelo menos para 24AA64 e outras EEPROMs que eu usei). O 24AA64 especifica uma página de 32 bytes, portanto, a contagem deve ser por página e não por bloco.
Saad
@Saad - Correto. Corrigido na minha resposta.
Stevenvh
4

1) Depois de iniciar o processo de gravação, você só precisa ligar o MCU / EEPROM e garantir que as linhas de controle não falhem - o I2C provavelmente prefere o SPI para isso. Você só precisa de alguns mA por alguns milissegundos para que não seja um grande problema, e você pode colocar o MCU no modo de suspensão assim que a gravação for iniciada. 3) você provavelmente pode aplicar alguma inteligência, por exemplo, uma pausa - uma vez escrita, ela sempre dura um certo tempo antes que outra gravação possa acontecer. Ou aguarde até que o valor fique estável por um tempo antes de escrever.
Você também pode aumentar a resistência espalhando os dados por vários locais. O microchip possui algumas ferramentas e notas para calcular a resistência de seus eeproms, o que pode ser útil.

mikeselectricstuff
fonte
4
Nota do Microchip App sobre resistência: ww1.microchip.com/downloads/en/AppNotes/01019A.pdf No Appnote, você também pode aumentar a resistência em cerca de 2x, diminuindo a tensão operacional de 5v para 3.5v.
vandee
11
Se você usar seu primeiro método, certifique-se de que gravar na memória não volátil seja a maior prioridade em seu sistema, uma vez iniciado, ou seja. essas interrupções não podem fazer com que seus valores sejam alterados no meio da gravação ou o micro inicie algum outro processamento que faz com que você fique sem tempo. É mais importante que você não escreva valores corrompidos ao desligar. Além disso, uma CRC nos valores ajudaria você a confirmar que a corrupção não ocorreu, mas você teria que decidir o que fazer se ocorresse, como o uso de padrões.
Martin
3

Eu sugeriria o uso de um dispositivo flash orientado a blocos e usaria um byte de cada bloco como sinalizador de modo. Manter como invariável que quase todos os sinalizadores de modo serão programados; haverá apenas um bloco em que o sinalizador de modo não está programado, mas o bloco anterior (quebra, se necessário). Esse bloco será aquele com os dados mais recentes. Quando esse bloco for preenchido, apague o bloco a seguir (observe que o bloco que está sendo apagado pode conter qualquer combinação de dados durante o ciclo de apagamento e o invariante ainda retém); depois que a exclusão estiver concluída, programe o sinalizador de modo no que costumava ser usado. seja o último bloco.

Será necessário proteger o suprimento do flash suficientemente bem para garantir que qualquer tentativa de programar um byte seja bem-sucedida ou falhe por completo, mas não importa se um ciclo de apagamento for interrompido, deixando um bloco cheio de dados arbitrários, já que a próxima tentativa de gravar uma entrada de dados apagará esse bloco.

Se seus dados tiverem 16 bits, um chip de 64Kx8 conterá mais de 32.000 entradas. Escrever uma entrada por segundo preencheria o chip cerca de 2,7 vezes. Mesmo um chip com resistência de "apenas" 10K ciclos de apagamento duraria mais de 10 anos. O uso de um chip maior, ou um com resistência de 100 mil, aumentaria a vida útil proporcionalmente.

supercat
fonte
2

1) Possivelmente a opção mais simples, embora possa exigir alterações de hardware. Eu já fiz isso antes, sem modificações no PBC, apenas aumentando as tampas de desacoplamento e interrompendo a interrupção.

2) Como você apontou, o problema com o FRAM é o preço!

3) Dependendo da volatilidade dos dados de temperatura e posição, você aumentará a resistência escrevendo apenas se o valor tiver sido alterado. Você pode amostrar a temperatura uma vez a cada segundo, mas se ela mudar a cada 5 minutos, o problema está resolvido.

Tim
fonte
1

Aqui está como eu resolvi esse problema no meu projeto:

Reserve 1 setor de flash para armazenar uma máscara de bits de slots não utilizados e vários slots para o valor.

A máscara de bit que usei tinha 16 bytes de comprimento, então eu tinha 128 slots para colocar valores.

A máscara de bits é inicializada para todas as que, em termos de flash, é o estado apagado.

Quando você quiser escrever um novo valor, leia a máscara de bits e encontre o primeiro bit. Este é o número do slot em que você escreverá o valor. Altere esse bit para zero para marcá-lo como usado e escreva o bitmask novamente para piscar sem primeiro apagá-lo. Em seguida, escreva o valor no slot após a máscara de bits também sem apagar o flash.

Dessa forma, você estende os ciclos de gravação do flash em 128 vezes, escrevendo a nova máscara de bits com apenas uma alteração de um para zero.

Se a máscara de bit inteira for 0, apague o setor de flash e comece novamente.

Robert
fonte
3
Posso desapontá-lo, mas quando você pisca um pouco, todo o setor é substituído. Sua solução tornará o setor de 'máscara de bits' morto em breve.
Andrejs Cainikovs
11
Se você não apagar o flash, não utilizará um dos ciclos de apagamento de 10 mil no setor. Se você possui o valor 0x7F e escreve o valor 0x3F, o resultado será 0x3F. Isso mantém a máscara de bits atualizada, mas não apaga o flash. A exclusão só acontece quando o bitmask inteiro é 0.
Robert
Se eu estiver errado, vamos discutir. Não quero respostas ruins aqui e realmente não quero um design ruim no meu projeto.
Robert
Eu acho que Robert está certo. No meu microcontrolador, você pode escrever apenas 4 bytes de cada vez, mas os bits necessários são definidos como zero. A única maneira de devolvê-los ao 1 é colocar o bloco 1k em branco. Seus apenas os ciclos de apagamento que usam o flash ...
Tim
Pode ser diferente para cada tipo de memória e talvez até o fornecedor da memória. Vi EEPROMs devem apagar a página e reescrevê-la para cada gravação. Eu já vi memória flash, você pode escrever bits que ainda são 1 sem apagar a página.
mjh2007