Table des matières:

Microcontrôleur AVR. Basculez les LED à l'aide d'un interrupteur à bouton-poussoir. Anti-rebond de bouton poussoir. : 4 étapes
Microcontrôleur AVR. Basculez les LED à l'aide d'un interrupteur à bouton-poussoir. Anti-rebond de bouton poussoir. : 4 étapes

Vidéo: Microcontrôleur AVR. Basculez les LED à l'aide d'un interrupteur à bouton-poussoir. Anti-rebond de bouton poussoir. : 4 étapes

Vidéo: Microcontrôleur AVR. Basculez les LED à l'aide d'un interrupteur à bouton-poussoir. Anti-rebond de bouton poussoir. : 4 étapes
Vidéo: AVR Microcontroller. Toggle LED’s using a Push Button Switch. Push Button Debouncing. 2024, Juillet
Anonim
Image
Image

Dans cette section, nous allons apprendre à créer un code C de programme pour ATMega328PU pour basculer l'état des trois LED en fonction de l'entrée d'un interrupteur à bouton. En outre, nous avons exploré une solution au problème de « Switch Bounce ». Comme d'habitude, nous assemblerons le circuit électrique sur la base de l'AVR ATmega328 pour vérifier le travail du code du programme.

Étape 1: Écriture et création d'une application de microcontrôleur AVR en code C à l'aide de la plate-forme de développement intégrée Atmel Studio 7

Écriture et création d'une application de microcontrôleur AVR en code C à l'aide de la plate-forme de développement intégrée Atmel Studio 7
Écriture et création d'une application de microcontrôleur AVR en code C à l'aide de la plate-forme de développement intégrée Atmel Studio 7
Écriture et création d'une application de microcontrôleur AVR en code C à l'aide de la plate-forme de développement intégrée Atmel Studio 7
Écriture et création d'une application de microcontrôleur AVR en code C à l'aide de la plate-forme de développement intégrée Atmel Studio 7
Écriture et création d'une application de microcontrôleur AVR en code C à l'aide de la plate-forme de développement intégrée Atmel Studio 7
Écriture et création d'une application de microcontrôleur AVR en code C à l'aide de la plate-forme de développement intégrée Atmel Studio 7

Si vous n'avez pas Atmel Studio, vous devez le télécharger et l'installer.

www.microchip.com/mplab/avr-support/atmel-studio-7

Les premières lignes sont définies par le compilateur.

F_CPU définit la fréquence d'horloge en Hertz et est courant dans les programmes utilisant la bibliothèque avr-libc. Dans ce cas, il est utilisé par les routines de retard pour déterminer comment calculer les retards.

#ifndef F_CPU

#define F_CPU 16000000UL // indiquant la fréquence du cristal du contrôleur (16 MHz AVR ATMega328P) #endif

#include // en-tête pour activer le contrôle du flux de données sur les broches. Définit les broches, les ports, etc.

