Minuterie sur les indicateurs ATMEGA8 et LED. Programmation des microcontrôleurs AVR Minuterie sur ATMEGA8 Microcontroller avec écran LCD

LEÇON 10.

Compteurs de minuteries. Interruption

Aujourd'hui nous apprenons quoi compteurs de minuteries dans les microcontrôleurs et ce dont ils ont besoin et ce qui est interruption Et pourquoi ils sont également nécessaires.

Compteurs de minuteries - Ce sont de tels dispositifs ou modules dans un microcontrôleur qui, comme on le considère depuis le nom considèrent en permanence quelque chose. Ils considèrent à une certaine valeur, soit à une telle ampleur comme ils sont comme. Ils sont considérés comme constamment à une vitesse, avec la vitesse de la fréquence d'horloge du microcontrôleur, corrigée sur les diviseurs de fréquence, que nous configurerons dans certains registres.

Et ces compteurs de minuteries sont constamment considérés si nous les initialisons.

TIMERS EN MK ATMEGA8. Trois.

Deux d'entre eux sont octite Les minuteries, c'est-à-dire celles qui peuvent maximiser seulement 255. Cette valeur ne sera pas suffisante pour nous. Même si nous appliquons le diviseur de fréquence maximum, nous ne comptons pas la seconde, nous ne pouvons même pas compter à moitié. Et nous avons une telle tâche de prendre jusqu'à 1 seconde pour contrôler le compte croissant de l'indicateur LED. Vous pouvez bien sûr appliquer une extension fixe à une variable à une certaine quantité, mais je voudrais des comptes matériels entièrement matériels.

Mais il y a une autre minuterie - c'est une gamme à part entière 16 bitsminuteur. Il n'est pas seulement 16 bitsMais il y a encore certains charmes de caractères, qui ne sont pas d'autres minuteries. Avec ces options, nous apprendrons plus tard.

Voici cette minuterie 16 bits, nous étudierons et utiliserons aujourd'hui. Aussi, après avoir connu cette minuterie, vous ne vous coûterez pas vous-même de vous explorer le travail des deux autres, car ils sont beaucoup plus faciles. Mais néanmoins, les minuteries 8 bits à l'avenir seront également envisagées, car pour atteindre des tâches plus complexes, une minuterie ne suffira pas.

Maintenant brièvement sur les interruptions.

Interruption (Interrompt.) Ce sont les mécanismes qui interrompent le code en fonction de certaines conditions ou d'un certain environnement qui dictera certains périphériques, modules et pneus dans le microcontrôleur.

Dans notre contrôleur d'ATMEGA8, il y a 19 types d'interruptions. Ici, ils sont tous dans la table de la documentation technique du contrôleur

Quel type peut être les conditions? Dans notre cas, par exemple, il a fallu une minuterie à un certain montant, ou par exemple, l'octet et d'autres conditions sont venus dans un bus.

Pour le moment, nous traiterons l'interruption située dans la table placée au-dessus de 7 positions - Timer1 COMPA.Appelé à 0x006.

Voyons maintenant notre minuterie 16 bits ou Timer1.

Voici son programme structurel

On se voyive regretter là-bas Tcntn.Lorsque le nombre change constamment, c'est-à-dire en augmentation constante. Presque c'est le comptoir. C'est-à-dire que ce registre stocke le numéro auquel il comptait également la minuterie.

Et dans des registres Ocrna. et OCRNB. (Lettres n est un numéro de minuterie, dans notre cas, il y aura 1) - ce sont les registres dans lesquels nous entrons dans le numéro avec lequel le chilo sera comparé dans le registre TCNTN.

Par exemple, nous avons énuméré un certain nombre au registre OCRNA et dès que ce numéro a coïncidé avec la valeur dans le registre du compte, l'interruption se posera et nous pourrons pouvoir le traiter. Les minuteries ayant des interruptions sont très similaires au retard habituel du code, uniquement lorsque nous sommes dans un retard, alors nous ne pouvons effectuer aucun code (bien, encore une fois, "nous", en fait allu). Et lorsque la minuterie croit, tout le code de notre programme est calmement effectué pour le moment. Nous remportons donc de colossal, ce qui ne la laissa pas plus facilement pour des ressources énormes du contrôleur dans une seconde ou même une demi-seconde. À ce stade, nous pouvons gérer la presse de boutons que nous pouvons également traiter dans la minuterie et bien plus encore.

