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?
fonte
Respostas:
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:
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á
Fácil com uma pequena supercap.
folha de dados de leitura adicional 24AA64
Tutorial de resistência da EEPROM
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte