Cours:TPS 2103 tpDigicode : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
m
 
(5 révisions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 +
[[Cours:CoursM2103|{{Rouge|<big>'''Fiche résumé'''</big>}}]]
 +
 +
[[Cours:TPs_2103|{{Bleu|<big>'''Retour à la liste des Tps'''</big>}}]]
 +
 +
[[Cours:TPS_2103_tpDigicode_corrige|{{Vert|<big>'''Éléments de correction'''</big>}}]]
 +
 +
[[Fichier:Arduino-nano-pinout.png|600px|droite]]
  
  
Ligne 5 : Ligne 12 :
 
Commençons pour définir les contraintes :
 
Commençons pour définir les contraintes :
  
*On appuie sur la touche '*' pour démarrer la saisie du code => la led rouge s'allume
+
*On appuie sur la touche '*' pour démarrer la saisie du code => la led rouge s'allume brièvement
 
*L'utilisateur doit alors saisir le code sur 4 chiffres
 
*L'utilisateur doit alors saisir le code sur 4 chiffres
 
*On valide le code par la touche '#'
 
*On valide le code par la touche '#'
Ligne 15 : Ligne 22 :
 
int8_t lecture_ligne()
 
int8_t lecture_ligne()
 
{
 
{
   int8_t ch;
+
   int8_t etatEntrees;
   DDRD |= (1<<PD4)|(1<<PD5)|(1<<PD6) ;// commençons par lister les sorties sur le port D
+
   DDRB  |= ((1<<PB2)|(1<<PB1)|(1<<PB0));           // commençons par lister les sorties sur le port B
   DDRB &=~( (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) ) ;   // puis les entrées sur le port B
+
   DDRC  &=~((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2)); // puis les entrées sur le port C
   PORTD &=~( (1<<PD4)|(1<<PD5)|(1<<PD6) ) ;   // on place les sortie à l'état 0
+
   PORTB &=~((1<<PB2)|(1<<PB1)|(1<<PB0));           // on place les sortie à l'état 0
   PORTB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) ;   // on active les résistances de pull-up sur les entrées
+
   PORTC |= ((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2)); // on active les résistances de pull-up sur les entrées
  
   _delay_ms(1);        // un délais est nécessaire pour l'activation des pull-ups
+
   _delay_ms(1);        // un délai est nécessaire pour l'activation des pull-ups
  
   ch = PINB & 0b00001111; // on récupère ensuite l'état des entrées
+
   etatEntrees = PINC & 0b00111100; // on récupère ensuite l'état des entrées en cachant les bits non utiles
   switch (ch)
+
   switch (etatEntrees)
 
   {
 
   {
     case  0b1111: return 0; // aucune touche
+
     case  0b00111000: return 0; // L0 (appui sur l'une des touches 0/1/2 )
     case  0b1110: return 1; // L1
+
     case  0b00110100: return 1; // L1
     case  0b1101: return 2; // L2
+
     case  0b00101100: return 2; // L2
     case  0b1011: return 3; // L3
+
     case  0b00011100: return 3; // L3
    case  0b0111: return 4; // L4
+
     // si autre cas, pas de touches deux touches ou autre
     // si autre cas, deux touches ou autre
 
 
     default : return -1;
 
     default : return -1;
 
   }
 
   }
 
}
 
}
 
 
int8_t lecture_colonne()
 
int8_t lecture_colonne()
 
{
 
{
   uint8_t ch;
+
   int8_t etatEntrees;
   DDRD &=~( (1<<PD4)|(1<<PD5)|(1<<PD6) );// colonnes en entrée
+
   DDRB  &=~((1<<PB2)|(1<<PB1)|(1<<PB0));           // commençons par lister les sorties sur le port B
   DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) ;   // lignes en sortie
+
   DDRC  |= ((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2)); // puis les entrées sur le port C
   PORTD |= (1<<PD4)|(1<<PD5)|(1<<PD6) ;   // pull-up
+
   PORTB |= ((1<<PB2)|(1<<PB1)|(1<<PB0));           // on place les sortie à l'état 0
   PORTB &=~( (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3) );   // sorties à 0
+
   PORTC &=~((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2)); // on active les résistances de pull-up sur les entrées
  
   _delay_ms(1);        // un délais est nécessaire pour l'activation des pull-ups
+
   _delay_ms(1);        // un délai est nécessaire pour l'activation des pull-ups
  
   ch = PIND & 0b01110000; // on récupère ensuite l'état des entrées
+
   etatEntrees = PINB & 0b00000111; // on récupère ensuite l'état des entrées en cachant les bits non utiles
   switch (ch)
+
   switch (etatEntrees)
 
   {
 
   {
     case  0b01110000: return 0; // aucune touche
+
     case  0b00000110: return 0; // L0 (appui sur l'une des touches 0/1/2 )
     case  0b01100000: return 1; // C1
+
     case  0b00000101: return 1; // L1
     case  0b01010000: return 2; // C2
+
     case  0b00000011: return 2; // L2
    case  0b00110000: return 3; // C3
+
     // si autre cas, pas de touches deux touches ou autre
     // si autre cas, deux touches ou autre
 
 
     default : return -1;
 
     default : return -1;
 
   }
 
   }
 
}
 
}
 
