Estou executando um Microchip dsPIC30F6012a. Eu tenho esse chip em vários PCBs, todos executando o mesmo software e observo o mesmo problema em todos eles. Isso implica um problema sistêmico, não um problema pontual de produção. O problema também é reproduzível, o que implica que eu devo matá-lo se souber onde procurar. Mas ainda estou tendo dificuldades surpreendentes para depurar o aplicativo.
A placa em teste aceita 24V, que é reduzida para 5V através de um V7805. O chip roda em seu oscilador interno, com um PLL 16x, proporcionando uma velocidade de operação de ~ 29,5 MIPS. O código relevante nesta placa é essencialmente muito simples: acorde, leia os dados da EEPROM e insira um loop infinito. Interrompa a cada milissegundo, observe alguns dados ambientais e escreva um valor atualizado na EEPROM. Há outras coisas acontecendo, mas o problema ainda ocorre mesmo que o código não relacionado seja comentado, para que eu possa ter certeza de que não é relevante para o problema em questão.
Em uso geral, 95% das vezes o conselho acorda com o valor correto na memória e continua seus negócios. Os outros 5% do tempo, porém, acordam com um valor incorreto. Especificamente, ele acorda com uma versão invertida dos dados que deveria ter. É um comprimento de quatro bytes sem assinatura que estou assistindo, e a palavra superior ou inferior do comprimento pode ser alterada. Por exemplo, 10 se torna 2 ^ 16-10, que mais tarde se torna 2 ^ 32-10. Posso reproduzir a falha alternando manualmente a energia várias dúzias de vezes, mas isso não é muito consistente, e meu dedo está gasto.
Para reproduzir o problema de maneira controlada, construí uma segunda placa que conduz o fornecimento de 24V à placa em teste. (Outro dsPIC dirigindo um acoplador óptico de darlington.) A placa do testador desliga os 24V por 1,5 segundos (tempo suficiente para que o trilho de 5V caia para essencialmente 0 e fique lá por um segundo), depois liga os 24V por um período de tempo configurável . Com um tempo de funcionamento de aproximadamente 520 mS, posso reproduzir essa falha da EEPROM em cinco ciclos de energia, todas as vezes.
O trilho de 5V está se comportando razoavelmente. Ele se instala em 5V a 1 mS de ativação, com talvez 0,4V de superação, supondo que eu possa confiar no meu escopo. No desligamento, decai para 0V exponencialmente, atingindo 1V dentro de 50 mS. Não tenho avisos de compilação que pareçam relevantes, apenas variáveis não utilizadas e novas linhas ausentes no final dos arquivos.
Eu tentei várias coisas:
- Ativando / Desativando o MCLR
- Ativando / desativando o WDT
- Ativando / desativando a proteção de código
- Ativar / desativar / alterar a tensão de detecção de queda de energia
- Ativando / Desativando / Alterando o Temporizador de Inicialização
- Configurações diferentes de PLL no oscilador interno principal
- Ligar / desligar o meu programador PICkit 3
- Adicionando 470 uF de capacitância ao trilho de 5V
- Adicionando / removendo .1 uF no pull-up de 4,7k no meu pino MCLR
- Desabilitando todas as interrupções no código e deixando apenas as atualizações de EEPROM no loop principal
- Adicionando um atraso de 1,5 segundo à minha rotina de inicialização antes de começar a ler EEPROM
Também escrevi um código de teste separado, que não faz nada, mas grava valores continuamente na EEPROM e os lê novamente, certificando-se de que o valor não seja alterado. Dezenas de milhares de iterações não deram erros. Tudo o que posso concluir é que algo dá errado com a leitura ou gravação da EEPROM, especificamente na inicialização / desligamento.
Eu uso as mesmas bibliotecas da EEPROM desde 2007. Vi falhas ocasionais, mas nada reproduzível. O código relevante pode ser encontrado aqui:
http://srange.net/code/eeprom.c
http://srange.net/code/readEEByte.s
http://srange.net/code/eraseEEWord.s
http: / /srange.net/code/writeEEWord.s
Já vi erros de EEPROM em outros aplicativos, mas sempre como falhas pontuais, nada tão reprodutível ou consistente.
Alguém tem alguma idéia do que está acontecendo? Estou ficando sem coisas para tentar.