Il y a aussi un registre TCCR. Ce registre est un registre de registre. Il existe des bits définis qui sont responsables de la configuration de la minuterie.

En outre, la minuterie a plusieurs modes que nous rencontrerons également un peu de questions.

Il se compose de deux moitiés, car nous avons un confériste 8 bits et ne peut pas être des registres de 16 bits. Par conséquent, dans la moitié du registre (et physiquement dans un registre), la partie la plus ancienne du registre est stockée et dans l'autre - le plus jeune. Vous pouvez également appeler une paire de registres composée de deux registres distincts TCCR1A et TCCR1B. Le numéro 1 signifie que le registre appartient à la minuterie 1.

Le registre TCCR est responsable de l'installation d'un diviseur afin que la minuterie ne compte pas aussi rapidement, il répond également (ou plutôt ses bits certains) pour l'installation d'un mode spécifique.

Les bits de WGM sont responsables de la définition du mode

Nous voyons ici beaucoup de variétés de modes.

Normal - Il s'agit d'un mode normal, la minuterie croit à la fin.

Pwm. - c'est Cale Seules différentes variétés, c'est-à-dire que la minuterie peut jouer un rôle modulateur d'impulsion. Nous ferons connaissance avec cette technologie dans des classes ultérieures.

CTC. - Ceci est une coïncidence de réinitialisation, juste que nous avons besoin. Ici, les registres TCNT et OCR sont comparés. Deux modes de ce type, nous avons besoin du premier, le second fonctionne avec un autre registre.

Toutes les variétés de régimes que nous n'étudierons pas dans cette leçon. Lorsque nous avons besoin de ces modes, nous le découvrirons.

Eh bien, ne soyons pas demain vous-même et essayons enfin quelque chose dans certains registres à mettre.

Comme toujours, le code a été créé à partir du projet passé. Pour ProTeus, le code a également été copié et renommé de l'occupation passée, le chemin du nouveau firmware a également été spécifié dans les propriétés du contrôleur. Projets que nous appelons Test07..

Essayons comment compiler le code et l'exécuter dans Proteus. Si tout fonctionne bien, vous commencez à ajouter un nouveau code.

Nous allons ajouter une autre fonction, l'avantage d'ajouter des fonctions que nous avons apprises sur le passé. Le code de fonction sera placé après la fonction Segchare et la fonction principale. Après le fait que nous allons à l'intérieur de notre nouvelle fonctionnalité, appelez la fonction Segchare.

De plus, nous ne créerons pas une seule fonction, mais deux autres. Dans une seule fonction, nous placerons tout le code d'initialisation de notre minuterie et l'autre fonction sera un gestionnaire d'interruption de la minuterie, et ils ne sont pas spécifiques à de telles fonctions. Quand il devient nécessaire, ils se causeront en fonction de certaines conditions énoncées ci-dessus.

Donc la première fonction que nous avons appelée timer_ini.

//———————————————

annuler.timer_ini.( annuler.)

{

}

//———————————————

Aussi, utilisons nos fonctions, ainsi que certains blocs complets avec une publicité de variables globales, nous séparerons les uns des autres avec des prototypes de fonctions, qui, en raison de la présence de deux couches à venir, le compilateur ne traitera pas et les prendra aux commentaires. En raison de ces négociations, nous verrons où une fonction se termine et l'autre commence.

Comme on voit, cette fonction n'a pas d'arguments - aucune entrée, n'est pas retournée. Appelons cette fonctionnalité immédiatement dans la fonction principale ()

non signécarboniser.butcount \u003d 0,butstate \u003d 0;

timer_ini.();

Nous allons maintenant endommager le code.

Commençons par le registre de contrôle de la minuterie, par exemple avec TCCR1B. En utilisant notre opération préférée "ou", nous entrerons un certain peu du registre

annuler.timer_ini.( annuler.)

Tccr1b.|= (1<< Wgm12);

Du commentaire, nous voyons que nous travaillons avec les batailles du mode et nous n'installerons que les bits WGM12, le reste quittera les zéros. Basé sur cela, nous avons configuré ce mode:

