WOW !! MUCH LOVE ! SO WORLD PEACE !
Fond bitcoin pour l'amélioration du site: 1memzGeKS7CB3ECNkzSn2qHwxU6NZoJ8o
  Dogecoin (tips/pourboires): DCLoo9Dd4qECqpMLurdgGnaoqbftj16Nvp


Home | Publier un mémoire | Une page au hasard

 > 

Mise au point d'applications en temps réel: Communication entre deux ordinateurs

( Télécharger le fichier original )
par turki ladhem&rebaï rami
Université arabe des sciences - Diplôme Universitaire de Technologie 2007
  

précédent sommaire suivant

Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy

III-1-2- port parallèle

D'après le diagramme de fonctionnalité précédent du port parallèle, notre programme est décomposé en deux grandes parties: la première se chargeant de l'émission et l'autre pour la réception.

· L'envoie est assuré grâce à une fonction EnvoieOctet, décrite par son prototype: int EnvoieOctet (unsigned char Valeur).

Du coté émetteur, on doit diviser l'octet en deux quartets pour être transféré.

int EnvoieOctet (unsigned char Valeur)

{

unsigned char Retour;

outportb(PORT,Valeur&0x0F);

while(((inport(PORT+1)&0xF8)&128)==0);

Retour1 =((inport(PORT+1)&0xF8)>>3)&0x0F;

outportb(PORT,(Valeur>>4)|0x10);

Retour2=while(((inport(PORT+1)&0xF8)&128)!=0);

Retour = Retour1|Retour2;

(Valeur==Retour);

}

ü Cette fonction a recours à une fonction spécifique, la même utilisée dans le port série. C'est la fonction outport déjà existante dans la bibliothèque de Turbo C. Elle permet d'envoyer un octet dans un port. Les périphériques ont généralement une plage de ports qui lui sont adressés. Ces ports permettent de « communiquer » avec ces périphériques.

ü On déclare une constante PORT qui égale à la valeur en hexadécimale 0x378.

ü L'instruction « outportb(PORT,Valeur&0x0F)» permet l'envoi du quartet le plus faible.

Afin d'expliquer «Valeur&0x0F », on prend par exemple valeur = 0101 0110.

Or 0x0F=0000 1111.

Alors,

Valeur & 0x0F=

0101 0110

0000 1111

0000 0110

Cela a permis de prendre en compte seulement le

quartet le plus faible.

ü Afin d'atteindre la mise à zéro de BUSY, on a recours à une boucle répétitive while permettant ainsi de ne sortir de la boucle que si la condition sur BUSY est vérifiée.

L'instruction «while(((inport(PORT+1)&0xF8)&128)==0)»permet ainsi de tester la condition sur BUSY.

La valeur est trouvée dans l'adresse de l'offset 1 (PORT+1).

Pour visualiser cette valeur, le procédé de masquage est appliqué.

1 0 0 0 0 0 0 0 = (128)H

0 0 0 0 0 0 0

ü « Retour1 =((inport(PORT+1)&0xF8)>>3)&0x0F » :

Afin de vérifier la bonne transmission, l'acquisition du quartet de retour à partir du récepteur est effectuée.

Ce quartet de retour est initialement mis de la manière suivante dans l'offset 1 du port parallèle (on désigne ce quartet par la valeur abcd)

a

b

c

d

0

0

0

Cela mène à conclure qu'on doit effectuer un décalage de 3 (>> 3) pour que le quartet de retour sera mis dans les quatre premier bits de l'offset 1 tout en multipliant par la valeur hexadécimale 0x0F pour le remplissage des autres valeurs, donc la valeur retour 1 est donnée par :

0

0

0

a

b

c

d

0

ü «outportb(PORT,(Valeur>>4)|0x10)» :

Afin d'envoyer le quartet le plus fort, on doit tout d'abord le mettre dans les quatre premier bits en effectuant un décalage de quatre et en écrasant ainsi le quartet le quartet faible( il est déjà envoyé).

Cette valeur est additionnée par une valeur hexadécimale (0x10) afin de remplir les autres quartets vides ( le but de 1 est de positionner le quartet décalé).

ü Afin d'attendre la mise à 1 de BUSY, on a utilisé la boucle répétitive while se basant sur le même principe déjà expliqué auparavant.

ü «Retour2=while(((inport(PORT+1)&0xF8)&128)!=0)» : Le deuxième quartet de retour est initialement posé de la manière suivante( on désigne ce quartet par la valeur ABCD) :

A

B

C

D

0

0

0

