Cours:TpiiChenillardSimple : Différence entre versions
m |
|||
(12 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
{{RetourVers/TpII}} | {{RetourVers/TpII}} | ||
− | = | + | ={{rouge|Remarques}}= |
Si vous copiez les solutions telles quelles | Si vous copiez les solutions telles quelles | ||
*l'affichage se fait par défaut sur votre PC avec des printf | *l'affichage se fait par défaut sur votre PC avec des printf | ||
Ligne 7 : | Ligne 7 : | ||
*il suffit de décommenter les lignes utiles pour faire l'affichage sur les leds de la carte | *il suffit de décommenter les lignes utiles pour faire l'affichage sur les leds de la carte | ||
− | =Solution détaillée= | + | ={{bleu|Solution détaillée}}= |
+ | ==Description== | ||
Pour réaliser un chenillard simple, nous devons envoyer successivement les valeurs suivantes sur le port parallèle : | Pour réaliser un chenillard simple, nous devons envoyer successivement les valeurs suivantes sur le port parallèle : | ||
Ligne 17 : | Ligne 18 : | ||
! Décimal | ! Décimal | ||
|- | |- | ||
− | | | + | |val1 = ||0||0||0||0||0||0||0||{{rouge|1}}|| ||align="center"| 1 |
|- | |- | ||
− | |val2 = ||0||0||0||0||0||0||1||0 ||align="center"| 2 | + | |val2 = ||0||0||0||0||0||0||{{rouge|1}}||0|| ||align="center"| 2 |
|- | |- | ||
− | |val3 = ||0||0||0||0||0||1||0||0 ||align="center"| 4 | + | |val3 = ||0||0||0||0||0||{{rouge|1}}||0||0|| ||align="center"| 4 |
|- | |- | ||
− | |val4 = ||0||0||0||0||1||0||0||0 ||align="center"| 8 | + | |val4 = ||0||0||0||0||{{rouge|1}}||0||0||0|| ||align="center"| 8 |
|- | |- | ||
− | |val5 = ||0||0||0||1||0||0||0||0 ||align="center"| 16 | + | |val5 = ||0||0||0||{{rouge|1}}||0||0||0||0|| ||align="center"| 16 |
|- | |- | ||
− | |val6 = ||0||0||1||0||0||0||0||0 ||align="center"| 32 | + | |val6 = ||0||0||{{rouge|1}}||0||0||0||0||0|| ||align="center"| 32 |
|- | |- | ||
− | |val7 = ||0||1||0||0||0||0||0||0 ||align="center"| 64 | + | |val7 = ||0||{{rouge|1}}||0||0||0||0||0||0|| ||align="center"| 64 |
|- | |- | ||
− | |val8 = ||1||0||0||0||0||0||0||0 ||align="center"| 128 | + | |val8 = ||{{rouge|1}}||0||0||0||0||0||0||0|| ||align="center"| 128 |
|} | |} | ||
+ | ==Port parallèle== | ||
+ | Ecrivons le programme ... | ||
+ | On commence par demander un accès au port parallèle : | ||
− | = | + | <source lang=c> |
+ | // on ajoute les fonctions de communications | ||
+ | #include "commcarte.h" | ||
− | + | int main() | |
− | |||
− | |||
{ | { | ||
− | int | + | int device; |
− | + | // on ouvre un accès au port parallèle. La valeur retournée permet ensuite d'envoyer/lire des données. | |
+ | device=openParPort("/dev/parport0"); | ||
+ | |||
+ | |||
+ | // notre programme sera décrit | ||
+ | // dans cette partie | ||
+ | // on utilise la fonction | ||
+ | // ecrireParPort pour changer les données | ||
+ | |||
+ | // fermeture de l'accès | ||
+ | closeParPort(device); | ||
} | } | ||
+ | </source> | ||
+ | |||
+ | ==Boucle== | ||
+ | |||
+ | Nous devons envoyer 8 valeurs différentes. Donc nous architecturons le programme autour d'une boucle. On choisit une boucle [[C#for|for]]. | ||
+ | |||
+ | <source lang=c> | ||
+ | |||
+ | for (i=1;i<=8;i++) | ||
+ | { | ||
+ | // liste des | ||
+ | // instructions à répéter | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | ==Valeurs à envoyer== | ||
+ | |||
+ | La première valeur à envoyer est 1. On constate qu'ensuite, il suffit de multiplier par 2 pour obtenir la valeur suivante. | ||
+ | |||
+ | On obtient donc le code complet : | ||
+ | |||
+ | <source lang=c> | ||
+ | // on ajoute les fonctions de communications | ||
+ | #include "commcarte.h" | ||
int main() | int main() | ||
{ | { | ||
int device; | int device; | ||
− | //device=openParPort("/dev/parport0"); | + | // on ouvre un accès au port parallèle. La valeur retournée permet ensuite d'envoyer/lire des données. |
− | unsigned char val | + | device=openParPort("/dev/parport0"); |
− | + | unsigned char i; // variable utilisée pour la boucle. On peut bien sûr utiliser un "int" | |
+ | unsigned char val; // valeur que l'on enverra sur le port parallèle. On peut aussi mettre "int" | ||
+ | |||
+ | val=1; // première valeur à placer sur le port parallèle | ||
+ | for (i=1;i<=8;i++) // i prendra 8 valeurs différentes | ||
{ | { | ||
− | + | ecrireParPort(device,val); // changement de la valeur du port parallèle | |
− | + | usleep(100000); // on attend un peu | |
− | + | val=val*2; // on passe à la valeur suivante de val | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | + | closeParPort(device); // fermeture de l'accès | |
} | } | ||
</source> | </source> | ||
+ | Bien sûr, chacun aura remarqué que ce programme exécute une seule fois le chenillard. Il est naturellement possible d'ajouter une autre boucle (infinie ou non) autour de la boucle for. Ceci n'est pas détaillé ici par souci de simplification mais sera présenté plus loin. | ||
− | =Solution avec boucle for= | + | ={{bleu|Solution avec boucle for}}= |
+ | Nous allons commencer par présenter une solution pour laquelle la multiplication par deux est réalisée dans la boucle for. | ||
==multiplication par 2== | ==multiplication par 2== | ||
Ligne 96 : | Ligne 134 : | ||
==décalage de n bits== | ==décalage de n bits== | ||
− | + | Nous allons utiliser maintenant un opérateur de décalage "<<". Il est important d'en connaitre la signification et nous espérons que les étudiants qui essaieront cet exemple le comprendront correctement. Après quelques petits efforts vous verrez une correspondance entre "<<1" et "*2". | |
<source lang="c"> | <source lang="c"> | ||
#include "commcarte.h" | #include "commcarte.h" | ||
Ligne 116 : | Ligne 154 : | ||
//ecrireParPort(device,1<<i); | //ecrireParPort(device,1<<i); | ||
printbits(1<<i);printf("\n"); | printbits(1<<i);printf("\n"); | ||
+ | //usleep(100000); | ||
+ | } | ||
+ | } | ||
+ | //closeParPort(device); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | ={{bleu|Solution avec une boucle while}}= | ||
+ | |||
+ | <source lang="c"> | ||
+ | #include "commcarte.h" | ||
+ | void printbits(unsigned char n) | ||
+ | { | ||
+ | int i; | ||
+ | for (i=7;i>=0;i--) printf("%d", (n >> i ) & 1); | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int device; | ||
+ | //device=openParPort("/dev/parport0"); | ||
+ | unsigned char val,cpt=0; | ||
+ | while (cpt<3) | ||
+ | { | ||
+ | cpt++; | ||
+ | val=0x01; | ||
+ | while (val) | ||
+ | { | ||
+ | //ecrireParPort(device,val); | ||
+ | printbits(val);printf("\n"); | ||
+ | val=val<<1 ; | ||
//usleep(100000); | //usleep(100000); | ||
} | } |
Version actuelle datée du 6 janvier 2013 à 22:05
retour vers la page des Tps II
Sommaire
Remarques
Si vous copiez les solutions telles quelles
- l'affichage se fait par défaut sur votre PC avec des printf
- ne modifiez pas la fonction printbits, elle sert uniquement à faire un affichage binaire
- il suffit de décommenter les lignes utiles pour faire l'affichage sur les leds de la carte
Solution détaillée
Description
Pour réaliser un chenillard simple, nous devons envoyer successivement les valeurs suivantes sur le port parallèle :
Binaire | Décimal | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
val1 = | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | |
val2 = | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | |
val3 = | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 4 | |
val4 = | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 8 | |
val5 = | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 16 | |
val6 = | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 32 | |
val7 = | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 64 | |
val8 = | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 128 |
Port parallèle
Ecrivons le programme ... On commence par demander un accès au port parallèle :
// on ajoute les fonctions de communications
#include "commcarte.h"
int main()
{
int device;
// on ouvre un accès au port parallèle. La valeur retournée permet ensuite d'envoyer/lire des données.
device=openParPort("/dev/parport0");
// notre programme sera décrit
// dans cette partie
// on utilise la fonction
// ecrireParPort pour changer les données
// fermeture de l'accès
closeParPort(device);
}
Boucle
Nous devons envoyer 8 valeurs différentes. Donc nous architecturons le programme autour d'une boucle. On choisit une boucle for.
for (i=1;i<=8;i++)
{
// liste des
// instructions à répéter
}
Valeurs à envoyer
La première valeur à envoyer est 1. On constate qu'ensuite, il suffit de multiplier par 2 pour obtenir la valeur suivante.
On obtient donc le code complet :
// on ajoute les fonctions de communications
#include "commcarte.h"
int main()
{
int device;
// on ouvre un accès au port parallèle. La valeur retournée permet ensuite d'envoyer/lire des données.
device=openParPort("/dev/parport0");
unsigned char i; // variable utilisée pour la boucle. On peut bien sûr utiliser un "int"
unsigned char val; // valeur que l'on enverra sur le port parallèle. On peut aussi mettre "int"
val=1; // première valeur à placer sur le port parallèle
for (i=1;i<=8;i++) // i prendra 8 valeurs différentes
{
ecrireParPort(device,val); // changement de la valeur du port parallèle
usleep(100000); // on attend un peu
val=val*2; // on passe à la valeur suivante de val
}
closeParPort(device); // fermeture de l'accès
}
Bien sûr, chacun aura remarqué que ce programme exécute une seule fois le chenillard. Il est naturellement possible d'ajouter une autre boucle (infinie ou non) autour de la boucle for. Ceci n'est pas détaillé ici par souci de simplification mais sera présenté plus loin.
Solution avec boucle for
Nous allons commencer par présenter une solution pour laquelle la multiplication par deux est réalisée dans la boucle for.
multiplication par 2
#include "commcarte.h"
void printbits(unsigned char n)
{
int i;
for (i=7;i>=0;i--) printf("%d", (n >> i ) & 1);
}
int main()
{
int device;
//device=openParPort("/dev/parport0");
unsigned char i,cpt;
for (cpt=0;cpt<3;cpt++)
{
for (i=1;i>0;i*=2)
{
//ecrireParPort(device,i);
printbits(i);printf("\n");
//usleep(100000);
}
}
//closeParPort(device);
}
décalage de n bits
Nous allons utiliser maintenant un opérateur de décalage "<<". Il est important d'en connaitre la signification et nous espérons que les étudiants qui essaieront cet exemple le comprendront correctement. Après quelques petits efforts vous verrez une correspondance entre "<<1" et "*2".
#include "commcarte.h"
void printbits(unsigned char n)
{
int i;
for (i=7;i>=0;i--) printf("%d", (n >> i ) & 1);
}
int main()
{
int device;
//device=openParPort("/dev/parport0");
unsigned char i,cpt;
for (cpt=0;cpt<3;cpt++)
{
for (i=0;i<8;i++)
{
//ecrireParPort(device,1<<i);
printbits(1<<i);printf("\n");
//usleep(100000);
}
}
//closeParPort(device);
}
Solution avec une boucle while
#include "commcarte.h"
void printbits(unsigned char n)
{
int i;
for (i=7;i>=0;i--) printf("%d", (n >> i ) & 1);
}
int main()
{
int device;
//device=openParPort("/dev/parport0");
unsigned char val,cpt=0;
while (cpt<3)
{
cpt++;
val=0x01;
while (val)
{
//ecrireParPort(device,val);
printbits(val);printf("\n");
val=val<<1 ;
//usleep(100000);
}
}
//closeParPort(device);
}