[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [gulliver] progammation sur port parallele


From launay <pierre dot launay at ac-rennes dot fr>
Subject Re: [gulliver] progammation sur port parallele
Date Sat, 06 May 2006 15:14:42 +0200

Bertrand Louargant a écrit :

Tu peut faire un driver pour piloter ton port série et ensuite écrire un programme qui utilise ce driver.
Voici un article qui survole la chose: http://www.freesoftwaremagazine.com/articles/drivers_linux




Attention le port parallèle est diffirent du port série.
Pour une application simple le port parallèle est plus simple à gérer.

Le Samedi 6 Mai 2006 00:31, chris a écrit :


Bonjour

Je suis en train de m'amuser avec mon port parallèle, mais les divers
programme que je trouve sur le net nécessite d'être root pour être exécuté.
Voici le code source que j'utilise :

#include <stdio.h>
#include <sys/io.h>
#include <asm/io.h>
#include <unistd.h>
//Puis nous définissons BASEPORT avec l'adresse du port à utiliser :
#define BASEPORT 0x378
//Ensuite nous pouvons commencer notre programme :
int main(void)
{
unsigned int i=0; // compteur pour l'accès aux relais
unsigned int r=1; //compteur pour le numéro du relais
//Cette ligne permet de demander un accès au port
//si l'accès est refusé le programme se termine avec une erreur
if(ioperm(BASEPORT,3,1)){perror("ioperm");exit(1);}
//Comme il n'y a pas eu d'erreur, nous pouvons entrer dans une
//boucle qui activera puis désactivera les huit relais les uns
//après les autres
while(r<9)
{
usleep(30000); //attendre
outb(i,BASEPORT); //on envoie la valeur de i sur 0x378
printf("Relais %d : ON\n", r); //on affiche que le relais n° r est allumé
usleep(30000); //attendre


attention tu vas allumer puis éteindre un relais toutes les 30 ms, ce qui est très court pour un relais et ne le fait pas trop souvent les relais ont un nombre limité d'allumage.

outb(0,BASEPORT); //on envoie 0 sur 0x378
printf("Relais %d : OFF\n", r); //on affiche que le relais n° r est éteint
i=i*2; //on double la valeur de i pour accéder au prochain relais
r++; //on incrémente le numéro du relais
i++;
}
return(0);
}

Pour l'instant, c'est un programme de base, mais je cherche à écrire en
mode user sur ce port parallèle, ce que ne permet pas les fonction ioperm
ou outb.



Pour le commander en user j'utilise la solution ci dessous :
Je suppose que ton fichier s'appelle parallele.c
sudo gcc -o parallele parallele.c + mot de passe root
sudo chmod 4111 parallele (plus de mot de passe, sudo le garde quelques minutes)
après tu peut le lancer avec
./parallele sans être root
Le principe est le SUID voir la documentation de Léa linux.org pour des explications complémentaires.


Qui peut me fournir des pistes pour résoudre ce problème, mes recherches
sur google, sont pour l'instant négative.

Merci pour toute aide

Christophe JOSSELIN


---- Liste gulliver ----
Se d�sinscrire, mailto:gulliver-unsubscribe at listes dot gulliver dot eu dot org
GULLIVER, http://gulliver.eu.org/




---- Liste gulliver ----
Se d�sinscrire, mailto:gulliver-unsubscribe at listes dot gulliver dot eu dot org
GULLIVER,       http://gulliver.eu.org/



Un dernier conseil pour commander des relais, pour chaque relais
mets un transistor NPN (2N2222 par exemple)
avec une résistancede 1K ohm entre la sortie du port parallèle et la base du transistor, l'émetteur du transistor à la masse
et la bobine du relais entre l'alimentation extérieur +5v ou +12v (suivant le relais) et le collecteur du relais
n'oublie surtout pas une diode de roue libre type 1N4148 en parallèle du relais
avec anode de la diode coté collecteur et cathode de la diode coté alimentation +5v ou +12v
Ainsi tu tires moins de 5mA par sortie du port parallèle.
Si tu veux un schéma je peux t'en faire un sous Kicad si tu le souhaites.


Amicalement, Pierre