12F675 et interruptions
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 32

12F675 et interruptions



  1. #1
    M-EIFFEL

    12F675 et interruptions


    ------

    Bonjour à la communauté,

    je reviens vers vous car je butte sur un problème de gestion d'interruptions.
    Tout d'abord mon environnement de 'travail' : Pic 12F675, Mikropascal, EasypicV7.
    Ensuite mon problème : j'essaye d'utiliser dans un même programme les interruptions via GP2/INT (GIE, INTE et INTF) et celles d'une autre broche (GP1 en l'occurrence) via les Interrupt
    On Change (GIE, GPIE et GPIF) et ceci sans résultat. Quand je teste les deux accès par des bouts de programmes indépendants j'arrive à activer les flags et à les exploiter dans le corps du programme principal mais quand je les réunis dans la même "procédure Interrupt" seule celle qui gère INT/GP2 réagit. J'ai essayé d'exploiter la Datasheet mais sans y trouver une réponse. J'ai tenté plusieurs changements au niveau de TRISIO, GPIO, IOC et autres mais toujours chou blanc.
    Quelqu'un aurait il rencontré ce problème ? Y a t'il une incompatibilité avec ce Pic ? Y a t'il un paramétrage qui m'aurait échappé (c'est sûrement la raison la plus probable) ?
    Pour info je fais tous mes tests en utilisant les boutons poussoirs et Leds de la plaque de développement.

    Merci d'avance à ceux qui pourront m'apporter leurs lumières.
    Bon dimanche.
    Michel

    -----

  2. #2
    adipie

    Re : 12F675 et interruptions

    Bonjour,
    Quelle est la valeur du registre IOC ?
    Poste le code.

  3. #3
    antek

    Re : 12F675 et interruptions

    Du pseudo Pascal pour un 12F
    Comment dire . . . ?

  4. #4
    adipie

    Re : 12F675 et interruptions

    Citation Envoyé par antek Voir le message
    Du pseudo Pascal pour un 12F
    Comment dire . . . ?
    Rien compris, peux tu expliquer ?

  5. A voir en vidéo sur Futura
  6. #5
    M-EIFFEL

    Re : 12F675 et interruptions

    Citation Envoyé par antek Voir le message
    Du pseudo Pascal pour un 12F
    Comment dire . . . ?
    Bonjour,
    Comme Adipie je suis dans l'expectative: humour, ironie ou... mépris ?

  7. #6
    M-EIFFEL

    Re : 12F675 et interruptions

    Citation Envoyé par adipie Voir le message
    Bonjour,
    Quelle est la valeur du registre IOC ?
    Poste le code.
    Bonjour Adipie,

    voici le code que j'essaye de faire 'tourner'. Merci pour toute(s) rectification(s) et/ou suggestion(s).

    Code:
    program _12F675_Interruptions;
    
    {
    Quand on détecte une IOC sur GP1 on allume/éteint alternativement LED_4
    Quand on détecte une INT sur GP2 on allume/éteint alternativement LED_5
    GPIO.0 --> Sortie LED mise en route
    GPIO.1 <-- Entrée IOC
    GPIO.2 <-- Entrée INT
    GPIO.4 --> Sortie LED
    GPIO.5 --> Sortie LED
    }
    
    var
    InterGP1, InterGP2 : boolean;
    
    procedure init;
    begin
         ANSEL := $00;              // Obligatoire
         CMCON := 7;                // Annihile les comparateurs sur le PORT A
         TRISIO := %00001110;       // Toutes les pattes en Entrées sauf GP0 (LED)
                                    // ...GPIO.4 et GPIO.5 pour test
         OPTION_REG := $00;         //
         INTCON.GIE := 1;           // Autorisation globale des INTerruptions
         INTCON.INTE := 1;          // Autorisation d'INT sur GP2
         INTCON.INTF := 0;          // RàZ du flag correspondant
         INTCON.GPIE := 1;          // Autorisation d'INT sur autres que GP2 (+IOC)
         INTCON.GPIF := 0;          // RàZ du flag correspondant
         IOC := %00000010;          // Autorise GP1 comme IOC
         InterGP1 := FALSE;         // Pour signaler l'INT (GP1) au programme
         InterGP2 := FALSE;         // Pour signaler l'INT (GP2) au programme
         GPIO.0 := 1;               // Voyant de mise en route
    end;
    
    procedure Interrupt;
    begin
         // Interruption sur GP2 (INT)
          if INTCON.INTF = 1 then  // Si on détecte une interruption sur GP2,
          begin                    // afin d'éviter les rebonds
            INTCON.INTE := 0;      // on interdit les INT sur ce port...
            delay_ms(200);         // ... pendant 200ms puis...
            INTCON.INTE := 1;      // ... on  y re autorise les INT  ...
            INTCON.INTF := 0;      // ... et on remet le flag à 0.
            InterGP2 := TRUE;      //  On envoie au prog principal l'info que
                                   // l'interruption a eu lieu.
          end;
    
          // Interruption sur GP1 (IOC)
          if INTCON.GPIF = 1 then   // Si on détecte une interruption sur GP1
          begin                     // afin d'éviter l'hystérésis
            INTCON.GPIE := 0;       // on interdit les INT sur ce port...
            delay_ms(200);          // ... pendant 200 ms puis...
            INTCON.GPIE := 1;       // ... on y re autorise les INT ...
            INTCON.GPIF := 0;       // ... et on remet le flag à 0.
            InterGP1 := TRUE;       //  On envoie au prog principal l'info que
                                    //  l'interruption a eu lieu.
          end;
    end;
    
    //Corps du programme
    begin
    init;
       while true do
    
    // Traitement de l'interruption sur GP2 (INT)
       if InterGP2 = TRUE then         // En cas d'interruption
       begin
            GPIO.5 := GPIO.5 xor 1;   // on allume/éteint LED_5
            InterGP2 := FALSE;        // on remet le flag à 0
    
       end;
    
    // Traitement de l'interruption sur GP1(LDR)
       if InterGP1 = TRUE then                 // En cas d'interruption LDR
       begin
            GPIO.4 := GPIO.4 xor 1;   // on allume/éteint LED_4
            InterGP1 := FALSE;        // on remet le flag à 0
       end;
    end.
    Dernière modification par Antoane ; 15/03/2015 à 14h16. Motif: Intégration du code au message

  8. #7
    invitef86a6203

    Re : 12F675 et interruptions

    pourquoi tu arrêtes l'int dans la procédure ?
    ça fonctionne une fois et après rien...

  9. #8
    antek

    Re : 12F675 et interruptions

    Citation Envoyé par M-EIFFEL Voir le message
    Bonjour,
    Comme Adipie je suis dans l'expectative: humour, ironie ou... mépris ?
    Surement pas du mépris.
    C'est plus fort que moi, je ris !

  10. #9
    antek

    Re : 12F675 et interruptions

    Je ne connais pas ce langage mais le programme semble ne pas suivre une bonne procédure
    Il faudrait faire comme ça :

    Dans la routine INT, si INT a été détecté
    - début
    - attendre X s
    - vérifier si la cause de l'interruption est présente
    - gérer l'indicateur d'interruption
    - effacer FLAG INT
    - fin

    Ne pas tripoter les INT ENABLE et des flag d'autres interruptions à l'intérieur du traitement d'une interruption.
    De plus, jusqu'à l'instruction RETFIE, les interruptions sont inhibées.

  11. #10
    inviteb21379d3

    Re : 12F675 et interruptions

    Je ne suis pas entièrement sûr si cela peut être la cause du problème, mais je pense que vous devriez mettre les commandes ci-dessous juste au fin de la procedure Interrupt, et aussi une seule fois, et non dupliquée comme ce est maintenant:

    Code:
            INTCON.INTE := 1;      // ... on  y re autorise les INT  ...
            INTCON.INTF := 0;      // ... et on remet le flag à 0.

  12. #11
    antek

    Re : 12F675 et interruptions

    Les interruptions sont automatiquement autorisées en sortant de la routine

  13. #12
    invite3a1051d7

    Re : 12F675 et interruptions

    Bonjour,
    voici un petit programme en basic ( proche du C pou la syntaxe) que j'avais fait comme exemple sur les les interuption pour un 12F683
    (tres proche du 12F75)
    si cela peut t'aider
    '12F683 tout digital
    'test interruption gpio2 et GPI X ici X=1
    'gpio2 choix du sens de variation détecté OPTION_REG
    'gpio.1 interruption à chaque chg sens
    Define CONF_WORD = 0x33c4 'A3 entrée
    'Define CONF_WORD = 0x33e4 'A3 MCLR
    Dim intergp1 As Byte
    Dim intergp2 As Byte
    Dim reg As Byte
    OSCCON = %01100000 '4 Mhz interne
    ADCON0 = %0000000
    TRISIO = %00001110 '1 =entrée
    'toutdigital
    CMCON0 = %0000111 '111 digital
    CMCON1 = %00000000 'horloge conversion
    ANSEL = %00000000 'C3,C2,C1,C0,X,A2,A1,A0
    WPUA = %00110111 'pull up X,X ,X,A4,A3,A2,A1,A0
    INTCON = %10011000
    'b7 INTCON.GIE general=1
    'b6 INTCON.PEIR extérieur EEPROOM,compa,usart,CCP,TIMER1 et 2
    'b5 INTCON.TOIE timer
    'b4 INTCON.INTE gpio2=1
    'b3 INTCON.GPIE gpioX voir IOC
    'b2 INTCON.TOIF flag timer
    'b1 INTCON.INTF flag gpio.2
    'b0 INTCON.GPIF flag gpio.X
    IOC = %00000010 'autorisation inter sur gpio1
    'mettre cette ligne en dernier
    OPTION_REG = %00000000
    'b7=0 permet pull up
    'b.6 sens interruption gpi0
    debut:
    If intergp2 = 1 Then
    intergp2 = 0
    reg.4 = 1
    GPIO = reg
    WaitMs 5
    reg.4 = 0
    GPIO = reg
    INTCON.INTF = 0 'drapeau à zero
    INTCON.INTE = 1 'autorise inter gpio.2
    Endif
    If intergp1 = 1 Then
    intergp1 = 0
    If GPIO.1 = 0 Then '(pour choisir choix sens detection)
    reg.5 = 1
    GPIO = reg
    WaitMs 5
    Endif
    reg.5 = 0
    GPIO = reg
    INTCON.GPIF = 0 'drapeau à zero
    INTCON.GPIE = 1 'autorise inter gpio.1
    Endif
    Goto debut
    End
    On Interrupt
    'pendant l'interruption toute autre interruption est inhibée
    If INTCON.INTF = 1 Then
    intergp2 = 1
    INTCON.INTE = 0
    Endif
    If INTCON.GPIF = 1 Then
    intergp1 = 1
    INTCON.GPIE = 0
    Endif
    Resume
    cordialement
    Alain

  14. #13
    adipie

    Re : 12F675 et interruptions

    Voici le test de bon fonctionnement des interuptions sur GPIO.1 et GPIO.2 en MikroBasic facile à convertir en MikroPascal.

    Code:
    program Test12F
    Sub procedure init()
         ANSEL = 0
         CMCON = 7
         WPU = 6
         OPTION_REG = 0         '
         TRISIO = %00000110
         IOC = %00000010        ' Autorise GP1 comme IOC
         INTCON.PEIE = 1
         INTCON.INTE = 1        ' Autorisation d'INT sur GP2
         INTCON.GPIE = 1        ' Autorisation d'INT sur autres que GP2 (+IOC)
         INTCON.GIE = 1         ' Autorisation globale des INTerruptions
         GPIO = 0
         GPIO.0 = 1              ' Voyant de mise en route
    end sub
    
    Sub procedure Interrupt()
         ' Interruption sur GP2 (INT)
          if INTCON.INTF = 1 then  ' Si on détecte une interruption sur GP2,
            GPIO.5 = 0
            GPIO.4 = 1
            INTCON.INTF = 0
          end if
    
          ' Interruption sur GP1 (IOC)
          if INTCON.GPIF = 1 then            ' Si on détecte une interruption sur GP1
             GPIO.4 = 0
             GPIO.5 = 1
             INTCON.GPIF = 0
          end if
    end Sub
    Main:
    'Corps du programme
    init()
       while true
       wend
    end.

  15. #14
    adipie

    Re : 12F675 et interruptions

    Antek a dit: Surement pas du mépris.
    C'est plus fort que moi, je ris !

    Comme nous aimons aussi rigoler, pourquoi ne pas nous expliquer pourquoi ça te fait tellement rire ?
    Dernière modification par adipie ; 15/03/2015 à 20h17.

  16. #15
    adipie

    Re : 12F675 et interruptions

    A M-EIFFEL
    Pour le test de mon programme, n'utilise pas les leds (SW port A sur off) de la carte Easy Pic, mais câble 2 leds sur le connecteur mâle du portA

  17. #16
    Seb.26

    Re : 12F675 et interruptions

    Je réponds pas vraiment à la question, mais pourquoi tu utilises 2 sources d’interruptions ???
    -> détecte quelle pin a générée l'interruption IOC et basta ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  18. #17
    M-EIFFEL

    Re : 12F675 et interruptions

    Bonjour et merci à tous, freepicbasic et andre_teprom pour vos suggestions.
    Merci aussi à alainav1 pour son programme : à son propos tu as précisé qu'il fallait placer la ligne Option_Reg en dernier. Y a t'il une raison particulière ?
    Et merci à Adipie pour son programme qui a fonctionné du premier coup. Super ! Fort de ton message de ce matin j'ai monté le pic sur une plaquette à trous et ça fonctionne impec. Je vais pouvoir utiliser ce code comme base pour de nouveaux développements.
    Bonne journée et vraisemblablement à bientôt.

    Michel.

  19. #18
    Seb.26

    Re : 12F675 et interruptions

    Probablement une piste :

    3.2.2 INTERRUPT-ON-CHANGE
    A mismatch condition will continue to set flag bit GPIF.
    Reading GPIO will end the mismatch condition and
    allow flag bit GPIF to be cleared.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  20. #19
    M-EIFFEL

    Re : 12F675 et interruptions

    Bonjour SEB.26,
    le projet consiste à alimenter une lampe de casque de spéléo à des puissances 'conséquentes' et qui doit pouvoir passer en mode veilleuse quand deux lampes identiques se font face (pour éviter l'éblouissement).
    J'ai donc besoin de deux interruptions : l'une qui permet de détecter un ILS pour changer cycliquement 4 niveaux possibles d'éclairage et simultanément une autre pour la commutation par LDR en mode veilleuse.
    Je n'ai trouvé que ce moyen (ce qui ne veut pas dire qu'il n'en existe pas d'autres) mais ce projet m'a permis de me lancer à la découverte des Pics. Une première approche à base de NE555 et comparateurs tournait à l'usine à gaz alors qu'on peut tout mettre (et surtout facilement modifier) dans un chip 8 pattes. Voilà l'historique.

    Bonne journée.
    Michel

  21. #20
    invite3a1051d7

    Re : 12F675 et interruptions

    bonjour,
    Option_Reg en dernier
    j'ai des soucis de configuration sur les pull up quand je met ce registre en début de programme ?
    peut etre un soucis de pic simulator donc j'ai laissé cet aide memoire dans le programme

    de même quand je met certaine sortie à 1 ou à 0 les autres se mettent à 0
    doncje passe par un byte et ensuite le le charge dans le port
    exemple
    au lieu d'ecrire

    GPIO.2=1
    j 'écris
    dim reg as byte 'reg est déclaré en byte
    reg= %00000000
    reg.2=1
    gpio=reg (tansfert vers le port

    j'ai déja lu , je ne sais plus où) que ce bug etait connu ?

    cordialement
    Alain

  22. #21
    adipie

    Re : 12F675 et interruptions

    Voici une autre solution avec l'utilisation de la librairie Button incluse dans MikroBasic ou MikroPascal.
    Testé sur EasyPic5 avec deux leds externes.
    Code:
    '2 Télérrupteurs avec PIC 12F675
    dim Os1, Os2 as byte
    Sub procedure init()
     ANSEL = 0
     CMCON = 7
     WPU = 6
     OPTION_REG = 0         '
     TRISIO = %00000110
    end sub
    Main:
    init()
     GPIO = 0
     GPIO.0 = 1              ' Voyant de mise en route
       while true
        'Télérupteur 1 In sur GPIO.1 Out sur GPIO.4
        if Button(GPIO, 1, 1, 1) then
        Os1 = 255
        end if
        if Os1 and Button(GPIO, 1, 1, 0) then
        GPIO.4 = not(GPIO.4)
        Os1 = 0
        end if
        'Télérupteur 2 In sur GPIO.2 Out sur GPIO.5
        if Button(GPIO, 2, 1, 1) then
        Os2 = 255
        end if
        if Os2 and Button(GPIO, 2, 1, 0) then
        GPIO.5 = not(GPIO.5)
        Os2 = 0
        end if
       wend
    end.
    Dernière modification par adipie ; 16/03/2015 à 14h03.

  23. #22
    Seb.26

    Re : 12F675 et interruptions

    Citation Envoyé par M-EIFFEL Voir le message
    Bonjour SEB.26,
    le projet consiste à alimenter une lampe de casque de spéléo à des puissances 'conséquentes' et qui doit pouvoir passer en mode veilleuse quand deux lampes identiques se font face (pour éviter l'éblouissement).
    J'ai donc besoin de deux interruptions : l'une qui permet de détecter un ILS pour changer cycliquement 4 niveaux possibles d'éclairage et simultanément une autre pour la commutation par LDR en mode veilleuse.
    Je n'ai trouvé que ce moyen (ce qui ne veut pas dire qu'il n'en existe pas d'autres) mais ce projet m'a permis de me lancer à la découverte des Pics. Une première approche à base de NE555 et comparateurs tournait à l'usine à gaz alors qu'on peut tout mettre (et surtout facilement modifier) dans un chip 8 pattes. Voilà l'historique.

    Bonne journée.
    Michel
    Ce que je voulais dire, c'est que tu utilises 2 sources d’interruptions différentes :
    -> IOC pour GP1
    -> INT pour GP2

    Mais GP2 peut aussi générer une interruption via IOC ... d'où ma question du pourquoi de l'utilisation de INT ...
    Dernière modification par Seb.26 ; 16/03/2015 à 16h17. Motif: orthograhe
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  24. #23
    Seb.26

    Re : 12F675 et interruptions

    << my 2 cents >>
    je me doute que le CPU ne va pas consommer grand chose comparé aux LEDs, mais par contre il consommera tout le temps ... l'utilisation d'une fréquence basse et de l'instruction sleep() serait une bonne idée AMA ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  25. #24
    adipie

    Re : 12F675 et interruptions

    Citation Envoyé par Seb.26 Voir le message
    Ce que je voulais dire, c'est que tu utilises 2 sources d’interruptions différentes :
    -> IOC pour GP1
    -> INT pour GP2
    Mais GP2 peut aussi générer une interruption via IOC ... d'où ma question du pourquoi de l'utilisation de INT ...
    IOC va générer une interruption à chaque changement d'état de GPIO.1 et GPIO.2 ce qui est OK pour réveiller le PIC quand il est en mode Sleep.
    Mais je me pose la question comment savoir quelle entrée a changé d'état, pour le moment je ne vois pas de solution.

  26. #25
    adipie

    Re : 12F675 et interruptions

    Citation Envoyé par Seb.26 Voir le message
    << my 2 cents >>
    je me doute que le CPU ne va pas consommer grand chose comparé aux LEDs, mais par contre il consommera tout le temps ... l'utilisation d'une fréquence basse et de l'instruction sleep() serait une bonne idée AMA ...
    Bonne idée SEB26, le programme suivant tient compte de cette remarque et met le PIC en mode Sleep.
    Une action sur GPIO1 ou GPIO2 réveille le PIC.
    Code
    Code:
    program Telerupteurs_12F675
    '2 Télérrupteurs avec PIC 12F675
    dim Os1, Os2 as byte
    Sub procedure init()
     ANSEL = 0
     CMCON = 7
     WPU = 6
     OPTION_REG = 0         '
     TRISIO = %00000110
     IOC = %00000110
     INTCON.GPIE = 1    'Cette interruption réveille le PIC quand GPIO.1 ou
     end sub            'GPIO.2 sont activés
    Main:
    init()
     GPIO = 0
     GPIO.0 = 1              ' Voyant de mise en route
       while true
        'Télérupteur 1 In sur GPIO.1 Out sur GPIO.4
        if Button(GPIO, 1, 1, 1) then
        Os1 = 255
        end if
        if Os1 and Button(GPIO, 1, 1, 0) then
        GPIO.4 = not(GPIO.4)
        Os1 = 0
        end if
        'Télérupteur 2 In sur GPIO.2 Out sur GPIO.5
        if Button(GPIO, 2, 1, 1) then
        Os2 = 255
        end if
        if Os2 and Button(GPIO, 2, 1, 0) then
        GPIO.5 = not(GPIO.5)
        Os2 = 0
        end if
        ASM
        Sleep           'Mise en someil du PIC
        End ASM
       wend
    end.

  27. #26
    M-EIFFEL

    Re : 12F675 et interruptions

    Bonsoir SEB.26,

    je prends note de ces suggestions et ce sera peut-être pour une V2.
    D'autant qu'Adipie m'a envoyé un bout de code justifiant l'adage "Pourquoi faire simple quand on peut faire compliqué"

    Cordialement.
    Michel

  28. #27
    M-EIFFEL

    Re : 12F675 et interruptions

    Merci Adipie pour cette rapide adaptation après le message de SEB.26. Je teste ça dès que possible et je vous tiens au courant.
    Bonne soirée.

    Michel

  29. #28
    M-EIFFEL

    Re : 12F675 et interruptions

    Bonjour à la communauté,

    hier soir, tout au plaisir de recevoir des infos d'Adipie et SEB.26, j'ai un peu 'squizzé' une info capitale : il faut que mon Pic travaille et non pas qu'il roupille
    En effet il est aussi (et surtout) là pour générer du PWM (Modulation en Largeur d'Impulsion en bon français) dont le changement de rapport cyclique permet la variation de la luminosité de la lampe de casque et qui donc tourne en permanence. D'où la nécessité d'utiliser les Interruptions ou la version "light" des télérupteurs d'Adipie. Comme le faisait justement remarquer SEB.26 la consommation est ridicule par rapport aux 1,2A à 1,5 A nécessaires à l'alimentation des LEDs, donc tant pis, il va bosser en continu.
    Mais je garde précieusement ce code pour une utilisation ultérieure.

    Bonne journée.
    Michel

  30. #29
    adipie

    Re : 12F675 et interruptions

    Tu vires les lignes suivantes et ton PIC restera éveillé.
    Code:
     IOC = %00000110
     INTCON.GPIE = 1    
     ASM
     Sleep          
     End ASM
    Un cahier des charges précis permettrai de ne pas dévier du besoin réel.
    Je n'ai toujours pas de réponse à mon post #24.
    Dernière modification par adipie ; 17/03/2015 à 16h55.

  31. #30
    invite3a1051d7

    Re : 12F675 et interruptions

    bonjour,
    suivant le flag mis à 1 on sait qui a provoqué l'interruption (voir le registre intcon )
    gpio.2 provoque une interuption dans un seul sens (sens défini dans option_reg ) donc on le sait le sens
    gpio.1 provoque une interuption dans les 2 sens (un test dans le programme d'interuption sur cette broches permet de trouver le sens)
    cordialement
    Alain

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Boucle while pic 12F675
    Par invite9d655374 dans le forum Électronique
    Réponses: 32
    Dernier message: 12/12/2014, 11h02
  2. pic 12F675
    Par invite4f140ec4 dans le forum Électronique
    Réponses: 2
    Dernier message: 26/06/2011, 14h48
  3. PIC 12F675 cramé ou pas ?
    Par invite743445eb dans le forum Électronique
    Réponses: 3
    Dernier message: 07/12/2010, 08h33
  4. 12F675 ADC et UART ?
    Par invitea3c9a7a9 dans le forum Électronique
    Réponses: 2
    Dernier message: 13/11/2009, 16h15
  5. Pic 12F675 et bouton poussoir
    Par invite92bb58f7 dans le forum Électronique
    Réponses: 8
    Dernier message: 18/04/2008, 17h47
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...