« Utiliser les PIC 16F et 18F/Exercices/Les ports et le langage C » : différence entre les versions

Une page de Wikiversité, la communauté pédagogique libre.
Contenu supprimé Contenu ajouté
m Robot : Remplacement de texte automatisé (-\b(I|i|Dési|dési)nt[eé]rr?[éeêè](ssements?|sser|ssés?|ssées?|ssants?|ssantes?|as?|ais?|ait|ent)\b +\1ntére\2)
Ligne 36 : Ligne 36 :
Le schéma indique que l'appui d'une touche fait un contact entre un fil horizontal et un fil vertical.
Le schéma indique que l'appui d'une touche fait un contact entre un fil horizontal et un fil vertical.


<u>'''Question 1'''</u> : on met alors tous les fils verticaux à 0 (3 bits de poids faible du '''PORTB''') et on cherche sur quelle touche on a appuyé en cherchant où est le 0 ? Cela nous donnera un colonne.
<u>'''Question 1'''</u> : on met alors tous les fils verticaux à 0 (3 bits de poids faible du '''PORTB''') et on cherche sur quelle touche on a appuyé en cherchant où est le 0 ? Cela nous donnera une colonne.
<source lang="c">
<source lang="c">
// question 1 TD8
// question 1 TD8
#define NOTAKEY 127
#define NOTAKEY 127
// colonne 0 à gauche
// colonne 1 à gauche
char lecture_colonne(){
char lecture_colonne(){
char ch;
char ch;
TRISB=0x07;
TRISB=0x78; // 0111 1000
ch=PORTB & 0x07; // on ne garde que les bits intéressants
PORTB = PORTB & 0x87; // B3, B4,B5 et B6 mis à 0
ch = PORTB & 0x07; // on ne garde que les bits intéressants B0, B1 et B2
switch (ch) {
switch (ch) {
case 3 : return 0;//a gauche
case 7 : return 0;//aucune touche
case 5 : return 1;// au milieu
case 3 : return 1;//a gauche
case 6 : return 2;//a droite
case 5 : return 2;// au milieu
case 6 : return 3;//a droite
// si autre cas pas de touche ou deux touches
// si autre cas, deux touches ou autre
default : return NOTAKEY;
default : return NOTAKEY;
}
}
Ligne 57 : Ligne 59 :
<source lang="c">
<source lang="c">
// #define NOTAKEY 127
// #define NOTAKEY 127
// ligne 0 en haut
// ligne 1 en haut
char lecture_ligne(){
char lecture_ligne(){
char ch;
char ch;
TRISB=0x78; // 0111 1000
TRISB = 0x07; // 0000 0111
ch=PORTB & 0x78; // on ne garde que les bits intéressants
PORTB = PORTB & 0xF8; //B0, B1 et B2 mis à 0
ch=PORTB & 0x78; // on ne garde que les bits intéressants B3, B4,B5 et B6
switch (ch) {
switch (ch) {
case 0x38 : return 0;//en haut = 0011 1000
case 0x78 : return 0;//aucune touche
case 0x58 : return 1;// au milieu = 0101 1000
case 0x38 : return 1;//en haut = 0011 1000
case 0x68 : return 2;// au milieu = 0110 1000
case 0x58 : return 2;// au milieu = 0101 1000
case 0x70 : return 3;//en bas = 0111 0000
case 0x68 : return 3;// au milieu = 0110 1000
case 0x70 : return 4;//en bas = 0111 0000
// si autre cas pas de touche ou deux touches
// si autre cas, deux touches ou autre
default : return NOTAKEY;
default : return NOTAKEY;
}
}

Version du 6 mai 2011 à 15:55

Exercice 1

Interfaçage d'un clavier 12 touches

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.

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.

Clavier 12 touches

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.

Question 1 : détermination du numéro de colonne Programmer les directions avec TRISB (PB6-PB3 en sortie et PB2-PB0 en entrée).

Tester si une touche est appuyée. Si oui sauvegarder dans une variable la valeur lue sur PORTB puis transformer cette valeur en numéro de colonne (0 à gauche et 2 à droite)

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

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

Programmer les directions avec TRISB (PB6-PB3 en entrée et PB2-PB0 en sortie).

Tester si une touche est appuyée. Si oui sauvegarder dans une variable la valeur lue sur PORTB puis transformer cette valeur en numéro de ligne (0 en haut et 3 en bas)

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

Question 3 : détermination du caractère

À 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 '#'


Exercice 2 (d'après les TPs)

Le PORTB est relié à un ensemble de LEDs permettant la réalisation de chenillards. Un chenillard est donné par le programme suivant :

// MikroC
main(){
	int i;
	TRISB=0x00; // 0 = sorties
	for(;;) { 
		for(i=0;i<6;i++) { 
			PORTB=(0x03<<i|0xC0>>i);
                  Delay_ms(1000);
		} 
	} 
}

Compléter la suite des états de ce chenillard (ceux où une ou plusieurs leds sont allumées).