Je reviens encore pour un nouveau problème dans mon petit projet.
J'aimerai traité un signal capteur sans utiliser une broche d'interruption.
C'est un signal carré que j'ai et j'aimerai incrémenté une variable à chaque front montant sans utiliser une interruption.
J'ai ce code :
}
if (digitalRead(C1)) // C1 est la broche où arrive le signal capteur
{
capteur+=1;
}
else {
capteur=0;
}
Le problème c'est que ça ne marche pas bien sûr ^^ ! Dans la mesure où tout le temps que C1 sera haut (une demie période donc) ma variable ne cesse de s'incrémenter alors que je voudrai qu'elle ne s'incrémente qu'une fois à chaque front montant. Quelqu'un aurait une astuce svp ?
Je ne peux pas utiliser les pins d'interruptions parce qu'ils sont déjà dédiés à autre chose dans le programme.
certainement d'autres solutions plus élégantes, j'ai tendance perso à simplement mémoriser l'état 1 de façon à ne le traiter qu'une fois (donc à son apparition), cette mémorisation est remise à zéro quand l'entrée repasse à zéro
en code, ça pourrais donner un truc de ce genre :
const int C1 = 8; // capteur branché sur l'entrée 8
int capteur=0;
bool mem = 0; // mémorisation de l'état précédent du capteur
void setup()
{
pinMode(capteur, INPUT);
Serial.begin(9600);
}
void loop()
{
if (digitalRead(C1)) // C1 est la broche où arrive le signal capteur
{
if (mem==0) // si C1 est à 1 et étais précédemment à 0
{
mem=1; // mémorisation du fait que C1 est passée à 1
capteur+=1; // incrémentation du compteur
}
}
else
{
mem=0; // RAZ de la mémorisation si C1 est repassé à 0
}
Serial.print ("capteur =");
Serial.println(capteur);
}
akuma8:
J'aimerai traité un signal capteur sans utiliser une broche d'interruption.
Je ne peux pas utiliser les pins d'interruptions parce qu'ils sont déjà dédiés à autre chose dans le programme.
Dans les micros avr il y a 2 types d'interruptions sur les pins.
Les fonctions "arduino" n'en utilisent qu'un celui qui s'applique à des interruptions sur 1 pin fixe comme celle que tu utilise.
Il y a une autre façon de faire mais "arduino" n'en parle pas ou si peu : PCINTx qui agit sur un port complet.
L'interruption PCINT te dit quel PORT à généré une interruption, c'est à toi a déterminer quel pin du PORT est concernée.
Bien sur il faut accepter d'utiliser les registres du micro-controleur et la dénomination Atmel des sorties mais le premier grattage de tête passé c'est génial.
Lien vers un tuto sur les interruption PCINTx avec des exemples d'utilisation.
Au passage tu pourra voir qu'il n'est pas obligatoire d'utiliser la fonction "arduino" attachinterrupt().
Atmel fourni avec l'avr-gcc une macro nommée ISR tout aussi facile à utiliser.
68tjs:
Lien vers un tuto sur les interruption PCINTx avec des exemples d'utilisation.
Au passage tu pourra voir qu'il n'est pas obligatoire d'utiliser la fonction "arduino" attachinterrupt().
Atmel fourni avec l'avr-gcc une macro nommée ISR tout aussi facile à utiliser.
Merci c'est corrigé le lien est bon maintenant. Pour info ce n'est pas mon lien qui a un petit soucis mais le forum qui en a un gros .
Avant il se débrouillait tout seul pour reconnaître les liens, maintenant c'est foutu il faut le faire à la main et en plus quand tu copie/colle un lien il rajoute "http://" qui vient en double avec ce que tu colle et j'avais oublié de le supprimer.
68tjs:
Dans les micros avr il y a 2 types d'interruptions sur les pins.
Les fonctions "arduino" n'en utilisent qu'un celui qui s'applique à des interruptions sur 1 pin fixe comme celle que tu utilise.
tiens je n'avais jamais fais "gaffe" à çà
merci (c'est enregistré ... qq part )
icare:
Bonsoir,Ton lien semble avoir un petit sucis.
68tjs:
Lien vers un tuto sur les interruption PCINTx avec des exemples d'utilisation.
Au passage tu pourra voir qu'il n'est pas obligatoire d'utiliser la fonction "arduino" attachinterrupt().
Atmel fourni avec l'avr-gcc une macro nommée ISR tout aussi facile à utiliser.
Merci pour ce retour très utile.
Je vais voir cela en espérant que ce soit facile à utiliser, dans le but de gagner du temps bien sûr :).
Combien de port a le 2560 ? Simple curiosité
Je viens de jeter un coup d'oeil sur le tuto qui m'a l'air pratique pour les utilisateurs de UNO mais je vais creuser pour voir comment je peux l'adapter avec la Méga.
Pour l'affectation des pins ça m'a l'air un peu hasardeux, je n'ai pas pris le temps de tout lire en détails mais j'ai cru comprendre que pour savoir la pin qui générer l'interruption il fallait tester toutes les pins du port pour la trouver. Vu le nombre de pins du 2560 on a un peu de boulot ^^...
Merci quand même, j'essaierai malgré mon petit niveau sous Arduino (4 semaines d'utilisation) de m'approprier un peu la chose.
Ils auraient pu quand même y penser les développeurs du langage Arduino, dans la mesure où ils veulent rendre un peu moins transparent le bidouillage des registres.
Perso, je me suis imprimé (au boulot, c'est gratuit ) les datasheets complets du 644 et du 2313, ce sont-ceux avec lesquels j'aime travailler. C'est une mine d'or une fois que l'on y navigue avec un peu plus d'aisance et dans le fond, il n'y a pas que l'arduino dans la vie, il y a aussi l'avr