Le premier fichier d'inclusion fait partie d'avr-libc et sera utilisé dans pratiquement tous les projets AVR sur lesquels vous travaillez. io.h déterminera le processeur que vous utilisez (c'est pourquoi vous spécifiez la partie lors de la compilation) et à son tour inclura l'en-tête de définition IO approprié pour la puce que nous utilisons. Il définit simplement les constantes de toutes vos broches, ports, registres spéciaux, etc.

#include // en-tête pour activer la fonction de retard dans le programme

La bibliothèque util/delay.h contient quelques routines pour les délais courts. La fonction que nous utiliserons est _delay_ms().

Nous utilisons des définitions pour déclarer nos ports et broches de bouton et de LED. L'utilisation des instructions de définition comme celle-ci nous permet de n'avoir besoin de modifier que 3 lignes faciles à trouver si nous déplaçons la LED sur une broche d'E/S différente ou si nous utilisons un AVR différent.

#define BUTTON1 1 // interrupteur à bouton connecté à la broche 1 du port B

#define LED1 0 // Led1 connecté au port B pin 0 #define LED2 1 // Led2 connecté au port C pin 1 #define LED3 2 // Led3 connecté au port D pin 2

Les deux derniers définissent les temps d'installation des instructions, en millisecondes, pour éviter le rebond du commutateur et le temps d'attente avant d'autoriser une autre pression sur le bouton. Le temps d'anti-rebond doit être ajusté au temps qu'il faut au commutateur pour passer d'un haut numérique à un bas numérique après tout le rebond. Le comportement de rebond diffère d'un commutateur à l'autre, mais 20 à 30 millisecondes suffisent généralement.

#define DEBOUNCE_TIME 25 // temps d'attente pendant le bouton "de-rebond"

#define LOCK_INPUT_TIME 300 // temps d'attente après avoir appuyé sur un bouton

void init_ports_mcu()

{

Cette fonction est appelée une seule fois au début de notre programme pour initialiser les broches d'entrée et de sortie que nous utiliserons.

Pour le bouton, nous utiliserons les registres PORT et PIN pour l'écriture et la lecture. Avec les AVR, nous lisons une broche en utilisant son registre PINx et nous écrivons sur une broche en utilisant son registre PORTx. Nous devons écrire dans le registre des boutons pour activer les tractions.

Pour la LED, nous n'avons besoin d'utiliser que le registre PORT pour écrire, cependant, nous avons également besoin du registre de direction des données (DDR) car les broches d'E/S sont configurées comme entrées par défaut.

Tout d'abord, nous définissons les broches d'E/S de la LED en tant que sortie à l'aide de son registre de direction des données.

DDRB=0xFFu; // Définit toutes les broches du PORTB comme sortie.

Ensuite, définissez explicitement la broche du bouton comme entrée.

DDRB &= ~(1<

Ensuite, les broches PORTB sont réglées haut (+5 volts) pour l'allumer. Les broches de sortie sont initialement hautes, et comme notre LED est câblée en mode haute, elle sera allumée à moins que nous ne l'éteignez explicitement.

Et enfin, nous activons la résistance de rappel interne sur la broche d'entrée que nous utilisons pour notre bouton. Cela se fait simplement en envoyant un au port. Lorsqu'il est configuré en tant qu'entrée, cela entraîne l'activation des pull-ups et lorsqu'il est configuré en tant que sortie, cela produirait simplement une haute tension.

PORTB = 0xFF; // Définir toutes les broches du PORTB comme HAUT. La LED est allumée, // également la résistance Pull Up interne de la première broche PORTB est activée. DDRC=0xFFu; // Définit toutes les broches du PORTC comme sortie. PORTC=0x00u; // Définit toutes les broches de PORTC à un niveau bas, ce qui le désactive. DDRD=0xFFu; // Définit toutes les broches du PORTD comme sortie. PORTD=0x00u; // Définit toutes les broches de PORTD à un niveau bas, ce qui le désactive. }

caractère non signé button_state()

{

Cette fonction renvoie une valeur booléenne indiquant si le bouton a été enfoncé ou non. C'est le bloc de code qui est continuellement exécuté dans la boucle infinie et qui interroge donc l'état du bouton. C'est aussi là que l'on fait rebondir le switch.

Maintenant, rappelez-vous que lorsque nous appuyons sur le commutateur, la broche de sortie d'entrée est tirée à la terre. Ainsi, nous attendons que la goupille descende.

/* le bouton est enfoncé lorsque le bit BUTTON1 est vide */

si (!(PINB & (1<

Nous le faisons en vérifiant si le bit est clair. Si le bit est à zéro, indiquant que le bouton est enfoncé, nous retardons d'abord la durée définie par DEBOUNCE_TIME qui est de 25 ms, puis vérifions à nouveau l'état du bouton. Si le bouton est enfoncé après les 25 ms, le commutateur est considéré comme étant anti-rebond et prêt à déclencher un événement et nous retournons donc 1 à notre routine d'appel. Si le bouton n'est pas enfoncé, nous retournons 0 à notre routine d'appel.

_delay_ms(DEBOUNCE_TIME);

si (!(PINB & (1<

int principal (vide)

{

Notre routine principale. La fonction principale est unique et distincte de toutes les autres fonctions. Chaque programme C doit avoir exactement une fonction main(). principal est l'endroit où l'AVR commence à exécuter votre code lors de la première mise sous tension, c'est donc le point d'entrée du programme.

caractère non signé n_led = 1; // initialement le numéro de LED est allumé maintenant

Appel de la fonction d'initialisation des broches d'E/S utilisées:

init_ports_mcu();

boucle infinie où notre programme s'exécute:

tandis que (1)

{

Lorsque button_state renvoie un indiquant que le bouton a été enfoncé et a rebondi, puis bascule l'état actuel des LED à son tour en fonction du paramètre n_led.

if (button_state()) // Si le bouton est enfoncé, bascule l'état et le délai de la LED pendant 300 ms (#define LOCK_INPUT_TIME)

{ switch(n_led){ cas 1: PORTB ^= (1<<LED1); PORTC ^= (1<<LED2); Pause;

Ces instructions utilisent des opérateurs C au niveau du bit. Cette fois, il utilise l'opérateur OU exclusif. Lorsque vous XOR le PORT avec la valeur de bit du bit que vous souhaitez basculer, ce bit est modifié sans affecter les autres bits.

cas 2:

PORTC ^= (1<<LED2); PORTD ^= (1<<LED3); Pause; cas 3: PORTD ^= (1<<LED3); PORTB ^= (1<<LED1); n_led=0; // réinitialiser le numéro de LED break; } n_led++; // la prochaine LED s'allume _delay_ms(LOCK_INPUT_TIME); } } retour (0); }

Alors maintenant, lorsque vous exécutez ce programme, vous devriez pouvoir appuyer sur le bouton-poussoir pour que les LED basculent. En raison de notre délai défini par LOCK_INPUT_TIME, vous pouvez appuyer sur le bouton et le maintenir enfoncé, ce qui entraînera l'extinction et l'allumage des LED à un rythme constant (un peu plus que toutes les 275 ms).

La programmation est terminée.

L'étape suivante consiste à créer le projet et à programmer le fichier hexadécimal dans le microcontrôleur à l'aide du programme avrdude.

Vous pouvez télécharger le fichier main.c avec le programme en code c:

Étape 2: Transfert du fichier HEX du programme dans la mémoire flash de la puce

Transfert du fichier HEX du programme dans la mémoire flash de la puce
Transfert du fichier HEX du programme dans la mémoire flash de la puce
Transfert du fichier HEX du programme dans la mémoire flash de la puce
Transfert du fichier HEX du programme dans la mémoire flash de la puce

Téléchargez et installez AVRDUDE. La dernière version disponible est la 6.3: Téléchargez le fichier zip

Tout d'abord, copiez le fichier hexadécimal du programme dans le répertoire AVRDUDE. Dans mon cas, c'est ButtonAVR.hex

Ensuite, tapez dans la fenêtre d'invite DOS la commande: avrdude –c [nom du programmeur] –p m328p –u –U flash:w:[nom de votre fichier hexadécimal].

Dans mon cas, c'est: avrdude –c ISPProgv1 –p m328p –u –U flash:w:ButtonAVR.hex

Cette commande écrit un fichier hexadécimal dans la mémoire du microcontrôleur.

Regardez la vidéo avec une description détaillée de la gravure de la mémoire flash du microcontrôleur:

Gravure de la mémoire flash du microcontrôleur…

D'accord! Maintenant, le microcontrôleur fonctionne conformément aux instructions de notre programme. Regardons ça!

Étape 3: Anti-rebond du commutateur matériel

Anti-rebond de commutateur matériel
Anti-rebond de commutateur matériel

En plus de l'anti-rebond de commutateur logiciel, nous pouvons utiliser la technique d'anti-rebond de commutateur matériel. L'idée de base derrière une telle technique est d'utiliser un condensateur pour filtrer les changements rapides du signal de commutation.

Quelle valeur de condensateur faut-il sélectionner ? Cela dépendra en fin de compte de la mauvaise performance du bouton concernant ce problème particulier. Certains boutons peuvent afficher un comportement de rebond énorme, mais d'autres en auront très peu. Une valeur de condensateur faible comme 1,0 nanofarads réagira très rapidement, avec peu ou pas d'effet sur le rebond. Inversement, une valeur de condensateur plus élevée telle que 220 nanofarads (ce qui est encore assez faible en termes de condensateurs) fournira une transition lente de la tension de début à la tension de fin (5 volts à 0 volts). La transition observée avec une capacité de 220 nanofarads est cependant encore assez rapide dans le monde réel, et peut donc être utilisée sur des boutons peu performants.

Étape 4: Circuit électrique

Circuit électrique
Circuit électrique
Circuit électrique
Circuit électrique
Circuit électrique
Circuit électrique

Connectez les composants conformément au schéma de principe.

Conseillé: