User Tools

Site Tools


start:eti:carte:08soft55

Programme PPI8255.EXE

(0)

Les composants PPI8255 et OneInstance

Ces deux composants ne seront pas visibles lors de l'exécution du programme. L'adresse de base du 8255 (composant PPI8255) a été fixée à 300h et ne peut être modifiée lors de l'exécution du programme.

(1)

Ces boutons permettent de lire l'état du port choisi. La valeur lue est écrite en 3. Par exemple pour lire la valeur présente sur le port A, voici le code utilisé:

PPI8255.ModePortA := mpEntree;
spnedtA.Value := PPI8255.PortA;

(2)

Ces boutons permettent d'écrire sur les ports les valeurs présente en 3. Voici le code utilisé pour écrire sur le port C:

PPI8255.ModePortC := mpSortie;
PPI8255.PortC := spnedtC.Value;

(3)

Voir les points 1 et 2 ci-dessus.

(4)

Ces différents contrôles permettent de choisir le port utilisé pour le chenillard, de démarrer et d'arrêter le chenillard.

Le choix du port utilisé pour le chenillard est effectué de la manière suivante:

CASE grpbxPortChenillard.ItemIndex OF
  0 : PPI8255.ChenillardPort := pPortA;
  1 : PPI8255.ChenillardPort := pPortB;
  2 : PPI8255.ChenillardPort := pPortC;
END; {CASE OF}               

Le chenillard est démarré simplement comme ça:

PPI8255.Chenillard;

Et pour l'arrêter, ce n'est pas beaucoup plus compliqué:

PPI8255.ChenillardStop := TRUE;

(5)

Si cette valeur est modifiée, le délai du chenillard est ajusté comme suit:

PPI8255.ChenillardDelai := spnedtDelai.Value;

(6)

Si la case “Montre état chenillard” est cochée, l'état du port choisi pour le chenillard est affiché juste en dessous par des croix montrant quel est actuellement le bit à 1. Voici le listing utilisé si le port B est utilisé pour le chenillard:

IF chkbxMontreEtat.Checked THEN BEGIN
  chkbxBit0.Checked := BitSetB(PPI8255.PortB, 0);
  chkbxBit1.Checked := BitSetB(PPI8255.PortB, 1);
  chkbxBit2.Checked := BitSetB(PPI8255.PortB, 2);
  chkbxBit3.Checked := BitSetB(PPI8255.PortB, 3);
  chkbxBit4.Checked := BitSetB(PPI8255.PortB, 4);
  chkbxBit5.Checked := BitSetB(PPI8255.PortB, 5);
  chkbxBit6.Checked := BitSetB(PPI8255.PortB, 6);
  chkbxBit7.Checked := BitSetB(PPI8255.PortB, 7);
END; {IF}

(7)

Cette boîte groupe radio permet de choisir quel est le port qui émettra les données pour le test de pattern:

CASE grpbxPortsPattern.ItemIndex OF
  0 : PPI8255.PatternPorts := ppABC; { A -> B, C }
  1 : PPI8255.PatternPorts := ppBAC; { B -> A, C }
  2 : PPI8255.PatternPorts := ppCAB; { C -> A, B }
END; {CASE OF}

(8)

Ces deux boutons permettent de démarrer et d'arrêter le test de pattern. Pour activer ce test, il faut exécuter:

{-- RAZ de la liste des erreurs }
lstbxErreursPattern.Clear;
lblNbErreurs.Caption := '';
{-- Démarre le test }
PPI8255.Pattern;

Et pour l'arrêter:

PPI8255.PatternStop := TRUE;

(9)

Lors de chaque erreur de transfert, le nombre d'erreurs ainsi que la description de l'erreur sont affichés avec cette procédure:

PROCEDURE TfrmSmall.PPI8255ErrorPattern(Sender: TObject);
{BUT:Affiche les erreurs de transfert lors de chaque erreur rencontrée}
VAR
  TotalTests : LONGINT;
BEGIN
  {-- Nombre total de transferts réalisés }
  TotalTests := PPI8255.PatternNbOK + PPI8255.PatternNbErreurs;
  {-- Ajoute la nouvelle erreur rencontrée }
  lstbxErreursPattern.Items.Add(PPI8255.PatternMessage);
  {-- Affiche le nombre d'erreurs }
  lblNbErreurs.Caption := IntToStr(PPI8255.PatternNbErreurs);
  lblNbErreurs.Caption  :=  lblErreurs.Caption  +  '  /  '
  lblNbErreurs.Caption := lblErreurs.Caption + IntToStr(TotalTests);
END; {PROCEDURE PPI8255ErrorPattern}

Remarques, problèmes rencontrés, bogues, etc...

Le composant OneInstance empêche d'exécuter deux instances du même programme. Ce composant n'est pas livré avec Delphi, mais a été écrit pas M.Andy Strong et fait partie du domaine public.

Dans ce programme, aucun test n'est effectué avant d'écrire sur un port ou lors de la modification du délai du chenillard: si le champ de la zone de saisie est vide lors de l'appel de la procédure, une erreur surviendra et le programme sera brutalement arrêté.

Le listing USmall.dfm présent dans les listings à titre d'exemple est généré automatiquement par Delphi. Il s'agit d'une interprétation du fichier binaire donnant toutes les propriétés des composants présent sur une fiche.

Un bogue a été découvert lors du test de pattern: les valeurs lues ne changeaient jamais (EFh et FFh) et toutes les LED branchées sur le port A s'éteignaient dès que le bouchon était mis en place sur le connecteur CON5.

Après plusieurs heures de recherche, nous avons trouvé que l'erreur se trouvait dans les procédures SetPortX(Mode:TModePort) du composant PPI8255: Une lecture du mot de contrôle était effectuée, mais cette lecture est interdite, et il s'en suivait une réinitialisation du PPI. Après avoir remplacé cette lecture du mot de contrôle par un test des variables globales (FModeDuPortX), tout est rentré dans l'ordre. Pour plus de détails, voir le listing VCL8255.PAS dans l'annexe 3.

Le listing complet de ce programme

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/08soft55.txt · Last modified: 2016/07/24 03:50 by admin