Boutons Opituvannya avr. Connexion du bouton à l'AVR. Appareil étouffant les contacts gras

03.11.2021

Une expérience simple est décrite à partir de la connexion d'un bouton à un microcontrôleur AVR, il n'est pas possible d'installer un programme avec mon Cі pour appuyer sur un bouton. Jetons un coup d'œil aux fonctionnalités de connexion du bouton aux ports du MK et découvrons comment lire le bouton sur mon C.

Dans les articles précédents, des expériences ont été examinées avec des diodes lumineuses, qui étaient connectées aux ports du microcontrôleur, qui étaient connectés à la sortie (sortie).

Dans cet état, un bouton est connecté au microcontrôleur, dont les contacts, lorsqu'ils sont enfoncés, se ferment et lorsqu'ils sont enfoncés, ils s'ouvrent (bouton qui se ferme).

Schéma principal de l'expérience

Pour que vous puissiez regarder comme si vous cherchiez un bouton supplémentaire, deux autres diodes lumineuses sont connectées au microcontrôleur. Le schéma est déjà simple, l'axe est sorti :

Mal. 1. Schéma de principe de l'expérience avec le microcontrôleur et le bouton ATtiny2313.

Comme Bachimo, jusqu'à deux ports PB0 et PB1 via des résistances, qui sont entrelacées, deux diodes lumineuses sont connectées, et au port PD2 - un bouton et il y a aussi une résistance intermédiaire. Pour connecter le programmateur au MK, les prises Conn 1 (AVR-ISP) sont connectées, et pour connecter le circuit à l'alimentation + 5V, deux contacts sont reconnus - P1 et P2.

Mal. 2. Conçu sur un panneau de planche à pain sans soudure pour une expérience avec un microcontrôleur et un bouton.

Pour un switch sécurisé vers un port avec un bouton, connectez séquentiellement une résistance avec un support de 1 KΩ (vous pouvez aussi vous connecter sur un autre support de 600 Ohm - 2 KΩ). Acceptez, en règle générale, une tonalité chaude dans un robot à broches, comme s'il protégeait le port du MK à la sortie de la frette lors du pardon donnant à la broche un niveau élevé lorsque le bouton est fermé.

La structure des ports d'entrée et de sortie dans les microcontrôleurs AVR

Les broches du microcontrôleur sont universelles GPIO (General Purpose Input Output), elles peuvent être connectées en tant que périphérique auxiliaire (indicateurs, interrupteurs d'alimentation) et divers capteurs numériques (boutons, cavaliers).

Les broches Dekіlka de MK peuvent être connectées à ADC / DAC (Analog-Digital-Converter et navpaki), à partir desquelles vous pouvez également analyser et générer des signaux analogiques. Les GPIO primaires ne fonctionnent pas avec des signaux analogiques, ils peuvent avoir plus de 0 (0V) ou 1 (+5V) en entrée/sortie.

Avant la broche de skin GPIO au milieu du microcontrôleur, un bloc de blocs et de composants électroniques est connecté, dont vous devez savoir:

  • Port Mіzh pinom et durée de vie cutanée des pneus (GND en VCC) connecté derrière une diode. La puanteur vikoristovuyutsya pour "gasinnya" korotkochasnyh pereshkod, stribkіv naprugi schodo pіna que kozhnoї z fatigue zhivlennya;
  • De plus, entre la broche et GND, le condensateur est allumé. Je ne sais pas exactement quel type de vin est nécessaire, il peut être utilisé pour zahistu dans un changement de code, pour intimider les contacts bryazkit avec différents boutons et interrupteurs connectés à la broche, ou bien pour autre chose ;
  • Connecté à la broche de la peau clé électronique avec une résistance - pull-up. Cette clé électronique est activée par logiciel et sert à établir un niveau logique haut 1 (+5V) pour l'opération de verrouillage avec une broche en mode d'entrée (Input);
  • Deux interrupteurs électroniques (sans résistances) sont allumés entre les jeux de barres skin et skin (GND et VCC), la puanteur est nécessaire pour installer un niveau logique haut (+5V) ou bas (0V) sur les broches de la broche robotique dans le mode de sortie (Sortie) .

Pour la gestion logicielle et la configuration du port skin, trois registres spéciaux sont nécessaires, par exemple, pour le port "B":

  • DDRB - registre (8 bits) pour la configuration des modes robotiques - pour l'entrée ou la sortie. Il est nécessaire de définir les bits appropriés au niveau du registre ;
  • PORTB - enregistrez-vous pour le dépôt fiduciaire du port en mode port - haut ou bas. Il est également victorieux en mode d'entrée, zastosovuetsya pour l'inclusion de résistances pull-up (Pull-UP) et l'installation d'un haut niveau à l'entrée pour le verrouillage;
  • PINB - registre, qui est utilisé pour vérifier la logique des broches sur le port, pour lire les valeurs des ports, comme si elles étaient définies en mode d'entrée.

Des informations plus détaillées sur les pièces jointes de port pour un modèle de microcontrôleur spécifique peuvent être trouvées dans la fiche technique, dans la section "I / O-Ports", et là, vous pouvez également mettre du code en C et Assembler pour travailler avec les ports.

Broche RESET comme port de visite d'entrée

Il est important de savoir que la broche « RESET » du microcircuit (nous avons la broche numéro 1 sur le circuit), qui sert à la suppression des programmes du microcontrôleur (redémarrage), vous pouvez également utiliser la clé pour connecter des boutons, diodes lumineuses et autres périphériques d'entrée-sortie possibles, de sorte que vous pouvez effectuer des transformations Buti vers le GPIO d'origine.

Cela peut être différent, car le microcircuit n'a pas de broches pour votre conception. Par exemple, une fois plié, je le construirai sur la puce ATtiny13 (8 visnovkіv, 2 pcs - live, 5 pcs - port d'entrée-sortie, 1 pc - pour RESET) vous avez montré que vous n'aviez pas une broche pour la lumière . Vous trouverez ici quelques options pour résoudre le problème :

  1. Reprogrammation pina z RESET pіd I/O port;
  2. Connexion d'une lumière à l'un des sussidnіh vzhe vykoristanyh pіnіv, zastosuvshi deyakі cіrіstіv schématique prіshennі ta z urakhuvannymi posіdnіh yogo zagalny vikoristannya;
  3. La variante d'un autre MK peut avoir plus de broches, par exemple ATtiny2313.

Laquelle de ces options est la plus simple et la moins chère pour les finances / heure - à en juger par une humeur humide.

Pour convertir la broche "RESET" en port d'E/S, changez le fusible spécial - RSTDISBL (Reset Disable). Et tout d'abord, vous devez vous rappeler qu'après ces opérations, la reprogrammation du microcontrôleur ne sera possible qu'en raison du brouillage du programmeur haute tension (à 12V), tel que USB ISP, ou l'autre programmeur ne pourra pas fonctionner son propre 5V

Programme en C

De plus, nous avons un bouton et deux diodes électroluminescentes connectées au microcontrôleur, que peut-on en faire ? - et zrobimo mi axis sho (algorithme):

  1. Après avoir allumé la vivacité, la lumière clignotera alternativement et hors des 300 millisecondes ;
  2. Lorsque vous appuyez sur ce bouton du matin, seule une lumière bleue s'allume ;
  3. Une fois le bouton de lumière bleue activé, la lumière clignote 3 fois hors du fondu pendant 500 millisecondes, après quoi la lumière brille à nouveau à travers le fondu hors du fondu pendant 300 millisecondes.

Un exemple de la mise en œuvre d'un tel algorithme par mon Cі pіd AVR est présenté ci-dessous. Créons un nouveau fichier pour notre logiciel et logiciel d'édition :

Nano /tmp/avr-switch-test.c

Déplaçons le code dans le corps du fichier :

/* Expérimentez avec le bouton sur ATtiny2313 * https://website */ #define F_CPU 1000000UL // Fréquence du cœur = 1 MHz #include #inclure // -- Macros pour l'éclairage avec des LED -- #define LED_BLUE_ON PORTB |= (1<< PB0) // Засвечиваем синий диод #define LED_BLUE_OFF PORTB &= ~(1 << PB0) // Гасим синий диод #define LED_RED_ON PORTB |= (1 << PB1) // Засвечиваем красный диод #define LED_RED_OFF PORTB &= ~(1 << PB1) // Гасим красный диод // Основная программа void main(void) { DDRD |= (0 << PD2); // Пин 6 - на вход PORTD |= (1 << PD2); // Включаем подтягивающий (Pull-UP) резистор для пина 6 DDRB |= (1 << PB0); // Пин 12 - на вывод DDRB |= (1 << PB1); // пин 13 - на вывод // -- Бесконечный цикл -- while(1) { _delay_ms(300); // Задержка 300 мс LED_BLUE_ON; // Включаем синий диод LED_RED_OFF; // Гасим красный диод _delay_ms(300); LED_RED_ON; // Включаем красный диод LED_BLUE_OFF; // Гасим синий диод if(!(PIND & (1 << PD2))) { // Проверяем нажата ли кнопка _delay_ms(50); // Задержка 50 мс (дребезг контактов) LED_RED_OFF; LED_BLUE_ON; while(!(PIND & (1 << PD2))); // Ждем пока кнопка не будет отпущена _delay_ms(500); // Дальше мигаем синим диодом LED_BLUE_OFF; _delay_ms(500); LED_BLUE_ON; _delay_ms(500); LED_BLUE_OFF; _delay_ms(500); LED_BLUE_ON; _delay_ms(500); LED_BLUE_OFF; _delay_ms(200); } // Конец блока работы с кнопкой } // Конец блока с вечным циклом }

On nous demande avant nous Constante F_CPU Cependant, si le compilateur travaille sur la fréquence du cœur du microcontrôleur, il est nécessaire que les sous-programmes et les fonctions aient été traités correctement. L'application a une fonction de retard pour l'heure - "_delay_ms" de la bibliothèque "util/delay.h", comme un retard d'une heure de retard sur un cycle hostile, en spirale jusqu'à la valeur de la constante F_CPU.

Regardez le code de la bibliothèque "delay" pour organiser le délai par heure et de quelle manière la constante F_CPU est fixée, vous pouvez utiliser GNU Linux pour l'aide de n'importe quel éditeur de texte, par exemple, vous pouvez utiliser la commande suivante :

Nano /usr/lib/avr/include/util/delay.h

La fréquence réglée en usine de l'oscillateur RC interne dans le microcontrôleur ATtiny2313 est de 8000000Hz (8MHz), également pour le réglage par défaut du fusible sous la fréquence - CKDIV8 (Clock Divide by 8), de sorte que la fréquence de fonctionnement réelle du cristal est de 800000.

Vous pouvez voir comment le fusible est installé dans le microcontrôleur à l'aide de l'avrdude ou du shell graphique au nouveau appelé AVR8 Burn-O-Mat.

Le programme a reçu des macros pour gérer le port camp, auquel la lumière est connectée : LED_BLUE_ON, LED_BLUE_OFF, LED_RED_ON, LED_RED_OFF. Si vous appelez une macro similaire dans n'importe quel programme, nous pouvons simplement l'allumer ou éteindre la peau des lumières, ne répétez pas le même code, afin que vous puissiez demander le programme de votre côté et l'écraser la première place.

Dans le programme principal "void main(void)", nous démarrons le robot avec la configuration du port :

  • DDRD |= (0<< PD2) - установка разряда PD2 регистра DDRD на ввод, к нему подключена кнопка (пин 6);
  • PORT |= (1<< PD2) - включение подтягивающего резистора для пина к которому привязан разряд PD2 регистра PORTD (пин 6);
  • DDRB | = (1<< PB0) - установка разряда PB0 в регистре DDRB на вывод, к нему подключен СИНИЙ светодиод (пин 12);
  • DDRB | = (1<< PB1) - установка разряда PB1 в регистре DDRB на вывод, к нему подключен КРАСНЫЙ светодиод (пин 13).

Dali, macros vicoristes, mi éteindre la lumière rouge et allumer le bleu. Maintenant, en plus d'une boucle éternelle de plus, nous pouvons encore attendre que le bouton s'affiche : "while (! (PIND & (1)<< PD2)));".

Lorsque le bouton est enfoncé sur la broche 6, une valeur élevée apparaîtra (pour augmenter la résistance interne, qui est utilisée, que nous avons allumée plus tôt), et un 1 logique sera inséré dans la ligne PD2 du registre PIND.

Après cela, le clignotement triple (vmknenny-vimikannya) de la diode lumineuse bleue du fondu en 0,5 seconde et le cycle éternel principal commence à fonctionner d'une nouvelle manière - deux diodes lumineuses sont déclenchées en fonction de l'appel.

Le programme est encore plus simple ;

Montage Geany pіd ATtiny2313

Dans les publications précédentes, j'ai mené des expériences avec le microcontrôleur ATMega8, ici il y a moins de "bourrages" du MK - ATTiny2313.

Pour compiler le firmware dans le MK, vous devez modifier les commandes de sélection dans l'environnement de programmation intégré Geany.

Idemo dans le menu Build - Set Build Commands. La commande de compilation (commandes C) doit changer le modèle de puce qui sera arrêté : "-mmcu=attiny2313". Pour que la commande flashe le MK, vous devez changer le type de puce pour avrdude : "-p t2313".

Mal. 3. Reconfiguration de Geany pour robots avec microcontrôleur ATTiny2313.

Toutes les commandes de guidage pour le système d'exploitation GNU Linux, si vous avez Windows, vous pouvez écrire différents chemins vers les fichiers binaires "avr-gcc.exe", "avr-objcopy.exe", "avrdude.exe".

Plus de détails sur la façon de construire Geany sous GNU Linux, j'ai regardé dans l'un des articles précédents de la série.

Compilation et firmware en MK

La compilation, le pliage et le micrologiciel du programme peuvent être téléchargés en appuyant sur trois boutons au milieu de Geany : "Compiler", "Construire" et "Exécuter". De plus, ces opérations peuvent être enroulées depuis la console, l'axe de la commande pour ces opérations (enroulement séquentiel):

Avr-gcc -mmcu=attiny2313 -Os /tmp/avr-switch-test.c -o /tmp/avr-switch-test.o avr-objcopy -j .text -j .data -O ihex /tmp/avr- switch-test.o /tmp/avr-switch-test.hex avrdude -c usbasp -p t2313 -P usb -U flash:w:/tmp/avr-switch-test.hex

Les commandes moustache peuvent être complètement (avec un peu de noms de fichiers) identiques à celles que nous avons corrigées pour les personnalisations Geany.

Visnovok

Indépendamment de la simplicité de l'expérience, j'ai également essayé de mettre en évidence certains des moments techniques les plus importants du travail avec les ports, la connaissance de ces informations sera similaire à la formation continue des robots avec des microcontrôleurs ATMEL.

Parfois, il peut être fait même une petite pièce jointe, par exemple un ordinateur de vélo. Mais la conception ne permet pas le placement d'un grand nombre de boutons. Zagal nous avons un bouton pour l'introduction et rien de plus.

Esprit spartiate, mais ici, vous pouvez lancer le menu riche et fonctionnel et d'autres accessoires de la vie. à la fois je montrerai une des implémentations d'un tel contrôle.

Otzhe, quel est notre bouton ?

  • Її peut être abrégé en pointillés
  • Vous pouvez pousser longtemps
  • Vous pouvez travailler différentes combinaisons pour pousser
  • Її vous pouvez laisser entrer au bon moment


Pas épais, mais rien. Pour un bouton, s'il vous plaît. La tête zatik lors de l'écriture de ceci est de ne pas gaspiller beaucoup de ressources système (heure processeur, minuteries et rangements) pour la production d'un bouton malheureux. Aja, il nous arrive de voir le fait de l'assaut, le fait de l'assaut, l'heure de l'assaut, le dernier de l'assaut à l'aube. Je suis friand de telles pédales pour la mise en œuvre de cette interface, que j'ai été simplement étonné de voir comment il est possible d'entasser des imbéciles et des galles sur un pin, et aussi de regarder toutes les minuteries :)

De plus, TK se présente :

  • Minuteries matérielles quotidiennes, minuteries de contrôleur.
  • Timchasovyh zatrimok tous les jours, seulement vyklik à vous-même à la minuterie.
  • Chіkuvan onslaught-vіdtskannya tous les jours par cycles. Ils sont entrés, ils ont mal interprété - ils ont donné la direction.
  • Nous introduisons l'intervalle horaire mode_time, en étirant une sorte de combinaison pour presser. Dites 2s
  • A la sortie, il y a un certain nombre d'appuis courts et longs pour tout l'intervalle

Algorithme
Nous faisons tout sur la machine terminale. Le nouveau aura trois camps :

  • Haut - le bouton n'est pas enfoncé
  • Dn - bouton enfoncé
  • Al - le bouton est relâché après une poussée de trois rouleaux

Et il y aura aussi une procédure de service, de sorte que via mode_time (2c) après la première action avec le bouton de sauvegarde, tous les résultats seront sauvegardés avec eux. Ce qui n'a plus d'importance. Les programmes Vіd se couchent.
Et tout ce bruit tournera par cycles, s'appelant à travers le répartiteur (ou comme s'il s'agissait d'un rang) toutes les 20 ms.

En haut
Entrer.
Chi le bouton n'est pas enfoncé? Yakscho pas - apparemment. S'il est enfoncé, la machine automatique est déplacée à la position Dn
Chi perevіryaєmo vpershe pour l'intervalle mi ici? En tant que premier, nous mettrons ensuite notre procédure de service au début du lancement (en 2s), nous lèverons le drapeau indiquant que le processus est terminé.
Apparemment.

Dn
Entrer.
Avez-vous déjà appuyé ? Si ce n'est pas le cas, le bouton est déjà relâché, tombant dans le camp dans Up et sécurisant un court assaut, plus que quelques courts assauts cnt_s. Dès qu'il est pressé, alors on l'appelle un lichnik à l'heure de la timidité de l'assaut du Temps. La trivalité vimiryuvannya nous allons dans les itérations de la machine. Une itération 20ms. La limite de l'assaut à long terme est de 20 itérations, ce qui donne environ 400 ms. Tout ce qui est supérieur à 0,4 s est important pour un assaut de longue durée. S'il frappe plus de 20 itérations, alors un jour de frappe est garanti et la machine est jetée au camp d'Al. Apparemment.

Al
Entrer.
Ils ne vous ont pas encore laissé entrer ? Si non, alors apparemment. Une fois le bouton relâché, nous passons à Up, laissant tomber le changement d'heure.


En une heure, mode_time, en deux secondes, le ciel peut être poussé - tout est à nous. La procédure d'analyse des données collectées et de ratissage du naticane va commencer. Tout y est simple. Banal case'om robimo nous avons besoin d'action. Je suis l'axe, par exemple, je place les enseignes comme si elles changeaient l'ordre. Golovne n'a pas bloqué l'ordre avec quoi que ce soit d'important, afin de ne pas laisser passer la combinaison offensive.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 #inclure u08 bt1, bt2, bt3, bt4, bt5, bt_l, bt_l2, bt_al ; // Changer - les proportions des boutons pressés. // Travailler efficacement avec les champs de bits // Alemeni muait. Optimisez-vous :) u16 bt_mode_time = 2000 ; // Trivalité de l'analyse de séquence // Écrasé par le changement, mais pas par une constante // pour que vous puissiez le changer un peu. abaissement // là, où vous devez vérifier les combinaisons trivalides // qui encourage fortement l'étrangeté de l'interface u08 bt_cnt ; // Flag, qui signale qu'il y a une analyse de la séquence u08 bt_cnt_s ; // Attaque courte de Lіchilnik u08 bt_cnt_l ; // Assaut de Lichilnik dovgih annuler bt_scan(annuler ) // Cette fonction est un scanner. Vaughn est coupable d'appeler toutes les 20 ms { #define up 0 // Définit la configuration de l'automate. 0 - par défaut.#define dn 1 #define al 3 statique u08 bt_state = 0; // Changer l'étourdissement de la machine statique u08 bt_time = 0 ; // Changer l'heure du robot de la machine commutateur (bt_state) // Vlasne automatique( case up : ( si (Fermer) // Comment le bouton est pressé(bt_state = dn; // Down stage bt_time = 0; // Remise à zéro de l'horloge si (bt_cnt== 0 ) // Quelle est la suite de la combinaison(SetTimerTask(bt_ok, bt_mode_time); // Lancer la procédure d'analyse bt_cnt = 1 ; // Pіshov pіshov! ) ) Pause ; // Exit ) case dn: ( if (Fermer) // Toujours pressé ?( si (20 > bt_time) // Pressé moins de 20 * 20ms ?(// Donc bt_time++; // Plus grand nombre d'itérations) sinon (bt_state = al ; // Salut, déjà plus ! Mais nous avons un long assaut! Allons à AL bt_time = 0 ; // Jeter l'heure de l'assaut bt_cnt_l++ ; // Zarakhovuєmo un assaut dovge)) sinon (bt_state = up ; // Bouton activé ? bt_time = 0 ; // Heure virée à zéro bt_cnt_s++ ; // Attaque courte de Lіchilnik) Pause ; // Exit) case al : // Et puis mi yakscho bulo dovge assaut(if (Open) // Laisser aller ? (bt_state = up ; // Alors ! Étape dans Up bt_time = 0 ; // Heure à 0 bt_al = 1 ; // Correction de l'entrée "Entrée la veille") Pause ; )) SetTimerTask(bt_scan, 20); // En boucle dans le répartiteur. } // Et cette fonction yak, au bout de 2 secondes, elle s'occupera des résultats de la farce vide bt_ok(vide ) // Attrapez le décryptage ici(commutateur (bt_cnt_s) // Vous vous demandez combien d'éléments courts pousser(Cas 1 : bt1 = 1 ; pause ; // Un tel enseigne et ensemble cas 2 : bt2 = 1 ; Pause; cas 3 : bt3 = 1 ; Pause; cas 4 : bt4 = 1 ; Pause; cas 5 : bt5 = 1 ; Pause; par défaut : pause ; ) interrupteur(bt_cnt_l) // Admirez le skilki pour pousser l'autre(Cas 1 : bt_l = 1 ; pause ; // Un tel enseigne et ensemble cas 2 : bt_l2 = 1 ; Pause; par défaut : pause ; ) bt_cnt = 0 ; // On laisse tomber les lichniks bt_cnt_s = 0 ; bt_cnt_l = 0 ; )

#inclure u08 bt1, bt2, bt3, bt4, bt5, bt_l, bt_l2, bt_al ; // Changer - les proportions des boutons pressés. // Travaillez efficacement avec les champs de bits // Alemen muait. Optimisez-vous :) u16 bt_mode_time = 2000; // La trivalité de la séquence d'analyse // C'est un changement, mais pas une constante // il fallait le changer à la volée. Abaissement // là où il n'y a pas de traces de combinaisons triviales // ce qui favorise fortement l'étrangeté de l'interface u08 bt_cnt; // Flag, qui signale qu'il y a une analyse de séquence u08 bt_cnt_s; // Appui court u08 bt_cnt_l; // Lіchilnik dovgikh onslaught bt_scan(void) // Quelle est la fonction du scanner. Il est chargé d'appeler une fois toutes les 20ms ( #define up 0 // Définir l'état de l'automate. 0 - par défaut. #define dn 1 #define al 3 static u08 bt_state=0; // Changer l'état de la machine static u08 bt_time =0 ; // Changer l'heure de travail de l'automate switch(bt_state) // L'automate est ouvert ( case up : ( if(Close) // Le bouton est enfoncé ( bt_state = dn; // Stage in Down bt_time = 0; // Reset timer if (bt_cnt==0 ) ) // Comme ci-dessus dans la combinaison ( SetTimerTask(bt_ok,bt_mode_time); // Exécuter la procédure d'analyse bt_cnt =1; // Bonne chance! ) ) break; // Exit ) case dn: ( if (Fermer) // Toujours appuyé dans AL bt_time = 0 ; // Sauter l'heure d'appuyer sur bt_cnt_l++ ; // Réserver une poussée supplémentaire)) else (bt_state = up ; // Bouton relâché ? bt_cnt_s++ ; // Appui court stop) break ; // Departure ) case al: // Et ici nous avons un autre push ( if(Open) // Let it go? ( bt_state = up; // So! Up stage bt_time = 0; // Heure à 0 bt_al = 1; // Fixe sous "Omission après le précédent") pause;)) SetTimerTask (bt_scan, 20); // En boucle dans le répartiteur. ) // Et puis la fonction du yak après 2 secondes appellera et prendra tous les résultats du pidrakhunka void bt_ok(void) // Attrapez le décryptage du code ici ( switch(bt_cnt_s) // Regarder combien de courts pousser ( case 1 : bt1 = 1 ; break ; // Cette enseigne est définie case 2 : bt2 = 1 ; break ; cas 3 : bt3 = 1 ; break ; cas 4 : bt4 = 1 ; break ; cas 5 : bt5 = 1 ; break ; par défaut : break ; case 1 : bt_l = 1 ; break ; // Cette enseigne est définie case 2 : bt_l2 = 1 ; break ; par défaut : break ;) bt_cnt = 0 ; // Saute la lichi bt_cnt_s = 0 ; bt_c ;)

Le code est écrit de telle manière que littéralement quelques lignes y sont liées sur l'AVR. Acceptez le bouton pressant au code de l'interprète. Toutes les fixations sur le fairway vont près de la tête, mais il n'y a rien là :

1 2 3 4 5 6 7 8 9 10 11 #inclure #inclure #define Ouvrir(BTN_PIN & 1<#define Close (!Open) extern void bt_scan(void ) ; void bt_ok(void); externe u08 bt1, bt2, bt3, bt4, bt5, bt_l, bt_l2, bt_al; externe u16 bt_mode_time ;

#inclure #inclure #define Ouvrir(BTN_PIN & 1<

Otzhe, portuvati tse pour l'autre architecture à droite, changez deux rangées. Eh bien, vous devrez peut-être modifier le mécanisme d'exécution automatique et le démarrage de la fonction de recherche. Comment allez-vous gagner en tant que répartiteur, système d'exploitation, ou bien en tant que système d'organisation du micrologiciel. Ale tse deux lignes dans le code à corriger.

Tout ce qui est décrit dans l'article est dans deux fichiers bouton.cі bouton.h

Vidéos robots

Dribniak
Se battre avec de la boue n'est plus obov'yazkovo ici. Parce que la fréquence de balayage est faible, de sorte que le bouton du modèle TM2 n'a pas émis de son sale - il s'est terminé plus tôt, diminuez le début du balayage. Et l'axe de ce qui peut être fumé ici, alors c'est tse zahist de la meilleure façon possible dans le résultat. Adzhe varto à l'avant pousse la ligne au moment de la lecture et sécurise l'assaut ponctuel. Il est possible de s'évader, après avoir fait le tour de l'automate. Disons qu'après avoir ajouté la dernière itération à Up, disons, deux ou trois itérations confirment que le bouton est toujours enfoncé et passent à Dn.

Choix
A vrai dire, j'ai un peu changé l'habillage de mon projet. Parce que si je n'avais pas besoin de beaucoup plus de pressions, alors j'ai mis l'enseigne "Dovge pressure" devant l'obrobnik AL i, contagieusement, en rangeant le nombre d'anciennes pressions. Ce qui a permis de déplacer l'étrangeté de l'interface robotique de l'accessoire, préjudiciable à l'assaut de l'entrée zdіysnyuvavsya à l'élément de menu, et la combinaison de deux longs assauts n'a pas vikoristovuvalis vzagalі.

Eh bien, j'ai compris que la même machine finale peut être mise sur un rozbіr de quelque chose à tout moment. Par exemple, à l'occasion de toute autre enseigne, sous forme de clavier matriciel, ou d'extension de signal.

Sur mes machines à microcontrôleur, j'ai un bouton vicoriste permanent. Tom a écrit conducteur simple travailler avec eux. Dans la version actuelle, le conducteur a été emprisonné sous les boutons, et il est facile d'en faire trop. Dans cet article, je décrirai les fichiers du pilote, et dans l'analyse offensive, il y a un mégot pratique.

Schème

Le schéma de connexion des boutons est traditionnel, un contact du bouton est connecté à la sortie du microcontrôleur, l'autre est à zéro. Tirer les résistances internes. Les boutons sont connectés aux interrupteurs principaux du microcontrôleur, afin de ne pas interférer avec les fonctions des interrupteurs externes.

En tête de fichier

Fichier d'en-tête pour supprimer les noms symboliques des registres et des connexions au port auquel le bouton est connecté. Cody, qui sera écrit dans le tampon lors de l'appui sur les boutons. Prototypes de fonctions.


void BUT_Init(void);

Nalashtovy vysnovki à certains boutons de connexion sur l'entrée et allumez les résistances qui tirent. Appelez en épi main`a.


void BUT_Debrief(void);

Activation unique du bouton Viconu. La fonction de mise en œuvre de la protection anti-écrasement est que le numéro du bouton sera entré dans le tampon, il est coupable d'être pressé par l'étirement d'un nombre donné de cycles d'itération. Le numéro du bouton est entré une fois dans la mémoire tampon, de sorte que le bouton sera supprimé pendant une longue période. Cette fonction est appelée en interrompant le temporisateur.


caractère non signé BUT_GetKey(void);

Tournez le bouton au lieu du tampon, lorsque le tampon est vidé. Appelé depuis la boucle principale du programme.

void BUT_SetKey(clé de caractère non signée);

Écrire dans la valeur du tampon. Vikoristovuetsya pour appuyer sur le bouton.

Fichier actuel

Ce fichier doit remplacer l'implémentation de toutes les fonctions. Parmi eux, l'intérêt n'est peut-être qu'une fonction de l'éducation.


Le bouton de l'horloge zvichayna peut être changé dans deux camps - celui enfoncé et celui relâché (le troisième camp est mauvais, ne nous appelez pas immédiatement). Dans un vipadka idéal, le bouton se déplace d'une station à l'autre, mais en réalité, lorsqu'il est pressé, les contacts clignotent et s'ouvrent, le premier se penche en arrière dans une station fermée. C'est ce qu'on appelle un bryazkale de contacts, et il est puissant pour tous les interrupteurs mécaniques.

Le microcontrôleur fonctionne à une fréquence de mégahertz, et pendant qu'il bourdonne, vous pouvez réinitialiser le bouton du sprat une fois. Si vous ne vous habituez pas à de tels appels, les contacts bryazkit seront «pris» par le microcontrôleur comme un assaut riche. Pour certains programmes, ce n'est pas critique, par exemple, car le bouton allumera la lampe. Ale zdebіlshgo tse nebazhane.

Les contacts Dribnennya peuvent être utilisés matériellement, à l'aide d'un filtre passe-bas passif. Mais il est beaucoup plus facile de surmonter le bryazkit, après avoir rendu le programme du microcontrôleur inacceptable pour le nouveau. Une variante de l'implémentation similaire à l'algorithme de la fonction BUT_Debrief()

#define SEUIL 20

caractère volatile non signé touche enfoncée = 0 ;
caractère non signé comp = 0 ;

