Interruption qui se déclenche sans raison (apparente!)

Bonjour
Je suis débutant et je voulais utiliser Arduino pour piloter un dispositif à travers une bascule RS contenue dans un 74LS279,en TTL donc. Arduino doit récupérer un front montant via une interruption et actionner une autre bascule : Set pour annoncer que le système est occupé, puis Reset pour annoncer qu'il est à nouveau libre et peut recevoir une nouvelle impulsion. Le Set et le Reset sont actifs si on leur envoie un niveau bas, et ne doivent pas être les deux ensemble au niveau bas. Voilà mon programme de test destiné à voir si les choses se passent comme j'aimerais :

const byte inter = 2;
const byte pinDdc = 4;
const byte pinFdc = 5;
volatile int compte = 0;

void setup() {
  Serial.begin(9600);
  pinMode(inter, INPUT);
  pinMode(pinDdc, OUTPUT);
  pinMode(pinFdc, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(inter), gestion, RISING);
  Serial.println("Prêt");
}
void gestion() {
  digitalWrite(pinDdc, LOW);
  Serial.println("ddc");
  delay(1);
  digitalWrite(pinDdc, HIGH);
  compte++;
  delay(100);
  Serial.print("impulsion carc ");
  Serial.println(compte);
  digitalWrite(pinFdc, LOW);
  delay(1);
  Serial.println("fdc");
  digitalWrite(pinFdc, HIGH);
}
void loop() {
}

Mais une fois lancé, même sans impulsion, tout se passe comme si Arduino recevait sans arrêt une impulsion. J'ai pensé que peut être il y a des soucis entre ma TTL et les circuits d'Arduino (en CMOS ?) mais même avec des tampons entre le 74LS279 et les entrées sorties d'Arduino, le comportement est le même.
Auriez-vous une idée sur l'erreur que je commets ?
Merci

avez vous un pullup ou pulldown externe sur cette pin?

Le code c'est bien de le donner, mais si on ne connait pas le schéma électrique du montage il manque la moitié des informations.

J-M-L a mis le doigt sur le problème : un fil en l'air sur une entrée à haute impédance constitue une antenne. Il faut absolument une résistance de tirage soit à la masse soit à l'alim selon la façon dont l'interrupteur est câblé.
Le microcontroleur ayant des résistances interne de tirage au Vcc (pull-up) le plus simple est de câbler l'inter à la masse et d'activer ces résistances internes.
Attention elles font entre 30k et 70 k selon le lot de fabrication : la plupart du temps c'est amplement suffisant.

TTL :
La TTL est une logique ancienne qui utilise des transistors bipolaires d'une façon très particulière :
L'entrée ne se fait pas sur une base mais sur un émetteur. Quand une porte à 2 entrées le transistor d'entrée aura 2 émetteurs.

La conséquence est que les niveaux logiques sont très particuliers.

Niveau logique TTL LS (Low Power Schottky)
Entrée :
-- Niveau bas max : 0,8V
-- Niveau haut min : 2 V
Sortie :
-- Niveau bas max : 0,5 V
-- Niveau haut min : 2,7 V
Il faut que tu vérifies que la compatibilité.

J'ai essayé avec pinMode(inter,INPUT_PULLUP) mais le comportement ne change pas.
Quand à la TTL, je pensais que le souci venait peut-être d'un problème de compatibilité avec Arduino et j'ai placé un tampon (74LS125) qui doit normalement lever le souci. Mais là encore, pas de changement.

Pardon, j'avais mal lu la réponse de J-M-L : je vais essayer avec une résistance EXTERNE

Comment est câblé ton poussoir ?
Quand on demande de donner tous les reseignements c'est qu'on a des raisons de le faire.

Entre la masse et l'entrée arduino -> dans ce cas il faut une résistance (~10k) entre l'entrée arduino et le Vcc --> attention au plus près du micro, pas à 50 cm.
Les pull-up du micro devraient suffirent.

Entre le Vcc et l'entrée du micro --> dans ce cas il faut une résistance (~10k) entre l'entrée arduino et la masse --> attention au plus près du micro, pas à 50 cm.

Pas de poussoir. C'est une logique à base de portes et de capteurs gérés électroniquement qui envoie un niveau bas sur l'entrée set et provoque un niveau haut sur pinCarc (je joins une partie du schéma électronique concerné)
Du coup, je ne vois pas pourquoi il me faudrait une résistance de rappel, en fait ! mes niveaux de tension sont (en principe) toujours bien définis.

schema

D'accord avec toi les résistances de rappel sont inutiles.

