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
@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’
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
) 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 
Olivier