Programmation PIC12F683 avec CCS 8.6 (Projet Treuil)
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Programmation PIC12F683 avec CCS 8.6 (Projet Treuil)



  1. #1
    HAYAC

    Programmation PIC12F683 avec CCS 8.6 (Projet Treuil)


    ------

    Bonjour à tous,

    J'aimerais réutiliser un moteur de machine à laver en treuil pour aider à remonter les voiliers pour mon club.
    Pour ce faire, j'aimerais :
    - Une commande à trois boutons AV/STOP/AR
    - Une incrémentation de la vitesse par appuie successif
    Pour le moment les commendes fonctionnent mais pas la variation de vitesse,
    Voici le programme :

    #define RL1 PIN_A0
    #define RL2 PIN_A1
    #define TRIAC PIN_A2
    #define BPAV PIN_A3
    #define BPSTP PIN_A4
    #define BPAR PIN_A5

    #define version 0x0001

    int tempo=300;
    int EtatBPAV,EtatBPAR,EtatBPSTP;
    int Vitesse;

    void main()
    {
    setup_adc_ports(NO_ANALOGS|VSS _VDD);
    setup_adc(ADC_OFF);
    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_2);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1) ;
    setup_comparator(NC_NC);
    setup_vref(FALSE);
    setup_oscillator(OSC_8MHZ);
    //port_a_pullups(TRUE);
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_TIMER0);

    set_tris_a(000111);

    output_low(RL1);
    output_low(RL2);
    output_low(TRIAC);

    EtatBPAV=0;
    EtatBPAR=0;
    EtatBPSTP=0;
    Vitesse=0;

    while (true) /* Boucle sans fin */
    {
    /* Procédure de marche avant */
    while(input(BPAV)) /* Test l'appuie sur Bouton AV */
    {
    EtatBPAV=1;/* Passe l'état de la variable bouton à 1 */
    delay_ms(300);/* Pause pour l'attente de relâchement du Bouton */
    while(!input(BPAV))/* Test le relâchement du Bouton */
    {
    output_low(TRIAC);/* Éteint le triac*/
    output_low(RL2);/* Éteint la LED de control AR*/
    output_high(RL1);/* Allume la LED de control AV*/
    output_high(TRIAC);/* Allume le triac AV*/
    if(EtatBPAV=1)/* Vérifie si la variable d’état du bouton est à 1 et incrémente la vitesse*/
    {
    if (Vitesse = 0)
    {
    Vitesse = 1;
    }
    else
    {
    ++Vitesse;
    }
    }
    EtatBPAV=0;/* Passe l'état de la variable bouton à 0 */
    EtatBPAR=0;/* Passe l'état de la variable bouton à 0 */
    EtatBPSTP=0;/* Passe l'état de la variable bouton à 0 */
    //delay_ms(300);/* Pause pour la visualisation du relâchement du Bouton */
    break;
    }
    break;
    }
    /* Procédure de marche arriéré */
    while(input(BPAR)) /* Test l'appuie sur Bouton AR */
    {
    EtatBPAR=1;/* Passe l'état de la variable bouton à 1 */
    delay_ms(300);/* Pause pour l'attente de relâchement du Bouton */
    while(!input(BPAR))/* Test le relâchement du Bouton */
    {
    output_low(TRIAC);/* Éteint le triac*/
    output_low(RL1);/* Éteint la LED de control AV*/
    output_high(RL2);/* Allume la LED de control AR*/
    output_high(TRIAC);/* Allume le triac AV*/
    if(EtatBPAR=1)/* Vérifie si la variable d’état du bouton est à 1 et incrémente la vitesse*/
    {
    if (Vitesse = 0)
    {
    Vitesse = 1;
    }
    else
    {
    ++Vitesse;
    }
    }
    EtatBPAV=0;/* Passe l'état de la variable bouton à 0 */
    EtatBPAR=0;/* Passe l'état de la variable bouton à 0 */
    EtatBPSTP=0;/* Passe l'état de la variable bouton à 0 */
    //delay_ms(300);/* Pause pour la visualisation du relâchement du Bouton */
    break;
    }
    break;
    }
    /* Procédure d'arret */
    while(input(BPSTP)) /* Test l'appuie sur Bouton STP */
    {
    EtatBPSTP=1;/* Passe l'état de la variable bouton à 1 */
    delay_ms(300);/* Pause pour l'attente de relâchement du Bouton */
    while(!input(BPSTP))/* Test le relâchement du Bouton */
    {
    output_low(TRIAC);/* Eteint le triac*/
    output_low(RL2);/* Eteint la LED de control AR*/
    output_low(RL1);/* Eteint la LED de control AV*/
    if(EtatBPSTP=1)Vitesse=0; /* Vérifie si la variable d'état du bouton est à 1 et passe la vitesse à 0*/
    EtatBPAV=0;/* Passe l'état de la variable bouton à 0 */
    EtatBPAR=0;/* Passe l'état de la variable bouton à 0 */
    EtatBPSTP=0;/* Passe l'état de la variable bouton à 0 */
    //delay_ms(300);/* Pause pour la visualisation du relâchement du Bouton AV */
    break;
    }
    break;
    }

    if (Vitesse=0)
    {
    output_low(TRIAC);
    }
    else
    {
    output_toggle(TRIAC);
    delay_ms(tempo/Vitesse);
    }
    }
    }

    Je suppose que le probléme ce situe au niveau de la variable Vitesse ??

    Merci d'avance de votre aide et conseil
    Cordialement,

    -----

  2. #2
    HAYAC

    Re : Programmation PIC12F683 avec CCS 8.6 (Projet Treuil)

    Re,

    J'ai eu une avancé et je re-bloque :
    si j'utilise la forme suivante ça fonctionne :

    while(input(BPAR)) /* Test l'appuie sur Bouton AR */
    {
    EtatBPAR=1;/* Passe l'état de la variable bouton à 1 */
    delay_ms(300);/* Pause pour l'attente de relâchement du Bouton */
    while(!input(BPAR))/* Test le relâchement du Bouton */
    {
    //output_low(TRIAC);/* Éteint le triac*/
    delay_ms(20);/* Pause pour éviter l'arc sur les contacts des relais */
    output_low(RL1);/* eteint la LED de control AV*/
    output_high(RL2);/* Allume la LED de control AR*/
    //output_high(TRIAC);/* Allume le triac AV*/
    if(EtatBPAR=1)/* Vérifie si la variable d’état du bouton est à 1 et incrémente la vitesse*/
    {
    if (Vitesse <= 0)
    {
    Vitesse = 1;
    }
    else
    {
    ++Vitesse;
    }
    }
    EtatBPAV=0;/* Passe l'état de la variable bouton à 0 */
    EtatBPAR=0;/* Passe l'état de la variable bouton à 0 */
    EtatBPSTP=0;/* Passe l'état de la variable bouton à 0 */
    AEC=2;
    break;
    }
    break;
    }

    Le problème est que cette fonction n'est pas sécuritaire (inversion de sens à pleine vitesse et mauvaise gestion des sorties),
    J'ai donc pensé à celle-ci :

    while(input(BPAV)) // Test l'appuie sur Bouton AV
    {
    EtatBPAV=1;// Passe l'état de la variable bouton à 1
    delay_ms(300);// Pause pour l'attente de relâchement du Bouton
    while(!input(BPAV))// Test le relâchement du Bouton
    {
    if(EtatBPAV=1)// Vérifie si la variable d’état du bouton est à 1 et incrémente la vitesse
    {
    if (AEC=0)// Procédures de marche avant si à l’arrêt
    {
    output_high(RL1);// Allume la LED de control AV
    Vitesse = 1;
    AEC=1;
    }
    if (AEC=1)// Procédures de marche avant si déjà en marche avant
    {
    if (Vitesse <= 0)
    {
    Vitesse = 1;
    }
    else
    {
    ++Vitesse;
    }
    }
    if (AEC=2)// Procédures de marche avant si en marche arriéré
    {
    output_low(TRIAC);// Éteint le triac
    delay_ms(20);// Pause pour éviter l'arc sur les contacts des relais
    output_low(RL2);// Éteint la LED de control AR
    output_high(RL1);// Allume la LED de control AV
    Vitesse = 1;
    AEC=1;
    }
    }
    EtatBPAV=0;// Passe l'état de la variable bouton à 0
    EtatBPAR=0;// Passe l'état de la variable bouton à 0
    EtatBPSTP=0;// Passe l'état de la variable bouton à 0
    break;
    }
    break;
    }

    Le problème reviens sur la variation de vitesse qui reste a 1
    Help please!!

  3. #3
    HAYAC

    Re : Programmation CCS PIC12F683 (Projet Treuil-interruption)

    Bonjour à tous,

    Voici mon environnement de travail :
    - MLAB Version 8.83
    - CCS Compiler Version 4.057
    - Programmateur PIC Kit 2
    - Platines de test maison

    - (Pour cette question) un PIC 12F683

    J’ai parcourue le forum et le net sans trouver de réponse que j’arrive à intégrer à mes projets.
    Je travail en se moment sur plusieurs projets qui ce trouve avoir les mêmes problématiques, à savoir :
    - La rapidité de réaction
    - La fiabilité
    Mes programmes utilisent une boucle sans fin « while (true) » pour exécuter mon programme principal, j’aimerais utiliser une interruption pour gérer les changements d’état lors d’appui sur des boutons.

    J'ai ajouté les timers et interruptions suivantes mais riens ne fonctionnent:

    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_2);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1) ;
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_RA0);
    enable_interrupts(INT_RA1);
    enable_interrupts(INT_RA2);

    Ainsi que ceci pour test :

    #INT_RA
    isr()
    {
    output_toggle(RL1);
    output_toggle(RL2);
    }

    Help please

Discussions similaires

  1. Programmation PIC16F872 avec CCS 8.6
    Par HAYAC dans le forum Électronique
    Réponses: 7
    Dernier message: 19/02/2012, 10h41
  2. Un treuil miniature pour mon projet ?
    Par flocool dans le forum Électronique
    Réponses: 7
    Dernier message: 27/11/2009, 12h55
  3. programmation du pic CCS compiler
    Par issamty dans le forum Électronique
    Réponses: 3
    Dernier message: 08/03/2009, 12h34
  4. Projet d'horloge avec programmation d'evenemments
    Par lcoulon dans le forum Électronique
    Réponses: 0
    Dernier message: 05/03/2009, 10h57
  5. adc avec un PIC12F683
    Par invite721580c7 dans le forum Électronique
    Réponses: 2
    Dernier message: 21/01/2007, 14h38
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...