[Ada][Adressage du port paralelle]

Bonjour,

J’ai longtemps eu à l’abandon un projet de pilotage d’afficheur LCD parce que je me suis eurté à l’initialisation de mon type de donnée avec une valeur qui sensiblement est la bonne mais l’expression litérale n’est pas accepter.

J’ai donc récemment, par besoin peut-être, rpris le projet et ai découvert l’expression permettant de décrire le type correctement.
Ici, le code donné est celui que j’ai trouvé à la lecture de Grady Booch dans Ingenierie du Logiciel avec Ada.

Déclaration du type de donnée :

 type Io_Port is
      record
         Data               : Integer range 0..255;
         Busy               : Boolean;
         Interrupt_Validity : Boolean;
      end record;
 Mot : constant := 1*8;

   for Io_Port use
      record at mod 2;
      Data              at 0*Mot range 0..7;
      Busy              at 1*Mot range 3..3;
      Interrupt_Validity at 1*Mot range 7..7;
      end record;

Déclaration des variables :

 LPT1_Data : Io_Port;
   LPT1_Ctrl : Io_Port;
   for LPT1_Data use at 16#378#;
   for LPT1_Ctrl use at 16#37A#;

Alors dans cette déclaration le code convenant sur mon système GNU/Linux est :

 LPT1_Data : Io_Port;
   LPT1_Ctrl : Io_Port;
   for LPT1_Data use at System'To_address(16#378#);
   for LPT1_Ctrl use at System'To_address(16#37A#);

Ce code nécessite la déclaration de la clause with System;

J’en suis resté là avec ce code qui devrait à présent me permettre d’écrire sur le port lpt1 de mon Comptatible IBM PC mais ne sachant pas du tout comment m’y prendre, je viens ici pour demander de l’aide.

S’il vous plait, merci.

Merci pour votre lecture.

Bonsoir @Lightman
En considérant que l’afficheur soit relié au port parallèle /dev/lp0:

with Ada.Text_IO; use Ada.Text_IO;

procedure Print_Line is
   Printer : File_Type;
begin
   begin
      Open (Printer, Mode => Out_File, Name => "/dev/lp0");
   exception
      when others =>
         Put_Line ("Unable to open printer.");
         return;
   end;

   Set_Output (Printer);
   Put_Line ("Hello World!");
   Close (Printer);
end Print_Line;

D’après https://rosettagit.org/drafts/hello-world-line-printer/

Bonjour vbreton !

Si ça fonctionne, c’est excellent de simplicité.

Comme j’ai plu /dev/lp0, est il possible de donner ici le nom de fichier avec les détails pour une création éventuel du fichier qui remplace /dev/lp0 ?

Bonsoir @Lightman ,

Un mknod /dev/lp0 b 6 0 suivi d’un chmod 660 /dev/lp0 devrait faire l’affaire.
Le c indique un fonctionnement en mode caractère par caractère (non bufferisé). Pour le mode bufferisé, c’est la lettre b. Le 6 indique le numéro majeur du périphérique (6 pour le port lp) et 0 le numéro mineur du périphérique.

Il y a longtemps que je n’ai pas travaillé sur le port //. De mémoire la lettre b (bufferisé) correspondrait au mode latch des sorties, bien connu des électroniciens (données non fugitives sur le port parallèle ce qui veut dire que tant qu’une nouvelle écriture n’est pas effectuée sur le port // ses sorties sont maintenues. Le mode b ne présenterait ses datas que quelques micro ou milli secondes sur le port // et n’est donc pas approprié par exemple pour commander directement des LED .

Merci Vincent.