IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres architectures Assembleur Discussion :

Programme PIC16F628 avec TIMER


Sujet :

Autres architectures Assembleur

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 71
    Points : 26
    Points
    26
    Par défaut Programme PIC16F628 avec TIMER
    Bonjour,

    J'ai besoin d'aide (assez urgent) pour réaliser un petit programme en C pour une entreprise électronique (virtuelle)-Programme an assembleur du PIC 16F628-
    Le collègue n'est plus disponible, je ne peux assurer tout seul le boulot, je suis débutant en C.

    Voici le problème (il y a 3 programmes mais en fait ils sont basés sur le même principe) :
    Réalisation d’un module électronique de commande moteur par contact relais.
    Ce module est composé d’un commutateur 3 positions pour les entrées, de deux sorties temporisées S1 et S2
    Suivant la position du commutateur, on délivre en sortie différente temporisation.

    Programme 1:

    -Position P1
    S1 déclenche pendant 3 mm (180s) ensuite s’arrête 15 mm (720s)
    S2 déclenche au bout de 9 mm (720s) pendant 30s.
    le cycle se poursuit sur 24 heures

    -Position P2
    S1 déclenche pendant 6 mm ensuite s’arrête 15 mm
    S2 déclenche au bout de 9 mm pendant 30s.
    le cycle se poursuit sur 24 heures

    -Position P3
    S1 déclenche pendant 9 mm ensuite s’arrête 15 mm
    S2 déclenche au bout de 12 mm pendant 30s.
    le cycle se poursuit sur 24 heures

    Programme2:

    -Position P1
    S1 déclenche pendant 10 mm (600s) ensuite s’arrête 20 mm (1200s)
    S2 déclenche au bout de la 19éme mm (1140s) de l’arrêt de S1 pendant 40s.
    Durée du cycle 30 mn (1800s)
    le cycle se poursuit sur en continu

    -Position P2
    S1 déclenche pendant 15 mm (900s) ensuite s’arrête 25 mm (1500s)
    S2 déclenche au bout de 24éme mm (1440s) de l’arrêt de S1 pendant 55s.
    Durée du cycle 40 mn (2400s)
    le cycle se poursuit sur en continu

    -Position P3
    S1 déclenche pendant 15 mm (900s) ensuite s’arrête 25 mm (1500s)
    S2 déclenche au bout de 24éme mm (1440s) de l’arrêt de S1 pendant 55s.
    Durée du cycle 18 mn (1080s)
    le cycle se poursuit sur en continu

    Programme3:

    -Position P1
    S1 déclenche pendant 3 mm (180s) ensuite s’arrête 17 mm (1020s)
    S2 déclenche au bout de 19 mm (1140s) pendant 20s.
    Durée du cycle 20 mn (1200s)
    le cycle se poursuit sur en continu

    -Position P2
    S1 déclenche pendant 4 mm (240s) ensuite s’arrête 16 mm (960s)
    S2 déclenche au bout de 19 mm (1140s) pendant 20s.
    Durée du cycle 20 mn (1200s)
    le cycle se poursuit sur en continu

    -Position P3
    S1 déclenche pendant 5 mm (300s) ensuite s’arrête 16 mm (960s)
    S2 déclenche au bout de 20 mm (1200s) pendant 20s.
    Durée du cycle 21 mn (1260s)
    le cycle se poursuit sur en continu

    Voici mon code pour l'instant :

    Exemple Programme 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include<P16F628.h> // Manque les .asm qui vont bien avec le composant ??
    #include<time.h>
     
    int State = 0;
    int delaiAvantMarche1;  //Le délai avant que S1 se mette en position ON
    int delaiAvantMarche2;  //Le délai avant que S2 se mette en position ON
    int delaiEnMarche1;     //Le délai avant que S1 se mette en position OFF
    int delaiEnMarche2;     //Le délai avant que S2 se mette en position OFF
     
    TRISA = 0b00010011;     //Configuration du port A (RA 0,1,4 en entrée - 2,3,4,5,6 en sortie)
    TRISB = 0b00000000;     //Port B configuré en sortie (pour des raisons de sécurité)
     
    OSCCON=0b11111111;      //Ceci est une configuration personnelle que j'utilise donc à toi d'adapter
    OSCTUNE=0b01000000;     //idem
     
    While(1)
    {
         //Ici dans les if tu vas jouer sur les delais 
         if(PORTAbits.RA0 == 0){          //position P1
              //bons délais pour P1 en secondes 
    delaiEnMarche1 = 180 ;
    delaiAvantMarche1 = 900 ;
    delaiAvantMarche2 = 540 ;
    delaiEnMarche2 = 30 ;
     
         }else if(PORTAbits.RA1 == 0){      //position P2
    delaiEnMarche1 = 360;
    delaiAvantMarche1 = 900;
    delaiAvantMarche2 = 540 ;
    delaiEnMarche2 = 30 ;
     
         }else if(PORTAbits.RA4 == 0){      //position P3
    delaiEnMarche1 = 540;
    delaiAvantMarche1 = 900;
    delaiAvantMarche2 = 720 ;
    delaiEnMarche2 = 30 ;
     
         }
     
         //Dans le switch les actions vont se suivre en fonction des délais que tu as mis
    switch(State){
    	case 0 : 
                    Delay(delaiAvantMarche1);   //attente du délai avant la mise en marche
    		LATAbits.LATA3 = 0;   //S2 : OFF
    		LATAbits.LATA2 = 1;   //S1 : ON
                    Delay(delaiEnMarche1);      //attente du délai avant l'arret
    		LATAbits.LATA2 = 0;   //S1 : OFF
                    State = 1 ;           //on passe à l'état suivant
    		break ;
    	case 1 : 
                    Delay(delaiAvantMarche2);   //attente du délai avant la mise en marche
    		LATAbits.LATA2 = 0;   //S1 : OFF
    		LATAbits.LATA3 = 1;   //S2 : ON
                    Delay(delaiEnMarche2);      //attente du délai avant l'arret
    		LATAbits.LATA3 = 0;   //S2 : OFF
    		State = 0 ;
    		break ;
    	}
    }
    Programme 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include<P16F628.h> // Manque les .asm qui vont bien avec le composant ??
    #include<time.h>
     
    int State = 0;
    int delaiAvantMarche1;  //Le délai avant que S1 se mette en position ON
    int delaiAvantMarche2;  //Le délai avant que S2 se mette en position ON
    int delaiEnMarche1;     //Le délai avant que S1 se mette en position OFF
    int delaiEnMarche2;     //Le délai avant que S2 se mette en position OFF
     
    TRISA = 0b00010011;     //Configuration du port A (RA 0,1,4 en entrée - 2,3,4,5,6 en sortie)
    TRISB = 0b00000000;     //Port B configuré en sortie (pour des raisons de sécurité)
     
    OSCCON=0b11111111;      //Ceci est une configuration personnelle que j'utilise donc à toi d'adapter
    OSCTUNE=0b01000000;     //idem
     
    While(1)
    {
         //Ici dans les if tu vas jouer sur les delais 
         if(PORTAbits.RA0 == 0){          //position P1
              //bons délais pour P1 en secondes 
    delaiEnMarche1 = 180 ;
    delaiAvantMarche1 = 1020 ;
    delaiAvantMarche2 = 1140 ;
    delaiEnMarche2 = 20 ;
     
         }else if(PORTAbits.RA1 == 0){      //position P2
    delaiEnMarche1 = 240;
    delaiAvantMarche1 = 960;
    delaiAvantMarche2 = 1140 ;
    delaiEnMarche2 = 20 ;
     
         }else if(PORTAbits.RA4 == 0){      //position P3
    delaiEnMarche1 = 300;
    delaiAvantMarche1 = 960;
    delaiAvantMarche2 = 1200 ;
    delaiEnMarche2 = 20 ;
     
         }
    //Dans le switch les actions vont se suivre en fonction des délais que tu as mis
    switch(State){
    	case 0 : 
                    Delay(delaiAvantMarche1);   //attente du délai avant la mise en marche
    		LATAbits.LATA3 = 0;   //S2 : OFF
    		LATAbits.LATA2 = 1;   //S1 : ON
                    Delay(delaiEnMarche1);      //attente du délai avant l'arret
    		LATAbits.LATA2 = 0;   //S1 : OFF
                    State = 1 ;           //on passe à l'état suivant
    		break ;
    	case 1 : 
                    Delay(delaiAvantMarche2);   //attente du délai avant la mise en marche
    		LATAbits.LATA2 = 0;   //S1 : OFF
    		LATAbits.LATA3 = 1;   //S2 : ON
                    Delay(delaiEnMarche2);      //attente du délai avant l'arret
    		LATAbits.LATA3 = 0;   //S2 : OFF
    		State = 0 ;
    		break ;
    	}
    }
    Programme 3:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include<P16F628.h> // Manque les .asm qui vont bien avec le composant ??
    #include<time.h>
     
    int State = 0;
    int delaiAvantMarche1;  //Le délai avant que S1 se mette en position ON
    int delaiAvantMarche2;  //Le délai avant que S2 se mette en position ON
    int delaiEnMarche1;     //Le délai avant que S1 se mette en position OFF
    int delaiEnMarche2;     //Le délai avant que S2 se mette en position OFF
     
    TRISA = 0b00010011;     //Configuration du port A (RA 0,1,4 en entrée - 2,3,4,5,6 en sortie)
    TRISB = 0b00000000;     //Port B configuré en sortie (pour des raisons de sécurité)
     
    OSCCON=0b11111111;      //Ceci est une configuration personnelle que j'utilise donc à toi d'adapter
    OSCTUNE=0b01000000;     //idem
     
    While(1)
    {
         //Ici dans les if tu vas jouer sur les delais 
         if(PORTAbits.RA0 == 0){          //position P1
              //bons délais pour P1 en secondes 
    delaiEnMarche1 = 600 ;
    delaiAvantMarche1 = 1200 ;
    delaiAvantMarche2 = 2940 ;
    delaiEnMarche2 = 40 ;
     
         }else if(PORTAbits.RA1 == 0){      //position P2
    delaiEnMarche1 = 900;
    delaiAvantMarche1 = 1500;
    delaiAvantMarche2 = 3840 ;
    delaiEnMarche2 = 55 ;
     
         }else if(PORTAbits.RA4 == 0){      //position P3
    delaiEnMarche1 = 900;
    delaiAvantMarche1 = 1500;
    delaiAvantMarche2 = 3840 ;
    delaiEnMarche2 = 55 ;
     
         }
    //Dans le switch les actions vont se suivre en fonction des délais que tu as mis
    switch(State){
    	case 0 : 
                    Delay(delaiAvantMarche1);   //attente du délai avant la mise en marche
    		LATAbits.LATA3 = 0;   //S2 : OFF
    		LATAbits.LATA2 = 1;   //S1 : ON
                    Delay(delaiEnMarche1);      //attente du délai avant l'arret
    		LATAbits.LATA2 = 0;   //S1 : OFF
                    State = 1 ;           //on passe à l'état suivant
    		break ;
    	case 1 : 
                    Delay(delaiAvantMarche2);   //attente du délai avant la mise en marche
    		LATAbits.LATA2 = 0;   //S1 : OFF
    		LATAbits.LATA3 = 1;   //S2 : ON
                    Delay(delaiEnMarche2);      //attente du délai avant l'arret
    		LATAbits.LATA3 = 0;   //S2 : OFF
    		State = 0 ;
    		break ;
    	}
    }

    Donc, manque les include restant (.asm), la fonction Delay() à écrire, je ne sais pas comment elle s'utilise dans ce cas là et la configuration de la partie TIMER 0 ou 1 ou 2 celui que je veux et regarder que je dois configurer quels registres (débordement, pré-diviseur, post-diviseur, oscillateur...). A la fin je devrais arriver à configurer mon timer mais je en sais pas comment faire.
    ça va dépendre directement de la fréquence de mon oscillateur (j'en ai pas vu sur le schéma donc je suppose que c'est l'oscillateur interne du PIC) généralement les oscillateurs internes des PIC sont à 40MHz.


    Merci de m'aider.
    Images attachées Images attachées

Discussions similaires

  1. Redirection URl avec Timer
    Par Empty_body dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/01/2006, 19h23
  2. programme C++ avec shell
    Par I_believe_I_can_fly dans le forum C++
    Réponses: 11
    Dernier message: 24/10/2005, 17h08
  3. comment deployer un programme fait avec jbuilder
    Par showmetheway dans le forum JBuilder
    Réponses: 6
    Dernier message: 23/09/2003, 01h11
  4. Programmation WEB avec delphi
    Par mayoguy dans le forum Web & réseau
    Réponses: 4
    Dernier message: 20/08/2002, 19h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo