Page 1 sur 2

MCP23017 et les interruptions

Posté : lun. 14 août 2017 16:28
par golum
Bonjour à tous !
Dans mon projet, j'utilise un MCP23017 sur mon RPI3 (distribution Raspbian).
Mon but est de déclencher une action lorsqu'on appuie sur un bouton poussoir sur l'entrée GPA0 ou GPA3 du MCP23017.
J'ai écrit le programme python suivant :

Code : Tout sélectionner

#-------------------------------------------------
# Test for interrupt detection on GPA0 or GPA3
 #-------------------------------------------------
import RPi.GPIO as GPIO 
import smbus
import time

DEVICE  = 0x20 # Device address (A0-A2)
IODIRA  = 0x00 # Pin direction register for GPA
GPINTENA= 0x04 # Enable interrupt for GPA
DEFVAL  = 0x06 # Reference values for the interruptions on GPA
INTCONA = 0x08 # Interruption mode -- 1:compare to DEFVAL, 0:compare to its old value
INTCAPA = 0x10 # value stored after an interruption
GPIOA   = 0x12 # GPA register for input
GPIOINT = 26   # GPIO pin for the interruption line
GPA0    = 1    # decimal value of GPA0 in the GPA register
GPA3    = 8    # decimal value of GPA3 in the GPA register

bus = smbus.SMBus(1)

# Set GPA1,2,4,5,6,7 as output the GPA0,3 as input
bus.write_byte_data(DEVICE,IODIRA,0x09)

# Define the reference values for the GPAs
bus.write_byte_data(DEVICE,DEFVAL,0x00)

# Define the interruption mode for GPAs
bus.write_byte_data(DEVICE,INTCONA,0x09)

# Enable interrupt on GPA0 and GPA3
bus.write_byte_data(DEVICE,GPINTENA,0x09)

# set up BCM GPIO numbering 
GPIO.setmode(GPIO.BCM)  

# set GPIOINT as input : pin GPIO26 of the RPI3 linked to INTA 
GPIO.setup(GPIOINT, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) 

def trigger_callback(channel):
    reg_interrupt_a = bus.read_byte_data(DEVICE,INTCAPA)
    if GPIO.input(channel) == 1:
        print time.strftime("%d.%m.%Y %H:%M:%S"), "Channel " + str(channel) + " :"
        if reg_interrupt_a == GPA0:
            print "-- GPA0 has been triggered"
        elif reg_interrupt_a == GPA3:
            print "-- GPA3 has been triggered"

# When a rising edge is detected on port GPIOINT,
# the function trigger_callback will run
# Add 75ms to avoid any bounce effect
GPIO.add_event_detect(GPIOINT, GPIO.RISING, callback=trigger_callback, bouncetime=75)

# Main loop
while True:
    try:
        reg_input = bus.read_byte_data(DEVICE,INTCAPA) # **** Needed to trigger the interruption !!!!
        time.sleep(0.1)
    except KeyboardInterrupt:
        print "Program has ended with a CTRL C"
        print "Cleaning all..."
        GPIO.remove_event_detect(GPIOINT) # remove any event detection
        GPIO.cleanup() # clean up GPIO on CTRL+C
        exit()

GPIO.remove_event_detect(GPIOINT)
GPIO.cleanup()
Mon problème est le suivant : je suis obligé de lire dans le registre INTCAPA (ou GPIOA) dans ma boucle (voir commentaire avec****) pour pouvoir déclencher la fonction 'trigger_callback'.
Si je ne le fais pas, rien ne se passe !!!
Si je le fais, tout se passe comme prévu...
Pourquoi ? Ça ne me paraît pas très logique...ou j'ai raté quelque chose.
J'ai lu la doc du MCP23017 (http://ww1.microchip.com/downloads/en/D ... 21952b.pdf) et rien n'est dit à ce sujet. Il est juste dit que les interruptions sont effacées à la lecture du INITCAPA ou GPIOA, ce que je fais dans le 'trigger_callback'.
Ci-joint mon schéma de connection.
montage_interruptions.jpg
montage_interruptions.jpg (30.01 Kio) Vu 2651 fois
Merci d'avance pour vos réponses ou débuts de réponses...

