Cours:TpiiChenillardSimple

De troyesGEII
Révision datée du 20 décembre 2012 à 19:46 par SergeMoutou (discussion | contributions) (Valeurs à envoyer)
Aller à : navigation, rechercher

retour vers la page des Tps II

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
val2 = 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 série. On peut aussi mettre "int"

  for (i=1;i<=8;i++)                  // i prendra 8 valeurs différentes
  {
     ecrireParPort(device,val);       // changement de la valeur du port série
     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.

Solution avec 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

#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); 
}

retour vers la page des Tps II