J'ai pensé à acheter une yaourtière d'une manière ou d'une autre. Oui, de telle sorte que le yogourt soit bon et toujours de la même qualité. Que faut-il pour cela? Premièrement, les matières premières, deuxièmement, la température précise et stable, troisièmement, le réglage du temps de cuisson. J'ai commencé à choisir et face à l'embuscade suivante: les fabricants de yaourts bon marché n'étaient pas réglementés. Autrement dit, à l'intérieur du fil chauffant, et ce fil, en fait, est connecté au réseau. La température à l'intérieur du yaourt dépend en même temps des mains du collecteur, de la température ambiante, des phases de la lune et de la profondeur de sommeil de Cthulhu (Cthulhu fhtagn, soit dit en passant).Bien sûr, cette situation ne me convenait pas. Et plus encore, j'étais gêné par la situation des fabricants de yaourts qui, par leurs fonctions et paramètres, me convenaient. Pour une raison quelconque, les fabricants de ces fabricants de yaourts estiment qu'ils fournissent des produits spatiaux au marché et que les prix de ces produits devraient être appropriés. Une forte angoisse mentale dans le processus de sélection m'a conduit au point où j'ai exprimé mon indignation à ma femme bien-aimée à propos de la politique de prix inhumaine des fabricants de yaourts et au cours des effusions verbales, j'ai formulé la phrase «Je ferai mieux pour cinq cents roubles», après quoi puis cliqué ...C'était la trame de fond. Et maintenant l'histoire.Dans le processus de construction d'un merveilleux appareil, j'ai rencontré un bug. Lorsque la température actuelle était affichée, le contrôleur redémarrait périodiquement. Autrement dit, parfois cela a fonctionné pendant des heures normalement, et parfois il a été réinitialisé toutes les quelques secondes. Comme cela a commencé à se produire après l'introduction de la fonction d'interrogation du capteur ds18b20 dans le firmware, il est naturel que je me tourne vers elle pour une recherche de bogue. Et n'a rien trouvé. La pile ne s'est pas cassée, la fonction n'a rien écrit dans ses zones mémoire. En général, cela a fonctionné comme il se doit. De plus, la désactivation de cette fonction a supprimé le bug, qui indiquait clairement (comme il me semblait à ce moment-là) le héros de l'occasion. Je pensais que tout était à blâmer pour le système de synchronisation.Comme j'ai une petite pierre (attiny2313a) et qu'il n'y a pas assez de minuteries pour toutes les lotions, je suis sorti de la situation en écrivant un gestionnaire de tâches qui reçoit les tâches et le temps de retard requis par les fonctions, les met dans la file d'attente. Puis, après avoir compté le temps nécessaire, il leur transfère le contrôle. J'ai réglé le temps de retard minimum à 1 milliseconde. Ce qui m'a permis de régler des délais de quelques millisecondes à une minute. Mais si vous regardez la fiche technique du capteur ds18b20, vous verrez que la communication avec le capteur de température dure parfois plus de 500 microsecondes (réinitialiser et attendre la présence).
Mais que se passe-t-il si, dans le processus, une interruption interfère avec la fonction de communication? Il y aura un décalage de tranche de temps, en raison duquel le contrôleur ne pourra pas lire le bit ou reconnaître correctement la présence. J'ai trouvé un moyen d'utiliser la synchronisation. Le processus est simple. Lorsque la fonction d'interrogation du capteur voit qu'elle aura une communication à long terme avec le capteur, elle établit une interruption dans le registre B du temporisateur 1 en même temps que l'interruption «gestionnaire de temps» située dans le registre A du temporisateur 1. Et puisque les interruptions sont traitées en stricte conformité avec l'adresse du vecteur d'interruption dans table d'interruption, il s'avère qu'après le processus de synchronisation, la fonction d'interrogation du capteur recevra le contrôle immédiatement après l'interruption du "gestionnaire de temps".Eh bien, où peut-il y avoir un bug? Oui partout. Mais personnellement, je pensais que le problème pourrait être à l'intersection des interruptions. C'est-à-dire dans le cas où un autre intervient pendant l'exécution d'une interruption. Le nettoyage du code pour résoudre ce problème s'est poursuivi jusqu'à ce que je découvre que mes actions ont conduit au fait que le problème a commencé à se produire même avec le capteur non connecté. Après avoir désactivé la fonction d'interrogation du capteur, j'étais convaincu que la réinitialisation du contrôleur ne dépend plus de son fonctionnement. Et puis une supposition brillante m'a frappé. Besoin de mesurer la tension! Le multimètre a joyeusement signalé qu'il y avait 4,2 volts sur le contrôleur. «Eh bien, bien sûr, DBO, je pensais. Et j'ai connecté une alimentation externe à la carte (avant cela, je me contentais de l'alimentation USB). Le multimètre grogna un peu, ce qui fait 4,98 volts sur la carte. Avec un sentiment de victoire, j'ai tourné le tableau pour voir l'incroyable. Un bug était présent!Et c'est devenu encore plus vigoureux. Maintenant, le contrôleur était réinitialisé toutes les deux secondes, et parfois en une fraction de seconde. Les recherches se sont poursuivies avec vengeance et ont conduit à une fonction qui affiche des informations à l'écran.Comme vous l'avez probablement deviné, tout allait bien avec elle, surtout qu'après l'avoir écrite, elle a été correctement testée. Et, néanmoins, tout a dit que mon bug insaisissable réside en elle. Il s'est avéré que le bogue se produit uniquement lors de l'affichage de la page de température actuelle. Les pages affichant la puissance, le début et l'heure du bug n'ont pas causé. Ne trouvant rien qui puisse provoquer ce comportement, j'ai décidé de miser sur la nourriture. A savoir, le fait que sous tension normale un bug se produisait plus souvent. En abaissant la tension, j'ai constaté qu'à 3,8 volts sur le contrôleur, ce dernier fonctionne de manière stable. La situation a déchiré tous les schémas. Et puis je me suis souvenu de la loi d'Ohm. Le courant est proportionnel à la tension. Est toujours? Non. Sur les LED, cette loi ne fonctionne pas. Cela fonctionne plus précisément, mais avec ses gadgets.La proportionnalité du courant à travers la diode n'est pas la même que sur une résistance conventionnelle, car les dispositifs semi-conducteurs sont pour la plupart non linéaires. N'oubliez pas au moins un thyristor ou une diode zener (diode zener). Voici une comparaison de la caractéristique courant-tension de la LED de la fiche technique (ligne noire) et de la caractéristique courant-tension de la charge résistive (ligne rouge)
On peut voir que pour la charge résistive, la loi d'Ohm est dieu et maître. Si la tension a augmenté de 10%, le courant augmentera du même 10%. Mais personne n'est un décret à la LED. Si vous augmentez la tension de la LED de seulement 10% (de 2 volts à 2,2 volts), son courant bondira de 100%, c'est-à-dire deux fois! Mais dans mon cas, l'essentiel était qu'une augmentation de la tension augmentait également son abaissement au moment où la diode était allumée. Et j'avais 32 diodes! Quatre indicateurs à sept segments avec chacun huit DEL (sept segments et un point). Ils ne me sont pas connectés par multiplexage, mais par registres à décalage car:1. Les conclusions du contrôleur attiny2313 faisaient cruellement défaut.2. Je suis agacé par leur scintillement lorsqu'il est connecté par multiplexage (nombre de fois de perfectionnisme)3. Le multiplexeur consomme beaucoup de ressources de contrôleur pour la sortie (perfectionnisme numéro deux).En outre, j'ai connecté des registres à décalage avec la fonction d'éteindre l'écran pendant la durée de la mise à jour de l'affichage (perfectionnisme numéro trois). Pourquoi ai-je abandonné cette fonctionnalité - je ne sais pas. Après tout, la logique que j'ai choisie peut fonctionner jusqu'à une fréquence de 100 MHz. En conséquence, les données peuvent y être poussées à la pleine fréquence du contrôleur, que j'ai à 10 MHz. Eh bien, qui a le temps de remarquer le mouvement des bits dans les bits de l'indicateur à une telle fréquence?Passez. La puissance de mon circuit est fournie par le régulateur L7805, voici son schéma de connexion.
Le régulateur fournit un courant de 1A sans aucun problème. À la sortie du régulateur se trouve un condensateur de 0,1 microfarad qui, en théorie, devrait atténuer les fluctuations de courant. Sa charge à 5 volts est de 0,5 microcoulomb. A 3,8 volts, la charge est respectivement de 0,38 microcoulomb. À 3,8 volts, les LED consomment environ 288 mA et à 5 volts environ 416 mA. En conséquence, lorsque la tension est augmentée de 3,8 volts à 5 volts, la charge stockée par le condensateur augmentera de 24%, mais la consommation de courant augmentera de plus de 30% en même temps. Les calculs sont bien entendu exemplaires mais montrent que la chute de tension dans un tel circuit est d'autant plus grande que la tension d'alimentation est élevée. À 3,8 volts, le rabattement n'était pas critique pour le contrôleur. Mais à 5 volts, le rabattement a augmenté et a commencé à réinitialiser le contrôleur. Et le contrôleur a été réinitialisé précisément sur la page d'affichage de la température carquels étaient exactement sur cette page tous les indicateurs d'affichage impliqués.La solution était simple. Dans le code, il vous suffisait de commenter les lignes pour activer et désactiver les indicateurs sbi displayPort, offDispWire et cbi displayPort, offDispWire. ldi XL, videoMem
cbi displayPort, shiftWire
cbi displayPort, storageWire
;sbi displayPort, offDispWire
ZpushToDisplay:
ldi temp2, 8
ld temp, X+
ZnextbitToDisplay:
cbi displayPort, dataWire
sbrc temp, 7
sbi displayPort, dataWire
sbi displayPort, shiftWire
cbi displayPort, shiftWire
lsl temp
dec temp2
cpi temp2, 0
brne ZnextbitToDisplay
cpi XL, videoMem+sizeVideoMem
brne ZpushToDisplay
sbi displayPort, storageWire
cbi displayPort, storageWire
;cbi displayPort, offDispWire
Les décharges ont cessé. Et le contrôleur a vécu heureux pour toujours.Z.Y. le processus de recherche de bugs insaisissable a indiqué un autre dévers dans le schéma. Le fait est que la puissance dissipée maximale des registres à décalage est d'environ 0,5 watts, et le courant à travers la sortie de puissance ou la masse est d'environ 70 milliampères. Si le chiffre huit avec un point est affiché, le courant dans le registre à décalage devrait être d'environ 104 milliampères, ce qui, comme vous le savez, est un excès. Ce n'est pas que je n'ai pas pris en compte ce moment. J'ai pris en compte. Mais dans le processus de calcul de la résistance de la LED, il a succombé à une faiblesse minuscule et a oublié que la LED est un élément non linéaire et pour réduire le courant à travers elle deux fois, il ne suffit pas de doubler la résistance de la résistance de limitation de courant. En général, dans toute situation incompréhensible, consultez le CVC!