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

Contenu supprimé Contenu ajouté
Ligne 32 :
 
==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
<source lang="c">
interrupteurs = PORTB & 0x12;
</source>
1-b) Compléter alors le programme :
<source lang="c">
// 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);
</source>
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 à :
<source lang="c">
unsigned char tableau[7]={0x00,0x08,0x22,0x2A,0x55,0x5D,0x77};
</source>
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.
<source lang="c">
unsigned char pseudoAleat(int Lim) {
unsigned char result;
static unsigned int Y=1;
Y = (Y * 32719 + 3) % 32749;
Result = ((Y % Lim)+1);
return Result;
}
</source>
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 ===