MCP23017 et les interruptions

Des infos, des conseils sur les bus DSI,CSI, I2C, SPI... du Raspberry Pi

Modérateur : Francois

golum
Messages : 34
Enregistré le : mer. 10 août 2016 01:11

MCP23017 et les interruptions

Message par golum » lun. 14 août 2017 16:28

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 768 fois
Merci d'avance pour vos réponses ou débuts de réponses...

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: MCP23017 et les interruptions

Message par guillaume9344 » mar. 15 août 2017 18:10

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.
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

golum
Messages : 34
Enregistré le : mer. 10 août 2016 01:11

Re: MCP23017 et les interruptions

Message par golum » mar. 15 août 2017 18:57

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

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

AAPA

Message par guillaume9344 » mer. 16 août 2017 07:22

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.
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

golum
Messages : 34
Enregistré le : mer. 10 août 2016 01:11

Re: AAPA

Message par golum » mer. 16 août 2017 15:27

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

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: MCP23017 et les interruptions

Message par guillaume9344 » jeu. 17 août 2017 07:25

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.
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

golum
Messages : 34
Enregistré le : mer. 10 août 2016 01:11

Re: MCP23017 et les interruptions

Message par golum » ven. 18 août 2017 12:02

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

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: MCP23017 et les interruptions

Message par guillaume9344 » ven. 18 août 2017 14:44

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 ?
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

golum
Messages : 34
Enregistré le : mer. 10 août 2016 01:11

Re: MCP23017 et les interruptions

Message par golum » ven. 18 août 2017 21:48

Oui, obsolument.

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: MCP23017 et les interruptions

Message par guillaume9344 » sam. 19 août 2017 12:18

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 .....
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

Répondre

Retourner vers « Les BUS interfaces »