PIC12F1572 et PWM
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

PIC12F1572 et PWM



  1. #1
    kevin8z

    PIC12F1572 et PWM


    ------

    Bonjour,

    Je viens vers vous ça fait 3 jours que je suis bloqué dans la configuration des registres du PIC12F1572.
    Tout d'abord voici la doc : http://ww1.microchip.com/downloads/e.../40001723C.pdf

    Code:
    /*******************************************************************************
     Nom : modif Thermostat
     Logiciel : MPLABX & compilateur XC8
     Date : 28/11/2014
     Auteur : K#######
    *******************************************************************************/
    
    #include <xc.h>
    #include <pic12f1572.h>
    
    /***************************************************************************
         * Define
    ***************************************************************************/
    #define _XTAL_FREQ 4000000
    
    #define Bouton_Droit     PORTAbits.RA3
    #define Valide               PORTAbits.RA4
    #define Bouton_Gauche !PORTAbits.RA5
    
    #define Anti_Rebonds()  __delay_ms(300)
    
    /*#define leds_rouge()   LATAbits.LATA0 = 0; LATAbits.LATA1 = 1; LATAbits.LATA2 = 0
    #define leds_vert()    LATAbits.LATA0 = 0; LATAbits.LATA1 = 0; LATAbits.LATA2 = 1
    #define leds_bleu()    LATAbits.LATA0 = 1; LATAbits.LATA1 = 0; LATAbits.LATA2 = 0
    #define leds_blanc()   LATAbits.LATA0 = 1; LATAbits.LATA1 = 1; LATAbits.LATA2 = 1
    #define leds_Eteint()  LATAbits.LATA0 = 0; LATAbits.LATA1 = 0; LATAbits.LATA2 = 0*/
    
    
    #define leds_rouge()   PWM1DCH = 0x00; PWM1DCL = 0x20; PWM2DCH = 0x00; PWM2DCL = 0x00; PWM3DCH = 0x00; PWM3DCL = 0x00
    #define leds_vert()    PWM1DCH = 0x00; PWM1DCL = 0x00; PWM2DCH = 0x00; PWM2DCL = 0x00; PWM3DCH = 0x00; PWM3DCL = 0x20
    #define leds_bleu()    PWM1DCH = 0x00; PWM1DCL = 0x00; PWM2DCH = 0x00; PWM2DCL = 0x20; PWM3DCH = 0x00; PWM3DCL = 0x00
    #define leds_blanc()   PWM1DCH = 0x00; PWM1DCL = 0x0A; PWM2DCH = 0x00; PWM2DCL = 0x0A; PWM3DCH = 0x00; PWM3DCL = 0x0A
    #define leds_Eteint()  PWM1DCH = 0x00; PWM1DCL = 0x00; PWM2DCH = 0x00; PWM2DCL = 0x00; PWM3DCH = 0x00; PWM3DCL = 0x00
    
    /***************************************************************************
         * Configurations fusibles
    ***************************************************************************/
    // CONFIG1
    #pragma config FOSC = INTOSC    //  (INTOSC oscillator; I/O function on CLKIN pin)
    #pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
    #pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
    #pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
    #pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
    #pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
    #pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
    
    // CONFIG2
    #pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
    #pragma config PLLEN = OFF      // PLL Enable (4x PLL disabled)
    #pragma config STVREN = OFF     // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
    #pragma config BORV = HI        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
    #pragma config LPBOREN = OFF    // Low Power Brown-out Reset enable bit (LPBOR is disabled)
    #pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
    
    /*******************************************************************************
     Name : main
     Fonction : principale
     Auteur : K#######.F#######
    *******************************************************************************/
    void main() {
    
        /***************************************************************************
         * Initialisations des variables
        ***************************************************************************/
        unsigned char menu, i;
        enum menu{Hors_gel, Eco, Confort, Auto, Heure, Prog, Off};
        menu = Heure;
    
        /***************************************************************************
         * Configurations des registres
        ***************************************************************************/
        OSCCON = 0x6A; //p54, PLL désactivée, FOSC = 4MHz
        while(!OSCSTATbits.HFIOFR); //Tant que l'oscillateur interne n'est pas démarré
    
        INTCONbits.GIE = 0; //p70, interruptions désactivées
        INTCONbits.PEIE = 0;
    
        ANSELA = 0x00; //PORTA utilisé en IO numérique
        TRISA = 0x30; //p105, RA3/4/5 configurées en entrées
        WPUA = 0x00;
        OPTION_REGbits.nWPUEN = 1; //p145, pull-up désactivées
        ODCONA = 0x00; //p107, sortie PORTA configurée en push-pull
        SLRCONA = 0x00; //p108, Slew rate au maximum
        INLVLA = 0x00; //p108, entrées TTL
        
        APFCON = 0x00; //p102, PWM1/2 sur les broche RA1 ET RA0
    
        /***************************************************************************
         * Configurations des PWMs
        ***************************************************************************/
        PWM1CON = 0xC0;
        PWM1INTE = 0x00;
        PWM1INTF = 0x00;
        PWM1CLKCON = 0x00;
        PWM1LDCON = 0x01;
        PWM1OFCON = 0x01;
        PWM1PHH = 0x00;
        PWM1PHL = 0x00;
        PWM1OFH = 0x00;
        PWM1OFL = 0x00;
        PWM1PRH = 0x04;
        PWM1PRL = 0x00;
    
            /************************************/
        PWM2CON = 0xC0;
        PWM2INTE = 0x00;
        PWM2INTF = 0x00;
        PWM2CLKCON = 0x00;
        PWM2LDCON = 0x02;
        PWM2OFCON = 0x02;
        PWM2PHH = 0x00;
        PWM2PHL = 0x00;
        PWM2OFH = 0x00;
        PWM2OFL = 0x00;
        PWM2PRH = 0x04;
        PWM2PRL = 0x00;
    
            /************************************/
        PWM3CON = 0xC0;
        PWM3INTE = 0x00;
        PWM3INTF = 0x00;
        PWM3CLKCON = 0x00;
        PWM3LDCON = 0x03;
        PWM3OFCON = 0x03;
        PWM3PHH = 0x00;
        PWM3PHL = 0x00;
        PWM3OFH = 0x00;
        PWM3OFL = 0x00;
        PWM3PRH = 0x04;
        PWM3PRL = 0x00;
    
        /***************************************************************************
         * Lorsque le thermostat et la carte sont alimentés pour la première fois
        ***************************************************************************/
        leds_Eteint();
        leds_rouge();
        while(Valide == 1); 
        Anti_Rebonds();
        while(Valide == 0);
        Anti_Rebonds();
        leds_bleu();
        while(1);
    }
    Le problème provient lorsque j'utilise les modules PWM :

    Des que j'alimente ma carte, mes leds s'éclaires en rouge, normal. Si j'appui sur le bouton Valide rien ne se passe, normalement les leds devraient s'éclairées bleu.
    Des que j'alimente la carte avec le bouton valide appuyé, les leds s'éclaire bleu ou parfois rouge et bleu, normalement les leds devraient rester éclairées rouge puisque je suis appuyé sur le bouton.

    Si les modules PWM ne sont pas utilisés tout fonctionne, mes leds sont donc pilotées en tout ou rien, or moi je veut qu'elles soit pilotées en PWM.

    Donc mon bouton Valide ne fonctionne plus lorsque j'utilise les PWMs, impossible de trouver d'ou viens le problème dans le programme.

    Merci de votre aide

    -----
    Dernière modification par gienas ; 01/01/2015 à 09h50. Motif: Anonymation des noms

  2. #2
    RISC

    Re : PIC12F1572 et PWM

    Salut,

    1/ Tout d'abord tu peux retirer #include <pic12f1572.h> car cela est fait automatiquement par #include <xc.h> qui est désormais valide pour tous les PICs.

    2/ Exemple d'utilisation du PIC12F1572
    As tu regardé la note d'application AN1562 pour ce PIC ?

    Il existe aussi une appli complete téléchargeable : badge RGB avec gestion slider capacitif fait par le PIC12F1572. Le code source est dispo ainsi que le schéma.

    Je pense qu'il y a un PB d'init du TRISA....

    a+
    Dernière modification par RISC ; 20/12/2014 à 17h53.

  3. #3
    kevin8z

    Re : PIC12F1572 et PWM

    1) Je vais retirer ça.
    2) Je l'ai regardé, mais en travers, je vais jeter un oeil plus approfondi dessus.

    Le TRISA est pourtant bien configuré.

    Je ne comprend vraiment pas pourquoi j'ai un tel problème.

    Merci

  4. #4
    Gérard

    Re : PIC12F1572 et PWM

    Citation Envoyé par kevin8z Voir le message
    1) Je vais retirer ça.
    2) Je l'ai regardé, mais en travers, je vais jeter un oeil plus approfondi dessus.

    Le TRISA est pourtant bien configuré.

    Je ne comprend vraiment pas pourquoi j'ai un tel problème.

    Merci
    Salut Kevin,

    As-tu trouvé une solution?

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

    Re : PIC12F1572 et PWM

    Salut,

    Cette ligne dans ton programme ne fait pas ce qui est marqué en commentaire...
    Code:
        TRISA = 0x30; //p105, RA3/4/5 configurées en entrées
    a+

  7. #6
    kevin8z

    Re : PIC12F1572 et PWM

    Citation Envoyé par RISC Voir le message
    Cette ligne dans ton programme ne fait pas ce qui est marqué en commentaire...
    Code:
        TRISA = 0x30; //p105, RA3/4/5 configurées en entrées
    Pourtant en regardant bien la doc, c'est bien configuré. Le 4ième bit de poids faible ne peut pas être modifié, car RA3 peut être utilisé uniquement en entrée.
    Donc ma configuration de TRISA fait bien ce qui est écrit en commentaire.

    Citation Envoyé par Gérard Voir le message
    As-tu trouvé une solution?
    Non toujours pas, j'espère trouver bientôt...

    J'ai regarder la note d'application je n'ai rien trouvé, et le programme du badge RGB n'est pas des plus facile à comprendre.

  8. #7
    Gérard

    Re : PIC12F1572 et PWM

    Avec RA3, RA4 et RA5 en entrée, je verrais TRIA = 0x38

    %0011 1000

  9. #8
    Gérard

    Re : PIC12F1572 et PWM

    Avec RA3, RA4 et RA5 en entrée, je verrais TRIA = 0x38

    %0011 1000
    Je trouve aussi que les liens donnés ne sont pas simple à exploiter.

  10. #9
    kevin8z

    Re : PIC12F1572 et PWM

    Citation Envoyé par Gérard Voir le message
    Avec RA3, RA4 et RA5 en entrée, je verrais TRIA = 0x38
    %0011 1000
    Certes mes si je met 0b00110000 cela reviens à la même chose, car le 4ième bit de poids faible ne peut pas être modifié(p105 de la doc), la broche RA3 est automatiquement mise en entrée.
    Et d'ailleurs le problème apparait uniquement lorsque je configure les registres pour les PWMs.

  11. #10
    kevin8z

    Re : PIC12F1572 et PWM

    Je n'ai toujours pas trouvé de solution, personne n'aurai une petite idée?

  12. #11
    RISC

    Re : PIC12F1572 et PWM

    Salut,

    Je te recommande de réécrire en binaire plutot qu'en hexa tous tes registres car si tu fais une erreur de setup des différents bits c'est très difficile à identifier...

    Exemple, au lieu de :
    Code:
    PWM3CON = 0xC0;
    utilise
    PWM3CON = 0b11000000;
    ou encore mieux, utilise les champs de bits :
    Code:
    PWM3CONbits.MODE = 0b00;
    En écriant les registres entiers sans commentaires, tu peux relire ton code des centaines de fois sans trouver l'erreur...

    Une fois que le code fonctionne, rien ne t'empêche de recompresser la taille du programme en écrivant tout le registre en une seule ligne.

    C'est comme cela que je procède car les PICs ont de plus en plus de registres ce qui multiplie les risques d'erreurs.

    a+
    Dernière modification par RISC ; 31/12/2014 à 15h52.

Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...