IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

microprocesseur 80c552 et interruption


Sujet :

Embarqué

  1. #1
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 46
    Points : 26
    Points
    26
    Par défaut microprocesseur 80c552 et interruption
    Bonjour à tous. Je suis en ce moment sur un projet qui est pratiquement terminé, mais je me suis cogné à un problème que j'ai pas réussis à régler encore.

    Alors, voilà je vous expose la situation.

    Je travail avec un microprocesseur 80c552. Je veux utiliser le INT0 qui va entrer dans une routine d'interruption quand je vais appuyer sur un bouton rouge d'urgence qui est connecté à la broche INT0.

    Quand j'appuis sur le bouton, il entre bien dans ma routine d'interruption, mais le problème est que dans cette même routine, je fais appel à une fonction qui lis en permanence un clavier matriciel et cette lecture se fait avec le protocole de communication I2c qui utilise à son tour une routine d'interruption I2C. Donc si je résume, quand j'Appuis sur le bouton d'urgence, le programme entre en interruption INT0 qui dans la même fonction fait appel à une fonction utilisant les interruptions I2c.

    Je sais pas si c'est possible de faire une interruption dans une interruption, mais mon problème vient du fait que mon programme principale lit en continue la clavier matriciel donc utilise en permanence les interruptions I2c et que quand la routine d'interruption INT0 est appelé, le programme est interrompu et donc les deux lignes SCL et SDA demeure à 0. Donc quand mon interruption INT0 appel la fonction de lecture du clavier, qui utilise elle aussi l'i2c, la communication ne s'effectue pas car les lignes SCL et SDA sont basse.

    Est ce qu'il y aurait un moyen d'envoyer un stop bit afin de fermer la communication i2c avant d'entrer dans la routine d'interruption INT0?

    Merci d'avance
    Carleric

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Salut
    -----

    Quand j'appuis sur le bouton, il entre bien dans ma routine d'interruption, mais le problème est que dans cette même routine, je fais appel à une fonction qui lis en permanence
    Le rôle d'une interruption, c'est de réagir rapidement à un évènement extérieur. Faire du pooling de ce genre dans une interruption, c'est utiliser l'interruption à contre-emploi.

    À mon avis, ton programme est mal structuré. Tu devrais dessiner un ordinogramme et t'arranger pour sortir "rapidement" des interruptions, quitte à positionner un flag dans l'interruption pour effectuer un traitement plus long dans le programme principal.

    Je sais pas si c'est possible de faire une interruption dans une interruption
    Pour interrompre une interruption par une interruption, il faut mettre en service le mécanisme de priorité. L'interruption prioritaire interrompt la moins prioritaire. De toutes façons, en principe tu as du lire le datasheet de ton microcontrôleur, c'est expliqué. Il faut lire le datasheet d'un micro avant de commencer à le programmer.

    Mais je suis pratiquement certain en te lisant (au pif), que ton programme est mal structuré et que mieux vaut modifier la structure de ton programme que de tenter de t'en sortir de cette façon.

    Mais bon, ce n'est qu'un conseil.

    A+
    Claude

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 680
    Points
    13 680
    Billets dans le blog
    1
    Par défaut
    Je partage l'avis de ClaudeBg.

    Une interruption porte bien son nom : elle interrompt tout le reste du programme. Elle doit donc être courte au risque de tout casser.

    Une interruption en interrompant une autre est appelé "interruption nichée", ou "nested interrupt" en anglais. Il parait que tous les processeurs ne le supporte pas.

    quand je vais appuyer sur un bouton rouge d'urgence [...], je fais appel à une fonction qui lis en permanence un clavier matriciel
    Pour moi, il y a un gros soucis de sens : c'est un bouton d'urgence qui va se mettre en attente d'une entrée clavier ? Où est l'urgence ? Et surtout, si ton main() est déjà en train de lire ce clavie, à quoi sert l'appui sur le bouton rouge ?? Comme l'a dit ClaudeBg, ne serait-il pas mieux de positionner un flag et de réagir différemment à l'interruption I2C en fonction de ce flag ?

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 217
    Points : 28 186
    Points
    28 186
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Une interruption en interrompant une autre est appelé "interruption nichée", ou "nested interrupt" en anglais. Il parait que tous les processeurs ne le supporte pas.
    Si, si, ils en supportent au moins une, pas toujours dénommée en ces termes, mais la plus prioritaire de toute : le Reset


    Ceci dit, je confirme, du polling dans une interruption, on fait pas. C'est l'un ou l'autre, mais pas les 2 ensembles.

    Dans ton interruption, tu viens lire le clavier une seule fois, pas en boucle

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Salut
    -------

    Si, si, ils en supportent au moins une, pas toujours dénommée en ces termes, mais la plus prioritaire de toute : le Reset
    Le reset n'est pas une interruption en tant que telle. Il ne met en outre pas en jeu les mêmes mécanismes que les interruptions.

    Une interruption est une rupture asynchronre du programme, avec retour (ou du moins possibilité de retour) à l'adresse suivant l'interruption après traitement via la sauvegarde de minimum le PC sur la pile (parfois plus, parfois avec swap de registres etc).

    Le reset, lui, ré-initialise le micro, une série de registres, dont la pile, et donc ne revient pas poursuivre le programme "interrompu", ça n'a donc rien à voir (à mon avis) avec un mécanisme d'interruption hiérarchisé, surtout dans le contexte qu'on est en train d'évoquer.
    La démarche n'est pas de réaliser une opération asynchrone mais de ré-initialiser le micro.

    Bref, je plussoie sur le fait que certains micros ont des interruptions à un seul niveau et d'autres avec un système de hiérarchisation de complexité variable. Ceci dit, de mémoire (à vérifier), la famille 80552 a deux niveaux de priorité.

    A+
    Claude

Discussions similaires

  1. Gestion des interruptions du microprocesseur sous XP
    Par herve13 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 20/08/2005, 18h29
  2. Interruptions du microprocesseur
    Par herve13 dans le forum Langage
    Réponses: 2
    Dernier message: 08/03/2005, 19h11
  3. interruption clavier
    Par pyrostan dans le forum C
    Réponses: 4
    Dernier message: 13/01/2003, 17h33
  4. Tracer une ligne droite sans les interruptions
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 25/11/2002, 01h22
  5. Bouquins d'Assembleur - interruptions matérielles
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 12/11/2002, 21h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo