User Tools

Site Tools


start:eti:carte:07compo55

Composant PPI8255

Qu'est-ce qu'un composant ?

A un niveau très pratique, un composant est un élément qui se “branche” dans l'environnement de développement. Il peut représenter une entité quelconque, qu'elle que soit sa complexité, allant d'une simple addition à l'interfaçage complexe d'un vaste système matériel et logiciel. En résumé, un composant correspond à ce qui peut être codé et qui obéit au cadre de développement de composants Delphi.

Les limites d'un “composant” sont celles de la programmation. Il n'est pas plus possible d'énumérer toutes les différentes sortes de composants qu'il est possible de créer, qu'il n'est possible de décrire tous les programmes que vous pouvez écrire à l'aide d'un langage déterminé.

Les composants sont les éléments de base d'une application Delphi. Bien que la plupart des composants représentent la partie visible d'une interface utilisateur, un composant peut aussi correspondre aux éléments non visibles d'un programme telles qu'une horloge ou une base de données.

Les propriétés et méthodes du composant PPI8255

Voici les différentes propriétés et méthodes implémentées dans le composant PPI8255:

Méthodes

Chenillard Cette méthode déplace un bit à 1 sur le port choisi par le propriété ChenillardPort.
Pattern Transfert de données émises sur un des ports et relues sur les deux autres ports. Si les valeurs lues et écrites sont identiques, la propriété PatternNbOK est mise à jour, mais si ces valeurs sont différentes, l'événement OnErrorPattern est activé, et les propriétés PatternNbErreurs et PatternMessage sont mises à jour.

Propriétés

Name La propriété Name identifie de manière unique un composant ou un objet.
Tag La propriété Tag est disponible pour stocker une valeur entière comme partie d'un composant. La propriété Tag n'a aucune signification particulière dans Delphi, mais il est possible de l'utiliser pour stocker une valeur répondant à un besoin particulier.
Enabled Active ou non le composant. Si cette propriété est à TRUE, il est possible d'écrire sur les ports, sinon ils sont en lecture seule. Cette propriété est, par défaut, à FALSE.
Version Cette propriété, en lecture seule, renvoie la version de la VCL.
Adresse Il s'agit de l'adresse de base du 8255. Les autres adresses sont calculées à partir de cette adresse. Par défaut, l'adresse de base est 300h (768 en décimal).
ModePortA Ces trois propriétés permettent de configurer les ports soit en entrée, soit en sortie. Si le port est en entrée, la propriété vaut mpEntree, s'il est en sortie mpSortie. Par défaut, la configuration du port n'est pas définie et cette propriété vaut mpIndefini.
ModePortB
ModePortC
PortA Ces propriétés permettent de lire la valeur présente sur le port, ou d'y écrire une valeur.
PortB
PortC
ChenillardPort Il est possible, via cette propriété, de choisir le port à utiliser pour le chenillard. Par défaut, le port utilisé est le Port A (pPortA), car ce port est relié sur les LED et la valeur en sortie est directement visible.
ChenillardStop Par défaut cette propriété vaut TRUE. Dés que le chenillard est activé, elle passe à FALSE, et le fait de la remettre à TRUE arrêtera le chenillard.
ChenillardDelai Cette propriété indique le temps (en millisecondes) qu'il faut attendre entre chaque changement d'état du chenillard.
PatternPorts Via cette propriété, on choisit quels sont les ports à utiliser pour le test de pattern.
PatternStop La fonction de cette propriété est similaire à ChenillardStop: Arrêter le test de pattern lorsqu'il est démarré.
PatternNbOK Nombre de patterns qui ont été correctement transmis
PatternNbErreurs Nombre de patterns qui n'ont pas été transmis correctement
PatternMessage Message décrivant l'erreur qui vient d'être rencontrée: ports utilisés et valeurs écrites/lues.

Evénements

OnChenillardBouge Cet événement est déclenché lors de chaque changement d'état sur le port choisi pour le chenillard. On pourra utiliser cet événement par exemple pour afficher l'état du port.
OnErrorPattern Cet événement est déclenché en cas d'erreur de transfert lors du test de pattern.

Les propriétés et événements vus avec l'inspecteur d'objet de Delphi

Le code du composant PPI8255

Le listing complet de ce composant (VCL8255.PAS) se trouve dans l'annexe 3. Il n'y a ici qu'une description des principales fonctions qui s'y trouvent.

INTERFACE

Dans cette partie, on trouve la déclaration de notre composant PPI8255 et la procédure Register qui permet d'intégrer notre objet PPI8255 dans l'environnement de développement Delphi. |

Dans la déclaration de la classe TPPI8255, il y a tout d'abord toutes les déclarations des variables. Elles sont effectuées avant la déclaration des méthodes, car s'il y a un mélange entre les variables et les méthodes, Delphi refuse de compiler l'unité.

Dans la partie PRIVATE de la déclaration, on retrouve les variables utilisées dans ce composant (les différentes adresses du 8255, l'état de ses ports, etc…) ainsi que les méthodes utilisées pour modifier les valeurs de ces composants (SetPortA, SetCanWrite, etc…).

Dans la partie PUBLIC, il y a le CONSTRUCTEUR et le DESTRUCTEUR. Ils ne sont là que pour l'initialisation du composant, pour fixer les valeurs par défaut des différentes variables.

Et pour terminer, dans la partie PUBLISHED, tout ce qui est “visible” par l'utilisateur final, à savoir les propriétés qui indiquent quelle sont les méthodes à utiliser pour lire ou écrire dans une des variables du composant, les méthodes de ce composant (Chenillard et Pattern) ainsi que les événements OnError et OnChenillardBouge.

IMPLEMENTATION

Dans cette partie se trouvent toutes les procédures et fonctions déclarées précédemment. Voici une brève description des plus importantes procédures et fonctions…

CONSTRUCTOR TPPI8255.Create

Il s'agit de l'initialisation du composant, soit tout d'abord l'appel du constructeur générique hérité TComponent dont notre classe est descendante.

Ensuite, on fixe le composant en lecture seule en mettant la variable FCanWrite à FALSE, puis on initialise les adresses des différents ports (avec la procédure SetAdresseBase).

Comme l'état des différents ports n'est pas connu, on affecte la valeur mpIndefini aux variables FModeDuPortA, FModeDuPortB et FModeDuPortC.

On fixe également la vitesse du chenillard (FDelaiChenillard := 300) et on indique qu'il est arrêté (FStopChenillard := TRUE).

Pour terminer, on initialise le test de pattern: Il est arrêté (FStopPattern := TRUE), et aucune erreur n'a encore été rencontrée (FNbErrPattern := 0, FNbOkPattern := 0 et FMsgErrPattern := '').

DESTRUCTOR TPPI8255.Destroy

Dans le destructor, il n'y a que l'appel du destructor hérité: INHERITED Destroy.

FUNCTION InPortB(Port:WORD)** & **PROCEDURE OutPortB(Port:WORD; Value:BYTE)

Ces deux procédures d'accès aux ports ont été décrites au chapitre “Accès aux ports”.

PROCEDURE TPPI8255.SetPortX(Mode:TModePort)

Les procédures SetPortA, SetPortB et SetPortC permettent de configurer les ports en entrée ou en sortie. Cette configuration est effectuée par l'écriture d'un mot de contrôle à l'adresse de contrôle du 8255. La description de ce mot de contrôle a été effectuée au chapitre “Paramètres software”.

FUNCTION TPPI8255.LitPortX:BYTE** & **PROCEDURE TPPI8255.EcritPortX(Valeur:BYTE)

Ces fonctions et procédures permettent, via les procédures InPortB et OutPortB, de lire et d'écrire sur les différents ports du 8255. Les écritures sont possibles uniquement si la propriété Enabled (variable FCanWritre) est à TRUE.

PROCEDURE TPPI8255.SetFStopChenillard(Stop:BOOLEAN)

Le but de cette procédure est de modifier l'état de la variable globale FStopChenillard.

PROCEDURE TPPI8255.SetFPortChenillard(Valeur:TPort)

Le port à utiliser par le chenillard est fixé par cette procédure.

PROCEDURE TPPI8255.SetFDelaiChenillard(Delay:WORD)

Cette procédure fixe le temps qu'il faut attendre entre chaque changement d'état sur le port choisi pour le chenillard.

PROCEDURE TPPI8255.Chenillard

Cette procédure est le “coeur” du chenillard. La première opération effectuée est d'arrêter le test de pattern s'il est en cours d'exécution.

Le chenillard et le test de pattern ne peuvent être exécutés en même temps car ces deux méthodes accèdent sur les ports, le résultat serait fortement aléatoire…

Ensuite, il faut configurer l'état des ports: le port, qui a été choisi avec la procédure SetFPortChenillard, est mis en sortie et les deux autres en entrée.

Puis la variable globale FStopChenillard est mise à FALSE. La boucle principale de cette procédure s'arrêtera au moment ou cette variable sera remise à TRUE.

C'est justement dans cette boucle qu'un des bits du port choisi pour le chenillard est successivement mis à 1. On remarquera vers la fin de la boucle l'appel de la procédure Delay, afin d'effectuer une petite pause.

La ligne Application.ProcessMessages interrompt l'exécution de l'application afin que Windows puisse répondre aux événements. Ce qui permet par exemple, via un bouton de l'application utilisant le composant PPI8255, de mettre la variable FStopChenillard à TRUE via la propriété ChenillardStop, et donc d'arrêter le chenillard.

Après chaque écriture sur le port, l'événement OnChenillardBouge est déclenché. On pourra utiliser cet événement dans le programme appelant pour visualiser l'état actuel du port.

PROCEDURE TPPI8255.SetFPortsPattern(Valeur:TPortPattern)

Cette procédure est similaire à TPPI8255.SetFPortChenillard, elle permet de choisir les ports à utiliser pour le test de pattern. Il y a trois possibilités: soit du port A vers les ports B et C (ppABC), ou du port B vers les ports A et C (ppBAC) ou encore du port C vers les ports A et B (ppCAB).

PROCEDURE TPPI8255.SetFStopPattern(Stop:BOOLEAN)

Si la procédure TPPI8255.SetFStopChenillard arrête le chenillard, celle-ci arrête le test de pattern.

PROCEDURE TPPI8255.Pattern

Cette procédure effectue un test de transmission entre un port en émission et les deux autres en réception. La première chose a faire est d'arrêter le chenillard, car le test de pattern et le chenillard ne sont pas compatibles. Ensuite, les ports sont configurés en entrée ou en sortie, selon la valeur de la variable FPortsPattern.

Ensuite les variables FNbErrPattern, FNbOkPattern, FMsgErrPattern et NoPattern sont réinitialisées.

Puis une boucle est exécutée jusqu'à ce que la variable FStopPattern soit à TRUE. Dans cette boucle, on écrit sur un des ports, puis on lit sur les deux autres ports les valeurs lues.

Les trois valeurs doivent être identiques. Ci ce n'est pas le cas, la variable FMsgErrPattern contiendra une description de l'erreur rencontrée (il faut utiliser la propriété PatternMessage pour lire le contenu de ce message) et l'événement OnErrorPattern sera déclenché.

Après chaque passage dans la boucle la variable FNbErrPattern est incrémentée s'il y a eu une erreur lors du test ou FNbOkPattern s'il n'y en a pas eue.

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
start/eti/carte/07compo55.txt · Last modified: 2016/07/24 01:44 by admin