Traitement signal capteur sans PIN d'interruption

Bonjour,

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.

je vous remercie.

Il faut détecter un changement d'état et pas un état.

+1 avec Christian_R...

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.

Bonsoir,

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.

Ton lien semble avoir un petit sucis. :wink:

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 :smiling_imp: .
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.

Bonsoir

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 ) :sunglasses:

icare:
Bonsoir,Ton lien semble avoir un petit sucis. :wink:

y ' a plus de sushis :grin: :grin:

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é

Yep!

Une tripoté. :smiley:

ATmega2560 pinout :

Ne pas hésiter à télécharger le datasheet complet.

@+

Zoroastre.

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.

zoroastre:
Yep!

Une tripoté. :smiley:

ATmega2560 pinout :

Ne pas hésiter à télécharger le datasheet complet.

http://www.atmel.com/Images/Atmel-2549-8-bit-AVR-Microcontroller-ATmega640-1280-1281-2560-2561_datasheet.pdf

@+

Zoroastre.

Merci, elle fait très plaisir à voir cette image ^^ !
435 pages, elle doit se faire plaisir la personne qui rédige ces docs :wink:

Tu ne saurais pas quel pin va à quelle broche pendant qu'on y est :wink: !

akuma8:
Tu ne saurais pas quel pin va à quelle broche pendant qu'on y est :wink: !

Je m'auto-réponds lol : http://arduino.cc/en/Hacking/PinMapping2560

akuma8:
Je m'auto-réponds lol : http://arduino.cc/en/Hacking/PinMapping2560

:wink:

Perso, je me suis imprimé (au boulot, c'est gratuit :smiley: ) 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 :wink:

@+

Zoroastre.

Bonjour 68tjs,

Lien insérer qui fonctionne : TUTO
En utilisant l'icône "insert a link"

zoroastre:
... il n'y a pas que l'arduino dans la vie, il y a aussi l'avr :wink:

Zoroastre.

Qu'entends-tu par-là ?

Merci :slight_smile:

Voir par là une librarie qui gère ce mode d'interruption:Google Code Archive - Long-term storage for Google Code Project Hosting.