Merci .
je vais faire des essais , il faut que je termine le programme.
-----
Merci .
je vais faire des essais , il faut que je termine le programme.
Je remercie l'auteur du post et ces participants , ça fonctionne parfaitement avec le code ci dessous ,mais j'ai du modifier car je pense qu'il y a une erreur , dans le principe c'est bon , mais par exemple dans le case 3 l'état 00 ou 11 est impossible et dans ce le programme incrémente/décrément à l'infini, je pense que l'auteur du post a inversé le cas 2 et 3 :
Code:#define SIG_A PIND.2 #define SIG_B PIND.3 #define INC_MAX 100 #define INC_MIN 0 /* Les lignes précédentes sont à ajuster en fonction du codeur et du µcontroleur. On peut par exemple les placer dans un fichier .h à part. */ #define INCREMENTER \ if (var<INC_MAX) var++;\ var_ab=(SIG_A<<1)+SIG_B; #define DECREMENTER \ if (var>INC_MIN) var--;\ var_ab=(SIG_A<<1)+SIG_B; unsigned var=0; //variables globales interrupt[14] void gray() // interruption sur compteur (toutes les 1,6ms) { static unsigned char var_ab=0; switch (var_ab){ case 0:if(SIG_A==0 && SIG_B==1) INCREMENTER else if(SIG_A==1 && SIG_B==0) DECREMENTER break; case 1:if(SIG_A==1 && SIG_B==1) INCREMENTER else if(SIG_A==0 && SIG_B==0) DECREMENTER break; case 2:if(SIG_A==1 && SIG_B==0) INCREMENTER // ne fonctionne pas else if(SIG_A==0 && SIG_B==1) DECREMENTER break; case 3:if(SIG_A==0 && SIG_B==0) INCREMENTER else if(SIG_A==1 && SIG_B==1) DECREMENTER }
correction :
Code:#define SIG_A PIND.2 #define SIG_B PIND.3 #define INC_MAX 100 #define INC_MIN 0 /* Les lignes précédentes sont à ajuster en fonction du codeur et du µcontroleur. On peut par exemple les placer dans un fichier .h à part. */ #define INCREMENTER \ if (var<INC_MAX) var++;\ var_ab=(SIG_A<<1)+SIG_B; #define DECREMENTER \ if (var>INC_MIN) var--;\ var_ab=(SIG_A<<1)+SIG_B; unsigned var=0; //variables globales interrupt[14] void gray() // interruption sur compteur (toutes les 1,6ms) { static unsigned char var_ab=0; switch (var_ab){ case 0:if(SIG_A==0 && SIG_B==1) INCREMENTER else if(SIG_A==1 && SIG_B==0) DECREMENTER break; case 1:if(SIG_A==1 && SIG_B==1) INCREMENTER else if(SIG_A==0 && SIG_B==0) DECREMENTER break; case 2:if(SIG_A==0 && SIG_B==0) INCREMENTER else if(SIG_A==1 && SIG_B==1) DECREMENTER break; case 3:if(SIG_A==1 && SIG_B==0) INCREMENTER else if(SIG_A==0 && SIG_B==1) DECREMENTER }
Merci de ton retour ...... coté soft , je suis incapable de donner un avis !
J'aime pas le Grec
Bonjour,
Discussion très intéressante et qui peut servir de base pour ce à qui veulent partir dans des projets comportant des roues codeuses !
J'avais néanmoins une question, j'utilise ce codeur incrémental :
http://www.walkerindustrial.com/BDK-...4k100-l5-5.htm
Et je compte utiliser ce code pour incrémenter une variable à chaque impulsion de mon codeur :
Celui-ci va venir lire l'état de mes GPIO de ma raspberry pi où sont branché mes signaux A, B & N (Top zero), ce qui fait que je peux réaliser et ajouter à mon code la partie suivante que vous avez partagée :Code:#include <stdio.h> #include <wiringPi.h> int main(void) { int switchPin=0; if(wiringPiSetup()==-1) {return 0;} //le port GPIO du bouton est configuré en lecture pinMode(switchPin,INPUT); int button=0; while(1) { //on lit la valeur de la broche GPIO button=digitalRead(switchPin); if(button==0)//Si un appui sur le bouton est détecté { //on affiche un message printf("button pressed!\n"); //cette boucle permet de gerer un appui continu while(button==0) { //on relit la valeur à chaque fois button=digitalRead(switchPin); delay(20);//et on attend 20ms } } delay(20);//on attend 20ms entre chaque lecture. } return 0; }
Mais est-ce-que dans le code que j'ai partagé le "delay" sert à avoir une référence de temps pour pouvoir connaître le nombre d'impulsions par seconde et récupérer une vitesse correspondante ?Envoyé par DAUDET78if(var_a==0 && var_b==0)
{
if(PIND.2==0 && PIND.3==1)var_plus(); //fonction incrémenter
else if(PIND.2==1 && PIND.3==0)var_moins(); //fonction décrémenter
}
else if(var_a==0 && var_b==1)
{
if(PIND.2==1 && PIND.3==1)var_plus();
else if(PIND.2==0 && PIND.3==0)var_moins();
}
else if(var_a==1 && var_b==1)
{
if(PIND.2==1 && PIND.3==0)var_plus();
else if(PIND.2==0 && PIND.3==1)var_moins();
}
else if(var_a==1 && var_b==0)
{
if(PIND.2==0 && PIND.3==0)var_plus();
else if(PIND.2==1 && PIND.3==1)var_moins();
}
J'ai quelques incompréhensions qui persistent malgré tout mais je compte bien réussir à lire mes données !
Merci d'avance,
Cordialement,
Vincent. D