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

Programmation PIC16F872 avec CCS 8.6



  1. #1
    HAYAC

    Programmation PIC16F872 avec CCS 8.6


    ------

    Bonjour à tous,
    J'aimerais, en utilisant le timer1 et son interruption, faire clignoter une LED (environ 1S On /1S Off) afin d’avoir un control visuel du fonctionnement normal de la carte final.

    Pour le moment j’utilise sur la maquette une horloge RC et la LED se trouve en C7
    Voici mon programme (main.c):

    #include <16F872.h> //Définition des spécifications du PIC
    #include "fusibles.h" //Définition des fusibles
    #include "param.h" //Définition des ports

    #int_TIMER1

    TIMER1_isr()
    {

    if (get_timer1()>200)
    {
    output_toggle(LED);
    set_timer1(0);
    }

    }

    void main()
    {
    Init:
    setup_adc_ports(ALL_ANALOG);
    setup_adc(ADC_OFF);
    setup_spi(SPI_SS_DISABLED);
    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_1);
    setup_wdt(WDT_18MS);
    setup_timer_1(T1_INTERNAL|T1_D IV_BY_1);
    setup_timer_2(T2_DIV_BY_1,0,1) ;

    enable_interrupts(INT_TIMER1);
    enable_interrupts(GLOBAL);

    Set_tris_A(11111) ;
    Set_tris_B(0000000) ;
    Set_tris_C(1111110) ;

    output_low(RL1);
    output_low(RL2);
    output_low(RL3);
    output_low(RL4);
    output_low(RL5);
    output_low(RL6);
    output_low(RL7);
    output_low(RL8);
    output_high(Led);

    set_timer1(0);

    Prog:
    while(1)
    {
    Tempo_Sec(1);
    Output_bit(RL1,1);

    Output_bit(RL8,1);
    }
    goto Prog;

    Stop:
    goto Init;
    }

    Le programme principal fonctionne mais je n’arrive pas au clignotement voulu de la led.
    Je vous remercie d’avance de votre aide

    -----

  2. Publicité
  3. #2
    HAYAC

    Re : Programmation PIC16F872 avec CCS 8.6

    Bonjour à tous,

    N'ayant reçu de réponse à ma question, je me permet de la décomposer :
    - Afin d'avoir un contrôle visuel rapide de l'activité du montage (son bon fonctionnement théorique), j'ai pensé utiliser une interruption du trimmeur 1 en effectuant le changement d'état d'une LED, cette idée est elle la meilleure façon de contrôler le bon fonctionnement du PIC et de son programme ?
    - Si tel est le cas, débutant en programmation C en CCS 8.6 et après avoir parcouru beaucoup de site sur le sujet, je n'arrive pas à trouver de solution simple (j'ai certainement dû zapper des infos) pour effectuer le changement d’état de la LED toute les secondes (actuellement son état ne change pas du tout).

    Je vous remercie de bien vouloir me donner un petit coup de main,

    Cordialement,

  4. #3
    carcan

    Re : Programmation PIC16F872 avec CCS 8.6

    Hello !

    voici une interruption qui se déclenche toutes les 100mS avec le timer1.
    Les calculs sont donnés avec un quartz de 4MHz et le prédiviseur réglé à 8.
    J'y ajoute un compteur pour inverser la LED tous les 10 passages.

    #int_TIMER1
    void TIMER1_isr(void)
    {
    static int ctmillisec = 0;

    set_timer1(53036);

    if (ctmillisec++==10) //Action toute les 1 seconde
    {
    output_toggle(LED);
    ctmillisec=0;
    }
    }

    Pour le calcul de la durée du timer : Valeur = 65536 - (durée*freq_quartz)/(4*prediviseur)

    A+
    Laurent

  5. #4
    HAYAC

    Re : Programmation PIC16F872 avec CCS 8.6

    Bonsoir Laurent et merci pour ta réponse,
    je vais approfondir le sujet des timers car je n'arrive pas à régler parfaitement à une seconde par état.
    Pour le moment, cette fonctions est largement suffisante pour ma maquette.

    Merci encore, cordialement,

  6. #5
    carcan

    Re : Programmation PIC16F872 avec CCS 8.6

    Hello !

    Tu travailles avec un quartz ou toujours un circuit RC ??

    A+
    Laurent

  7. A voir en vidéo sur Futura
  8. #6
    HAYAC

    Wink Re : Programmation PIC16F872 avec CCS 8.6

    Bonsoir Laurent,

    Pour le moment toujours en RC, la raison va certainement t'amuser :

    Je ne peux, pour le moment, pas graver mon typon et donc monter mon pic sur son circuit à quartz du fait de la température de l'environnement ou je vie (l'ile de la réunion, environ 32°C au plus frais).
    Je suis en attente d'une solution de mon fournisseur d’électronique (dissolution du révélateur, du perclo, modification des temps d'expo...).
    J'ai de ce fait du temps pour travailler sur la programmation CCS.

    Cordialement,

    Jean-Marc.

  9. Publicité
  10. #7
    HAYAC

    Re : Programmation PIC16F872 avec CCS 8.6

    Bonjours à tous, voici mes évolutions et mon problème actuel :
    (Je rappel que je débute à l’utilisation des PIC et en programmation CCS, mon environnement de travail EAGLE 5, MPLAB IDE V8.6, CCS Compiler V4, PICKit2 MICROCHIP, carte de programmation MICROCHIP).
    Je travail avec un PIC16F872, le circuit du micro contrôleur est d’utilisation générique afin de pouvoir le décliner à volonté.
    Sch&#233;ma.gif

    Ma programmation ce présente de cette façon :

    (Fichier main.c)
    #include <16F872.h>
    #include "fusibles.h"
    #include "param.h"
    #include "fonctions.h"

    void main()
    {
    Init:
    Init_MC ();
    init_IO ();
    ValTim1=0;

    Prog:
    // Durée d'un cycle complet d'une porte 8 Sec
    // Durée d'un état actif (relais) 1 Sec.
    Tempo_Sec(1);
    EtaRL1=1;EtaRL2=0;EtaRL3=0;Eta RL4=0;EtaRL5=0;EtaRL6=0;EtaRL7 =0;EtaRL8=0;
    Relais();
    Tempo_Sec(1);
    EtaRL1=0;EtaRL2=1;EtaRL3=0;Eta RL4=0;EtaRL5=0;EtaRL6=0;EtaRL7 =0;EtaRL8=0;
    Relais();
    Tempo_Sec(1);
    EtaRL1=0;EtaRL2=0;EtaRL3=1;Eta RL4=0;EtaRL5=0;EtaRL6=0;EtaRL7 =0;EtaRL8=0;
    Relais();
    Tempo_Sec(1);
    EtaRL1=0;EtaRL2=0;EtaRL3=0;Eta RL4=1;EtaRL5=0;EtaRL6=0;EtaRL7 =0;EtaRL8=0;
    Relais();
    Tempo_Sec(1);
    EtaRL1=0;EtaRL2=0;EtaRL3=0;Eta RL4=0;EtaRL5=1;EtaRL6=0;EtaRL7 =0;EtaRL8=0;
    Relais();
    Tempo_Sec(1);
    EtaRL1=0;EtaRL2=0;EtaRL3=0;Eta RL4=0;EtaRL5=0;EtaRL6=1;EtaRL7 =0;EtaRL8=0;
    Relais();
    Tempo_Sec(1);
    EtaRL1=0;EtaRL2=0;EtaRL3=0;Eta RL4=0;EtaRL5=0;EtaRL6=0;EtaRL7 =1;EtaRL8=0;
    Relais();
    Tempo_Sec(1);
    EtaRL1=0;EtaRL2=0;EtaRL3=0;Eta RL4=0;EtaRL5=0;EtaRL6=0;EtaRL7 =0;EtaRL8=1;
    Relais();
    goto Prog;

    Stop:
    goto Init;
    }

    (Fichier 16F872.c est l’original de MPLAB)
    (Fichier fusibles.h)
    #device adc=8
    #device ICD=TRUE
    //#FUSES WDT //Watch Dog Timer
    #FUSES HS //High speed Osc (> 4mhz)
    //#FUSES PUT //Power Up Timer
    #FUSES NOPROTECT //Code not protected from reading
    //#FUSES NODEBUG //No Debug mode for ICD
    #FUSES NOBROWNOUT //No brownout reset
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD //No EE protection
    #FUSES NOWRT //Program memory not write protected

    #use delay(clock=20000000,RESTART_W DT)

    (Fichier param.h)
    // Nommage : définie les noms usuels des IO
    // Port A (Entrée analogique capteur / Sortie Led activité)
    #define AN1 PIN_A0
    #define AN2 PIN_A1
    #define AN3 PIN_A2
    #define AN4 PIN_A3
    #define LED PIN_A4
    #define AN6 PIN_A5
    // Port B (Sortie relais)
    #define RL1 PIN_B0
    #define RL2 PIN_B1
    #define RL3 PIN_B2
    #define RL4 PIN_B3
    #define RL5 PIN_B4
    #define RL6 PIN_B5
    #define RL7 PIN_B6
    #define RL8 PIN_B7
    // Port C (Entrée logique)
    #define NU1 PIN_C0
    #define NU2 PIN_C1
    #define NU3 PIN_C2
    #define NU4 PIN_C3
    #define NU5 PIN_C4
    #define NU6 PIN_C5
    #define NU7 PIN_C6
    #define NU8 PIN_C7
    // Variables : définie les variables du programme
    int1 EtaRL1;
    int1 EtaRL2;
    int1 EtaRL3;
    int1 EtaRL4;
    int1 EtaRL5;
    int1 EtaRL6;
    int1 EtaRL7;
    int1 EtaRL8;
    /*int1 EtaNU1;
    int1 EtaNU2;
    int1 EtaNU3;
    int1 EtaNU4;
    int1 EtaNU5;
    int1 EtaNU6;
    int1 EtaNU7;
    int1 EtaLed;*/
    int8 ValTim1;
    // Constantes : définie les constantes du programme
    #define Const 25;

    (Fichier fonctions.h)
    /* Définition de la configuration du microcontroleur */
    Void Init_MC(void)
    {
    setup_adc_ports(ALL_ANALOG);
    setup_adc(ADC_OFF);
    setup_spi(SPI_SS_DISABLED);
    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_1);
    setup_wdt(WDT_2304MS);
    setup_timer_1(T1_INTERNAL|T1_D IV_BY_1);
    setup_timer_2(T2_DIV_BY_1,0,1) ;

    enable_interrupts(GLOBAL);
    //enable_interrupts(INT_TIMER0);
    enable_interrupts(INT_TIMER1);
    //enable_interrupts(INT_TIMER2);

    /* Définition de la configuration de port (1 entrée et 0 sotie) */
    Set_tris_A(111101) ;
    Set_tris_B(0000000) ;
    Set_tris_C(1111111) ;
    }
    /* routine d'initialisation des sorties */
    void init_IO(void)
    {
    output_low(RL1);
    output_low(RL2);
    output_low(RL3);
    output_low(RL4);
    output_low(RL5);
    output_low(RL6);
    output_low(RL7);
    output_low(RL8);
    output_high(Led);
    }
    /* Appel d’une autre fonction Delay_ms (avec comme paramètres 500 * duree)*/
    void Tempo_Sec(int8 duree)
    {
    delay_ms(1000*duree);
    }

    /* Appel d’une autre fonction Delay_ms (avec comme paramètres 50 * duree)*/
    void Tempo_DSec(int8 duree)
    {
    delay_ms(100*duree);
    }

    /* Appel d’une autre fonction Delay_ms (avec comme paramètres 5 * duree)*/
    void Tempo_CSec(int8 duree)
    {
    delay_ms(10*duree);
    }

    /* Appel d’une autre fonction Delay_ms (avec comme paramètres 1 * duree)*/
    void Tempo(int8 duree)
    {
    delay_ms(1*duree);
    }

    #int_TIMER1
    void TIMER1_isr(void)
    {
    static int ctmillisec = 0;
    set_timer1(65031);
    if (ctmillisec++==10) //Action toute les 1 seconde
    {
    //output_low(LED);
    output_toggle(LED);
    ctmillisec=0;
    }
    }

    void Relais(void)
    {
    Output_bit(RL1,EtaRL1);
    Output_bit(RL2,EtaRL2);
    Output_bit(RL3,EtaRL3);
    Output_bit(RL4,EtaRL4);
    Output_bit(RL5,EtaRL5);
    Output_bit(RL6,EtaRL6);
    Output_bit(RL7,EtaRL7);
    Output_bit(RL8,EtaRL8);
    }

    Mes problèmes actuels sont, premièrement que je n’arrive pas à faire clignoter ma LED et deuxièmement que l’utilisation de la routine d’interruption dérègle la séquence des relais.
    Pourriez-vous m’éclairer sur le sujet ? (Tout les commentaires sont les bienvenus (Structure de programmation, évolution, simplification et autres…)

  11. #8
    carcan

    Re : Programmation PIC16F872 avec CCS 8.6

    Hello !

    aaahh, cette sortie RA4, elle en aura déjà piégé beaucoup (dont moi) !

    C'est une sortie "open drain" et pas une sortie TTL. il faut connecter ta LED entre V+ et RA4 (toujours avec la résistance bien entendu) et ça fonctionnera.
    Les commandes sont inversées : output_low active la led et output_high ou output _float éteignent la LED.

    Pour ton problème de synchro et décalages, il ne faut pas utiliser les tempos comme tu as fait, mais un seul séquenceur géré par le timer1.
    A chaque appel du timer, tu fais changer ta LED d'état et tu appelles une fonction "séquenceur" qui contient un compteur. En selon la valeur du compteur, tu actives/désactives tes sorties.
    Cela peut se faire tout simplement avec un tableau de int8 et tu rafraichis le port en une fois avec la fonction output.

    A+
    Laurent

Sur le même thème :

Discussions similaires

  1. programmation des pic sous ccs c
    Par chachah dans le forum Électronique
    Réponses: 0
    Dernier message: 05/10/2011, 23h11
  2. programmation des pic sous ccs c
    Par chachah dans le forum Électronique
    Réponses: 12
    Dernier message: 07/09/2011, 14h30
  3. programmation des pic sous ccs c
    Par chachah dans le forum Électronique
    Réponses: 8
    Dernier message: 01/08/2011, 21h36
  4. programmation des pic sous ccs c
    Par chachah dans le forum Électronique
    Réponses: 1
    Dernier message: 11/01/2011, 19h47
  5. programmation du pic CCS compiler
    Par issamty dans le forum Électronique
    Réponses: 3
    Dernier message: 08/03/2009, 13h34
Découvrez nos comparatifs produits sur l'informatique et les technologies.