[Programmation] MICROCONTROLEURS 12F683 Interruption ne fonctionne pas - Page 3
Répondre à la discussion
Page 3 sur 4 PremièrePremière 3 DernièreDernière
Affichage des résultats 61 à 90 sur 97

MICROCONTROLEURS 12F683 Interruption ne fonctionne pas



  1. #61
    invitead6c50a3

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas


    ------

    Bonne nouvelle!
    La routine d'interruption si elle est mal déclarée sera traitée comme une simple fonction et le compilateur ne la traitera pas comme il se doit, d'où le message de warning que tu avais.
    Je pense que c'était le problème.
    INTCON qui contient les activations d'interruptions doit être déclaré après avoir configurer le timer0.

    -----

  2. #62
    invitead6c50a3

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Maintenant il te reste à ajouter ton BP et configurer le registre qui va gérer l'interruption.
    C'est un bon exercice

  3. #63
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    J'ai rajouté une interruption extèrieure ( doublant la fréquence) en mettant un contact + sur GP2.
    ça ne marche pas la fréquence est constamment doublée sans que j'appuie.

    Le programme, en gras ce que j'ai rajouté:

    #include <xc.h>
    #include <pic12f683.h>

    // Définition de la fréquence du crystal pour la fonction __delay_ms(x);
    #define _XTAL_FREQ 31000
    #define led GP4
    // CONFIG
    #pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
    #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
    #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
    #pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
    #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
    #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
    #pragma config BOREN = OFF // Brown Out Detect (BOR disabled)
    #pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode is disabled)
    #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)



    void __interrupt () my_isr_routine (void)
    {
    if ((INTCONbits.T0IF == 1) && (INTCONbits.T0IE == 1))
    {
    TMR0 = 16;
    led =~ led;
    INTCONbits.T0IF = 0;
    }
    if ((INTCONbits.INTF == 1) && (INTCONbits.INTE ==1))
    {
    OPTION_REGbits.PS2 = 0;
    OPTION_REGbits.PS1 = 1;
    OPTION_REGbits.PS0 = 0;

    INTCONbits.INTF = 0;
    }

    }


    void main() {
    ANSEL = 0b00000000;

    TRISIO = 0b00000100;

    OSCCON = 0b00000111;

    // timer

    OPTION_REGbits.T0CS = 0;
    OPTION_REGbits.T0SE = 0;
    OPTION_REGbits.PSA = 0;
    OPTION_REGbits.PS2 = 1;
    OPTION_REGbits.PS1 = 0;
    OPTION_REGbits.PS0 = 0;

    OPTION_REGbits.nGPPU = 1;
    OPTION_REGbits.INTEDG = 1;


    TMR0 = 16; // le timer0 doit contenir ce préchargement pour avoir 1s

    //interruptions

    INTCON = 0b11110000; // ici on active les interruptions

    IOC = 0b00000100;


    while (1)
    {
    }
    }

  4. #64
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    soit la broche est au + constamment, soir le flag INTF ne se remet pas à 0 ??

  5. #65
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    pourtant j'ai désactivé les pull_up et même mis GP2 = 0 dans le main

  6. #66
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    je vais repasser en revue tous les registres

  7. #67
    invitead6c50a3

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Il faut que tu mettes une pull-down sur GP2, par exemple une 10K reliée au GND.
    Ton BP sera relié entre GP2 et Vcc.
    As-tu fait ça?

  8. #68
    invitead6c50a3

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Corrige ce registre:
    Code:
    ANSEL = 0b00000100; // déclare GP2 en entrée analogique

  9. #69
    invitead6c50a3

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Tu peux aussi utiliser le pull-up interne et mettre ton BP au GND.
    Pour cela il faut activer le pull-up:
    Code:
    OPTION_REGbits.nGPPU = 0; // GPIO Pull-up Enable bit
    OPTION_REGbits.INTEDG = 0; // Détection sur front descendant
    WPU=0b00000100; // pull-up sur GP2 activé

  10. #70
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Je fais ça et te tiens au courant, merci, bonne soirée.

  11. #71
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Sans rien changer en rallumant le montage:

    Au départ clignotement 1Hz - OK - j'appuie sur BP clignotement 0.5Hz - OK- et si je le relache le clignotement ne reviens pas à 1Hz, il continue à 0.5Hz.
    Si j'éteins et je rallume, idem.
    On dirait que le Flag ne s'efface pas malgré l'instruction.


    Ensuite j'ai mis GP2 en analogique, je l'ai relié au GND par une 12K:

    La led clignote à 1Hz , le BP n'a aucun effet

    Je vais essayer avec le pull-up

  12. #72
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Je confirme en remettant GP2 en numérique, le BP fonctionne mais l'interruption continue si on le relache

  13. #73
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    en retirant la 12K, le montage passe en 0.5Hz, GP2 doit donc bien être polarisé en négatif.
    J'essaye avec le pull_up

  14. #74
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    avec le pull-up, 1Hz et PB n'a aucun effet

  15. #75
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    le OPTION_REGbits.INTEDG : front montant ou descendant fait bien son effet ( effet si on appuie ou relache le BP)

  16. #76
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    OPTION_REGbits.nGPPU = soit 1 soit 0
    OPTION_REGbits.INTEDG = idem
    n'ont aucun effet

  17. #77
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    en résumé, avec ce programme , l'interruption PB fonctionne mais ne s'arrête pas ( flag reste à 1 ou se remet à 1 automatiquement ?). Et le système se réinitialise à 1Hz en éteignant et rallumant le montage:

    #include <xc.h>
    #include <pic12f683.h>

    // Définition de la fréquence du crystal pour la fonction __delay_ms(x);
    #define _XTAL_FREQ 31000
    #define led GP4
    // CONFIG
    #pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
    #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
    #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
    #pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
    #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
    #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
    #pragma config BOREN = OFF // Brown Out Detect (BOR disabled)
    #pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode is disabled)
    #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)



    void __interrupt () my_isr_routine (void)
    {
    if ((INTCONbits.T0IF == 1) && (INTCONbits.T0IE == 1))
    {
    TMR0 = 16;
    led =~ led;
    INTCONbits.T0IF = 0;
    }
    if ((INTCONbits.INTF == 1) && (INTCONbits.INTE ==1))
    {
    OPTION_REGbits.PS2 = 0;
    OPTION_REGbits.PS1 = 1;
    OPTION_REGbits.PS0 = 0;

    INTCONbits.INTF = 0;
    }
    }


    void main() {
    ANSEL = 0b00000000;

    TRISIO = 0b00000100;

    OSCCON = 0b00000111;

    // timer

    OPTION_REGbits.T0CS = 0;
    OPTION_REGbits.T0SE = 0;
    OPTION_REGbits.PSA = 0;
    OPTION_REGbits.PS2 = 1;
    OPTION_REGbits.PS1 = 0;
    OPTION_REGbits.PS0 = 0;



    TMR0 = 16; // le timer0 doit contenir ce préchargement pour avoir 1s

    //interruptions

    INTCON = 0b11110000; // ici on active les interruptions

    IOC = 0b00000100;

    GP2 = 0;

    while (1)
    {
    }
    }

  18. #78
    RISC

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Salut,
    Code:
    #include <xc.h>
    #include <htc.h>
    #include <pic12f683.h>
    #include <pic.h>
    Toutes ces lignes sont redondantes...Il suffit de mettre celle là :

    Code:
    #include <xc.h>
    Je pense que ton problème vient peut*-être de cette ligne :
    Code:
    #define _XTAL_FREQ 31000
    Cette ligne dit au compilateur..la fréquence du PIC est 31000 Hz...
    Le PB c'est que si cette déclaration est incorrecte, le calcul des délais sera complètement faux...
    Tu as entré la valeur de l'oscillateur basse vitesse (31000)...mais j'ai l'impression que tes bits de configuration sélectionne l'oscillateur haute vitesse ...qui est à 4MHz....
    Tu devrais essayer de changer cette ligne avec :
    Code:
    #define _XTAL_FREQ 4000000
    a+

  19. #79
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Salut,
    merci, je vais essayer
    Bonne nuit

  20. #80
    invitead6c50a3

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Citation Envoyé par nilelong Voir le message
    Au départ clignotement 1Hz - OK - j'appuie sur BP clignotement 0.5Hz - OK- et si je le relache le clignotement ne reviens pas à 1Hz, il continue à 0.5Hz.
    Si j'éteins et je rallume, idem.
    On dirait que le Flag ne s'efface pas malgré l'instruction.
    Attention, ce n'est pas comme ça qu'on programme.
    Essayer des choses sans modifier les registres qui vont avec, on y sera encore à Noël.
    Il faut que tu lises la doc du µC et que tu fasses les choses de manière structurée.
    Par exemple comment veux-tu que la tempo revienne à l'initial si tu ne modifie pas les conditions du timer?
    Le registre ANSEL gère les I/O, si tu déclares GP2 en numérique ce n'est pas correct.
    Donc pose toi et écris un flowchart qui décomposera les actions à mener, tu verras que les choses vont t'apparaître plus simplement.

    Si ton timer0 réalise bien la seconde de tempo c'est que ta base de temps est bien reconnue.
    En même temps tu n'as pas choisi le meilleur des compilateurs....
    Bon courage pour la suite.

  21. #81
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Bonjour,

    J'ai vérifié, les configurations sont cohérentes. Même pb si je fais tourner à 4Mhz

    bonne journée

  22. #82
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    OK, bonne journée

  23. #83
    invitead6c50a3

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Citation Envoyé par nilelong Voir le message
    Sans rien changer en rallumant le montage:

    Au départ clignotement 1Hz - OK - j'appuie sur BP clignotement 0.5Hz - OK- et si je le relache le clignotement ne reviens pas à 1Hz, il continue à 0.5Hz.
    Si j'éteins et je rallume, idem.
    On dirait que le Flag ne s'efface pas malgré l'instruction.


    Ensuite j'ai mis GP2 en analogique, je l'ai relié au GND par une 12K:

    La led clignote à 1Hz , le BP n'a aucun effet

    Je vais essayer avec le pull-up
    Fais au moins cette modification:
    Code:
    void __interrupt () my_isr_routine (void)
    {
    if ((INTCONbits.T0IF == 1) && (INTCONbits.T0IE == 1))
    {
    TMR0 = 16;
    OPTION_REGbits.PS2 = 1;
    OPTION_REGbits.PS1 = 0;
    OPTION_REGbits.PS0 = 0;
    led =~ led;
    INTCONbits.T0IF = 0;
    }
    if ((INTCONbits.INTF == 1) && (INTCONbits.INTE ==1))
    {
    OPTION_REGbits.PS2 = 0;
    OPTION_REGbits.PS1 = 1;
    OPTION_REGbits.PS0 = 0;
    
    INTCONbits.INTF = 0;
    }
    }
    Remets en situation tes registres dans la version qui fonctionnait à 1Hz avec la bonne déclaration à 31000Hz.

  24. #84
    invitead6c50a3

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Ca donnera sans doute un fonctionnement bizarre, vu que pour faire les choses proprement il faudrait que tu ajoutes une variable dans la routine d'interruption.

    Fonctionnellement ça devrait donner ça:

    1/ on charge le timer0 avec la valeur d'offset 16 et la config des bits <PS2:PS0> pour avoir 1s.
    2/ lors de l'appui sur BP tu entres dans la routine d'interruption et tu actives une variable, par exemple t_change = ~t_change;
    Il faut déclarer cette variable et l'initialiser à 0;

    Dans le while(1) tu écris une condition qui ressemble à ça:

    Code:
    if(t_change == 1) 
      {
      OPTION_REGbits.PS2 = 0;
      OPTION_REGbits.PS1 = 1;
      OPTION_REGbits.PS0 = 0;
      }
    else
      {
      TMR0 = 16;
      OPTION_REGbits.PS2 = 1;
      OPTION_REGbits.PS1 = 0;
      OPTION_REGbits.PS0 = 0;
      }
    Ainsi ton timer0 cadencera à la bonne valeur à chaque appui sur ton BP.

  25. #85
    invitead6c50a3

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Ce qui donnerait à tester ceci:

    Code:
    unsigned char t_change = 0;
    
    void __interrupt () my_isr_routine (void)
    {
    if ((INTCONbits.T0IF == 1) && (INTCONbits.T0IE == 1))
      {
    TMR0 = 16;
    led =~ led;
    INTCONbits.T0IF = 0;
      }
    if ((INTCONbits.INTF == 1) && (INTCONbits.INTE ==1))
     {
    t_change = ~t_change:
    INTCONbits.INTF = 0;
     }
    }
    
    ......
    
    while(1)
    {  
      if(t_change == 1) 
      {
      OPTION_REGbits.PS2 = 0;
      OPTION_REGbits.PS1 = 1;
      OPTION_REGbits.PS0 = 0;
      }
    else
      {
      TMR0 = 16;
      OPTION_REGbits.PS2 = 1;
      OPTION_REGbits.PS1 = 0;
      OPTION_REGbits.PS0 = 0;
      }
    }

  26. #86
    RISC

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    Salut Exotique,

    Je pense que tu peux simplifier ton écriture en utilisant les "champs de bits" :
    Code:
      OPTION_REGbits.PS2 = 0;
      OPTION_REGbits.PS1 = 1;
      OPTION_REGbits.PS0 = 0;
    ou :
    Code:
      OPTION_REGbits.PS = 0b010;
    a+

  27. #87
    invitead6c50a3

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    On peut alléger l'écriture par:

    Code:
    unsigned char t_change = 0;
    
    void __interrupt () my_isr_routine (void)
    {
    if ((INTCONbits.T0IF) && (INTCONbits.T0IE))
      {
    TMR0 = 16;
    led =~ led;
    INTCONbits.T0IF = 0;
      }
    if ((INTCONbits.INTF) && (INTCONbits.INTE))
     {
    t_change = ~t_change:
    INTCONbits.INTF = 0;
     }
    }
    
    ......
    
    while(1)
    {  
      if(t_change) 
      {
      OPTION_REGbits.PS2 = 0;
      OPTION_REGbits.PS1 = 1;
      OPTION_REGbits.PS0 = 0;
      }
    else
      {
      TMR0 = 16;
      OPTION_REGbits.PS2 = 1;
      OPTION_REGbits.PS1 = 0;
      OPTION_REGbits.PS0 = 0;
      }
    }

  28. #88
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    et encore merci.

  29. #89
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    J'avais essayé d'inverser le prescaler dans l'interruption mais ça ne fonctionnait pas, je n'avais pas pensé à une variable.

    J'ai appliqué ta modif, ça ne fonctionne pas, la led reste allumée et aucun effet du BP

  30. #90
    invite4d59cbf7

    Re : MICROCONTROLEURS 12F683 Interruption ne fonctionne pas

    je vai essyer une variable à 1 bit ( _Bool)

Page 3 sur 4 PremièrePremière 3 DernièreDernière

Discussions similaires

  1. PIC : interruption externe et interruption on change ?
    Par invitea3277f60 dans le forum Électronique
    Réponses: 10
    Dernier message: 09/04/2012, 13h41
  2. interruption sur pic 12f683
    Par invite19d2f999 dans le forum Électronique
    Réponses: 0
    Dernier message: 26/03/2012, 22h28
  3. probleme de gestion du port gpio sur 12F683
    Par invite3a1051d7 dans le forum Électronique
    Réponses: 23
    Dernier message: 13/07/2010, 10h47
  4. Programmation 12F683
    Par invite1ba9e12c dans le forum Électronique
    Réponses: 0
    Dernier message: 11/02/2009, 19h39
  5. PIC 12F683 et Debugger ICD2
    Par invite427c7eae dans le forum Électronique
    Réponses: 8
    Dernier message: 25/04/2007, 06h20
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...