annuler MAIS_Debrief( annuler )
{
caractère non signé clé;

//Tests de suivi de visnovkіv mk

si(BitIsClear(PIN_BUTTON, ENTER))
clé = KEY_ENTER ;
sinon si(BitIsClear(PIN_BUTTON, ANNULER))
clé = KEY_CANCEL ;
sinon si(BitIsClear(PIN_BUTTON, UP))
clé=KEY_UP ;
sinon si(BitIsClear(PIN_BUTTON, DOWN))
clé = KEY_DOWN ;
autre{
clé = KEY_NULL ;
}

//quelle est l'heure du changement temporel ?
si(clé) (

//et ainsi le bouton disparaîtra longtemps
//écrit її nombre dans le tampon
si(comp == SEUIL) (
comp = SEUIL + 10 ;
pressedKey = clé ;
retourner ;
}
sinon si(comp< (THRESHOLD+5)) comp++;

}
autre comp=0 ;
}

Sur l'épi de la fonction, il y a une expérimentation ultérieure de visnovkiv. Dès que le bouton est enfoncé, le code de la clé sera entré dans la clé de Timchas. Revoyons la signification de la composition de changement, afin que vous sachiez combien de temps le bouton est dans le camp pressé. Tant que comp n'atteint pas une certaine valeur de seuil THRESHOLD, il incrémentera. Dès que la valeur de comp devient égale à THRESHOLD, la touche sera copiée dans la mémoire tampon du bouton pressedKey. Avec cette comp, une nouvelle valeur est supprimée, de sorte que lorsque les boutons sont enfoncés, le microcontrôleur n'incrémente pas le changement et n'écrit pas dans le tampon. De cette manière, tant que le bouton n'a pas été appuyé longtemps, le microcontrôleur enregistrera le fait qu'il n'a été appuyé qu'une seule fois.

Pour finir souvent, les boutons sont victorieux pour régler toutes les valeurs changeant linéairement. De cette façon, vous pouvez modifier manuellement un tel algorithme - une courte pression sur le bouton modifie correctement la valeur, une pression rapide est rapide. Soumettez une partie de la fonction à l'expérience et prenez une variante simple de l'implémentation de l'algorithme.

#définir SEUIL2 300
...
si(clé)
{
si(comp > SEUIL2)
{
comp = SEUIL2 - 40 ;
pressedKey = clé ;
retourner ;
}
autre comp++;

si(comp == SEUIL)
{
pressedKey = clé ;
retourner;
}
}
autre comp=0 ;
...

Maintenant, dès que le bouton est réduit pendant plus de 300 cycles, le microcontrôleur écrira encore et encore le code dans le tampon.

Sur tsimu, tout est immobile, mais le sujet des boutons n'est pas clos. Dali être...

Tâche : Élargissons le programme de soins avec une seule lumière. Lorsqu'on appuie sur le bouton, la lumière s'allume, lorsqu'elle s'éteint, elle s'éteint.

Pour l'épi, je vais ajouter un schéma important. Pour la connexion au microcontrôleur, qu'il y ait des pièces jointes externes, il y a des ports et des E/S. Cuir des ports du bâtiment pratsyuvati yak à l'entrée et à la sortie. Nous allumons la lumière sur l'un des ports et le bouton sur l'autre. Pour qui nous confirmerons le contrôleur Atmega8. La puce a 3 ports pour les E/S, peut-être 2 temporisateurs/horloges à huit bits et 1 à seize bits. Un PWM à 3 canaux, une conversion analogique-numérique 10 bits à 6 canaux et bien plus encore sont également intégrés. À mon avis, le microcontrôleur est merveilleusement adapté pour apprendre les bases de la programmation.

Pour connecter la diode électroluminescente au vicoriste, nous utilisons la ligne PB0, et pour lire les informations des boutons, nous utilisons la ligne PD0. Le schéma est illustré à la Fig.1.

Mal. un

À travers la résistance R2, une tension positive est appliquée à l'entrée PD0, ce qui donne un signal d'une unité logique. Lorsque le bouton est fermé, la tension tombe à zéro, ce qui s'apparente à un zéro logique. Nadal R2 peut éteindre les circuits, en le remplaçant par une résistance de tension interne, en introduisant les ajustements nécessaires dans le programme. Connexions légères au port de sortie PB0 via la résistance R3, qui entoure la strum. Pour allumer la lumière, vous devez envoyer un signal d'unité logique à la ligne PB0. Réglez le générateur d'horloge pour qu'il vicore en interne à 4 MHz, car le module complémentaire n'a pas de hautes fréquences tant que la fréquence n'est pas stable.

Nous écrivons maintenant un programme. Pour l'écriture des programmes, j'utilise un support logiciel vicorist Studio AVRі winavr. Ouvrez AVR Studio, fusionnez à la fin du bain, appuyez sur le bouton "Créer un nouveau projet" (Nouveau projet), sélectionnez le type de projet - AVR GCC, écrivez le nom du projet par exemple "cod1", remettez les cases à cocher "Créer un dossier pour le projet" et "Créer un fichier "bouton d'initialisation", appuyez sur le bouton "Dalі", sélectionnez "AVR Simulator" dans la fenêtre de gauche et le type de microcontrôleur "Atmega8" dans la fenêtre de droite, cliquez sur le " Terminer", ouvrez l'éditeur et l'arborescence de la catégorie de projet - l'installation est terminée.

Pour la première fois, ajoutez le texte standard des descriptions Atmega8 pour l'aide de l'opérateur pour recevoir les fichiers téléchargés : #inclure

syntaxe des directives #inclure

#inclure<имя_файла.h>
#include "mon_nom_fichier.h"

Arches de Kutovі< и >pour indiquer au compilateur quels fichiers inclure, il est nécessaire de rechercher dans le dossier standard WinAvr avec les noms d'inclusion. Déplacez les pattes et demandez au compilateur de lancer une recherche du répertoire dans lequel le projet est enregistré.

Pour le microcontrôleur de type skin, il existe un fichier d'en-tête séparé. Pour ATMega8, ce fichier s'appelle iom8.h, pour ATtiny2313 - iotn2313.h. Sur l'épi du programme skin, connectez le fichier d'en-tête du microcontrôleur, qui est un peu clin d'œil. Et puis il y a le gros fichier d'en-tête io.h. Le préprocesseur traite ce fichier et inclut le fichier d'en-tête requis dans notre programme.

Pour nous, la première ligne du programme peut être vue comme l'axe comme ceci :

#inclure

Si le programme de mon Cі est coupable d'obov'yazkovo revenge one head function. Vaughn maє im'ya main. La programmation est toujours démarrée à partir de la fonction principale. Fonction maє en-tête - int main(void) et body - il est entouré d'arcs bouclés ().

int principal (vide)
{
corps de fonction
}

Au corps de la fonction, nous ajoutons notre code. Les noms de fonction sont précédés du type de valeur à faire pivoter. Si la fonction ne fait pas tourner la valeur - la touche annuler.

entier- nombre entier à 2 octets, plage de valeurs - 32768 à 32767

Après le nom de la fonction aux arches (), les paramètres sont spécifiés, car les fonctions sont passées à la fonction pour l'heure de la semaine. Comme une fonction sans paramètres - le mot clé est choisi annuler. Une fonction principaleà retirer de votre propre ensemble de commandes, pour améliorer le système et le cycle principal du programme.

Nous a donné un port à l'entrée Le mode de port du robot est défini dans le registre local DDRD(Registre pour la transmission directe d'informations). Le nombre "0x00" est écrit dans ce registre (0b0000000 - pour la double-vue), à ​​l'exception du bouton auquel rien n'est connecté, puis tout le port D est affecté à l'entrée. Vous pouvez définir le port petit à petit en écrivant le numéro 0 ou 1 (0-input, 1-out) dans le bout en cuir du registre, par exemple DDRD = 0x81 (0b10000001) - la première ligne du reste du port D est appliqué à la sortie, reshta à l'entrée. Il est également nécessaire de connecter une résistance de tension interne. Notez que le contournement des résistances internes efface le registre PORTx afin que le port soit en mode d'entrée. Écrivons-le tout seul.

Configurer un port B en vacances. Le mode de port du robot est défini dans le registre local DDRB. Rien, lumière vive à bâbord B n'est pas connecté, le port entier peut être configuré pour s'ouvrir. Tse vole un record au registre DDRB numéro "0xFF". Dans l'ordre, lorsque la lumière est allumée pour la première fois, sans brûler, nous écrivons sur le port B zéros logiques. Tse se précipite pour enregistrer PORTB= 0x00 ;

Pour affecter une valeur, le symbole "=" est utilisé et s'appelle l'opérateur d'affectation, il est impossible de le confondre avec le signe "égal"

Le réglage des ports ressemble à ceci :

DDRD=0x00 ;
PORTD=0xFF ;
DDRB=0xFF ;
PORTB = 0x00 ;

Nous écrivons le cycle principal du programme. tandis que( "encore" de l'anglais) - cette équipe organise un cycle, répétant à plusieurs reprises le corps du cycle jusqu'au dernier sapin, jusqu'à ce que l'esprit gagne, c'est-à-dire jusqu'à ce que le viraz aux bras soit vrai. Il est admis dans la langue de Cі que c'est vrai, comme si le vin n'était pas égal à zéro, et c'est mauvais, comme si c'était bon.

La commande ressemble à ceci :

tandis que (umova)
{
cycle corporel
}

Notre façon de penser est que le cycle principal est composé de moins d'une commande. L'équipe Tsya donne un registre PORTB valeur de registre à inverser PORTD.

PORTB = ~PIND ; //Obtenir la valeur du port D, l'inverser et l'affecter à PORTB (écrire sur PORTB)

// virazi mon Cі lu de droite à gauche

NIP registre des informations d'entrée. Afin de lire les informations de la vue actuelle du contrôleur, il est nécessaire de basculer la décharge requise du port en mode d'entrée. Tobto écrire dans le registre de bits vіdpovіdny DDRx zéro. Quelques jours plus tard seulement, il est possible d'envoyer un signal numérique à l'ensemble du visnovok depuis le bâtiment extérieur. Laissez le microcontrôleur lire l'octet du registre PINx. Au lieu d'un bit sortant, il envoie un signal au port d'origine. Notre programme est prêt et ressemble à ceci :

#inclure int main (void) (DDRD = 0x00 ; // port D - entrée PORTD = 0xFF ; // résistance enfichable DDRB = 0xFF ; // port B - sortie PORTB = 0x00 ; // définir 0 sur la sortie tandis que (1) ( PORTB = ~PIND; //~ signe inversé au niveau du bit)))

Movі Сі a largement confirmé les commentaires. Il y a deux manières d'écrire.

/*Commenter*/
// Commenter

Si tel est le cas, le compilateur ne respecte pas ceux qui sont écrits dans les commentaires.

Comment utiliser le programme et se connecter au microcontrôleur 8 boutons et 8 diodes lumineuses, comme indiqué dans le petit 2, alors vous comprendrez que le port du mors en cuir répondez à votre port bit B. En appuyant sur le bouton SB1 - HL1 s'allume, en appuyant sur le bouton SB2 - HL2 s'allume lentement.

Maliounok 2

L'article a rassemblé des éléments du livre de Belova A.V. "L'auto-lecteur du revendeur de dépendances sur l'AVR"




L'ATMega16 MK dispose de trois temporisateurs/appelants - deux de 8 bits (Timer/Counter0, Timer/Counter2) et un de 16 bits (Timer/Counter1). La peau doit être remplie de registres spéciaux, l'un d'eux est le registre personnel TCNTn (n est le nombre entier 0, 1 chi 2). Ainsi, si le processeur bat une commande, au lieu de ce registre, il sera augmenté d'un (skin 8, 64, 256, 1024 cycles). C'est pourquoi le vin s'appelle Rakhunkov. Nouveau, encore un autre registre OCRn (Output Compare Register), dans lequel nous pouvons écrire nous-mêmes un tel nombre. Un lіchilnik 8 bits a des registres 8 bits. Dans le monde, les programmes à la place de TCNTn se développent et à un moment donné, il sera possible de sortir de la place de l'OCRn. Ensuite (en plus de spécifier des paramètres spéciaux) dans le registre d'indicateurs TIFR (Timer/Counter Interrupt Flag Register) l'un des processeurs, le processeur est invité à redémarrer, il est immédiatement vérifié pour la fin d'un cycle non arrêté et le temporisateur est desservis. Chaque fois que le processus est répété.

Vous trouverez ci-dessous le graphique horaire pour le mode CTC (Clear Timer on Compare). Dans ce mode, le registre d'ouverture est effacé au moment de la journalisation au lieu de TCNTn et OCRn ;

C'est loin d'être le seul mode du minuteur/refroidisseur robotique. Il est possible de ne pas effacer le registre personnel au moment du démarrage, alors le mode de génération de la modulation de largeur d'impulsion, qui est un article mondain offensant, le sera. Vous pouvez modifier le compte directement, c'est-à-dire qu'au lieu du registre de compte, vous changerez le programme dans le monde. Il est également possible de travailler les fenêtres non pas pour le nombre de commandes passées par le processeur, mais pour le nombre de changements de niveau de tension sur le T0 ou T1 "inférieur" (mode lanceur), vous pouvez automatiquement, sans la participation de processeur, modifiez le paramètre OCn bas dans la minuterie d'inactivité. Timer/Lichilnik1 tout en travaillant en parallèle avec deux canaux - A chi W.

Pour démarrer la minuterie, vous devez définir le deuxième bit dans le registre de contrôle avec la minuterie TCCRn (Timer/Counter Control Register), après quoi vous commencez immédiatement votre travail.

Nous pouvons regarder les modes robotiques actuels de la minuterie. Si vous avez besoin d'un robot dans un mode différent, alors lisez la Datasheet jusqu'à ATMega16 - tout y est écrit en anglais, il est donné d'appliquer des programmes en C et en assembleur (ce n'est pas pour rien qu'il faut 357 faces d'un texte rédigé ! ).

Voyons maintenant les boutons.

Nous choisissons de sélectionner un petit nombre de boutons (jusqu'à 9 pièces), de les connecter entre la «masse» et les boutons de n'importe quel port du microcontrôleur. Si vous souhaitez ajouter un certain nombre d'entrées, pour lesquelles vous devez installer les bits d'entrée dans le registre DDRx et activer la résistance interne pour prendre en charge l'installation des bits dans le registre PORTx. Avec cela, une tension de 5 V apparaît sur ces "fonds". Lorsque le bouton est enfoncé, l'entrée du MK est verrouillée sur GND et la tension tombe à zéro sur un nouveau (et peut-être aussi bien - vysnovok MK de courts-circuits au sol dans le camp vijatom). Lorsque le registre PINx est modifié, dans quel port est sélectionné (sur la vue PORTx, dans quel port est défini pour la fréquence du trafic, de sorte qu'il n'y ait pas de boutons à appuyer). En lisant périodiquement PINx, vous pouvez savoir si le bouton est enfoncé.

UVAGA ! Si le dernier bit du registre DDRx est défini sur 1 pour votre bouton, la pression sur le bouton peut entraîner un petit effet pyrotechnique - faible sur le MK. Naturellement, le MK du suivant se trouve être pile au vent pour la mort...

Passons à la partie pratique. Créez un nouvel espace de travail dans IAR et un nouveau projet avec un nom, par exemple TimerButton. Définissez les options du projet comme décrit dans l'article précédent. Et maintenant tapons un petit code.

#inclure"iom16.h" annuler init_timer0( annuler) //Initialisation du timer/chiller0(OCR0 = 255 ; // Registre Vmіst povіvnannya //Définir le mode minuterie robotique TCCR0 = (1 vide init_timer2( annuler) //Initialisation du timer/chiller2(OCR2 = 255 ; TCCR2 = (1 //Défini pour un nouveau redémarrage du bus) annuler principale( annuler) ( DDRB = 255; init_timer0(); init_timer2(); tandis que(1) { } } #pragma vecteur = TIMER2_COMP_vect // Réinitialiser par timer2 __interrupt vide clignotant() ( si((PORTB & 3) == 1) ( PORTB &= (0xFF // Activer PB0, PB1 PORTB |= 2; // Activer PB1 } autre( PORTB &= (0xFF // Activer PB0, PB1 PORTB |= 1 ; // Activer PB0 } }

Voyons voir comment ça fonctionne. Dans les fonctions init_timern, des bits sont définis dans les registres TCCRn, OCRn et TIMSK, et cette manière peut être étrange ou inconnue de quiconque. Veuillez expliquer au début ce que signifie l'entrée "(1

de a est le nombre, dont deux manifestations doivent être détruites, et b indique combien de batailles vous devez détruire. Si tel est le cas, il est possible de gaspiller la valeur enregistrée dans a (vous ne pouvez donc pas toujours vous souvenir de celles qui étaient dans a). Regardons l'exemple :

Ce qui doit apparaître dans la ligne suivante C = (22

2 pour le code 2 bits ressemblera à 00010110, et après le changement vers la gauche pour 3 bits, C = 10110000 est pris.

De même, іsnuє і zsuv droitier. Un autre exemple:

carboniser C; … C = ((0xFF > 2);

L'arrière de la tête est cassé au niveau des arcades intérieures (0xFF - tse 255 dans le code hexadécimal), s 11111111 ressemble à 111111100, puis il va se casser à droite et prendre C \u003d 00111111. Comme Bachimo, il y en a deux ensemble. deux temps. Soogo a disparu, yakby a été remplacé par le type int, de sorte que int prend 16 bits.

Nous pouvons maintenant examiner deux autres opérateurs de bits largement utilisés lors de la programmation de MK. Le même opérateur est "bit à bit" (&) et "bit à bit" (|). Comment tu pues, je suppose, je serai au courant des applications:

Dia : Résultat (pour code double) : С = 0 ; // C = 00000000 C = (1 // C = 00100101 C | = (1 // C = 00101101 C & = (0xF0 >> 2)); // C = 00101100 C = (C je 4) | 3 ; // C = 00000111

Petit n'a pas oublié! Є sche "désactiver au niveau du bit abo" (^). Il s'avère être en nombre égal, et même s'ils sont identiques, tournez 0, sinon un.

Passons à notre programme. Il est écrit "(1

/* Registre de contrôle du temporisateur/compteur 0 */ #définir FOC0 7 #définir WGM00 6 #définir COM015 #définir COM004 #définir WGM01 3 #définir CS02 2 #définir CS01 1 #définir CS00 0

Lors de la compilation du programme, l'entrée WGM01 est simplement remplacée par le chiffre 3, et le résultat est une entrée correcte. WGM01 s'appelle une macro et ne prend pas de place dans la mémoire (c'est dans la mémoire du programmeur :-).

Jetez maintenant un coup d'œil à la fiche technique, mais peu importe si vous savez que WGM01 est le troisième bit du registre TCCR0. Ces mêmes représentent d'autres batailles du même registre. Tsej zbіg not vypadkovo in vіdnositsya à tous les MK enregistrés (ou mayzhe à tous). Autrement dit, en écrivant "(1

Ensemble, d'affilée

signifie que le mode STS est activé, lorsque le timer0 est activé, le camp OS0 «inférieur» (Won PB3) est modifié, au lieu du lichnik, le cycle skin 1024 est augmenté.

De même pour timer2 : TCCR2 = (1

Le registre TIMSK (Timer/counter Interrupt MaSK register) est mis en mode interruption. Mi a écrit

qu'est-ce que timer2 se réinitialise après l'augmentation de TCNT2 et OCR2. La fonction restante est la fonction actuelle de neutralisation de la minuterie2. Pererivannya être stupéfait par le rang à venir :

#pragma vecteur= VECTEUR __interrompre TYPE IM()

de VECTOR - la macro du vecteur de la récursivité (derrière le changement se trouve juste un nombre qui caractérise la récurrence); tsі macros dans l'ordre de diminution de la priorité de reprotection dans le fichier iom16.h. TYPE - le type de la valeur que la fonction transforme en notre type vide (rien). Ім'я - plus de fonctions ім'я цієї. Avec des interruptions, il est toujours possible de s'éloigner du futur.

En cas d'échec de notre fonction, il est de notre responsabilité de faire clignoter la lumière, de se connecter à PB0 et PB1. À toutes fins utiles, la fréquence est 11059200/(256*1024) = 42 Hz. Tse shvidko, mais on s'en souviendra d'un œil non obstrué. Avant le discours, zastosuvannya timerіv daє mozhlivіst vіdrahovuvaty exact hrіvі invalі, scho de ne pas mentir dans la complexité de votre programme et de commander її vykonannya (alternativement, vous n'avez pas plus d'une interruption).

Ensuite, prenez le fichier comme "TimerDebug.c", ajoutez-le au projet, compilez, flashez le MK. Qu'est-ce que nous faisons? Lumière, connexions jusqu'à l'introduction de PB3, activement morgatime, et il n'y a pas de changements quotidiens sur PB0 et PB1. Pourquoi est-il à droite ? N'est-ce pas?

Shchob tse z'yasuvati, arrive à améliorer notre programme. Il n'y a pas de débogueurs dans IAR, vous devez pirater AVR Studio. La partie centrale de la production peut être obtenue sur le site Web du constructeur http://atmel.com. Je suppose que les problèmes de vstanovlennyam ne sont pas à blâmer maisi. Avant de démarrer AVR Studio, sélectionnez le mode Débogage pour IAR et créez un fichier cof personnalisé (toutes les options du projet peuvent être définies, comme décrit dans l'article précédent).

Bienvenue dans AVR Studio, nous vous souhaitons la bienvenue, veuillez sélectionner Ouvrir. Maintenant, allez dans le dossier avec le projet, là Debug \ Exe, sélectionnez "TimerDebug.cof" là-bas, créez le projet là-bas, deproponuyut, sélectionnez le périphérique ATMega16 et le mode de configuration du simulateur. Après tout, si tout a été fait correctement, je vais commencer le processus de récupération

Le milieu du lagodzhennya ici est beaucoup plus difficile, car. permet de parcourir tous les registres du MK, et de régler manuellement les valeurs en cliquant sur la souris. Par exemple, pour définir un indicateur de redéploiement dans le registre TIFR au bit 7 (sous le carré noir à TIMSK), puis à l'étape suivante du programme (en appuyant sur F10 ou F11), vous pouvez avoir un processus de redistribution (l'indicateur sera être automatiquement défini lorsque vous modifiez les registres TCNT2 et OCR2). Ale, sur notre podiv, il n'y aura pas de réparation !

Poste alimentaire : pourquoi ?

Registre Vіdcriєmo CPU, SREG. Ce registre est affecté au robot du processeur, le bit le plus important (I-bit, Interrupt bit) est chargé de traiter toutes les modifications dans le MC. Nous n'avons pas installé de yoga. Varto yogo vistaviti, comme dans le sillage de la résurrection (puisque le septième bit a été inséré immédiatement dans le TIFR).

Vous pouvez noter une particularité : dès que le processeur entre dans le processus de reconstruction, ce bit (le drapeau de la distribution du bâtiment du traitement) est pris, et lorsque vous quittez la fonction, le processus sera automatiquement restauré encore. Tse ne permet pas au processeur, sans avoir terminé un réarrangement, de se rassembler pour un autre (même s'il est orienté dans le programme lui-même dans un tel rang - par enseigne).

Plus tard, il est nécessaire d'ajouter une ligne au code pour définir ce bit dans un seul camp. Dodamo mi yogo à la fonction init_timer2. Viide arrive :

annuler init_timer2( annuler) (SREG |= (1 // Ajout de cette ligne OCR2 = 255 ; TCCR2 = (1

Maintenant, après avoir fait la configuration Release et flashé le MK, appuyé sur F7 et lancé AVReal32.exe, c'est une bonne chose que tout fonctionne comme suit.

Noter: lorsque le programme est ajusté, les intervalles des minuteries doivent être modifiés, comme s'il puait trop longtemps, de sorte que lors du processus de mise à niveau dans AVR Studio, le programme soit mis à jour mille fois plus, abaissez le milieu du MC, et vous ne vérifiez pas le fonctionnement de la minuterie. Zagalogodzhennya à nouveau similaire à celle d'autres systèmes de programmation, tels que Visual C ++.

Maintenant, après avoir appris à ajuster le programme, créons un nouveau fichier dans IAR (et sauvegardons l'ancien du projet) et tapons le code suivant :

#inclure"iom16.h" long entier non signé compteur = 0 ; //Lichilnik pour façonner les intervalles horaires caractère non signé B0Appuyé = 0 ; //Ici le bouton 0 est enregistré (0 - non pressé, 1 - pressé) caractère non signé B1Appuyé = 0 ; //Ici le bouton 1 est enregistré (0 - non pressé, 1 - pressé) //Initialisation du timer2 // Nécessite skin 11059 ticks (1 ms) pour augmenter le compteur. Nous avons la peau 1.001175 ms annuler init_timer2() ( OCR2 = 173; TCCR2 = (1 //Init_io_ports() ( DDRA =(1//pause_ms millisecondes) annuler retard( long entier non signé pause_ms) (compteur = 0 ; tandis que(counter void main() ( SREG |= (1 // Autoriser le redémarrage init_timer2()); //Activer la minuterie2 sur la peau 64 ticks, jusqu'à 173 init_io_ports(); //Activer le port d'entrée/sortie tandis que(1) { //Enveloppe de bouton 0 si(B0Appuyé == 1) { // dites à PORTB, vérifiez l'admission PORTB++ ; B0Appuyé = 0 ; tandis que((PINC & (1 sinon ( si((PINC & (1 //Fixer la pression ( delay(50)); si((PINC & (1 // Surcharger la pression ( B0Pressed = 1;)) } } } //Traitement du bouton 1 si(B1Appuyé == 1) //Comment appuyer sur le bouton, { // changer PORTB, vérifier l'admission PORTB-- ; B1Appuyé = 0 ; tandis que((PINC & (1 sinon ( si((PINC & (1 //Fixer la pression ( delay(200)); //Usunennya "clés sales" si((PINC & (1 // Surcharger la pression ( B1Pressed = 1;)) // Définit le drapeau "bouton enfoncé" } } } } } // Remise à zéro par la minuterie 2, lorsque le compteur est incrémenté #pragma vecteur= TIMER2_COMP_vect __interrompre void inc_delay_counter() ( compteur++; )

Je vais commencer par prendre un fichier de firmware préparé (fichiers avant l'article, le dossier Release, le fichier TimerButton.hex ou compiler le texte) et écrire du yoga au MK. Après avoir changé le câble du micrologiciel, connectez-vous aux boutons PC0 et PC1 et essayez d'appuyer sur їх. Il est à noter qu'en appuyant sur l'un des boutons, le registre PORTB est augmenté (s'allume) et lorsqu'on appuie sur un autre, il change. Si cela ne fonctionne pas - essayez d'appuyer sur un bouton, en maximisant l'autre - d_yatime. À droite, dans le fait que j'allume les boutons dans l'ordre d'avancement: lorsqu'on appuie sur le bouton des moustaches, le MK "s'incline" à la porte, et lorsqu'il est relâché, il scintille jusqu'au sol. Comme vous avez connecté les boutons d'une manière différente, il faudra moins d'un peu pour moderniser le programme.

Jetons un coup d'œil au code. Ici, le robot avec la minuterie est organisé trohi inakshe. Vіn spratsovuє kozhnі 11072 tact (tobto koіnі 1,001175 ms) Il existe également une fonction delay (long unsigned int Pause_ms), car elle prend le paramètre Pause_ms nombre de millisecondes, réinitialise le compteur et vérifie si le compteur atteint la valeur de Pause_ms, après quoi le robot MK continue. De cette façon, en écrivant delay(1500), nous formerons un retard dans le programme en 1,5 secondes. Ceci est particulièrement pratique pour former des intervalles horaires.

Avec une minuterie, tout compris. Ale navіscho vіn vikoristovuєtsya? Jetons un coup d'œil à la boucle while(1) inépuisable de main(). Dans ce cycle, le montant du bouton est changé par analyse à la place du registre PINB. Et y a-t-il un fondu de 50 ms ? Tse usunennya t. « claquement de clés ». A droite, en appuyant sur le bouton, un coup porté à un contact est frappé contre l'autre, et, éclats de contacts métalliques, le coup est ressort. Contacts, ressorts, zamikayutsya qui rozmikayutsya kіlka razіv, ne respectant pas ceux qui doigtent zrobiv plus d'une poussée. Tse à produire avant que le MK ne fixe le sprat sur la pression. Jetons un coup d'œil au calendrier de la tension de retombée à la sortie PC0 par heure. Vin peut ressembler à ceci :

Le point A est le moment où le bouton est enfoncé. Vin peut être en train de réparer MK. Alors allons-y sprats de zamikan et rozmikan (ils peuvent ne pas l'être, ou ils peuvent être 12 pièces - vous pouvez prendre la vue avec vipadkovym). Au point B, le contact est déjà superficiellement fixé. Mіzh A et B sont en moyenne proches de 10 ms. Nareshti, au point D il y a un romarin. Comment puis-je me débarrasser de cette manifestation inacceptable? Cela semble tout aussi facile. Il faut fixer le moment d'appuyer sur le bouton (point A), après une certaine heure, par exemple, 50 ms (point C) vérifier que le bouton est effectivement appuyé, pour s'assurer, que le bouton est appuyé à ce moment de libération (point D). Tobto doit faire une pause de A à C, de sorte que toute la "ronce" apparaisse au milieu de la pause. Et maintenant, essayez d'utiliser une rangée qui forme un repli, composez le programme et cousez-le dans MK. En appuyant simplement sur les boutons, vous pouvez facilement traverser, de sorte que toute la farine n'était pas merveilleuse.

Et qu'en est-il du travail, si vous devez connecter, disons, 40 boutons à MK? Aje dans la nouvelle laisse 32 visnovkas. Ça aurait été mieux, pas question. En effet, c'est possible. Parfois algorithme vikoristovuyut, titres par gating. Pour lequel vous avez besoin de boutons pour vous connecter à la matrice, comme indiqué dans le petit (les petits sont tirés du livre de Morton "MK AVR, un cours d'introduction", où il est écrit sur la programmation AVR en assembleur).

Lors de la soumission d'un journal visnovka PB0. 1 (+5V), et sur les bobinages PB1 et PB2 log. 0, il est permis d'éditer les boutons 1, 4 et 7. Vous pouvez déterminer quel type de cuir parmi eux en modifiant la tension de l'un des commutateurs PB3..PB5. Dans cet ordre, en donnant consécutivement les logs PB0..PB2. 1, vous pouvez attribuer le standard des boutons. J'ai réalisé que les broches PB0..PB2 peuvent être utilisées comme sorties et PB0..PB2 comme entrées. Pour déterminer le nombre de touches dont vous avez besoin pour un tableau de X boutons, vous devez connaître une paire de X multiplicateurs dont la somme est la plus faible (pour notre exemple de 40 boutons, les chiffres 5 et 8 seront nécessaires). Cela signifie que jusqu'à 256 boutons peuvent être connectés à un MK (et encore plus à partir des décodeurs, mais sur les décodeurs plus tard). Il est préférable de créer moins de sorties visnovkіv et plus d'entrées. Dans ce cas, l'expérimentation de toutes les lignes de la matrice prendra moins d'une heure. Un mode de connexion similaire (stroboscope) n'est pas moins puissant que les boutons. Vous pouvez y connecter divers appareils, en commençant par une matrice de diodes lumineuses et en terminant par des puces à mémoire flash.

© Kiselov Roman
Cherven 2007