En outre, la minuterie a toujours un tel registre - Timsk.. Ce registre est responsable des masques d'interruption - Masque d'interruption.. Ce registre est disponible pour toutes les minuteries, non seulement pour le premier, il est courant. Dans ce registre, nous allons installer des bits Ocié1a.qui allumera le type d'interruption dont vous avez besoin Timer1 COMPA.

Tccr1b.|= (1<< Wgm12); // Installez le mode STS (réinitialiser la coïncidence)

Timsk.|= (1<< Ocié1a.);

Jouons maintenant avec les registres de comparaison eux-mêmes OCR1A (H et L). Car cela devra compter un peu. S'inscrire Ocr1ah Stocke la partie plus ancienne du numéro à titre de comparaison et le registre Ocr1al - plus jeune.

Mais avant de calculer, remarquons le code avec des valeurs de ce registre, puis nous allons corriger, comme nous initialiserons le diviseur et il participera également au calcul du temps requis. Sans diviseur, la minuterie prendra trop rapidement.

Timsk.|= (1<< Ocié1a.); // Installer un peu d'autorisation de l'interruption de la 1ère coïncidence du compteur avec OCR1A (H et L)

Ocr1ah= 0B10000000;

Ocr1al= 0B00000000;

Tccr1b.|= ( ); // Installez le diviseur.

Jusqu'à présent, aucun diviseur n'est fixé, car nous n'avons pas encore pensé. Laissez-nous le faire.

Bien que nous ayons dans le registre OCR1A. Il existe un numéro 0B1000000000000000, qui correspond au nombre décimal 32768.

Le microcontrôleur fonctionne comme nous avons accepté 80 000 000 Hz.

Nous divisons 800000000 à 32768, nous obtenons environ 244.14. Ici avec une telle fréquence à Hertz et notre minuterie fonctionnera si nous n'appliquons pas un diviseur. C'est-à-dire que nos chiffres vont changer 244 fois par seconde, nous ne les verrons même pas. Par conséquent, le diviseur de fréquence de la minuterie sera appliqué. Nous choisissons un diviseur à 256. Cela va simplement nous adapter, et même jusqu'à 1 Hz, nous ajustons ensuite le nombre de comparaisons.

Voici quelques diviseurs pour 1 minuterie

J'ai alloué un diviseur dans la table. Nous voyons que nous devons installer uniquement des bits CS12.

Étant donné que le diviseur de fréquence est de 256 ans, nous partagerons 80 000 000 sur ce diviseur, il s'avérera 31250, c'est ce que nous devons mettre le numéro dans TCNT. À un tel nombre, notre minuterie considérera à compter jusqu'à 1 seconde. Le nombre 31250 est en représentation binaire 0B0111101000010010. Apportons ce numéro à la paire Enregistrer et appliquer également un diviseur

Ocr1ah= 0b. 01111010 ; // Ecrire un numéro au registre de la comparaison

Ocr1al= 0b. 00010010 ;

Tccr1b.|= (1<< CS12 ); // Installez le diviseur.

Avec cette fonction, tout.

Maintenant, la fonction suivante est le gestionnaire d'interruption de la coïncidence. Elle est écrite comme ça

Isr.( Timer1_Compa_vect.)

{

}

Et le corps de cette fonctionnalité sera effectué dans le fait de la compétence du nombre de chiffres.

Nous avons besoin d'une variable. Nous le déclarerons globalement, au début du fichier

#Inclure.

//———————————————

non signécarboniser.jE.;

//———————————————

En conséquence, du code dans la fonction principale (), nous supprimerons la même variable.

int.principale.( annuler.)

non signécarboniser.jE.;

Nous nous plaignons également tout le code dans un cycle infini. Son rôle maintenant Nous allons effectuer une minuterie et, je pense qu'il ne le pire plus, mais encore mieux, "personne" n'interfère pas avec cela.

pendant que(1)