Reste l'accrochage ou la relaxation.
La solution des vieux électroniciens en présence de suspicion d'accrochage est de promener ses mains autour et dans le montage et de voir si on stoppe ou si on amplifie.
Tu peux aussi prendre un petit tournevis à manche isolé et toucher des points qui peuvent te paraitre sensibles et voir ce qui se passe.
Tu peux aussi améliorer les découplages d'alimentation.

Attention aussi au couplage de masse : si tu as un AOP, si sa masse fluctue par exemple parce qu'un composant à courant variable est sur son fil de masse il peut se mettre à osciller ou relaxer.

Si c'est un problème d'accrochage (ce qui n'est pas encore prouvé) la difficulté est de trouver le vrai coupable qui est rarement celui qui parait le plus évident.

  1. sans doute rien à voir avec ton problème, mais il serait bon de fixer l'état des lignes Fdc et Ddc dans le setup(). A minima, il faudrait faire ça:
  digitalWrite(pinDdc, HIGH);
  pinMode(pinDdc, OUTPUT);
  digitalWrite(pinFdc, HIGH);
  pinMode(pinFdc, OUTPUT);

A noter, qu'en faisant cela l'état de la bascule est indéterminé, il faudrait peut-être faire une impulsion à zéro sur l'une des entrées pour fixer correctement l'état après un reset.

  1. J'ai peut-être mal lu, mais je n'ai pas vu comment est généré le signal qui attaque inter. Et c'est lui le problème, à priori, pas la bascule en sortie.

Tu as raison, bien sûr, et un front descendant sur 2S fixe 4Q au niveau bas.

Une fourche optique délivre des impulsions (disque à fentes) qui sont comptées par 15, et à ce moment 4S passe au niveau bas ce qui entraine 4Q au niveau haut... ce qui devrait déclencher une seule interruption, mais là, les interruptions se succèdent sans arrêt.
J'ajoute que la fréquence maxi des impulsions sur pinCarc est de 40 Hz et que le système fonctionne bien si je remplace Arduino sur pinDdc et pinFdc par des inverseurs à vitesse très lente. Alors j'en viens à la réponse de 68tjs :

C'est seulement quand je branche Arduino que mon circuit ne va plus. Je vais promener mes doigts et un tournevis, et, bien qu'il fasse froid, je vais aussi descendre au sous-sol pour voir si l'oscillo décèle quelque chose sur la bascule 2 ou la bascule 4.

Oui mais, à ce moment là, le micro reçoit l'interruption et il passe Ddc à 0.
Et tu te trouves avec 4S ET 4R à 0 en même temps.

Avec plus de 40 ans de numérique derrière moi, je peux t'assurer que mélanger des signaux lents et des signaux rapides avec de la logique asynchrone c'est juste la porte ouverte à tout un tas de problèmes.

En passant au niveau bas, 4S remet le compteur à 0 si bien que l'impulsion est très brève et 4S repasse vite au niveau haut. Je ne pense pas qu'il y ait problème à ce niveau mais ça vaut le coup de regarder quand même.

Voilà ce que j'ai vu à l'oscillo : même lorsque le programme ne tourne pas (Arduino juste sous tension et connecté à mon CI) et en l'absence d'impulsions carc, les lignes Fdc et Ddc émettent des impulsions rectangulaires régulières : 10ms à 5v puis 40 ms à 0.5v si bien que la ligne "busy" clignote en quelque sorte. Ça me semble bizarre...
Toujours sans programme, si les impulsions arrivent, un signal rectangulaire se superpose fugacement mais régulièrement et au bon rythme. (j'ai branché quelques led d'état)
Je pense que je dois faire une bêtise quelque part mais je n'arrive pas à trouver quoi.

Je n'ai pas vraiment de signal rapide... Quel serait ton conseil dans mon cas ?

L'ATmega est quand même largement plus rapide que ta fourche optique.
Et vraiment, la logique asynchrone est pleine de piège donc il faut bien regarder tout ce que tu as autour et comment les différentes bascules RS et la glue autour interagissent.

Une autre question : tu as écrit

On peut définir le niveau d'une broche avant de la déclarer en sortie ?

Oui on peut parfaitement le faire.
Le registre qui sélectionne le mode (DD sur la figure) agit uniquement sur la mise en haute-impédance d'un buffer mais ne touche pas au registre qui fixe la valeur (PORT sur la figure).

Bonjour
Je vous remercie tous pour vos réponses et je vous présente mes excuses : tout le problème venait d'une erreur vraiment stupide : mon circuit et l'Arduino n'avaient pas de masse commune. J'aurais dû m'en douter après mon utilisation de l'oscillo.
Merci pour votre aide
Bien cordialement

C'est la vie .....

Classique.
Nouvelle vérification que ce qui est le plus évident est souvent le plus difficile à voir.