Go Down

Topic: Interruption sur pin analogique (Read 4456 times) previous topic - next topic

F6EEQ

Bonjour,

Pour gérer un clavier 4*4 en "un fil" j'ai besoin d'utiliser des interruptions sur une pin analogique.

Les interruptions "classiques" ne gèrent pas les pins A0 à A15, mais apparemment on peut le faire.
J'ai trouvé quelques infos dans le "playground", mais ce n'est pas très explicite.

Quelqu'un a-t-il un tutoriel ou un lien intéressant?
Je ne cherche pas une librairie toute faite, mais quelques infos sur le traitement des interruptions.

J'ai vu le tutoriel de Nick Gammon, et j'ai compris qu'il fallait aller un peu plus dans les registres de base du processeur, mais je suis un peu perdu.

Pour info j'utilise un MEGA.


Merci d'avance.
73 de Gerard F6EEQ

icare

Bonjour,
Pour avoir des réponses demande à l'un des modérateur de déplacer ton sujet dans la bonne rubrique, ici c'est la rubrique "Tutoriels et cours".
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

68tjs

#2
Jan 02, 2015, 05:38 pm Last Edit: Jan 02, 2015, 05:40 pm by 68tjs
Pour gérer un clavier 4*4 en "un fil" j'ai besoin d'utiliser des interruptions sur une pin analogique.
Précise ton besoin.
Dans les avr il existe des entrées analogiques qui sont purement analogique (elles sont rares) et des entrées qui peuvent faire soit entrée numérique soit entrée analogique : c'est le cas "normal".

Je sais pour l'avoir fait qu'il est possible d'utiliser des interuptions de type PCINT sur n'importe quelle entrée en mode numérique , à la suite de cet essais j'ai même écrit un tuto disponible dans la partie où tu as commencé à écrire par erreur :
C'est là

Par contre avec les entrées en mode analogique pur, je ne vois pas de solution à part en utilisant le comparateur analogique disponible dans le micro-contrôleur (et les interruptions qui y sont associées) . Maintenant ce n'est pas parce que je ne connais pas que cela n'existe pas.
Je pense qu'une lecture de la datasheet du micro va s'imposer. :smiley-mr-green:

Nota : si tu as une carte UNO (micro 328p) tu auras accès aux entrées "-" et "+" du comparateur analogique. Par contre si tu as une carte Mega  chez arduino ils n'ont pas compris a quoi cela pouvait servir et ils n'ont jugé utile de sortir l'accès "-" qui n'est utilisable que connecté à une référence interne.

Nota 2 : les fonctions "arduino" excluent mutuellement les modes numériques et analogiques. Je n'ai pas regardé mais peut-être bien qu'il est possible de les faire fonctionner en parallèle, ou du moins en "mode dégradé qui conserverait les interruptions" ?
Si tu n'as pas de réponse sur ce forum il faudra aller sur un forum "pur ATMEL" comme avrfreaks
forum avrfreaks 
Petit désagrément c'est uniquement en anglais et s'ils acceptent les références à arduino ils restent des "purs et durs" et il ne faut pas trop insister avec arduino.

jlbechennec

Bonjour,

Pour les it sur les broches Ax, le plus facile est d'utiliser la bibliothèque PinChangeInt. Il y a un exemple d'utilisation ici : http://www.locoduino.org/spip.php?article64

_pepe_

#4
Jan 03, 2015, 11:58 am Last Edit: Aug 20, 2018, 11:42 am by _pepe_
Supprimé

68tjs

#5
Jan 03, 2015, 12:50 pm Last Edit: Jan 03, 2015, 12:51 pm by 68tjs
1) Je ne connais pas le 2560. Tu spécifies les pins analogiques A8 à A15 ce qui laisse à penser que ce ne serait pas applicable aux pins A0 à A7. Est vrai ou c'est simplement un choix  pour le besoin de la démonstration et il suffit juste de choisir le numéro de PCintx qui va bien pour les entrées A0 à A7 ?

2) Juste un détail :  la macro "SIGNAL" est "deprecated" depuis plus de 10 ans et elle n'est plus acceptée avec les dernières versions de l'avr-gcc. Cela passe peut-être encore avec la version anté-déluvienne installée par l'IDE1.0x  mais cela ne résistera pas à une mise à jour. Il faudrait passer à "ISR" -> Interrupt Service Routines.
http://www.atmel.com/webdoc/AVRLibcReferenceManual/deprecated.html

_pepe_

#6
Jan 03, 2015, 03:23 pm Last Edit: Aug 20, 2018, 11:43 am by _pepe_
Supprimé

68tjs

Pour faire simple :
La grande majorité ici utilise des Atmega 328p (Uno, nano, mini-pro).
Les accès A6 et A7 (nano et mini-pro uniquement) sont purement analogiques donc on les oublie.
Peut-on appliquer ton exemple aux accès A0 à A5  d'une carte à base de 328p ?
Question subsidiaire et pour le 32U2 des Léonardo et micro ?

En tout cas il s'avère qu'en l'état de la discussion il n'est pas possible de choisir le niveau analogique qui déclenche l'interruption sauf à passer par le comparateur interne.
Problème dans les avr il n'y a qu'un seul comparateur par micro-controleur et c'est foutu pour la carte Mega du fait qu'une broche du comparateur n'a pas été rendu accessible du fait de la conception de la carte.
Il ne reste plus que la solution des comparateurs extérieurs (exemple LM393) dont le changement d'état des sorties provoque une interruption.

_pepe_

#8
Jan 04, 2015, 12:33 pm Last Edit: Aug 20, 2018, 11:43 am by _pepe_
Supprimé

zoroastre

#9
Jan 04, 2015, 07:32 pm Last Edit: Jan 04, 2015, 07:56 pm by zoroastre
Yep!

En aparté, les variables déclarées à l'intérieur et à l'extérieur d'une routine ISR doivent être dites volatile.

On utilise des variables de type volatile à partir du moment où elles peuvent être modifiées par autre chose que le code, elles sont obligatoirement partagées par le programme et un événement matériel (Timer, interruption, etc. Grosso modo, on indique au microcontrolleur où aller chercher la variable, c-a-d sa visibilité).

Ici, une interruption hardware, en plus du code, est susceptible de changer la valeur de la variable change. Donc :

Code: [Select]
volatile char change;

@+

Zoroastre.
Gné! ;)

_pepe_

#10
Jan 05, 2015, 12:33 am Last Edit: Aug 20, 2018, 11:43 am by _pepe_
Supprimé

68tjs

Puisqu'on en est à couper les cheveux en 4 il faut rectifier le chiffre de "512" pour la génération de l'interuption.
Pourquoi ? Parce que l'interruption est générée par la partie numérique suite à une détection de changement de niveau et non pas par la partie analogique.
La datasheet nous dit que pour Vcc = 5 V les changements de niveaux se font :
- Niveau Bas vers niveau haut = +2,7 V
- Niveau Haut vers niveau bas = +2,15 V

Ce qui ferait "en équivalent analogique" 440 et 552    A CONDITION que la référence de l'ADC soit à +5 V MAIS cette quantité dépend directement de la tension de référence de l'ADC.
- avec Vref_ADC = 3.3 V on aurait = 667 et 837
- avec Vref_ADC = interne = 1,1 V cela ne marche plus.

Ma conclusion : c'est une fonctionnalité non prévue que j'estime difficilement exploitable.

_pepe_

#12
Jan 05, 2015, 04:17 pm Last Edit: Aug 20, 2018, 11:42 am by _pepe_
Supprimé

Go Up