logo

Général

Accueil

Présentation section

Matériel section

Trombinoscopes

Liens

Plan du site

Contactez-nous

SN 1

Aide spécifique Java

TP C++ Arduino

Les TP réseau Linux

Les TD Java

Les TP Java

TD C#

TP C#

Les Mini-projets

Stage en entreprise

IRIS 2

TP IPC linux / coldFire

TP PHP

Cours / TP XML

Projets

Cours

SN 1

IRIS 2

Statistiques

1 visiteur

Record : 92

Pages vues :

Aujourd'hui : 158

Total : 180977

Valid XHTML 1.0 Transitional

Télémètre GP2D02

separation

[Vous êtes ici ] ==> Accueil > Général > Matériel section > Télémètre GP2D02

separation

Documentations :



2 documents se trouvent sur le partage Iris : ou

Branchement physique



Branchement

Code de lecture de la distance



Remarques sur le code
  • void timer(unsigned short nombre,unsigned short unite);
    Pour simplifier, cette fonction sera en boucle infinie tant que le temps ne sera pas écoulé. Le temps est passé en argument avec 2 paramètres :
    Le deuxième argument indique l’unité : ex
    unite==1000 => milliseconde (TRR==48000)
    Unite==1 => microseconde (TRR==1)
    Ex : timer(70,1000) correspondra à 70ms d’attente active.
  • void ecrit(unsigned short brocheSortie,unsigned short allume,volatile unsigned short * PCDATA);
    Cette fonction permet d’écrire sur la broche brocheSortie du port PCDATA 0 ou 1 déterminé par allume. (Attention logique inversée)
  • unsigned short lecture(unsigned short brocheSortie,volatile unsigned short * PCDATA);
    Cette fonction lit la broche brocheSortie du port PCDATA et retourne sa valeur (0 ou 1)
Vous utiliserez ces trois fonctions pour écrire le programme de lecture de la distance en suivant l’algorithme du constructeur (Chronogramme p2 et p3 fichier gp2d02.pdf)
Une fois la lecture effectuée, il faut la convertir en centimètre. Formule donnée dans le fichier g2d02_5 p10. Le paramètre 1560 est spécifique à chaque télémètre, il faudra donc l’ajuster par tatonnement.

Remarque :
  • On utilisera sur le port B la broche 0 pour l’horloge (mise en sortie (1)) et la broche 1 pour la lecture des données du télémètre (mise en entrée (0)).
  • Pour l’écriture, la logique est inversée, l’écriture d’un 1 sur le port met la sortie physique à 0.
  • Ne pas oublier de remettre à 0 (ou 1 suivant configuration le registre TER, remise à 0 sur front)
  • Pour le timer, les deux fichiers ColFire.pdf et MCF5272ulm.pdf sont toujours disponibles sur le partage.

Exported from Notepad++
/*****************************************************/ /* Didier Petitjean le 1/11/2008 distanceTp3.c */ /* Tp3 Mise en oeuvre de multiprocessus sur la carte */ /* Arcturus/ColdFire. */ /* Processus permettant la lecture régulière de la distance */ /* mesurée par télémètre, puis envoi par tube à un autre */ /* processus */ /*****************************************************/ #include #include #include #include // utilisation du premier timer unsigned short * TMR=(unsigned short *)(MCF_MBAR+0x200); //Timer mode register unsigned short * TRR=(unsigned short *)(MCF_MBAR+0x204); //Timer reference register unsigned short * TER=(unsigned short *)(MCF_MBAR+0x210); //Changement d'état void timer(unsigned short,unsigned short); void ecrit(unsigned short brocheSortie,unsigned short allume,volatile unsigned short * PCDATA); unsigned short lecture(unsigned short brocheSortie,volatile unsigned short * PCDATA); int main(int arc, char * argv[]) { int pidTampon,tubeEcriture,i; unsigned short distance=0; int envoi=0; // Init à l'adresse du Port B volatile unsigned short * PCDATA = (volatile unsigned short *)(MCF_MBAR + MCFSIM_PCDAT); // Configuration du port voir pour broche 0 en sortie broche 1 en entree * (volatile unsigned short *)(MCF_MBAR + MCFSIM_PCDDR)=0xFD00;//0xFF00 // Broche 0 : Vin horloge Broche 1 : Vout Données pidTampon=atoi(argv[1]); tubeEcriture=atoi(argv[2]); while(1) { distance=0; ecrit(0,0,PCDATA); timer(70,1000); //70mS for(i=0;i<8;i++) { distance=distance<<1; ecrit(0,1,PCDATA); timer(1,100); //0.1ms ecrit(0,0,PCDATA); timer(1,100); //0.1ms distance+=lecture(1,PCDATA); } ecrit(0,1,PCDATA); timer(2,1000); distance=(1532.9/(distance-54.2))-0.5; // Envoi de la distance dans le tube envoi=distance; write(tubeEcriture,&envoi,sizeof(int)); kill(pidTampon,SIGUSR1); } return 0; } /****************************************************************/ /* uSeconde est un multiple de 10 (1 -> uS, 1000-> mS) */ /* nb est le nombre d'unité : nb=70 uSeconde=1000 => compte 70mS */ /* nb=1 uSeconde=100 => compte 0.1mS */ /****************************************************************/ void timer(unsigned short nb,unsigned short uSeconde) { unsigned short stop=0; *TMR=0x0023+(unsigned short)((nb-1)<<8); //0010 1011+prédivision commencant à 0 *TRR=(unsigned short)48*uSeconde; *TER=3; while(stop==0) stop=(*TER)&2; *TER=3; // RAZ des bits 0 et 1 (CAP et REF) logique inversée *TMR=0; *TRR=0; } void ecrit(unsigned short brocheSortie,unsigned short allume,volatile unsigned short * PCDATA) { unsigned char entree; allume=~allume&1; //logique inversee // Lecture du port entree=(unsigned char)((*PCDATA)>>8); // + décalage de 8 bits entree=~entree; if(allume==1) // Inversion bit/bit { allume=allume<<brocheSortie; // Positionne l'état sur la bonne broche entree=entree|allume; // Met l'état de la broche } else { allume=1; allume=allume<<brocheSortie; allume=~allume; entree=entree&allume; } *PCDATA=(unsigned short)(~entree)<<8; // Ecriture du nouvel état des 8 broches } unsigned short lecture(unsigned short brocheSortie,volatile unsigned short * PCDATA) { return ((*PCDATA>>(brocheSortie+8))&1); }

separation

ancre