/*****************************************************//* 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
unsignedshort*TMR=(unsignedshort*)(MCF_MBAR+0x200);//Timer mode register
unsignedshort*TRR=(unsignedshort*)(MCF_MBAR+0x204);//Timer reference register
unsignedshort*TER=(unsignedshort*)(MCF_MBAR+0x210);//Changement d'état
voidtimer(unsignedshort,unsignedshort);voidecrit(unsignedshortbrocheSortie,unsignedshortallume,volatileunsignedshort*PCDATA);unsignedshortlecture(unsignedshortbrocheSortie,volatileunsignedshort*PCDATA);intmain(intarc,char*argv[]){intpidTampon,tubeEcriture,i;unsignedshortdistance=0;intenvoi=0;// Init à l'adresse du Port B
volatileunsignedshort*PCDATA=(volatileunsignedshort*)(MCF_MBAR+MCFSIM_PCDAT);// Configuration du port voir pour broche 0 en sortie broche 1 en entree
*(volatileunsignedshort*)(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);}return0;}/****************************************************************//* 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 *//****************************************************************/voidtimer(unsignedshortnb,unsignedshortuSeconde){unsignedshortstop=0;*TMR=0x0023+(unsignedshort)((nb-1)<<8);//0010 1011+prédivision commencant à 0
*TRR=(unsignedshort)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;}voidecrit(unsignedshortbrocheSortie,unsignedshortallume,volatileunsignedshort*PCDATA){unsignedcharentree;allume=~allume&1;//logique inversee
// Lecture du port
entree=(unsignedchar)((*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=(unsignedshort)(~entree)<<8;// Ecriture du nouvel état des 8 broches
}unsignedshortlecture(unsignedshortbrocheSortie,volatileunsignedshort*PCDATA){return((*PCDATA>>(brocheSortie+8))&1);}