Cours:TPS 2103 2 : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
m
m ({{Rouge|Buzzer}})
Ligne 48 : Ligne 48 :
 
void buzz(unsigned char note);
 
void buzz(unsigned char note);
 
</source>
 
</source>
 +
 +
={{Rouge|Decodage d'un clavier}}=
 +
On commence par rappeler ce qui a été fait en TD.
 +
==Interfacer un clavier==
 +
Sur un PC, le clavier est complètement décodé. C'est à dire que lorsqu'une touche est appuyée, sa position sur le clavier est envoyée sur la liaison PS2. Le fait d'envoyer la position et non le code ASCII permet de gérer les claviers en divers langues.
 +
 +
[[Fichier:Clavier12Touches.png|thumb|500px|Clavier 12 touches]]
 +
 +
Pour de petites applications, on utilise un clavier à 12 touches. Il est composé de simples contacts et le décodage est réalisé par le système informatique. Avec seulement 8 touches, un PORT de 8 bits en entrée suffit. Si le clavier possède plus de 8 touches, il faut:
 +
* soit utiliser d'avantage d'entrées,
 +
* soit multiplexer les entrées en deux étapes.
 +
En utilisant 4 fils pour les lignes et 4 fils pour les colonnes, on peut différencier par croisement 16 touches. On utilise donc 8 fils reliés à 8 bits d'un PORT pour 16 touches. Pour nos 12 touches on peut câbler comme indiqué ci-dessus. Il s'agit ensuite de procéder en  deux phases, une pour la détection de la colonne et une autre pour la détection de ligne.
 +
===Exercice===
 +
====Question 1 : détermination du numéro de colonne====
 +
<source lang=c>
 +
#define NOTAKEY 127
 +
// colonne 1 à gauche
 +
char lecture_colonne(){
 +
  char ch;
 +
  DDRB=0xF0; // 1111 0000
 +
  PORTB = 0x00; // B4, B5,B6 et B7  mis à 0 !!! surtout pas 0x0F =>pullup !!!
 +
  ch = PINB & 0x0E; // on ne garde que les bits intéressants B1, B2 et B3
 +
  switch (ch) {
 +
  case 14 : return 0;//aucune touche
 +
  case 6 : return 1;//a gauche
 +
  case 10 : return 2;// au milieu
 +
  case 12 : return 3;//a droite
 +
// si autre cas, deux touches ou autre
 +
  default : return NOTAKEY;
 +
  }
 +
}
 +
</source>
 +
Commenter en testant les bonnes valeurs du case.
 +
====Question 2 : détermination du numéro de ligne====
 +
Programmer les directions avec '''DDRB''' (PB7-PB4 en entrée et PB3-PB1 en sortie).
 +
 +
Quel est le code correspondant : sous-programme char lecture_ligne()
 +
 +
====Question 3 : détermination du caractère====
 +
A partir des deux informations précédentes transformer le numéro de colonne et le numéro de ligne en caractère correspondant sur le clavier : '1' ou '2' ou ... ou '0' ou '#'
 +
{{remarque|contenu=les bits RB4-RB7 peuvent servir à déclencher une interruption (RB port change Interrupt). Si l'on veut utiliser cette interruption il faudrait câbler notre clavier autrement. Les interruptions seront abordées plus loin.
 +
}}

Version du 3 avril 2014 à 19:23

Vous allez développer un système de digicode architecturé autour d'un atmega328p (le µcontrôleur présent sur les cartes arduino).

ArduinoPinout.png

Informations lumineuses

Le digicode sera équipé de 2 voyants lumineux (rouge et vert). On utilisera des résistances de 330Ω, et vous êtes libre de choisir un montage à anodes ou cathodes communes.

Todo.jpg Câbler sur une plaque à essais les leds sur les pin PC0 et PC1

Question.jpg Écrire une fonction pour éteindre ou allumer une led dont le prototype sera le suivant :

void chgEtatLed(unsigned char numLed,unsigned char val);
Bluebg.png
Aidesmall.png
À propos de cette image

Astuce


Vous pourrez vous inspirer du programme suivant permettant de faire clignoter la led "13" de la carte Arduino Uno.

#define led PB5

void setup()
{
  DDRB |= 1 << led;
  
}

void loop()
{
  PORTB |= 1 << led;
  delay(100);
  PORTB &= ~(1 << led);
  delay(100);
}

Buzzer

période : de 1400 µs à 4000 µs

sortie en opposition

void buzz(unsigned char note);

Decodage d'un clavier

On commence par rappeler ce qui a été fait en TD.

Interfacer un clavier

Sur un PC, le clavier est complètement décodé. C'est à dire que lorsqu'une touche est appuyée, sa position sur le clavier est envoyée sur la liaison PS2. Le fait d'envoyer la position et non le code ASCII permet de gérer les claviers en divers langues.

Clavier 12 touches

Pour de petites applications, on utilise un clavier à 12 touches. Il est composé de simples contacts et le décodage est réalisé par le système informatique. Avec seulement 8 touches, un PORT de 8 bits en entrée suffit. Si le clavier possède plus de 8 touches, il faut:

  • soit utiliser d'avantage d'entrées,
  • soit multiplexer les entrées en deux étapes.

En utilisant 4 fils pour les lignes et 4 fils pour les colonnes, on peut différencier par croisement 16 touches. On utilise donc 8 fils reliés à 8 bits d'un PORT pour 16 touches. Pour nos 12 touches on peut câbler comme indiqué ci-dessus. Il s'agit ensuite de procéder en deux phases, une pour la détection de la colonne et une autre pour la détection de ligne.

Exercice

Question 1 : détermination du numéro de colonne

#define NOTAKEY 127
// colonne 1 à gauche
char lecture_colonne(){
  char ch;
  DDRB=0xF0; // 1111 0000
  PORTB = 0x00; // B4, B5,B6 et B7  mis à 0 !!! surtout pas 0x0F =>pullup !!!
  ch = PINB & 0x0E; // on ne garde que les bits intéressants B1, B2 et B3
  switch (ch) {
  case 14 : return 0;//aucune touche
  case 6 : return 1;//a gauche
  case 10 : return 2;// au milieu
  case 12 : return 3;//a droite
// si autre cas, deux touches ou autre
  default : return NOTAKEY;
  }
}

Commenter en testant les bonnes valeurs du case.

Question 2 : détermination du numéro de ligne

Programmer les directions avec DDRB (PB7-PB4 en entrée et PB3-PB1 en sortie).

Quel est le code correspondant : sous-programme char lecture_ligne()

Question 3 : détermination du caractère

A partir des deux informations précédentes transformer le numéro de colonne et le numéro de ligne en caractère correspondant sur le clavier : '1' ou '2' ou ... ou '0' ou '#' Modèle:Remarque