Les nouvelles variantes «PB» d'ATmega ont-elles un bug dans le détecteur de brunissement?


9

Nous utilisons les microcontrôleurs ATmega48 / 88/168/328 avec succès depuis de nombreuses années dans bon nombre de nos produits. Nous avons maintenant envisagé de passer des variantes A et PA à la nouvelle variante PB (parce que nous aurons besoin des broches, des minuteries et des UART supplémentaires dans les nouveaux produits, car c'est devenu moins cher, et parce qu'il semble que les anciennes variantes seront abandonnées), nous avons donc remplacé un ATmega328A par un ATmega328PB. Il semble se détraquer très souvent après des coupures de courant . De tels problèmes ne se sont jamais produits avec les anciennes variantes.

Des coupures de courant régulières sont normales pour l'utilisation de nos produits. Nous utilisons une alimentation à découpage (comme celle-ci ) réglée sur 5 V et des condensateurs dans la plage de 220 µF sur le VCC de l'ATmega, pour maintenir la SRAM en vie pendant des interruptions de courant de plusieurs minutes, pour stocker des états internes qui ne sont pas la mission critique mais augmente considérablement l'expérience utilisateur en étant instantanément disponible au redémarrage (ces états changent assez souvent pour rendre l'EEPROM inadaptée). Cela a toujours fonctionné.

Cependant, avec le nouveau ATmega328PB, après une coupure de courant, la puce se réinitialise sans qu'une condition de réinitialisation ne soit trouvée dans MCUSR, et l'horloge semble se détraquer.

  • le détecteur de brunissement est réglé par fusible. Nous avons essayé tous les niveaux de carrosserie disponibles, le bug se produit sur chacun d'eux.
  • nous utilisons 20 MHz externes, également réglés correctement par fusible.
  • nous avons essayé 3 puces différentes, donc ce n'était pas une seule soudure ou une autre défaillance matérielle.

Après le bug, l'horloge se règle souvent à une vitesse 2,5 fois plus lente, indiquant que le processeur est synchronisé par l'oscillateur interne à 8 MHz. Cependant, le ralentissement est parfois d'environ 6x. Cela signifie qu'il ne peut pas s'agir d'un bug logiciel modifiant le diviseur d'horloge, car je ne peux pas régler les fusibles à partir du logiciel, et le diviseur d'horloge ne peut pas diviser l'horloge par 2,5 ou par 6.

Donc, mon premier suspect était le nouveau fusible de détection de défaillance d'horloge. Cependant, peu importe s'il est activé ou désactivé, le comportement reste le même.

Pour exclure les particularités du logiciel, j'ai écrit un programme de test simple à partir de zéro, qui ne fait rien d'autre que basculer une sortie à 100 Hz à partir d'une interruption de minuterie, et indique avec des LED après chaque redémarrage quelles conditions de réinitialisation ont été activées (comme lu sur MCUSR). Le reste du matériel a également été retiré, seuls le mcu et le régulateur sont là (et les voyants avec résistances série).

Les resultats

Environ 2/3 du temps, rien d'intéressant ne se produit. Après l'interruption de l'alimentation, le mcu reprend son travail, les voyants de réinitialisation de panne de courant et de réinitialisation de mise sous tension s'allument.

(sur l'image, le rouge est la broche basculée et le bleu est VCC. Sur cette image, le bronzage 2,7 V est clairement visible. J'ai fait les mêmes tests avec les autres paramètres de brunissement, les résultats sont exactement les mêmes, donc je vais omettre ces photos)

ça redémarre bien

Environ 1/3 du temps, le bogue susmentionné se produit, et lorsque le courant est de nouveau rétabli , aucun des indicateurs de réinitialisation et de réinitialisation à la mise sous tension n'est allumé! La sortie est différente, comme si le processeur fonctionnait avec une horloge étrange. Ce n'est pas chaotique, cependant, il continue de fonctionner avec la même fréquence.

il redémarre dans un état fou

Fait intéressant, dans cette situation, le détecteur de brunissement semble être complètement inactif, car après la prochaine coupure de courant (où l'horloge correcte est parfois rétablie, parfois non), il est clairement visible que la sortie continue de basculer bien après le brun. le niveau a été dépassé. Dans de telles situations, l'horloge devient parfois plus rapide, d'autres fois elle ralentit:

Pas de brunissement, l'horloge s'accélère Pas de brunissement, l'horloge ralentit

Lors de ces tests, j'ai utilisé 16K CK / 14CK + 4,1 ms pour le délai de démarrage (mais le délai de 65 ms n'évite pas les problèmes).

