Question:
Bouton de réinitialisation à deux fonctions - appui long / court
njh
2017-03-05 20:04:51 UTC
view on stackexchange narkive permalink

J'essaie de créer un circuit en utilisant un ATmega328, qui a un bouton de réinitialisation qui se comporte comme de nombreux appareils grand public:

  1. Une courte pression redémarre le microcontrôleur
  2. Un appui long (5 secondes?) provoque la restauration des paramètres par défaut

Quelle est la meilleure façon d'obtenir ce comportement? J'imagine qu'il faudra deux broches? Peut-on le faire simplement en utilisant des composants passifs?

Merci!

Je n'utiliserais pas la broche de réinitialisation mais une broche ordinaire. Durée pendant laquelle le bouton est enfoncé. Ensuite, une fois libéré, restaurez éventuellement les paramètres et réinitialisez la carte à l'aide d'un logiciel. De cette façon, vous n'avez pas à expérimenter différentes valeurs de résistance et de condensateur, ni à contourner les retards du chargeur de démarrage.
Personnellement, je suis plus enclin à utiliser la broche de réinitialisation car elle réinitialise le matériel. Cela devrait également toujours réussir - il y a toujours un risque de bogue dans le logiciel et de ne pas se réinitialiser correctement.
L'utilisation du chien de garde pour réinitialiser l'appareil est assez fiable.
Trois réponses:
Majenko
2017-03-05 20:15:43 UTC
view on stackexchange narkive permalink

Cela peut être fait avec un bouton, une résistance, un condensateur et une broche GPIO (en plus de la broche RESET):

schematic

simuler ce circuit - Schéma créé à l'aide de CircuitLab

Appuyer sur le bouton provoque une impulsion BAS sur la broche RESET (exactement de la même manière que l'interface USB le fait).

Lors de votre procédure de démarrage, vous avez lu la broche GPIO que vous avez choisie. S'il est BAS, le bouton est toujours enfoncé. S'il est HAUT, il a été relâché.

Si vous utilisez un Arduino avec le chargeur de démarrage normal, le chargeur de démarrage lui-même impose un délai de 2 secondes (ce qui peut être suffisant pour tu). Sinon, vous devrez avoir votre propre retard dans votre programme avant de lire le bouton pour vous assurer que vous avez suffisamment de temps pour relâcher le bouton afin de ne pas réinitialiser accidentellement vos paramètres.

Merci pour la réponse très complète. Exactement ce que j'espérais!
dannyf
2017-03-05 20:49:40 UTC
view on stackexchange narkive permalink

Utilisez une machine à états pour détecter les pressions du roi. Une fois cela fait, vous pouvez soit déclencher une réinitialisation matérielle ou logicielle, soit en simuler une en passant au vecteur de réinitialisation - vous devrez écrire le code pour prendre en charge cela, comme une initialisation explicite de variables, etc.

Notez que le passage au vecteur de réinitialisation n'initialise pas le matériel à son état normal de mise sous tension. Il initialise cependant la mémoire (sections data et bss), car cela est effectué par le runtime C avant d'appeler `main ()`. Une réinitialisation matérielle peut être déclenchée en configurant le chien de garde avec un délai très court.
caligari
2017-03-09 06:49:16 UTC
view on stackexchange narkive permalink

Vous pouvez régler le RSTDISBL (bit 7 sur le fusible HIGH ) pour désactiver la réinitialisation externe et utiliser la réinitialisation pin comme PC6 pour gérer le comportement de réinitialisation de votre programme.

RSTDISBL ATmega328P

La deuxième partie consiste à capturer lorsque le bouton de réinitialisation est enfoncé : mettez du code dans le gestionnaire ISR pour PCINT1 lorsque la broche change (fonction de broche PCINT14 ). Si vous programmez une carte Arduino, le bouton de réinitialisation est tiré vers le haut (la pression devient LOW et la libération devient HIGH).

La détection d'une pression longue ou d'une pression courte est une affaire de minuterie. Selon vos besoins, vous restaurerez certaines valeurs d'EEPROM ou l'état externe aux paramètres d'usine par défaut avant que le microcontrôleur ne se réinitialise avec un appui long.

Cet extrait de code C réinitialisera le microcontrôleur après le court ou appui long ( fonction de minuterie de surveillance):

  #include <avr / wdt.h> // ... wdt_enable ( WDTO_15MS); pour (;;) {}  


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...