+
const int8_t touches[4][3] = { { 1, 2, 3},
int8_t touches[4][3] = { { 1, 2, 3},
+
                            { 4, 5, 6},
                          { 4, 5, 6},
+
                            { 7, 8, 9},
                          { 7, 8, 9},
+
                            {10, 0,11} };
                          {10, 0,11} };
 
  
 
int8_t getTouche()
 
int8_t getTouche()
 
{
 
{
   int8_t line,col;
+
   int8_t ligne,colonne;
   line=lecture_ligne();
+
   ligne  =lecture_ligne();
   col=lecture_colonne();
+
   colonne=lecture_colonne();
   if ((col>0) && (col<4) && (line >0) && (line < 5))
+
   if ((ligne==-1)or(colonne==-1)) return -1;
    return touches[line-1][col-1];
+
   else                           return touches[ligne][colonne];
   else
 
    return -1;
 
 
}
 
}
 
</source>
 
</source>
Ligne 81 : Ligne 82 :
  
  
En cas de besoin, et seulement si vous n'avez aucune idée sur comment fait, vous pouvez [[Cours:TPS_2103_tpDigicodeAlgorithme|consulter cette page]]
+
En cas de besoin, et seulement si vous n'avez aucune idée sur comment faire, vous pouvez [[Cours:TPS_2103_tpDigicodeAlgorithme|consulter cette page]]
 +
 
 +
'''Remarque''' : Il y a beaucoup plus simple ;-)
 +
 
  
 
=Améliorations=
 
=Améliorations=

Version actuelle datée du 14 février 2024 à 11:16

Fiche résumé

Retour à la liste des Tps

Éléments de correction

Arduino-nano-pinout.png


Nous allons utiliser la fonction getTouche() pour réaliser un programme de digicode.

Commençons pour définir les contraintes :

  • On appuie sur la touche '*' pour démarrer la saisie du code => la led rouge s'allume brièvement
  • L'utilisateur doit alors saisir le code sur 4 chiffres
  • On valide le code par la touche '#'
  • Si le code est bon la led verte s'allume pendant 10s, sinon la led rouge clignote pendant 10s


Si vous n'avez pas terminé le tp précédent, vous pouvez utiliser les fonctions suivantes :

int8_t lecture_ligne()
{
  int8_t etatEntrees;
  DDRB  |= ((1<<PB2)|(1<<PB1)|(1<<PB0));           // commençons par lister les sorties sur le port B
  DDRC  &=~((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2));  // puis les entrées sur le port C
  PORTB &=~((1<<PB2)|(1<<PB1)|(1<<PB0));           // on place les sortie à l'état 0
  PORTC |= ((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2));  // on active les résistances de pull-up sur les entrées

  _delay_ms(1);        // un délai est nécessaire pour l'activation des pull-ups

  etatEntrees = PINC & 0b00111100; // on récupère ensuite l'état des entrées en cachant les bits non utiles
  switch (etatEntrees)
  {
     case  0b00111000: return 0; // L0 (appui sur l'une des touches 0/1/2 )
     case  0b00110100: return 1; // L1
     case  0b00101100: return 2; // L2
     case  0b00011100: return 3; // L3
     // si autre cas, pas de touches deux touches ou autre
     default : return -1;
  }
}
int8_t lecture_colonne()
{
  int8_t etatEntrees;
  DDRB  &=~((1<<PB2)|(1<<PB1)|(1<<PB0));           // commençons par lister les sorties sur le port B
  DDRC  |= ((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2));  // puis les entrées sur le port C
  PORTB |= ((1<<PB2)|(1<<PB1)|(1<<PB0));           // on place les sortie à l'état 0
  PORTC &=~((1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2));  // on active les résistances de pull-up sur les entrées

  _delay_ms(1);        // un délai est nécessaire pour l'activation des pull-ups

  etatEntrees = PINB & 0b00000111; // on récupère ensuite l'état des entrées en cachant les bits non utiles
  switch (etatEntrees)
  {
     case  0b00000110: return 0; // L0 (appui sur l'une des touches 0/1/2 )
     case  0b00000101: return 1; // L1
     case  0b00000011: return 2; // L2
     // si autre cas, pas de touches deux touches ou autre
     default : return -1;
  }
}
const int8_t touches[4][3] = { { 1, 2, 3},
                             { 4, 5, 6},
                             { 7, 8, 9},
                             {10, 0,11} };

int8_t getTouche()
{
  int8_t ligne,colonne;
  ligne  =lecture_ligne();
  colonne=lecture_colonne();
  if ((ligne==-1)or(colonne==-1)) return -1;
  else                            return touches[ligne][colonne];
}

Codez !

Question.jpg Ecrire un algorithme ( sur feuille !! ) puis réaliser le programme correspondant


En cas de besoin, et seulement si vous n'avez aucune idée sur comment faire, vous pouvez consulter cette page

Remarque : Il y a beaucoup plus simple ;-)


Améliorations

Question.jpg Ajouter une procédure de changement du code.


Question.jpg Faire en sorte que le temps maximum de saisie du code soit de 4s