Pilotage des 8 sorties du port //

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 171 fois - Téléchargée 19 fois

Contenu du snippet

les valeurs b1 a b8 correspondent a des futur bouton b1 sortie 1 b2 sortie 2 etc...., Arret sert a ressortir du programme

Source / Exemple :


#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>
#define ADRESSEBASE 0x378

int main(void)

//ouverture du dialogue sur le port db25
{
if(ioperm(ADRESSEBASE, 2, 1))
  {
   perror("Erreur d'obtention des droits");
   return(1);
  }

//lecture de la valeur actuelle sur le port db25
printf("Valeur en entree: %d\n", inb(ADRESSEBASE));
//initialisation des valeurs

      //initialisation de la valeur du port db25
int bin=0;
     //initialisation des valeurs boutons
int b1=0;
int b2=0;
int b3=0;
int b4=0;
int b5=0;
int b6=0;
int b7=0;
int b8=0;
int b9=0;
     //initialisation des valeurs datas
int d1=0;
int d2=0;
int d3=0;
int d4=0;
int d5=0;
int d6=0;
int d7=0;
int d8=0;
do{
//demande de position des boutons 0=OFF   1=ON
printf(" Bouton ON=1    Bouton OFF=0\n");
printf("Quel valeur affecte a b1:");scanf("%d", &b1);
printf("Quel valeur affecte a b2:");scanf("%d", &b2);
printf("Quel valeur affecte a b3:");scanf("%d", &b3);
printf("Quel valeur affecte a b4:");scanf("%d", &b4);
printf("Quel valeur affecte a b5:");scanf("%d", &b5);
printf("Quel valeur affecte a b6:");scanf("%d", &b6);
printf("Quel valeur affecte a b7:");scanf("%d", &b7);
printf("Quel valeur affecte a b8:");scanf("%d", &b8);
printf("Arret :");scanf("%d", &b9);
//attribution des valeurs datas  selon le bouton et sa position
if (b1 == 1)
{
 d1=1;
}
else if (b1 != 1)
{
  d1 = 0;
}
if (b2 == 1)
{
 d2=2;
}
else if (b2 != 1)
{
  d2 = 0;
}
if (b3 == 1)
{
 d3=4;
}
else if (b3 != 1)
{
  d3 = 0;
}
if (b4 == 1)
{
 d4=8;
}
else if (b4 != 1)
{
  d4 = 0;
}
if (b5 == 1)
{
 d5=16;
}
else if (b5 == 0)
{
d5 = 0;
}
if (b6 == 1)
{
 d6=32;
}
else if (b6 == 0)
{
  d6 = 0;
}
if (b7 == 1)
{
 d7=64;
}
else if (b7 == 0)
{
  d7 = 0;
}
if (b8 == 1)
{
 d8=128;
}
else if (b8 == 0)
{
  d8 = 0;
}

  bin = d1+d2+d3+d4+d5+d6+d7+d8;

outb (bin, ADRESSEBASE);

printf("Valeur en entree: %d\n", inb(ADRESSEBASE));
}
while (b9 !=1 );

if(ioperm(ADRESSEBASE, 2, 0))
  {
   perror("Erreur de fermeture");
   return(1);
  }

  return(1) ;
}

A voir également

Ajouter un commentaire

Commentaires

Messages postés
45
Date d'inscription
samedi 3 mai 2003
Statut
Membre
Dernière intervention
25 janvier 2011

Si c'est une question de longueur de code, essayer python !! :-)
Messages postés
19
Date d'inscription
mardi 11 mars 2003
Statut
Membre
Dernière intervention
21 mai 2010

j'arrive après la bataille, mais je te soutiens!
ton code si "mauvais" soit il, m'à bien aidé.

A l'autre zigoto, je ferais remarqué que ça fait peut être 20 ans que l'usb à remplacé toutes les autres Connectique mais que pour tester, piloter et interfacer des micro-contrôleurs on est bien heureux de toujours avoir la solution économique en temps et en sous du port série.

pour améliorer ton code:
si tu as l'octé : "1000 1100" << "0001 1000" <= deviens ça
"1000 1100" >> "0100 0110"

bref l'opérateur décale d'un rang les bits à gauche ou à droite (ce qui reviens à multiplier ou diviser par 2 la valeur de ton octé en décimal...)
il y à aussi l'utilisation de masques qui peut être utile avec les opérateurs & et ||, si tu veux aller plus loin.

anecdote: l'opérateur << consomme très peu de temps machine.
Plutôt que de diviser par 2 utilise la pour des super programmes super puissant et tout et tout... ^^.
Messages postés
202
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
29 janvier 2019

Désolé de te contredire Shorzy, mais j'ai bel et bien été courtois et constructif en essayant d'orienter le contributeur et signaler quelques bévues de son code. Cela n'avait strictement rien de personnel, même si j'ai dit que ce code n'apprenait rien et ne remplissait pas les objectifs voulus pour être utilisable par d'autres (hormi un seul appel de fonction, c'est à dire une seule ligne, la plus intéressante pourtant qu'il a omis de commenter, celle concernant l'appel de ioperm() avec des valeurs "magiques").
Messages postés
8
Date d'inscription
samedi 8 août 2009
Statut
Membre
Dernière intervention
2 novembre 2009

j ai utiliser ce principe de cablage , avec des leds de 3v et une resistance par led dont je ne me souviens pas la valeur , et mon montage d essais un indemontable car scelle par de la colle a chaud pour tout isoler



/ \
\ 13 12 11 10 9 8 7 6 5 4 3 2 1 /
\ /
\ 25 24 23 22 21 20 19 18 17 16 15 14 /
\______________________________________________________/



borne 2 +led 1 borne 18 masse led 1
borne 3 +led 2 borne 18 masse led 2
borne 4 +led 3 borne 19 masse led 3
borne 5 +led 4 borne 19 masse led 4
borne 6 +led 5 borne 20 masse led 5
borne 7 +led 6 borne 20 masse led 6
borne 8 +led 7 borne 21 masse led 7
borne 9 +led 8 borne 21 masse led 8

Voila le montage de base ; apres pour l utilisation de relais je compte passer par des micro relais qui commanderont un autre jeux de relais via une alimentation normale 12v

bonne journee
Messages postés
94
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
1 juin 2013

T'es Relou VERDY_P !!!

CEDPIC voulais faire partager un programme qui l'a bien aidé.
Je lui dis bravo, et merci !!!

Je voulais justement savoir comment faire ce genre de choses avec un PC. (pour piloter, par Ex. une maquette de Train, éclairage, aiguillage...)

Je ne te félicite pas VERDY_P pour ta courtoisie ni pour ton manque de jugement.
(n'importe qui, verrait qu'ici, les port USB ne sont pas applicables !!!)

PS:
Tu as un schéma de raccordement Elec CEDPIC ???
Afficher les 20 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.