{

// pour (i \u003d 0; i<10;i++)

// {

// tandis que (ButState \u003d\u003d 0)

// {

// si (! (PINB & 0B00000001))

// {

// si (butcount< 5)

// {

// butcount ++;

// }

// AUTRE.

// {

// i \u003d 0;

// butstate \u003d 1;

// }

// }

// AUTRE.

// {

// si (butcount\u003e 0)

// {

// butcount-;

// }

// AUTRE.

// {

// butstate \u003d 1;

// }

// }

// }

// segchare (i);

// _delay_ms (500);

// butstate \u003d 0;

// }

Maintenant, en fait, le corps de la fonction de gestionnaire. Ici, nous appellerons la fonction Segchare. Ensuite, nous augmenterons sur 1 variable jE.. Et de sorte qu'il ne va pas au-delà du numéro unique, nous allons le réinitialiser sous cette condition

Isr.( Timer1_Compa_vect.)

si.( jE.>9) jE.=0;

Segchare.( jE.);

JE.++;

Maintenant, je corrigerai un petit code au début de la fonction principale (). Port RÉ.Ce qui est responsable de l'état des segments, nous en prendrons un, de sorte que lorsque vous allumez, l'indicateur ne brille pas, car il s'agit d'une anode commune. Ensuite, nous apportons un numéro 0 à une variable globale I, juste pour la commande. En général, en règle générale, lors du démarrage de variables non spécifiées, et donc toujours des zéros. Mais nous l'initialisons toujours. Et, surtout, l'interruption de la minuterie a fonctionné, il ne suffit pas de l'inclure dans l'initialisation de la minuterie. En général, les interruptions mondiales doivent également être résolues pour toutes les interruptions. Pour cela, il y a une fonctionnalité spéciale sei () - Définir une interruption.

Maintenant le code sera ceci

DDRB.= 0x00;

Portd.= 0b. 11111111 ;

Portb.= 0b00000001;

jE.=0;

sei();

pendant que(1)

En outre, nous devons connecter le fichier de bibliothèque d'interruptions au début du fichier.

#Inclure.

#Inclure.

#Inclure.

De plus, les variables pour le bouton ne doivent pas être nécessaires pour nous, car nous ne travaillerons pas avec le bouton aujourd'hui. Commettre-les

int.principale.( annuler.)

// non signé Charcount \u003d 0, ButState \u003d 0;

timer_ini.();

Nous recueillons notre code et vérifions d'abord ses performances dans Proteus. Si tout fonctionne bien, vérifiez également dans un schéma vivant

Tout fonctionne pour nous. Excellent!

Voici un tel chronomètre. Mais puisque nous n'avons même pas de résonateur à quartz, ce chronomètre ne peut pas être appelé précis.

Néanmoins, aujourd'hui, nous avons beaucoup appris avec vous. Nous avons appris sur les interruptions, ils ont également appris à les traiter, ont appris à travailler avec les minuteries, configurez plusieurs nouveaux registres de microcontrôleurs, avant de travailler uniquement avec des registres de port. En outre, au détriment de tout cela, nous avons considérablement déchargé le dispositif logique arithmétique de notre microcontrôleur.

Voir le tutoriel vidéo

Post Vues: 17 258

La minuterie est conçue pour allumer la charge à un moment donné et à une autre, c'est-à-dire Charge de travail de travail à certains cadres de temps.

La conception de l'horloge en temps réel PCF8583 est appliquée dans un ensemble avec une batterie de montre de sauvegarde pour les heures de travail en l'absence de puissance. En tant que cerveau de l'appareil, un microcontrôleur ATMEGA8 avec tact de 16 MHz est appliqué.
L'appareil a été planifié de charger le téléphone - il n'y a donc pas de stabilisateur de 5V dans le schéma - il existe un connecteur d'alimentation 5V et 220V pour BP.
La charge est commutée sur le relais - avec le type spécifié dans le diagramme à 10A.
Il y a 3 LED dans le diagramme:
Options. - S'allume lorsque vous entrez dans les paramètres de l'horloge.
Temps. - Clignotant lorsque la minuterie fonctionne - ne brûle pas lorsque la minuterie est désactivée.
En dehors. - Affiche l'état du relais - on ou désactivé.
Boutons:
Sw1 - Bouton H..
SW2. - Bouton M..
Paramètres:
Définir des heures.
Pour personnaliser l'horloge, vous devez conserver le bouton Sw1 Avant le meneur de bronzer Options..
Le point s'allume et ne clignote pas - bouton Sw1 Horloge sont installés et le bouton SW2. Minutes.


Pour quitter les paramètres, vous devez également conserver le bouton. Sw1 jusqu'à ce que le voyant sort Options..
Régler la minuterie.
Pour configurer la minuterie dont vous avez besoin en mode affichage (mode debout - Basic). Sw1 - allumer la charge, SW2. - Il est temps d'éteindre la charge. Après le cadran de la minuterie, il entrera dans le mode d'affichage de l'heure si les boutons ne sont pas enfoncés dans les 2-3 secondes.


Désactivation de la minuterie.
Pour désactiver la minuterie, vous devez conserver et maintenir le bouton SW2. - L'appareil allumera la charge et la minuterie ne l'éteindra pas.
Schème.


Un connecteur ISP non standard est appliqué dans le diagramme:
1 - VCC.
2 - MOSI.
3 - Miso.
4 - SCK.
5 - Réinitialiser.
6 - GDN.

Cartes de circuits imprimés.



Dans la carte de circuit imprimé, un indicateur avec une anode courante E40361 est appliqué - mais il est possible d'autres avec une pince et des dimensions similaires.

Certains modèles 3D.




Un simple schéma d'une bonne minuterie sur ATMEGA8 MK, Navigation pratique dans le menu, écran LCD LCD, horloge en temps réel, pièces minimales.

Très utile, par exemple, pour les serres, il est possible d'organiser l'arrosage ou la circulation dans l'hydroponique, vous pouvez ajuster les mangeoires et les buveurs pour les animaux, les oiseaux et bien plus encore pour quoi.


Le cœur de cette minuterie est un microcontrôleur très populaire et plus cher ATMEGA8.

Bien sûr, pour le firmware, nous aurons besoin d'un programmeur, mais s'il n'est pas nécessaire, vous ne pouvez faire que 4 câblages connectés au port LPT conformément à ce schéma.

De quoi avons nous besoin:

Régime de minuterie

Comme on peut le voir, il n'existe pas de circuit d'alimentation et d'actionneur, c'est parce que vous pouvez décider d'utiliser un BP stabilisé distant, et il n'est pas non plus connu de la charge de la planification de la connexion, de sorte que tout le monde devrait choisir l'actionneur sous ses exigences techniques. .

Alternativement, l'actionneur sur les triages, les thyristors et les simistors est présenté ci-dessous.



Option de la mise en page Sprint.

Une attention particulière doit être accordée lors de l'installation de la puce de l'horloge et de l'élément de quartz. La longueur des pistes entre eux devrait être minimale et il est préférable d'utiliser micro-quartz des bracelets et de la souder directement sur les jambes de la MS de l'horloge. Tout espace libre à côté de l'horloge est rempli de cuivre sur le corps. La batterie est nécessaire pour maintenir des heures en état de fonctionnement tout en déconnectant du réseau. Si, pour une raison quelconque, vous n'avez pas installé cette batterie, placez le fil plus sur le corps, sinon l'horloge n'allait pas.

Le microcontrôleur est cousu par un programmeur ou à l'aide de 5 fils simples.

L'auteur du firmware (téléchargement - Multitimer) a essayé et n'a pas changé les FUBES, ce qui le rend très plus facile, sans problème, firmware pour une radio novice amateur. Si le MK n'a pas encore été utilisé, un nouveau du magasin, alors simplement vers le microprogramme et tout, mais s'il y a déjà des changements de fusibles, vous devez les définir comme cksel \u003d 0001. Tout le reste est simple et n'a pas besoin d'une explication.

Pour le logement, il est très pratique d'utiliser les distributeurs de plastique, ils sont de tailles et de formes différentes.

Dans le couteau de coupe coupé, avec l'aide d'une arme à feu d'une arme à feu, fixez l'écran LCD., Coupez les trous sous les boutons de commande et le bouton d'alimentation.

Nous placons tous les nœuds à l'intérieur du boîtier, vérifiant constamment comment la couverture est fermée, si nécessaire, nous portons ou balayons l'interférence.

Sur le schéma collecté, nous donnons des repas, une telle image devrait apparaître.

Le contrôle est effectué par quatre boutons. Le menu se compose de trois éléments, l'installation de l'horloge de l'horloge, des rins-emplacement de toutes les minuteries définies, la minuterie - Installation des minuteries.

Tout d'abord, entrez (*) dans le menu de l'horloge et exposition (\u003e) (<)(#) точное время.


Supprimez les boutons de contrôle sur la ligne inférieure de l'écran, chaque menu est différent, il n'est donc pas nécessaire de décrire les boutons.

Maintenant, tout est prêt à définir correctement la position de la minuterie, après avoir appuyé sur la grille, le programme est enregistré dans la mémoire permanente du MK.

Le compte à rebours vous aidera à mesurer avec précision l'intervalle de temps allant de 1 seconde à 24 heures.

Aujourd'hui, personne ne surprendre la conception de la minuterie, car En vente et sur Internet, de tels appareils que vous le souhaitez. Et toutes les minuteries semblent se ressembler. Et lorsque vous commencez à considérer les fonctions du système plus en détail, vous trouvez tout inconvénient pour vous-même.

Ici, à partir de ces considérations, j'ai fait un programme de minuterie qui répond aux paramètres suivants:
- conception compacte et circuit simple;
- bouton-poussoir opérationnel;
- lors de la gestion des boutons, des actions de duplication sur l'écran LCD;
- temps de tâche jusqu'à une seconde;
- compte à rebours de 1 seconde à 24 heures;
- Fonction de démarrage, pause;
- la fonction de réinitialisation de référence et les valeurs de temps exposées;
- lorsque la valeur est atteinte 00h00.00, l'actionneur est activé;

Toutes les tâches fixées ont été mises en œuvre dans ce projet.

Le compte à rebours vous aidera à mesurer avec précision l'intervalle de temps allant de 1 seconde à 24 heures.

Aujourd'hui, personne ne surprendre la conception de la minuterie, car En vente et sur Internet, de tels appareils que vous le souhaitez. Et toutes les minuteries semblent se ressembler. Et lorsque vous commencez à considérer les fonctions du système plus en détail, vous trouvez tout inconvénient pour vous-même.

Ici, à partir de ces considérations, j'ai fait un programme de minuterie qui répond aux paramètres suivants:
- conception compacte et circuit simple;
- bouton-poussoir opérationnel;
- lors de la gestion des boutons, des actions de duplication sur l'écran LCD;
- temps de tâche jusqu'à une seconde;
- compte à rebours de 1 seconde à 24 heures;
- Fonction de démarrage, pause;
- la fonction de réinitialisation de référence et les valeurs de temps exposées;
- lorsque la valeur est atteinte 00h00.00, l'actionneur est activé;

Toutes les tâches fixées ont été mises en œuvre dans ce projet.

Description des modes de fonctionnement de la minuterie

Après avoir allumé la minuterie, vous pouvez définir l'heure dont nous avons besoin. Le but des boutons est visible dans le diagramme. Après l'installation, vous appuyez sur la touche Start-Pause Comptage Démarrage. Temps de délai maximum 23.59.59.

La correction du temps de comptage peut être produite à tout moment de la minuterie, après l'alimentation du circuit.

Dès que le temps atteint 00h00h00, le voyant s'allume (au moment où elle imite l'inclusion de l'actionneur ou peut simplement être un grincement avec le générateur).

Si vous cliquez sur le bouton Start-Pause lorsque vous travaillez, la minuterie cesse de compter, appuyer sur la touche Start-Pause conduit à la reprise de l'arrêt de l'arrêt.

Pour désactiver la charge après la mise sous tension, vous devez appuyer sur la réinitialisation, les données de la minuterie seront installées 00.00.01 - Eteignez-la. Ou définissez une nouvelle période de référence et double appuyez sur le bouton Start-Pause.

Affichage sur les caractères LCD< ! \u003e Signifie que la charge est désactivée (PD3) et la durée de démarrage de l'heure de réglage commencera à appuyer sur le bouton Démarrer.

Quartz External 8 MHz, pour la précision du compte.

Liste des éléments radio

La désignation Un type Nominal numéro NoterButMon cahier
Mk avr 8 bits

ATMEGA8.

1 Dans le cahier
Régulateur linéaire

LM7805

1 Dans le cahier
Diode de redressement

1n4148.

1 Dans le cahier
Condensateur22 pf2 Dans le cahier
Condensateur0,1 mkf.1 Dans le cahier
100 μf1 Dans le cahier
Condenseur électrolytique470 μf1 Dans le cahier
Résistance

470 Oh.

1 Dans le cahier
Résistance forte5 com1 Dans le cahier
Résistance

10 com

1 Dans le cahier
Résonateur de quartz8 MHz1