J'utilise un Microchip dsPIC30F6012a. J'ai cette puce sur plusieurs PCB, tous exécutant le même logiciel, et j'observe le même problème sur chacun d'eux. Cela implique un problème systémique, pas un problème de production ponctuel. Le problème est également reproductible, ce qui implique que je devrais pouvoir le tuer si je sais où chercher. Mais j'ai toujours des difficultés surprenantes à déboguer l'application.
La carte testée accepte 24V, qui descend à 5V via un V7805. La puce fonctionne sur son oscillateur interne, avec une PLL 16x, donnant une vitesse de fonctionnement de ~ 29,5 MIPS. Le code pertinent sur cette carte est essentiellement très simple: réveillez-vous, lisez les données de l'EEPROM, puis entrez dans une boucle infinie. Interrompez toutes les millisecondes, observez certaines données environnementales et écrivez une valeur mise à jour dans l'EEPROM. Il y a d'autres choses en cours, mais le problème persiste même si le code non lié est commenté, donc je peux être raisonnablement certain qu'il n'est pas pertinent pour le problème en question.
En général, 95% du temps, la carte se réveille avec la bonne valeur en mémoire et continue ses activités. Les 5% restants, cependant, il se réveille avec une valeur incorrecte. Plus précisément, il se réveille avec une version inversée des données qu'il est censé contenir. C'est un long non signé de quatre octets que je regarde, et le mot supérieur ou inférieur du long peut être inversé. Par exemple, 10 devient 2 ^ 16-10, qui devient plus tard 2 ^ 32-10. Je peux reproduire le pépin en coupant manuellement l'alimentation plusieurs dizaines de fois, mais ce n'est pas très cohérent, et mon interrupteur s'use.
Afin de reproduire le problème de manière contrôlée, j'ai construit une deuxième carte qui alimente l'alimentation 24 V de la carte en cours de test. (Un autre dsPIC pilotant un optocoupleur Darlington.) La carte testeur éteint le 24 V pendant 1,5 seconde (assez longtemps pour que le rail 5 V tombe à essentiellement 0 et y reste pendant une seconde), puis allume le 24 V pendant une durée configurable . Avec un temps d'activation d'environ 520 mS, je peux reproduire ce pépin EEPROM en cinq cycles d'alimentation, à chaque fois.
Le rail 5V se comporte raisonnablement. Il s'installe à 5 V dans 1 mS de mise sous tension, avec peut-être 0,4 V de dépassement, en supposant que je peux faire confiance à ma portée. À l'arrêt, il décroît à 0 V de façon exponentielle, atteignant 1 V à moins de 50 mS. Je n'ai aucun avertissement de construction qui semble pertinent, juste des variables inutilisées et des sauts de ligne manquants à la fin des fichiers.
J'ai essayé plusieurs choses:
- Activation / désactivation du MCLR
- Activation / désactivation du WDT
- Activation / désactivation de la protection du code
- Activation / désactivation / modification de la coupure de détection de tension
- Activation / désactivation / modification de la minuterie de mise sous tension
- Différents paramètres PLL sur l'oscillateur interne principal
- Connexion / déconnexion de mon programmateur PICkit 3
- Ajout de 470 uF de capacité au rail 5V
- Ajout / suppression de 0,1 uF dans le pullup de 4,7 k sur ma broche MCLR
- Désactiver toutes les interruptions du code et ne laisser que des mises à jour EEPROM dans la boucle principale
- Ajout d'un délai de 1,5 seconde à ma routine de démarrage avant de commencer à lire l'EEPROM
J'ai également écrit un code de test séparé qui ne fait rien d'autre que d'écrire continuellement des valeurs dans l'EEPROM, puis de les relire, en m'assurant que la valeur n'a pas changé. Des dizaines de milliers d'itérations n'ont donné aucune erreur. Tout ce que je peux conclure, c'est que quelque chose ne va pas avec la lecture ou l'écriture de l'EEPROM, en particulier à la mise sous tension / hors tension.
J'utilise les mêmes bibliothèques EEPROM depuis 2007. J'ai vu des problèmes occasionnels, mais rien de reproductible. Le code correspondant peut être trouvé ici:
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'ai déjà vu des erreurs EEPROM dans d'autres applications, mais toujours comme des problèmes ponctuels, rien de reproductible ou cohérent.
Quelqu'un a-t-il une idée de ce qui se passe? Je suis à court de choses à essayer.