[Programmation] Aide réalisation de deux CAN - pic18f27/47k40 - Microship
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

Aide réalisation de deux CAN - pic18f27/47k40 - Microship



  1. #1
    INSAVCamp

    Aide réalisation de deux CAN - pic18f27/47k40 - Microship


    ------

    Bonjour à tous,

    Pour un projet en électronique, je dois réaliser deux mesures avec un pic, une mesure de tension image du courant (avec un capteur LEM) et une mesure de tension. Dans un premier temps, j'ai réaliser un CAN sur mon PIC. J'arrive à le faire marcher, et je réalise ma mesure sans problème. J'affiche avec des LED les bits de poids fort de la tension mesurée.
    Cependant, je n'arrive pas à en a utiliser 2.
    Il est en effet, pas possible de faire deux mesure en même temps, je souhaite donc mesure dans une boucle en continue la mesure 1 puis la mesure 2.
    Mon principe de code est le suivant :
    - Initialisation générale
    - Initialisation mesure 1 (Choix du channel A0)
    - Mesure 1 et sauvegarde de la valeur
    - Initialisation générale (pour tout remettre les paramétré par défaut)
    - Initialisation mesure 2 (Choix du channel A1)
    - Mesure 2 et sauvegarde de la valeur
    - Calcul = Mesure 1 * Mesure 2

    Pour savoir si les CAN fonctionnent bien, je souhaite afficher les bits de poids fort de la tension sur 4 led (C0, C1, C2, C3) et afficher les 4 autres bits de poids fort de l'autre tension sur 4 autres led (C4, C5, C6, C7).
    Après plusieurs essais, cela ne fonctionne pas.... pourtant avec 1 seul CAN cela fonctionne bien...

    MON CODE :
    Code:
    #include <xc.h>
    #include <stdlib.h>
    #define _XTAL_FREQ 64000000
    
    char resultHigh1;       //Stockage mesure 1
    char resultHigh2;       //Stockage mesure 2
    int puissance;          //Valeur puissance
    
    void can_init(void) {
        ADCON0bits.ADON = 0;    //Turn ADC Off
        ADREFbits.ADPREF = 00;  //Tension max référence = VDD
        ADREFbits.ADNREF=0;     // Tension min référence = GND
        ADCON0bits.ADCS = 0;    // Fréquence du convertisseur fixée sur l'oscillateur interne
        ADCLK=0b00111111;       // Fosc/128 = 2us
        ADCON0bits.ADFM =0;     //Justification à gauche
        ADACT=0x00;             //Pas de réinitialisation automatique
        
    }
                                //On choisit de ne garder que le registre de poids fort : conversion sur 8 bits
    
    void can_init1(void) {
        TRISAbits.TRISA0 = 1;   //Set RA0 to input
        ANSELAbits.ANSELA0 = 1; //Set RA0 to analog
        ADPCH = 0x00;           //RA0 is Analog channel
    }
    
    void can_mesure1(void) {
        ADRESH=0;
        TRISC=0b00000000;       //Port C en sortie pour l'affichage
        ANSELC=0x00;            //Numérique
        ADCON0bits.ADON = 1;    //Turn ADC On
        ADCON0bits.GO = 1;      //Start conversion
        while (ADCON0bits.GO);  //Wait for conversion done
        resultHigh1 = ADRESH;   //Read result
        LATCbits.LATC0=ADRESHbits.ADRESH15;
        LATCbits.LATC1=ADRESHbits.ADRESH14;
        LATCbits.LATC2=ADRESHbits.ADRESH13;
        LATCbits.LATC3=ADRESHbits.ADRESH12;
    }
    
    void can_init2(void) {
        TRISAbits.TRISA1 = 1;   //Set RA1 to input
        ANSELAbits.ANSELA1 = 1; //Set RA1 to analog
        ADPCH = 0x01;           //RA1 is Analog channel
    }
    
    void can_mesure2(void) {
        ADRESH=0;
        TRISC=0b00000000;       //Port C en sortie pour l'affichage
        ANSELC=0x00;            //Numérique
        ADCON0bits.ADON = 1;    //Turn ADC On
        ADCON0bits.GO = 1;      //Start conversion
        while (ADCON0bits.GO);  //Wait for conversion done
        resultHigh2 = ADRESH;   //Read result
        LATCbits.LATC7=ADRESHbits.ADRESHbits.ADRESH15;
        LATCbits.LATC6=ADRESHbits.ADRESHbits.ADRESH14;
        LATCbits.LATC5=ADRESHbits.ADRESHbits.ADRESH13;
        LATCbits.LATC4=ADRESHbits.ADRESHbits.ADRESH12;
    }
    
    void calcul(void) {
        puissance=resultHigh1*resultHigh2;
    }
    
    void main(void) {
        
                
        while (1) {
    	can_init
            can_init1();
            can_mesure1();
    
    	can_init
            can_init2();
            can_mesure2();
            calcul();
    }
    }[/I][/I]
    En espérant que quelqu'un puisse m'aider,

    Vincent

    -----
    Dernière modification par Antoane ; 16/01/2021 à 16h41. Motif: ajout balises code

  2. #2
    Exotique

    Re : Aide réalisation de deux CAN - pic18f27/47k40 - Microship

    Bonjour et bienvenue,

    quelques remarques et conseils d'ordre pratique:

    1/évite d'utiliser CAN au lieu d'ADC, ça évitera des confusions dans tes codes le jour où tu voudras ou devras utiliser un vrai CAN (Controller Area Network).
    Je sais que l'enseignement est friand de franciser les acronymes techniques mais l'électronique dans son usage (les datasheets notamment) sont en langue anglaise, c'est ainsi.
    C'est une bonne habitude à prendre

    2/ pour poster tes codes utilises les balises [code]...ici tu mets ton code...[*/code] (tu enlèves le *)

    Maintenant je vais lire ton code

  3. #3
    INSAVCamp

    Re : Aide réalisation de deux CAN - pic18f27/47k40 - Microship

    Bonjour, merci pour votre réponse !

    Aucun souci pour les remarques, j'aurai bien voulu modifier et corriger mes erreurs et les fautes, mais je n'ai pas l'impression que ce soit possible...
    C'est la première fois que je demande de l'aide sur un forum alors je ne suis pas du tout habitué.

    Désolé pour la gêne occasionnée !

  4. #4
    Exotique

    Re : Aide réalisation de deux CAN - pic18f27/47k40 - Microship

    3/ quand tu déclares une variable de type char ou int, il faut préciser signée (signed char ou signed int) ou non signée (unsigned char ou unsigned int)

  5. A voir en vidéo sur Futura
  6. #5
    Exotique

    Re : Aide réalisation de deux CAN - pic18f27/47k40 - Microship

    Il faudrait aussi écrire une fonction mesure qui soit compatible avec autant de mesure que tu veux faire et qui retourne le résultat.
    Je vois aussi que tu as des redondances inutiles comme par exemple:
    Code:
    TRISC=0b00000000; //Port C en sortie pour l'affichage
    Ton affichage sera j'imagine toujours sur ce portC et comme tu le déclares toujours en sortie, dans ce cas écris le une seule fois dans l'init de ton PIC.

    Je vais modifier ton code.

  7. #6
    Exotique

    Re : Aide réalisation de deux CAN - pic18f27/47k40 - Microship

    Il y a une coquille ici:

    Code:
    void can_init(void) {
        ADCON0bits.ADON = 0;    //Turn ADC Off
        ADREFbits.ADPREF = 00;  //Tension max référence = VDD
        ADREFbits.ADNREF=0;     // Tension min référence = GND
        ADCON0bits.ADCS = 0;    // Fréquence du convertisseur fixée sur l'oscillateur interne
        ADCLK=0b00111111;       // Fosc/128 = 2us
        ADCON0bits.ADFM =0;     //Justification à gauche
        ADACT=0x00;             //Pas de réinitialisation automatique
        
    }

  8. #7
    INSAVCamp

    Re : Aide réalisation de deux CAN - pic18f27/47k40 - Microship

    Effectivement, il y a beaucoup de redondance. Comme je n'arrive pas à comprendre pourquoi cela marche pour un ADC et pas pour 2 ADC... J'ai essayé d'être le plus méthodique possible en copiant-collant le code qui fonctionnait pour un ADC.

    Déjà une erreur en moins! Après cela fonctionnait avec cette coquille dans mon simple ADC alors je ne suis pas sur que ce soit la seule erreur malheureusement..

    J'ai également vu que j'avais fait une erreur en postant le code sur le forum :
    Code:
        LATCbits.LATC7=ADRESHbits.ADRESHbits.ADRESH15;
        LATCbits.LATC6=ADRESHbits.ADRESHbits.ADRESH14;
        LATCbits.LATC5=ADRESHbits.ADRESHbits.ADRESH13;
        LATCbits.LATC4=ADRESHbits.ADRESHbits.ADRESH12;

  9. #8
    Exotique

    Re : Aide réalisation de deux CAN - pic18f27/47k40 - Microship

    Voici un code non testé, où j'ai remis en place certaines choses et réorganiser un peu mieux le code.
    Je n'ai pas vérifié tes configurations des registres de l'ADC, juste regardé ADPCH.


    Code:
    #include <xc.h>
    #include <stdlib.h>
    #define _XTAL_FREQ 64000000
    
    unsigned char resultHigh, resultHigh1, resultHigh2;   //Stockage mesure
    unsigned int puissance;          //Valeur puissance
    
    void init_ADC(void)
    {
        ADCON0bits.ADON = 0;    //Turn ADC Off
        ADREFbits.ADPREF = 0;  //Tension max référence = VDD
        ADREFbits.ADNREF=0;     // Tension min référence = GND
        ADCON0bits.ADCS = 0;    // Fréquence du convertisseur fixée sur l'oscillateur interne
        ADCLK=0b00111111;       // Fosc/128 = 2us
        ADCON0bits.ADFM =0;     //Justification à gauche
        ADACT=0x00;             //Pas de réinitialisation automatique
        ADPCH = 0;
    }
    
    void init_PIC(void)
    {
        TRISAbits.TRISA0 = 1;   //Set RA0 to input
        TRISAbits.TRISA1 = 1;   //Set RA1 to input
        ANSELAbits.ANSELA0 = 1; //Set RA0 to analog
        ANSELAbits.ANSELA1 = 1; //Set RA1 to analog
        TRISC = 0;              //Port C en sortie pour l'affichage
    }
    
    void mesure_ADC(unsigned char voie)
    {
    
        ADPCH |= voie;   //Selection de la voie de mesure (0 ou 1)
        ADCON0bits.ADON = 1;    //Turn ADC On
        ADCON0bits.GO = 1;      //Start conversion
        while (ADCON0bits.GO);  //Wait for conversion done
        resultHigh = ADRESH;   //Read result
    
        switch (voie)
              {
              case 0:
                    {
                     resultHigh1 = resultHigh;
                     LATCbits.LATC0=ADRESHbits.ADRESH15;
                     LATCbits.LATC1=ADRESHbits.ADRESH14;
                     LATCbits.LATC2=ADRESHbits.ADRESH13;
                     LATCbits.LATC3=ADRESHbits.ADRESH12;
                     };
               case 1:
                     {
                     resultHigh2 = resultHigh;
                     LATCbits.LATC7=ADRESHbits.ADRESHbits.ADRESH15;
                     LATCbits.LATC6=ADRESHbits.ADRESHbits.ADRESH14;
                     LATCbits.LATC5=ADRESHbits.ADRESHbits.ADRESH13;
                     LATCbits.LATC4=ADRESHbits.ADRESHbits.ADRESH12;
                     }
               defaut: break;
               }
    
    }
    
    
    void calcul(void)
    {
        puissance=resultHigh1*resultHigh2;
    }
    
    void main(void)
    {
    
        while (1)
           {
            init_PIC();
            init_ADC();
            mesure_ADC(0);
            mesure_ADC(1);
            calcul();
            }
    }
    Je te laisse vérifier et adapter si besoin et tester bien sur.
    Dis moi ce que tu obtiens avant d'aller plus loin et ouvrir la doc de ce µC.

  10. #9
    Exotique

    Re : Aide réalisation de deux CAN - pic18f27/47k40 - Microship

    Une petite correction à faire ici:
    Code:
    ADPCH = voie;   //Selection de la voie de mesure (0 ou 1)
    Il faut enlever le OU (|) que j'avais mis.
    Ainsi que ce que tu as dis également.
    Dernière modification par Exotique ; 16/01/2021 à 17h46.

  11. #10
    Exotique

    Re : Aide réalisation de deux CAN - pic18f27/47k40 - Microship

    Je reposte le code corrigé de quelques coquilles:

    Code:
    #include <xc.h>
    #include <stdlib.h>
    #define _XTAL_FREQ 64000000
    
    unsigned char resultHigh, resultHigh1, resultHigh2;   //Stockage mesure
    unsigned int puissance;          //Valeur puissance
    
    void init_ADC(void)
    {
        ADCON0bits.ADON = 0;    //Turn ADC Off
        ADREFbits.ADPREF = 0;  //Tension max référence = VDD
        ADREFbits.ADNREF=0;     // Tension min référence = GND
        ADCON0bits.ADCS = 0;    // Fréquence du convertisseur fixée sur l'oscillateur interne
        ADCLK=0b00111111;       // Fosc/128 = 2us
        ADCON0bits.ADFM =0;     //Justification à gauche
        ADACT=0x00;             //Pas de réinitialisation automatique
        ADPCH = 0;
    }
    
    void init_PIC(void)
    {
        TRISAbits.TRISA0 = 1;   //Set RA0 to input
        TRISAbits.TRISA1 = 1;   //Set RA1 to input
        ANSELAbits.ANSELA0 = 1; //Set RA0 to analog
        ANSELAbits.ANSELA1 = 1; //Set RA1 to analog
        TRISC = 0;              //Port C en sortie pour l'affichage
    }
    
    void mesure_ADC(unsigned char voie)
    {
    
        ADPCH = voie;   //Selection de la voie de mesure (0 ou 1)
        ADCON0bits.ADON = 1;    //Turn ADC On
        ADCON0bits.GO = 1;      //Start conversion
        while (ADCON0bits.GO);  //Wait for conversion done
        resultHigh = ADRESH;   //Read result
    
        switch (voie)
              {
              case 0:
                    {
                     resultHigh1 = resultHigh;
                     LATCbits.LATC0=ADRESHbits.ADRESH15;
                     LATCbits.LATC1=ADRESHbits.ADRESH14;
                     LATCbits.LATC2=ADRESHbits.ADRESH13;
                     LATCbits.LATC3=ADRESHbits.ADRESH12;
                     }; break;
               case 1:
                     {
                     resultHigh2 = resultHigh;
                     LATCbits.LATC7=ADRESHbits.ADRESH15;
                     LATCbits.LATC6=ADRESHbits.ADRESH14;
                     LATCbits.LATC5=ADRESHbits.ADRESH13;
                     LATCbits.LATC4=ADRESHbits.ADRESH12;
                     }; break;
               defaut: break;
               }
    
    }
    
    
    void calcul(void)
    {
        puissance=resultHigh1*resultHigh2;
    }
    
    void main(void)
    {
    
        while (1)
           {
            init_PIC();
            init_ADC();
            mesure_ADC(0);
            mesure_ADC(1);
            calcul();
            }
    }
    Dernière modification par Exotique ; 16/01/2021 à 17h51.

  12. #11
    INSAVCamp

    Re : Aide réalisation de deux CAN - pic18f27/47k40 - Microship

    Ok, merci beaucoup !
    Je teste ça Lundi à la première heure !

    J'ai vu aussi sur d'autres forums de Microchip que beaucoup avaient des problèmes avec des temps d'acquisition pour mettre en place 2 ADC distincts... Peut être c'est aussi pour cela ne fonctionne pas.. à voir Lundi. Je tiens au jus de toute façon !

  13. #12
    Exotique

    Re : Aide réalisation de deux CAN - pic18f27/47k40 - Microship

    Oui possible, il faut voir l'ensemble et bien lire la doc du µC.
    J'ai vu que tu as mis 64MHz, c'est beaucoup pour faire 2 mesures

  14. #13
    INSAVCamp

    Re : Aide réalisation de deux CAN - pic18f27/47k40 - Microship

    Re bonjour,
    Du coup pour tenir informé, cela fonctionne plutôt bien. Cependant, je ne sais pas si l'ADC est suffisamment précis pour ce que je veux faire… En effet, je souhaite réaliser un MPPT avec les valeurs de courant et tension mesurées pour générer des PWM et piloter un hacheur boost (d'où le 64MHz).
    Vu le peu de temps qu'il me reste, on va se satisfaire de ce programme.
    Merci beaucoup en tout cas, ça m'aura bien aidé !

    Autre petite question, vu que je dois renvoyer mes valeurs de tension et courant vers un void_MPPT, est ce que je dois créer une fonction pour return la valeur de tension et courant ? ou bien le µC arrive à comprendre qu'il doit passer la valeur d'un void_Mesure à un void_MPPT ?

  15. #14
    Exotique

    Re : Aide réalisation de deux CAN - pic18f27/47k40 - Microship

    Il va te falloir utiliser plutôt des pointeurs, ça te permettra d'envoyer l'adresse de la variable à la fonction que tu veux.

    Pour résumer un peu ce qu'est un pointeur:

    -> Chaque variable est stockée à une adresse précise en mémoire.

    -> Les pointeurs sont semblables aux variables, sauf qu'au lieu de stocker un nombre ils stockent l'adresse à laquelle se trouve la variable en mémoire.

    -> Si on place le symbole & devant le nom de la variable, on obtient l'adresse de cette variable.

    -> Si on place un symbole * devant un nom de pointeur, on obtient la valeur de la variable stockée à l'adresse indiquée par le pointeur.

    Si tu dois coder en C il faut que tu te renseignes sur ces techniques, l'usage des pointeurs est une méthode puissante mais aussi casse gueule quand tu ne maitrises pas bien le sujet.
    Mais tu n'auras pas le choix si tu veux faire des choses qui tiennent la route

Discussions similaires

  1. Réalisation d'une mezzanine (ou trastet) métal dans deux garages
    Par jaltadiADI dans le forum Bricolage et décoration
    Réponses: 6
    Dernier message: 09/09/2014, 17h42
  2. Microship & Texas intruments
    Par just-a-man-but dans le forum Électronique
    Réponses: 4
    Dernier message: 12/02/2013, 07h28
  3. L'électronique autour des Pic Microship
    Par Pouloupe dans le forum Électronique
    Réponses: 6
    Dernier message: 23/09/2011, 22h09
  4. realisation d'un compteur deux digits (de 00 a 99)
    Par badr-MOB dans le forum Électronique
    Réponses: 9
    Dernier message: 06/11/2010, 11h41
  5. Realisation de deux monostable à portes logiques
    Par invite0c401fa8 dans le forum Électronique
    Réponses: 11
    Dernier message: 26/03/2010, 13h32
Découvrez nos comparatifs produits sur l'informatique et les technologies.