Re: MCP23017 et les interruptions

Posté : mar. 15 août 2017 18:10
par guillaume9344
bonjour, je ne suis pas familier de ce langage de programmation , mais en lisant le datasheet du mcp23017 , les pin inta et intb sont configurable soit active low active hight ou active open drain , je vois aussi dans votre programme que vous configurez la pi d’interruption du pi en entrée avec une résistance de tirage à la masse ( gpio.pu_down)il faudrait vérifier si ces deux configuration vous ensemble: INTA active low(ou open drain) -> pi en entré pull-up , ou INTA active hight -> pi en entré pull-down.

Re: MCP23017 et les interruptions

Posté : mar. 15 août 2017 18:57
par golum
Bonjour Guillaume,
Merci bcp bpour ta réponses pertinentes.
En fait, j'ai ajouté dans mon code (juste après ma publication) la config 'Active-high à 1' pour INTA par le registre IOCON en y affectant la valeur 0x02 (bit 1 à 1).
Cette modif ne change rien à mon problème, malheureusement...

AAPA

Posté : mer. 16 août 2017 07:22
par guillaume9344
Bonjour,
essayez de faire une lecture de INTCAPA avant la boucle principale et non dedans . cela effacera les drapeaux d’interruptions et de reseter la pin INTA.

Re: AAPA

Posté : mer. 16 août 2017 15:27
par golum
guillaume9344 a écrit :Bonjour,
essayez de faire une lecture de INTCAPA avant la boucle principale et non dedans . cela effacera les drapeaux d’interruptions et de reseter la pin INTA.
Quand je fais la lecture en dehors de la boucle, j'arrive à capter la première interruption mais que dalle pour les autres qui suivent...

Re: MCP23017 et les interruptions

Posté : jeu. 17 août 2017 07:25
par guillaume9344
vous pouvez essayer de simuler le signal INTA sur le pi pour voir si c'est le programme du pi qui ne prend en compte les nouvelles interruptions ou si c'est le mcp qui n'en génère pas de nouvelles. vous pouvez aussi brancher un multimètre ou une diode (et sa résistance )sur la pin INTA pour voir si les interuption s sont bien créées.
Autre chose d’importance , il faudrait mieux alimenter le mcp en 3.3v car ces tensions de sortie vers le pi à l'état haut sont proche de la tension d'alimenttion, et le pi support pas très bien le 5v sur ses gpio.

Re: MCP23017 et les interruptions

Posté : ven. 18 août 2017 12:02
par golum
Merci bcp pour ta réponse...
J'ai déjà fait ces tests et voici ce que j'ai pu voir :
- le rpi3 prend bien en compte les interruptions lorsque je simule une interruption sur INTA (switch entre INTA et +)
- les interruptions sont crées uniquement si je lis INTCAPA dans la boucle principale. Sans cette lecture, pas d'interruption. Testé avec multimètre.
Effectivement, je me suis rendu compte que j'avais un retour de 5V sur mon GPIO26. Heureusement, je ne l'ai pas cramé. J'ai donc laissé l'alim du MCP sur 5V et connecté le GPIO26 sur le INTA avec un pont diviseur de tension pour avoir à peu près du 3V.

Je ne sais plus quoi faire pour résoudre mon pb...

Re: MCP23017 et les interruptions

Posté : ven. 18 août 2017 14:44
par guillaume9344
Lorsque les interuptions fonctionnent, la fonction callback fait elle bien la différence entre gpa0 et gpa3 ? En gros es que la lecture de intcapa dans la fonction d interuption fonctionne bien ?

Re: MCP23017 et les interruptions

Posté : ven. 18 août 2017 21:48
par golum
Oui, obsolument.

Re: MCP23017 et les interruptions

Posté : sam. 19 août 2017 12:18
par guillaume9344
Peut être rajouter une lecture de intcapa a la fin de la fonction callback, les fonction print sont assez longues, il se passe peut être un truc dans le mcp pendant ce temps.
Je ne pratique pas le python , il y a aussi la possibilité d'une erreur de placement des fonctions ou de la boucle try .....