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

 C Discussion :

Gestion de feux tricolores avec un PIC 16F877A


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 208
    Par défaut Gestion de feux tricolores avec un PIC 16F877A
    Salut,

    J'ai un projet en langage C. La description de ce projet est la suivante :

    Le but est d'assurer la gestion de feux de trafic d'un carrefour. La solution est basée sur l'utilisation d'un micro-contrôleur PIC 16F877A.

    La première partie de ce travail concerne la conception de la carte qui sert de simulateur. La seconde partie concerne la programmation du micro-contrôleur. La troisième partie est une validation de la solution proposée.

    Description du cahier des charges : Le but est d'assurer la circulation des véhicules et des piétons au niveau d'un carrefour qui comporte 4 voies.

    Fonctionnement du système :

    Sur ce carrefour, les voies 1 et 3 fonctionnent ensemble ce qui signifie que le signal vert de la voie 1 et le signal vert de la voie 3 sont couplés et donc simultanément activés pour que le témoin vert de la voie 1 et le témoin vert de la voie 3 soient commandées ensembles : tous les deux allumés, ou tous les deux éteints. Il en va de même pour les témoins jaunes ainsi que pour les témoins rouges de ces deux voies. Les voies 2 et 4 sont couplées de la même façon.

    Chaque voie est munie d'un passage réservé aux piétons protégé par deux signalisations Vip et Rip (i=1,2,3 ou 4). Lorsque les véhicules détiennent le contrôle des voies tous les voyants rouges piétons sont allumés. Un bouton-poussoir permet aux piétons de lancer une demande pour prendre le contrôle des voies. Une temporisation de 5 secondes est déclenchée, suite à laquelle tous les voyants rouges des 4 voies destinées aux voitures passent au rouge et les voyants verts destinés aux piétons passent au vert.
    Ce cycle dure pendant 15 secondes. Les feux verts piétons clignotent alors 5 fois pendant 5 secondes. Puis le cycle de passage de véhicules reprend dans l'ordre des voies : 1, 2, 3, 4.

    Un deuxième bouton-poussoir est prévu pour lancer le fonctionnement en mode clignotant des voyants oranges des 4 voies. Ce fonctionnement est très souvent utilisé la nuit lorsque la cadence du trafic diminue.

    J'ai une solution concernant le feu rouge à deux voies :

    Le premier fichier est prog.c :

    Code C : 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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #include "C:\feudecarr\prog.h"
     
    void main()
    {
     
       setup_adc_ports(NO_ANALOGS);
       setup_adc(ADC_OFF);
       setup_psp(PSP_DISABLED);
       setup_spi(FALSE);
       setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
       setup_timer_1(T1_DISABLED);
       setup_timer_2(T2_DISABLED,0,1);
     
    set_tris_C(0xFF);
       set_tris_b(0x00);
       output_b(0x00);
     
    do
    {
     
    if (input(PIN_C0)==1)
                          {
                          output_B(0b10010);
                          delay_ms(1000);
                          output_B(0);
                          delay_ms(1000);
                          }
                         else
                         {
                         output_b(0b100001);
                         delay_ms(5000);
                         output_b(0b000001);
                         delay_ms(500);
                         output_b(0b100001);
                         delay_ms(500);
                         output_b(0b000001);
                         delay_ms(500);
                         output_b(0b100001);
                         delay_ms(500);
                         output_b(0b000001);
                         delay_ms(500);
                         output_b(0b100001);
                         delay_ms(500);
                         output_b(0b010001);
                         delay_ms(1000);
                         output_b(0b001011);
                         delay_ms(1000);
                         output_b(0b001100);
                         delay_ms(5000);
                         output_b(0b001000);
                         delay_ms(500);
                         output_b(0b001100);
                         delay_ms(500);
                         output_b(0b001000);
                         delay_ms(500);
                         output_b(0b001100);
                         delay_ms(500);
                         output_b(0b001000);
                         delay_ms(500);
                         output_b(0b001100);
                         delay_ms(1000);
                         output_b(0b001010);
                         delay_ms(1000);
                         output_b(0b011001);
                         delay_ms(1000);
                          }
    }
     while(true);
    }

    Le deuxième fichier est prog.h :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <16F877.h>
    #device adc=8
    #use delay(clock=400000000)
    #fuses NOWDT,RC, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG

    Mais je n'arrive pas à comprendre le code. Mais il est exécutable.

    Mon but est de programmer un feu rouge a 4 voies en language C avec la notion de timer.

    Quelqu'un peut-il m'aider ?

    Voila le code ainsi que l'image mais je veux réaliser un feu rouge a 4 voies avec le code C.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    il manque pas mal d'info ou est branché quoi par exemple, tu dis vouloir programmer un feu rouge mais ton projet c'est un feu bicolore, les timers ne te servent à rien si tu n'utilise pas les interruptions pour savoir si le piéton à appuyé sur le feu.

    pour ce qui est du code, si pin_co est à 1 (bouton appuyé je pense sans voir ton schéma) alors tu fais clignoter certaine led sur la sortie B (en supposant que tu ais bien des leds en sortie B) sinon tu en fais clignoter d'autre avec des timer différent.

    hum si c'est un projet virtuel ok, si c'est pour une mise en place réel le polling oublie tu peux pas prédire les temps de traitements (donc tu ne respecte pas ton cdc)

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 208
    Par défaut programmtion pic 16F877A en C de feu rouge
    salut,

    voila un code qui est excutable est juste

    mais le problemme est que ne supporte pas l'interruption

    j'explique encore


    je veux quand je clique sur RBO il me fait le premier code qui sert a clignote le feu rouge

    si je lache le boutton il me fonctionne avec le deuxieme code qui est le fonctionnement normale de feu rouge et ainsi de suite

    je suppose quand juste ajouter la notion d'interruption au niveau de portB

    ce code il me tient juste l'etat initiale de port B

    sans avoir le faite de taper sur le bouton


    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
    60
    61
    62
    63
     
    void main()
    {
     
     
     
      TRISC= 0x00;
       TRISb =0xFF;
       PORTB= 0xFF;
     
    do
    {
     
                   if (RB0 ==1)
                          {
                          PORTC = 0b10010;
                          delay_ms(1000);
                          PORTC = 0;
                          delay_ms(1000);
                          }
     
                   else
                        {
                         PORTC = 0b100001;
                         delay_ms(5000);
                         PORTC =0b000001;
                         delay_ms(500);
                         PORTC =0b100001;
                         delay_ms(500);
                         PORTC =0b000001;
                         delay_ms(500);
                         PORTC = 0b100001;
                         delay_ms(500);
                         PORTC = 0b000001;
                         delay_ms(500);
                         PORTC =0b100001;
                         delay_ms(500);
                         PORTC = 0b010001;
                         delay_ms(1000);
                         PORTC =0b001011;
                         delay_ms(1000);
                         PORTC =0b001100;
                         delay_ms(5000);
                        PORTC =0b001000;
                         delay_ms(500);
                         PORTC =0b001100;
                         delay_ms(500);
                        PORTC =0b001000;
                         delay_ms(500);
                         PORTC =0b001100;
                         delay_ms(500);
                         PORTC =0b001000;
                         delay_ms(500);
                         PORTC =0b001100;
                         delay_ms(1000);
                         PORTC =0b001010;
                         delay_ms(1000);
                         PORTC =0b011001;
                         delay_ms(1000);
                         }
    }
     while(1);
    }

    SVP AIDEZ MOI C URGENT

    merci d'avance

  4. #4
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    ton RB0 n'est pas déclaré et je doute que le pin 0 du port B puisse s'appeller de cette manière j'essaierais plutot PIN_B0 à la place donc ça donnerais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (input(PIN_B0)==1)
                {
     
                }
              else
               {
     
               }
    à vérifier pour le input suivant la bibliothèque tu utilises.

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/08/2004, 18h52
  2. Communication RS232 avec un PIC via delphi
    Par JeanPh dans le forum API, COM et SDKs
    Réponses: 22
    Dernier message: 09/08/2004, 22h56
  3. [TComport] communiquer avec un PIC
    Par tracks dans le forum C++Builder
    Réponses: 5
    Dernier message: 09/06/2004, 13h11
  4. [TP]Gestion des images bmp avec BMP.TPU
    Par Gabi dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 14/05/2004, 23h20
  5. [CVS]Gestion de 2 versions avec une partie commune
    Par Gromitou dans le forum EDI et Outils pour Java
    Réponses: 4
    Dernier message: 19/02/2004, 14h32

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