Tutoriel 1 - WatchDog + LED D13

Le WatchDog couplé avec l'allumage d'une LED, la D13 des arduinos.

Nous allons voir dans ce premier projet l'utilisation des ports sur un arduino ainsi que l'utilisation des WatchDog.

Les ports ont trois registres différents : les registres PIN, PORT et DD. Le DD permet de déterminer si le port est configuré en sortie (à l'état logique 1) ou en entrée (à l'état logique 0). Le PORT a deux  fonctions différentes suivant le registre DD. Si DD est en entrée, l'écriture logique d'un 1 sur le registre PORT active la résistance de pull up (tirage au niveau haut) et si c'est un 0, c'est  un tirage au niveau bas. Si le registre DD est en sortie, le registre PORT au niveau 1 applique une sortie au niveau haut et au niveau bas applique une sortie au niveau bas. Le registre PIN permet de connaître l'état du port, niveau haut ou niveau bas.

WatchDog signifie chien de garde, il est donc programmer pour surveiller. Par défaut, il est désactivé. Il peut générer trois actions différentes sur l'ATmega328P : un reset, une interruption , une interruption suivie d'un reset.

Je vais donc utiliser le WatchDog en mode interruptions et, à chaque interruption, l'état de la LED 13 changera. Nous allons donc faire clignoter la LED de l'Arduino.

Afin de procéder par étape, commençons par paramétrer la LED. Le programme suivant permet d'allumer la LED 13.

------------------------------------------------------------------------------
--  IMPORTATIONS ET UTILISATIONS DES PACKAGES UTILES                        --
------------------------------------------------------------------------------
with AVR;
with AVR.MCU;

use AVR;

------------------------------------------------------------------------------
--  DECLARATION DE LA PROCEDURE LEDallumee utilisée comme MAIN              --
------------------------------------------------------------------------------
procedure LEDallumee is
begin
   -- Déclaration du port PB5 comme étant une sortie
   MCU.DDRB_Bits (5) := True;
   -- On attribue au port PB5 la valeur haute pour allumer la LED
   MCU.PORTB_Bits (5) := True;
end LEDallumee;

L'ensemble du projet peut être télécharger ici :Led allumeeLed allumee (1.75 Ko)

Ce programme permet de l'éteindre.

------------------------------------------------------------------------------
--  IMPORTATIONS ET UTILISATIONS DES PACKAGES UTILES                        --
------------------------------------------------------------------------------
with AVR;
with AVR.MCU;

use AVR;

------------------------------------------------------------------------------
--  DECLARATION DE LA PROCEDURE LEDeteinte utilisée comme MAIN              --
------------------------------------------------------------------------------
procedure LEDeteinte is
begin
   -- Déclaration du port PB5 comme étant une sortie
   MCU.DDRB_Bits (5) := True;
   -- On attribue au port PB5 la valeur haute pour éteindre la LED
   MCU.PORTB_Bits (5) := False;
end LEDeteinte;

L'ensemble du projet  peut être télécharger ici : Led eteinteLed eteinte (1.76 Ko)

La différence entre ces deux programmes est la valeur écrite sur le port : True => LED allumée, False => Éteinte.

Maintenant, intérressons nous au WatchDog, nous allons le paramètrer en mode interruption. Comme le programme devient plus volumineux, on ne peut pas tout avoir dans le meme fichier, je vais donc utiliser un package qui va contenir la procédure d'initialisation du WatchDog, le traitement de son interruption (qui est faite d'une manière un peu bizarre car elle s'appuie sur le compilateur gcc) et une fonction Run qui assurera l'éxecution de l'ensemble. Voici le corps package ainsi obtenu :

------------------------------------------------------------------------------
--                                                                          --
--                         PACKAGE WatchDogEx0                              --
--                                 BODY                                     --
--                                                                          --
------------------------------------------------------------------------------

------------------------------------------------------------------------------
--  IMPORTATIONS ET UTILISATIONS DES PACKAGES UTILES                        --
------------------------------------------------------------------------------
with AVR;
with AVR.MCU;
with AVR.Interrupts;

use AVR;
use AVR.MCU;

------------------------------------------------------------------------------
--  DECLARATIONS DU CORPS DU PACKAGE                                        --
------------------------------------------------------------------------------

package body WatchDogEx0 is

------------------------------------------------------------------------------
--  DECLARATIONS DES VARIABLES                                              --
------------------------------------------------------------------------------

   -- Variable globale booleenne stockant l'état de la LED (la dernière
   -- valeur écrite sur la LED pour être précis).
   niveauLed : Boolean := True;


------------------------------------------------------------------------------
--  DECLARATIONS DES PROCEDURES ET FONCTIONS                                --
------------------------------------------------------------------------------

   -- Procedure d'initialisation du WatchDog
   procedure init_Watchdog is
   begin
      -- Desactivation des interruptions pour paramétrer le watchdog
      AVR.Interrupts.Disable;
      -- WatchDog reset
      Wdr;
      -- Pour pouvoir changer le parametrage du watchdog, on doit activer
      -- les bits WDCE et WDE à la même opération et parametrer le timer
      -- en une opération dans les 4 cycles d'horloge suivant l'activation
      -- des bits WDCE et WDE.
      -- Pour plus d'info, voir datasheet paragraphe 11.8 Watchdog Timer
      -- Activation des bits WDCE et WDE
      MCU.WDTCSR := +(MCU.WDCE_Bit => True,
                      MCU.WDE_Bit => True,
                      others => False);
      -- Activation du prescaler pour avoir un Watchdog toutes les 4.0 s
      -- Configuration du Timer pour activer les interruptions du WatchDog
      -- sans le reset ie effectue ce qu'il y a dans la partie interruption
      MCU.WDTCSR :=  +(MCU.WDIE_Bit => True,
                       MCU.WDE_Bit => False,
                       MCU.WDP3_Bit => True,
                       others => False);
      -- Activation des interruptions
      AVR.Interrupts.Enable;
   end init_Watchdog;