Voici une image zoomée, où vous pouvez clairement voir que le VCC atteint un état stable à 5 V en moins de 2 ms:

démarrage réussi, zoom avant

Dans l'image ci-dessus, le MCU a démarré correctement.

Fait intéressant, quand ce n'est pas le cas, la tension d'alimentation atteint un 5 V stable encore plus tôt (il semble que de nombreuses parties du MCU ne s'allument pas, donc il consomme moins de courant lors du démarrage)

Ci-dessous, une image d'un démarrage infructueux:

démarrage infructueux, zoom avant

Veuillez noter que le logiciel commence à fonctionner après plus de 85 ms après stabilisation de la tension d'alimentation, au lieu des 10,5 ms requis autrement. Les fusibles pour le délai de démarrage sont toujours les mêmes, 16K CK / 14CK + 4,1 ms.

Ce qui est également intéressant à noter, c'est qu'après la coupure de l'alimentation, le VCC se stabilise autour de 1,1 à 1,2 Volt (l'ancienne variante ATmega328A est tombée à environ 0,6 - 0,7 V). Il garde cela pendant plusieurs minutes. Si j'attends assez longtemps (de l'ordre d'une demi-heure ou plus), le mcu démarre toujours correctement! Il semble donc que le problème soit qu'il y ait 1,1 Volt autour, ce qui, selon la fiche technique, n'est pas garanti pour être réinitialisé à la mise sous tension. Mais cela devrait suffire pour une réinitialisation du brownout!

À l'exception de ces situations, le détecteur de brunissement fonctionne correctement. Il est visible sur la première image (le signal de sortie s'arrête lorsque le niveau corporel a été atteint, et la chute de tension ralentit, car certaines parties du processeur sont arrêtées). J'ai fait des tests lorsque j'ai réduit le VCC à un niveau légèrement inférieur au niveau de la carrosserie et que je l'ai laissé remonter à nouveau, le mcu a toujours redémarré correctement dans de telles conditions, seul l'indicateur de réinitialisation de brunissement étant allumé.

Ai-je raté quelque chose d'évident, ou l'ATmega328PB a-t-il un bug sérieux dans son détecteur de brunissement?

ÉDITER:

Fait intéressant, les problèmes ci-dessus ne surviennent que lorsque j'interrompt l'alimentation devant le régulateur. Si je l'interromps après le régulateur (ou si j'utilise une alimentation de laboratoire), les problèmes ne se produisent jamais. Comme si la forme de la tension croissante causait les problèmes. Cependant, comme vous pouvez le voir sur la dernière image, la montée en tension est assez agréable et se stabilise rapidement.

EDIT 2

Je l'ai essayé avec 16 MHz au lieu de 20 MHz, mais les mêmes problèmes se produisent.


Avez-vous contacté Atmel ou examiné ses erratas? De nos jours, les erreurs de conception de circuits intégrés sont assez courantes.
Edgar Brown

J'ai parcouru les erratas (je n'ai rien trouvé dans ce sens), et nous envisageons de contacter Atmel, mais pas avant de faire d'autres tests et de regarder un peu plus autour.
vsz

3
D'après mon expérience, ne perdez pas de temps avant de contacter le fabricant ou d'utiliser leurs forums. Vous avez fait plus qu'assez de débogage pour présenter un dossier très solide. Avec beaucoup moins que cela, TI m'a envoyé leurs errata internes (non publiés) pour l'un de leurs circuits intégrés qui documentaient notre problème.
Edgar Brown

Ma valeur de deux cents: j'ai vu des problèmes avec d'autres processeurs si la puissance augmente trop rapidement. Certains fabricants spécifient un temps de montée maximum mais le plus souvent cela n'est pas mentionné.
Oldfart

Réponses:


3

Je ne pense pas que ce soit un bug avec le détecteur de brunissement, mais comment vous utilisez la puce.

Comme vous l'avez dit vous-même, le seuil de réinitialisation à la mise sous tension 1,1 V n'est pas atteint si l'alimentation est juste brièvement coupée et connectée, il n'y aura donc pas de POR.

Le détecteur de brunissement ne peut pas non plus aider beaucoup ici. Vous utilisez l'AVR à 20 MHz, et cela nécessite une tension d'alimentation de 4,5 V ou plus, ou vous violez les spécifications. Et le BOD ne garantit pas qu'il se déclenchera à 4,5 V, il est généralement inférieur à cela, disons 4,3 V. Donc, même avant que le BOD ne se déclenche, il n'y a aucune garantie dans quel état l'AVR se termine, mais le BOD devrait se déclencher, sauf qu'il peut ne fonctionne pas en raison de votre horloge de 20 MHz. Lorsque la tension recommence à augmenter, la DBO se désactive avant que la tension d'alimentation ne soit à nouveau à un niveau sûr de 4,5 V. S'il s'est déclenché correctement. La temporisation de démarrage doit ensuite être réglée sur une valeur suffisamment élevée pour que la tension passe d'un niveau de désactivation de DBO à 4,5 V avant que la réinitialisation interne ne soit libérée.

Mais tout cela peut échouer car il a juste besoin d'au moins 4,5 V pour fonctionner à 20 MHz. La fiche technique de l'AVR mentionne que si le système de réinitialisation interne ne convient pas, utilisez une puce de réinitialisation externe, et dans ce cas, il semblerait que cela résoudrait vos problèmes pour réinitialiser l'AVR avant que la tension ne tombe à 4,5 V.


J'ai supposé que le BOD n'utilise pas le processeur lui-même mais c'est un matériel dédié. Peut-être l'ont-ils changé pour la variante PB? Je serais surpris s'ils ne prennent plus en charge la DBO pour 20 MHz. Le niveau de corps le plus élevé est de 4,3 V, donc 20 MHz nécessiteraient un DBO externe? Pourtant, j'ai des doutes que cela seul soit la cause. J'ai fait un test avec 20 MHz, un niveau de corps de 2,7 V, j'ai réglé le VCC sur 3 V, cela a bien fonctionné. Lorsque j'ai réduit la tension manuellement à un peu moins de 2,7, la sortie s'est arrêtée, quand je l'ai augmentée au-dessus de 2,7, la sortie a repris, toujours, elle n'a jamais échoué, pas même une fois. Seul un démarrage à partir de 1,1 V semble désactiver le BOD.
vsz

Il s'agit très probablement d'un matériel dédié, mais pendant la sous-tension avant le démarrage du BOD, pouvez-vous être sûr que les données correctes sont extraites de la mémoire flash pour l'exécution du processeur, et le processeur les exécute-t-il correctement? Il pourrait, ou simplement écrire des données aléatoires dans des registres réservés qui font des choses non spécifiées. Les spécifications ont changé pour la variante PB, et elles ne prenaient pas en charge la DBO pour 20 MHz non plus sur l'ancienne puce. La variante PB a des courbes BOD et POR en effet différentes et se déclenche plus tard à des tensions inférieures.
Justme

Veuillez jeter un œil à ma deuxième photo. Le DBO était apparemment correctement engagé et a réinitialisé la puce. Il ne parvient à s'initialiser qu'au prochain démarrage. De plus, j'ai piloté cette puce à 3 V et elle a fonctionné correctement, n'a jamais échoué une seule fois.
vsz

Eh bien, à mon avis, la puce n'a pas besoin de fonctionner en dehors de la zone d'exploitation sûre, mais continuons. Le DBO ne réinitialisera pas le détecteur de défaillance d'horloge, donc seules la réinitialisation à la mise sous tension et la réinitialisation externe seront désactivées de l'horloge interne. Vérifiez donc les paramètres du fusible CFD. Utilisez-vous un cristal externe ou une horloge externe? Le fusible CFD était peut-être auparavant le fusible Full Swing. Et comme il n'y a pas de fusible à ouverture totale, la fréquence maximale d'un cristal est de 16 MHz et 20 MHz nécessitent un signal d'horloge de niveau logique externe. Cela pourrait également être un problème de démarrage de Crystal, alors mettez également un champ d'application sur les broches Crystal.
Justme

J'utilise un cristal. Bonne idée, je vais examiner cela. Veuillez noter que le même comportement que j'ai décrit avec des images s'est produit, que le CFD soit activé ou désactivé.
vsz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.