Cela mène à conclure qu'on doit effectuer un décalage à gauche de 1(<<1) tout en multipliant par 0xF0 afin de forcer les autres valeurs en 0, ainsi la valeur de Retour2 est donnée par :

B

C

D

0

0

0

0

A

ü «Retour= Retour1|Retour2» : Cela permet de concaténer les deux valeurs du quartet.

Ceci se fait de la manière suivante :

0

0

0

0

a

b

c

d

Retour1 :

0

A

B

C

D

0

0

0

Retour2 :

B

C

D

a

b

c

d

A

= Retour :

ü «Return (Valeur= = Retour)» : C'est l'étape de la vérification.

Si Valeur est égale à Retour, on retour en 1 à la fonction EnvoieOctet, Sinon un message d'erreur doit être affiché.

Le programme principal assurant l'émission est ainsi décrit de la manière suivante:

void main(void)

unsigned char valeur;

clrscr();

do

{

valeur= getch(); // lire le caractère clavier

EnvoieOctet(valeur); // envoie du caractère

printf("%c",valeur); // affiche du caractère même s'il est ESC

}while (valeur!=0x1b);//envoie de caractère si oui sortir

}

Le programme complet est introduit dans l'annexe 2.

· La réception est assurée grâce à une fonction RecOctet, décrite par son prototype: unsigned char RecOctet( void ) définie de la manière suivante

unsigned char RecOctet( void )

{

unsigned char LoNib, HiNib;

while((((inport(PORT+1)&0xF8)&128)==0));

LoNib =( (inport(PORT+1)&0xF8) >> 3) & 0x0F;

outportb(PORT,LoNib);

while((( (inport(PORT+1)&0xF8) & 128 ) != 0 ));

HiNib = ( (inport(PORT+1)&0xF8) << 1 ) & 0xF0;

outportb(PORT,((HiNib >> 4 ) | 0x10 ));

return( LoNib | HiNib );

}

ü On doit tout d'abord attendre la ligne jusqu'à atteindre la valeur 1. Cela est assuré grâce à la boucle répétitive while :  while((((inport(PORT+1)&0xF8)&128)==0)) » :

La valeur est trouvée dans l'adresse de l'offset 1 (PORT+1).

Pour visualiser cette valeur, le procédé de masquage est appliqué.

ü «LoNib = ((inport(PORT+1)&0xF8) >> 3) & 0x0F»: Comme décrit dans la fonction précédente, on doit décaler le quartet reçu à droite par trois (>>3 ) afin de le placer dans les quatre premiers quartets de l'offset du port parallèle.

ü Après la réception du quartet supérieur, le port doit le renvoyer à l'émetteur qui le compare au quartet envoyé. De cette façon, on a effectué la vérification au plus bas niveau. Cela est assuré grâce à la fonction : « outportb(PORT,LoNib ».

ü Afin d'attendre la mise à 1 de busy, on a utilisé la boucle répétitive while par le même principe déjà utilisé auparavant : «while((( (inport(PORT+1)&0xF8) & 128 ) != 0 ))».

ü On répète le même principe pour la transmission du second quartet de poids fort.

« outportb(PORT,((HiNib >> 4 )|0x10 ))» : Afin d'envoyer le quartet le plus fort, on doit tout d'abord le mettre dans les quatre premiers bits en effectuant un décalage de quatre et en écrasant ainsi le quartet le quartet faible.

ü «return( LoNib|HiNib» :Après la réception des deux quartets, on va retourner tout l'octet en effectuant la concaténation de LoNib et HiNib.

Le programme principal assurant la réception est ainsi décrit de la manière suivante:

void main(void)

{

unsigned char valrecu;

clrscr();

do

{

valrecu=RecOctet();

printf("%c",valrecu);

} while(valrecu!=0x1b);

}

Le programme complet est introduit dans l'annexe 2.

CONCLUSION

Grâce à cette méthode de spécification et de programmation structurée, on a pu suivre l'état d'émission et de réception d'un bit suivant le port série RS232 et d'un octet suivant le port parallèle. Cette méthode nous a permis d'éviter le problème d'encombrement dans le port et le problème de blocage devant les contraintes temporelles.

La dernière étape dans la programmation structurée est le test et la validation. Cette étape a été réalisé et a donnée des résultats satisfaisants. Ceci montre la fiabilité et l'efficacité de notre programme que ces soit pour le port série ou le port parallèle.

précédent sommaire suivant






Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy








"Piètre disciple, qui ne surpasse pas son maitre !"   Léonard de Vinci