Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

[PIC18F] Interruptions : choisir le port d'entrée pour déclencher une interruption



  1. #1
    rolf34

    Question [PIC18F] Interruptions : choisir le port d'entrée pour déclencher une interruption

    Bonjour (ou bonsoir),

    Je développe actuellement sur un Pic 18F4520 en C et je souhaiterais déclencher une interruption quand une trame se présente sur le port RC7.
    Malheureusement, mon niveau de programmation en C (et sur Pic), ainsi que mon niveau en Anglais sont limités, et ne sais toujours pas comment utiliser la syntaxe malgré mes recherches. C'est la raison pour laquelle je fais appel à ceux qui voudrons bien m'aider sur le forum.


    Voici déjà mon code :


    /* !!! VERIFIER QUE LE FICHIER "FTOA.C" EST INCLUE AVEC LE PROGRAMME
    PRINCIPAL !!! */


    /* DIRECTIVES */
    #include <p18f4520.h>
    #include <stdlib.h>
    #include <usart.h>
    #include <adc.h>
    #include <delays.h>

    #define NB_VAL_MOY 50
    #define RC7 PORTCbits.RC7



    /* VARIABLES */
    char str_n[30];
    float valeur;
    char valeur_char=0;
    int valeur_int=0;
    int moyenne=0;

    static int tab[NB_VAL_MOY];
    static char index=0;



    /* FONCTION COMMANDE PC */

    // C'est la fonction que je souhaite activer en interruption quand une trame se présente sur le port RC7

    void CMD(void)
    {
    if(PIR1bits.RCIF)
    {
    getsUSART(valeur_char,2);
    valeur_int = atoi(valeur_char);
    PORTB=valeur_int;
    }
    }



    /* FONCTION CAPTEUR DE PRESSION */
    void Capteur(void)
    {
    while(BusyADC());
    Delay100TCYx(50);
    ConvertADC();
    tab[index++]=ReadADC();

    if(index>=NB_VAL_MOY)
    {
    char i;
    for(i=0; i<NB_VAL_MOY; i++)
    moyenne+=tab[i];
    moyenne/=NB_VAL_MOY;
    valeur=moyenne;

    valeur=(valeur+8.520)/7.251;

    ftoa(valeur, str_n, 2,'F');

    putsUSART(str_n);
    index=0;
    }
    }


    /*============================= ===
    ===== PROGRAMME PRINCIPALE =====
    ============================== ==*/

    void main (void)
    {
    TRISCbits.TRISC6=0; //TX Définit la sortie RS232
    TRISCbits.TRISC7=1; //RX Définit l'entrée RS232


    TRISB = 0;
    PORTB = 0;



    OpenUSART( USART_TX_INT_OFF &
    USART_RX_INT_OFF &
    USART_ASYNCH_MODE &
    USART_EIGHT_BIT &
    USART_BRGH_HIGH,25);


    OpenADC( ADC_RIGHT_JUST & // Initialisation du CAN
    ADC_4_TAD &
    ADC_FOSC_32, ADC_CH1 & // CH1 pour l'entrée RA1
    ADC_REF_VREFPLUS_VREFMINUS &
    ADC_INT_ON, ADC_1ANA);


    while(1)
    {
    Capteur();

    if(PIR1bits.RCIF) // Si une trame est détectée sur RC7...
    {
    CMD(); // Actuellement, la fonction se trouve dans le void main void
    }
    }
    }


    Explication du code : En résumé, j'ai un capteur de pression qui délivre une plage de tension sur le CAN du pic.
    Convertie en signal numérique, la tension est envoyée via RS232 au PC. Ce dernier me l'affiche dans une textbox (visual basic 2008) sous la forme "252 millibars", par exemple.
    Le rôle du PC et de réguler une pression que j'ai définis et va donc envoyer une chaîne de caractère au Pic qui activera une pompe ou une valve de fuite en fonction de la pression affichée.

    Par exemple : Si je décide qu'il faut maintenir une pression de 200millibars dans mon circuit pneumatique, et que le capteur m'indique une pression de 120millibars, le PC enverra la chaîne "01" au Pic et le port RB1 se mettra en état 1, et allumera la pompe (via un relais mécanique) pour augmenter la pression jusqu'à 200millibars comme demandé.
    Le principe est le même pour allumer la valve de fuite quand il y a trop de pression dans le circuit pneumatique.




    Le problème :Jusque là tout marche comme il faut. Le seul problème est que la fonction CMD(); (qui permet de récupérer les trames en provenance du PC) est inclue dans le programme principal "void main void" et me déclenche assez souvent la vanne de fuite ou la pompe sans que cela soit nécessaire, et empêche correctement la régulation.
    C'est alors que j'ai pensé à activer CMD(); qu'après une interruption, c-à-d que quand le port RC7 reçoit une trame du PC, à n'importe quel moment, une interruption se fait et met en pause void main void et exécute CMD();.
    Et c'est là où je ne puis continuer car j'ignore comment utiliser la syntaxe des interruptions et en choisissant le port RC7.



    J'espère avoir été clair :s et vous remercie par avance de vos réponses.
    Je ne pourrais répondre que demain matin, car ce soir je serais absent.



    Merci bien.

    -----


  2. #2
    RISC

    Re : [PIC18F] Interruptions : choisir le port d'entrée pour déclencher une interruption

    Salut,

    La mise en oeuvre des interruptions sur PIC18 a été maintes et maintes fois traité sur ce forum...La fonction recherche te permettra de localiser les sujets.
    Regarde aussi du coté de ce tutoriel :
    http://www.aix-mrs.iufm.fr/formation...indexPIC_C.htm

    Tu pourras aussi voir ce webseminar dédié aux interruptions sur PIC18 :
    http://techtrain.microchip.com/webse...spx?Active=152

    a+
    Ma marotte ? les microcontrôleurs ;=)

  3. #3
    rolf34

    Re : [PIC18F] Interruptions : choisir le port d'entrée pour déclencher une interruption

    Bonjour RISC et merci de ta réponse,


    J'ai consulté les cours du lien que tu m'a passé et poussé encore mes recherches.
    J'ai désormais un peu avancé mais je suis confronté à un problème : le port RB1 et le port RB2 sont tout les 2 allumés et je ne reçoit plus la mesure du capteur de pression sur mon PC, je pense qu'il est gelé, inactif dans le Pic.



    Voilà le nouveau code :

    /* !!! VERIFIER QUE LE FICHIER "FTOA.C" EST INCLUE AVEC LE PROGRAMME
    PRINCIPALE !!! */


    /* DIRECTIVES */
    #include <p18f4520.h>
    #include <stdlib.h>
    #include <usart.h>
    #include <adc.h>
    #include <delays.h>

    #define NB_VAL_MOY 50



    /* VARIABLES */
    char str_n[30];
    float valeur; // Déclaration de la variable en décimale qui m'affichera la valeur en Volt.
    char valeur_char=0;
    int valeur_int=0;
    int moyenne=0;

    static int tab[NB_VAL_MOY];
    static char index=0;



    /* INTERRUPTION */
    #pragma interrupt CMD
    void CMD(void)
    {
    if(PIR1bits.RCIF) // Si RC7 reçoit une trame...
    {
    getsUSART(valeur_char,2);
    valeur_int = atoi(valeur_char);
    PORTB=valeur_int;
    }
    }
    #pragma code vecteurITH=0x08
    void une_fonction(void)
    {
    _asm goto CMD _endasm
    }
    #pragma code



    /* FONCTION CAPTEUR DE PRESSION */
    void Capteur(void)
    {
    while(BusyADC());
    Delay100TCYx(50);
    ConvertADC();
    tab[index++]=ReadADC();

    if(index>=NB_VAL_MOY)
    {
    char i;
    for(i=0; i<NB_VAL_MOY; i++)
    moyenne+=tab[i];
    moyenne/=NB_VAL_MOY;
    valeur=moyenne;

    valeur=(valeur+8.520)/7.251; // Pour que la valeur soit étalonnée en Inch (CA1) : (valeur+b)/a

    ftoa(valeur, str_n, 2,'F');

    putsUSART(str_n); // Envoi du char au PC (RS232)
    index=0;
    }
    }



    /*============================= ===
    ===== PROGRAMME PRINCIPALE =====
    ============================== ==*/

    void main (void)
    {
    TRISB = 0;
    PORTB = 0;


    RCONbits.IPEN=1; // active la priorité sur les IT
    IPR1bits.RCIP=1; // selectionne haute priorité pour RX
    INTCONbits.GIEH=1; // autorise IT haute priorité
    INTCONbits.GIEL=0; // interdit IT basse priorité


    OpenUSART( USART_TX_INT_OFF &
    USART_RX_INT_ON & // Interruptions sur RX autorisé
    USART_ASYNCH_MODE &
    USART_EIGHT_BIT &
    USART_BRGH_HIGH,25);


    OpenADC( ADC_RIGHT_JUST & // Initialisation du CAN
    ADC_4_TAD &
    ADC_FOSC_32, ADC_CH1 & // CH1 pour l'entrée RA1
    ADC_REF_VREFPLUS_VREFMINUS &
    ADC_INT_ON, ADC_1ANA);


    while(1)
    {
    Capteur();
    }
    }







    J'ai l'impression que l'interruption se fait continuellement, et empêche maintenant la fonction Capteur(); de marcher, tu aurais une idée ?

  4. #4
    _charléne_

    Re : [PIC18F] Interruptions : choisir le port d'entrée pour déclencher une interruption

    tu n'aurrais pas un probléme de flag?

Sur le même thème :

Discussions similaires

  1. Mesure d'humidité pour déclencher une VMC
    Par alexparis dans le forum Bricolage et décoration
    Réponses: 10
    Dernier message: 17/09/2017, 17h17
  2. [PIC] PORTB,VAR ? (choisir le no du port avec une variable)
    Par Mkala dans le forum Électronique
    Réponses: 5
    Dernier message: 20/02/2010, 11h18
  3. [PIC18F] - Bonne Configuration pour les interruptions
    Par jorg1n dans le forum Électronique
    Réponses: 9
    Dernier message: 01/12/2009, 09h10
  4. Interruptions sur changement d'état du port B
    Par Toufinet dans le forum Électronique
    Réponses: 2
    Dernier message: 29/05/2006, 21h40
  5. interruption PIC18F
    Par induc dans le forum Électronique
    Réponses: 12
    Dernier message: 19/05/2006, 16h17