Leçons de niveau 15

Utiliser les PIC 16F et 18F/Exercices/Les ports et le langage C

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche
Les ports et le langage C
Image logo représentative de la faculté
Exercices no6
Leçon : Utiliser les PIC 16F et 18F
Chapitre du cours : Les ports et le langage C

Exercices de niveau 15.

Exo préc. :Introduction au langage C
Exo suiv. :Le Timer0 des 16FXXX et le langage C
Icon falscher Titel.svg
En raison de limitations techniques, la typographie souhaitable du titre, « Exercice : Les ports et le langage C
Utiliser les PIC 16F et 18F/Exercices/Les ports et le langage C
 », n'a pu être restituée correctement ci-dessus.




Exercice 1[modifier | modifier le wikicode]

Pour vérifier la bonne compréhension de ce qui a été dit sur les bits (et le MikroC), nous donnons le fichier d'entête des bits correspondant au registre INTCON.

//********* bits de INTCON
GIE      = 0x0007,
EEIE       = 0x0006,
T0IE       = 0x0005,
INTE       = 0x0004,
RBIE       = 0x0003,
T0IF       = 0x0002,
INTF       = 0x0001,
RBIF       = 0x0000,

1°) Dessiner le registre correspondant

2°) En utilisant les masques du TD précédent, écrire les instructions C permettant :

  • mise à 1 de GIE
  • mise à 0 de INTE.
  • tester si T0IE est à 1
  • tester si T0IF est à 0

3°) Refaire le même travail en utilisant les noms des bits directement.

Exercice 2[modifier | modifier le wikicode]

Nous allons essayer de dimentionner R1 dans les montages ci-dessus. 1°) Une led rouge (Kingbright λ = 627 nm 15mcd à 10 mA VD = 1,95 V) est montée comme à gauche sur le bit b0 du PORTB d'un 16F84. À l'aide du modèle de Thévenin du PORT, on vous demande d'évaluer la résistance R1 à mettre pour avoir un courant ne dépassant pas 5 mA.

2°) Une led verte (Kingbright λ=565 nm 12mcd à 10 mA VD = 2,09 V) est montée comme sur le schéma de gauche (sur le bit b2 du PORTB). Calculer R1 sans prendre l'approximation de Rth pour avoir un courant qui ne dépasse pas les 4 mA.

3°) On désire commander deux leds rouge en série. Faire le schéma et dimensionner correctement la résistance.

Exercice 3[modifier | modifier le wikicode]

On connecte deux interrupteurs comme indiqué dans la partie gauche sans utiliser de résistance pull-up interne. Les deux LEDs de l'exercice 1 sont elles aussi connectées.

1°) On désire écrire un programme C qui ne fait rien si on n'appuie sur aucun bouton poussoir, fait clignoter la LED rouge si l’on appuie sur un bouton, fait clignoter la led verte si on appuie sur l'autre bouton, et les deux LEDs si l’on appuie sur les deux boutons.

1-a) Donner les 4 valeurs possibles de la variable interrupteurs avec l'instruction

	interrupteurs = PORTB & 0x12;

1-b) Compléter alors le programme :

// boucle d'attente ATTENTION PB4=1 et PB1=0 au repos
while(interrupteurs.F1==0 &&  interrupteurs.F4==1)
     interrupteurs = PORTB & 0x12;
switch(interrupteurs) {
  case 0x12 : PORTB = PORTB^0x01;break; 
  case 0x00: PORTB = PORTB^0x04;break;
  case 0x02 : PORTB = PORTB^0x05;break; // les deux
}
Delay_ms(1000);

2°) Peut-on modifier facilement le programme pour que les deux LEDs fonctionnent à deux fréquences différentes ?

Exercice 4[modifier | modifier le wikicode]

On désire réaliser un dé comme indiqué sur le schéma plus loin.

1°) Calculer les six valeurs prédéfinies pour allumer correctement le dé et les ranger dans un tableau si la première case du tableau éteint tout. Quel est l’affichage du dé correspondant à :

	unsigned char tableau[7]={0x00,0x08,0x22,0x2A,0x55,0x5D,0x77};

2°) Écrire un programme complet qui affiche les 6 valeurs du dé avec un délai d'attente de 3s utilisant la fonction "Delay_ms()" de la librairie MikroC.

3°) On désire maintenant générer de manière aléatoire le score affiché sur le dé. Pour cela on vous propose d’utiliser la fonction ci-dessous.

unsigned char pseudoAleat(int Lim) {
  unsigned char result;
  static unsigned int Y=1;
  Y = (Y * 32719 + 3) % 32749;
  Result = ((Y % Lim)+1);
  return Result;
}

3-a) Calculer la première valeur de cette fonction si Lim=6.

3-b) Écrire le programme général qui génère les valeurs du dé de manière aléatoire dès l'appui du bouton poussoir (attente de 0,3s pour éviter les rebonds).

4°) Proposer un schéma pour réaliser deux dés en utilisant un seul PORT de sortie sur 8 bits. Écrire le programme correspondant. L'astuce consiste à regrouper les leds qui s'allument ensembles (pour un dé) sur un même bit du PORT : il faut ainsi 4 bits par dé.


Exercice 5[modifier | modifier le wikicode]

Interfaçage d'un clavier 12 touches[modifier | modifier le wikicode]

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.

Dígito.jpg
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 6 (d'après les TPs)[modifier | modifier le wikicode]

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).