« 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 : Changement de type cosmétique
Ligne 8 : Ligne 8 :
| suivant = [[../Le Timer0 des 16FXXX et le langage C/]]
| suivant = [[../Le Timer0 des 16FXXX et le langage C/]]
}}
}}
==Exercice 1==
== Exercice 1 ==
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.
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.
<source lang="c">
<source lang="c">
Ligne 31 : Ligne 31 :
3°) Refaire le même travail en utilisant les noms des bits directement.
3°) Refaire le même travail en utilisant les noms des bits directement.


==Exercice 2==
== Exercice 2 ==
Nous allons essayer de dimentionner R1 dans les montages ci-dessus.
Nous allons essayer de dimentionner R1 dans les montages ci-dessus.
1°) Une led rouge (Kingbright λ = 627nm 15mcd à 10mA VD = 1,95V) est montée comme à gauche sur le bit b0 du PORTB d'un 16F84. A 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 5mA.
1°) Une led rouge (Kingbright λ = 627nm 15mcd à 10mA VD = 1,95V) est montée comme à gauche sur le bit b0 du PORTB d'un 16F84. A 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 5mA.
Ligne 39 : Ligne 39 :
3°) On désire commander deux leds rouge en série. Faire le schéma et dimensionner correctement la résistance.
3°) On désire commander deux leds rouge en série. Faire le schéma et dimensionner correctement la résistance.


==Exercice 3==
== Exercice 3 ==
On connecte deux interrupteurs comme indiqué dans la partie gauche sans utiliser de résistance pull-up interne.
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.
Les deux LEDs de l'exercice 1 sont elles aussi connectées.
Ligne 63 : Ligne 63 :
2°) Peut-on modifier facilement le programme pour que les deux LEDs fonctionnent à deux fréquences différentes ?
2°) Peut-on modifier facilement le programme pour que les deux LEDs fonctionnent à deux fréquences différentes ?


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


Ligne 91 : Ligne 91 :




==Exercice 5==
== Exercice 5 ==
=== Interfaçage d'un clavier 12 touches ===
=== Interfaçage d'un clavier 12 touches ===



Version du 21 mars 2012 à 19:52

Les sous-programmes en assembleur
Image logo représentative de la faculté
Exercices no6
Leçon : Utiliser les PIC 16F et 18F

Exercices de niveau 15.

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



Exercice 1

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

Nous allons essayer de dimentionner R1 dans les montages ci-dessus. 1°) Une led rouge (Kingbright λ = 627nm 15mcd à 10mA VD = 1,95V) est montée comme à gauche sur le bit b0 du PORTB d'un 16F84. A 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 5mA.

2°) Une led verte (Kingbright λ=565nm 12mcd à 10mA VD = 2,09V) 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 4mA.

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

Exercice 3

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

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

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