------------------------------------------------------------------------------
--  DECLARATIONS DES PROCEDURES D'INTERRUPTIONS                             --
------------------------------------------------------------------------------

   -- Procedure d'interruption du Watchdog
   procedure WatchDog_Interrupt;

   pragma Machine_Attribute (Entity         => WatchDog_Interrupt,
                             Attribute_Name => "signal");
   pragma Export (C, WatchDog_Interrupt, MCU.Sig_WDT_String);

   procedure WatchDog_Interrupt is
   begin
      -- Desactivation des interruptions pour paramétrer le watchdog
      AVR.Interrupts.Disable;
      -- Changement de la variable globale niveauLed
      niveauLed := not niveauLed;
      -- Ecriture sur le port PB5 (D13) de la valeur niveauLed
      MCU.PORTB_Bits (5) := niveauLed;
      -- Activation des interruptions
      AVR.Interrupts.Enable;
   end WatchDog_Interrupt;


------------------------------------------------------------------------------
--  LA PROCEDURE RUN                                                        --
------------------------------------------------------------------------------

   procedure Run is
   begin
      -- Appel de la procédure d'initialisation du WatchDog
      init_Watchdog;
      -- Déclaration du port PB5 comme étant une sortie
      MCU.DDRB_Bits (5) := True;
      -- On attribue au port PB5 la valeur niveauLed pour commander la LED
      MCU.PORTB_Bits (5) := niveauLed;
      -- Bouclage infini vide, le processeur fait que boucler mais reste
      -- actif ce qui permet aux interruptions de toujours fonctionner
      loop
         null;
      end loop;
   end Run;

end WatchDogEx0;

L'ensemble du projet peut être télécharger ici : WatchdogWatchdog (4.49 Ko)

 

Truc en un peu plus, pour un peu plus tard, un peu plus loin bref en un peu plus quoi !

Quand on programme sur de l'embarqué on utilise toujours un port (sinon, cela veut dire que l'on a aucune entrées/sorties de connectées et du coup, et donc que le micro-contrôleur ne sert à rien). J'ai créé des fonctions pour déclarer les ports en entrées sorties, écrire dessus que j'ai enregistré sous un package « LVC.PINS ». Voici ce que donne ce code avec ce nouveau package.

------------------------------------------------------------------------------
--                                                                          --
--                         PACKAGE WatchDogEx1                              --
--                                 BODY                                     --
--                                                                          --
------------------------------------------------------------------------------

------------------------------------------------------------------------------
--  IMPORTATIONS ET UTILISATIONS DES PACKAGES UTILES                        --
------------------------------------------------------------------------------
with AVR;
with AVR.MCU;
with AVR.Interrupts;
with LVC.PINS;

use AVR;
use AVR.MCU;
use LVC.PINS;

package body WatchDogEx1 is

------------------------------------------------------------------------------
--  DECLARATIONS DES VARIABLES                                              --
------------------------------------------------------------------------------
   -- Variable globale niveauLed stockant le dernier état envoyé à la LED D13
   niveauLed : lvcLevel := High_lvl;

------------------------------------------------------------------------------
--  DECLARATIONS DES PROCEDURES ET FONCTIONS                                --
------------------------------------------------------------------------------

   -- Initialisation du WatchDog
   procedure init_Watchdog is
   begin
      AVR.Interrupts.Disable;
      -- Watchdog reset
      Wdr;
      -- Start timed sequence
      MCU.WDTCSR := +(MCU.WDCE_Bit => True,
                      MCU.WDE_Bit => True,
                      others => False);
      -- Set the prescaler 4.0 s and the WatchDog Timer Configuration:
      -- just in Interrupt Mode
      MCU.WDTCSR :=  +(MCU.WDIE_Bit => True,
                       MCU.WDE_Bit => False,
                       MCU.WDP3_Bit => True,
                       others => False);

      AVR.Interrupts.Enable;
   end init_Watchdog;

------------------------------------------------------------------------------
--  DECLARATIONS DES PROCEDURES D'INTERRUPTIONS                             --
------------------------------------------------------------------------------

   -- Traitement de l'interruption du WatchDog
   procedure WatchDog_Interrupt;

   pragma Machine_Attribute (Entity         => WatchDog_Interrupt,
                             Attribute_Name => "signal");
   pragma Export (C, WatchDog_Interrupt, MCU.Sig_WDT_String);

   procedure WatchDog_Interrupt is
   begin
      AVR.Interrupts.Disable;
      -- Changement d'état de la LED
      niveauLed := not niveauLed;
      digitalWrite(D13,niveauLed);
      AVR.Interrupts.Enable;
   end WatchDog_Interrupt;

------------------------------------------------------------------------------
--  LA PROCEDURE RUN                                                        --
------------------------------------------------------------------------------

   procedure Run is
   begin
      init_Watchdog;
      pinMode(D13,Output);
      digitalWrite(D13,niveauLed);
      loop
         null;
      end loop;
   end Run;

end WatchDogEx1;

L'ensemble du projet  peut être télécharger ici : Watchdog lvcpinWatchdog lvcpin (7.17 Ko)

 

Ajouter un commentaire

Vous utilisez un logiciel de type AdBlock, qui bloque le service de captchas publicitaires utilisé sur ce site. Pour pouvoir envoyer votre message, désactivez Adblock.

Créer un site gratuit avec e-monsite - Signaler un contenu illicite sur ce site