Probleme commande LPT code block [Resolu]

Bonjour,

J’ai un problème avec mon programme cela va faire 2 jours que je cherche sur internet, divers forum expliquant le fonctionnement du port lpt.

Avant sous Qbasic j’utilise OUT(888,8)

Mais sou C++ ?
J’ai essayer out,outp,outport,outportb en vains.

Voila le dernier code que j’ai essaye:

#include <iostream>

int main()
{
    __asm
    {
        mov al,10;
        mov dx,0X0378;
        out dx,al;
    }
}

Et les erreurs de compilation

Compiling: main.cpp
/home/olivier/Controle LPT/main.cpp: In function ‘int main()’:
/home/olivier/Controle LPT/main.cpp:6: error: expected `(' before ‘{’ token
/home/olivier/Controle LPT/main.cpp:7: error: ‘mov’ was not declared in this scope
/home/olivier/Controle LPT/main.cpp:7: error: expected `;' before ‘al’

Je ne sais plus quoi faire

À lire : ibiblio.org/gferg/ldp/GCC-Inline … HOWTO.html

@olivier > Si ce OUT(x, y) est une instruction assembleur ça ne change pas que ce soit du C, du C++, du python, du basic ou je ne sais quel autre langage (ça varie d’un processeur à l’autre (ou plus précisément d’un jeu d’instructions à l’autre)). Là en l’occurrence tu ne respecte pas la manière d’inclure du code assembleur dans du C++. Je ne sais pas comment on en inclus, mais de ce que j’ai pu voir du lien de Desintegr peut t’aider.

Bonjour,

Merci pour le lien qui est très bien explique.

apres avoir regarder j’en ai deduit:

#include <iostream>

int main()
{
    asm("movl $1, 0x37A");
    return 0;
}

Je n’ai pas d’erreur l’ors de la compilation mais je n’ai pas de resultat sur les sorties lpt

Bonjour,

Bon alors voila apres avoir repris mon facicule ‘TITAN’ :stuck_out_tongue: j’ai trouver quelque explication et j’en ai deduit:

#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/io.h>
#include <unistd.h>

#define LPT1         0x378

int main(void) {

    long a;
    int b;

    b = 1;

    /* ouverture du port parallèle */
    ioperm(LPT1,3,1);
    while (b < 255)
    {
        outb(b,LPT1);
        a=inb(LPT1+1); // Lecture
        printf("Valeur lu: %ld valeur ecris: %d \n",a,b);
        b++;
        sleep(1);
    }

  return 0;
}

Utilise en mode Root car il faut les droits pour l’acces.
les valeurs lu sont 56 et 120 suivent la valeur qui est écris qui normalement devrais être différente mais cela dois venir de ioperm que je n’ai pas bien configuré.

D’apres se que j’ai lu ioperm(LPT1,3,1); ouvre le port 0x378 jusque 0x380 avec valeur 1 pour acces autorise ou 0 si interdit.

Donc si je veut ouvrir tout le port LPT

si je me trompe pas j’aurrais droit d’utilise tous les sorties du port LPT?

Bonjour,

Voila j’ai réussi !!

Voici a titre d’exemple ( programme de test :slightly_smiling: ) il y a plus optimise mais bon sa marche et je sais se que je peut utilise maintenant.

#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/io.h>
#include <unistd.h>

/*
    * 060h - clavier
    * 170h/376h - contrôleur IDE secondaire
    * 1F0h/3F6h - contrôleur IDE primaire
    * 220h - carte son
    * 300h - carte réseau
    * 330h - carte adaptatrice SCSI
    * 3F2h - contrôleur de lecteur de disquettes
    * 3F8h - COM1
    * 2F8h - COM2
    * 3E8h - COM3
    * 2E8h - COM4
    * 378h - LPT1
    * 278h - LPT2

Commade simple
Bits 193    Moteur 1    Horaire
Bits 64     Moteur 1    Anti Horaire

Bits 20     Moteur 2    Horaire
Bits 50     Moteur 2    Anti Horaire

Commande double

Bits 208    Moteur 1/2    Horaire / Horaire
Bits 240    Moteur 1/2    Horaire / Anti Horaire
Bits 80     Moteur 1/2    Anti Horaire / Horaire
Bits 112    Moteur 1/2    Anti Horaire / Anti Horaire


*/

#define LPT1         0x378

const int PAUSE = 1000000; //Definit la vitesse des pas

void pause(double boucle)
{
    double c;
    c = 0;
    while(c < boucle)
    {
     c++;
    }
}

void ecrire(int valeur)
{
    outb(0,LPT1);
    pause(PAUSE);
    outb(valeur,LPT1);
    pause(PAUSE);
    printf("Bits Envoye: %d \n",valeur);
}

void lire()
{
    int a;
    a = inb(LPT1+1); // Lecture
    printf("Bits Recu: %d \n",a);
}

int main(void) {

    int b,valeur,pas,pass;

    pas = 200;
    valeur = 0;
    pass = 0;

    /* ouverture du port parallèle */
    ioperm(LPT1,3,1);

    while (pass <= 8)
    {
        b = 0;
        switch (pass)
        {
            case 0:
                valeur=193;
            break;
            case 1:
                valeur=64;
            break;
            case 2:
                valeur=20;
            break;
            case 3:
                valeur=50;
            break;
            case 4:
                valeur=208;
            break;
            case 5:
                valeur=240;
            break;
            case 6:
                valeur=80;
            break;
            case 7:
                valeur=112;
            break;
            default:
                valeur=0;
            break;
        }

        while (b < pas)
        {
            ecrire(valeur);
            b++;
        }
        pass++;
    }

  return 0;
}

Par contre la fonction ioperm() n’est pas portable donc utilise uniquement sur Linux.

Au moins ma carte marche en direct sur ma Debian c’est super :smiley:

Olivier