Programmation en C, la fonction delay.
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 50

Programmation en C, la fonction delay.



  1. #1
    terrdala

    Arrow Programmation en C, la fonction delay.


    ------

    Salut a tous,

    Récemment je bosse sur un système d'alarme sur base d'un PIC 16F628A.

    Pendant ma programmation j'ai remarqué une lacune avec la fonction delay.J'utilise comme IDE MikroC.

    Voici un petit bout de code pour vous montré :

    Code:
     if(variable == 1)
    {
      BUZER = 1;
      delay_ms(50); // délais sensé être de 50ms
      BUZER = 0;
      delay_ms(50); // délais sensé être de 50ms
    }

    Bon,tout d'abord je tient a dire que j'utilise le PIC avec son OSC interne régler a 4MHz grâce au registre PCON prévus a cette effet.

    L'incrémentation de la variable se fait par l'interruption INT/RB0.Celas donne donc :

    Code:
    void interrupt()
    {
      if (INTCON.INTF == 1) // si le débordement du flag a lieu,alors...
      {
        INTCON.INTF = 0; // remise a 0 du flag
        variable++; // incrémentation de "variable"
       }
    }

    Voila,maintenant ce qui se passe avec le delay c'est que lui dure 1 seconde quand je tape 50 pour avoir 50 ms.Donc en gros mon buzer sonne a intervalle de 1 seconde allumé et 1 seconde éteint.

    Plutôt bizarre je trouve car le délais est précisé en (ms) et j'ai noté 50.LE timing devrais être de 50 ms.

    Moi qui cherchais a la base un delay de 125ms je suis obligé de tapé delay_ms(2).Alors celas fonctionne parfaitement mais celas me semble pas logique.


    Celas pourrais t-il venir de l'oscillateur interne?


    Cordialement.

    -----
    <<La détermination mène a la satisfaction>>

  2. #2
    jiherve

    Re : Programmation en C,la fonction delay.

    Bonsoir,
    Qu'est ce qui génère l'interruption?
    drapeau (flag) mis à 1 lors d'un front (montant ou descendant selon l'état du bit INTEDG du registre OPTION_REG) sur la broche RB0/INT
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    terrdala

    Re : Programmation en C,la fonction delay.

    Bonsoir,

    J'utilise pour les testes un BP (pull down) sur RB0,configurer en front montant (bit 6 OPTION_REG) et les pull-up (bit 7 OPTION_REG) son désactivée.

    En gros j'ai déjà écrit tous le programme de mon alarme,j'ai isolé une partie du programme pour en trouvé le bug.

    Pour comprendre mon erreur je reprogramme la partie qui bug de façon facile et j'ajoute la difficulté petit a petit.Pendant celas je suis tombé sur le bug du delay.
    <<La détermination mène a la satisfaction>>

  4. #4
    jiherve

    Re : Programmation en C,la fonction delay.

    Re
    Comme ton interruption dépend de l'entrée RBO moi ce que je me demande c'est par quel miracle le delay peut il aboutir!
    les pull-up (bit 7 OPTION_REG) son désactivée.
    mais là je commence à entrevoir le soucis , l'entrée est flottante et bascule au rythme de ce qui peu trainer au niveau EM.
    Un délais cela se contrôle par un timer(ce qui pourrait être un diviseur externe connecté sur RB0) toutes les autres solutions sont inadaptées.
    Tel qu'est ton montage il faudra que tu appuies achtement vite sur le bouton(avec le pull up activé) pour que cela fonctionne, c'est un concept typiquement shadock.
    JR
    l'électronique c'est pas du vaudou!

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

    Re : Programmation en C,la fonction delay.

    Pourquoi flotante? La pin RB0 est tiré a la masse quand j’appuie pas sur le BP.

    Le BP fait interruption,dans l'interruption j'ai une variable qui s’incrémente et cette variable de type "bit" sert dans le void main avec un while.

    Code:
    void main
    {
     while(1)
     {
       if (variable ==1)
       {
         BUZER = 1:
         delay_ms(50);
         BUZER = 0;
         delay_ms(50);
        }
        
        if (variable == 0)
        {
          BUZER = 0;
        }
      }
    }
    <<La détermination mène a la satisfaction>>

  7. #6
    ranarama

    Re : Programmation en C,la fonction delay.

    bsr. Au cas où ça puisse aider, il y a eu des explications postées sur une autre discussion sur le mm sujet ici ya deux jours :
    http://forums.futura-sciences.com/el...5-seconde.html

  8. #7
    jiherve

    Re : Programmation en C,la fonction delay.

    Re
    J'ai sans doute compris de travers mais j'ai lu que tu avais un BP qui connecte RB0 à la masse
    BP (pull down)
    et tu attends un front montant (sans pull up) sur la même entrée.??????????
    Par ailleurs dans l'interruption tu n’incrémentes qu'une fois , à moins que l'interruption ne bégaie.
    En passant un petit conseil il faudrait un anti rebond sur le poussoir et exploiter plutôt le front descendant qui sera plus raide que le montant, les entrées de ce type sont faites pour recevoir des signaux logique propres, un BP cela se gère par échantillonnage régulier(qqs ms) de l'entrée avec un confirmateur logiciel.
    JR
    l'électronique c'est pas du vaudou!

  9. #8
    terrdala

    Re : Programmation en C,la fonction delay.

    Hello,

    Merci pour ta réponse.

    MAis dans mon cas elle ne sert pas.

    Je veux juste comprendre pourquoi le delay est bizarement incorrecte.

    Je sais facilement faire des delay avec interruption.


    Je vais un peut expliqué mon bug principale.Ce que je cherche a faire c'est faire sonner un BUZER avec intervalle de 125ms pendant 15 seconde.Alors les 15s je les ai fait avec le TMR0.

    Sauf que pour les 125ms ben pour pas me prendre la tête je les inséré dans la partie ou le buzer doit sonné,je n'ai que 2 delay de 125ms c'est pas énorme.

    Donc en gros imaginons quand j'active l'alarme et que j'ai une variable "bit" mit a 1( signal ) le buzer sonne 15s avant de mettre une autre variable "bit" (alarme) a 1.Une variable (seconde de type "unsigned char") est incrémenter par le TMR0,si elle vaut 1 forcément il c'est passé 1 seconde.

    La variable signal détermine si j'ai taper le code sur le clavier ou non.La variable alarme détermine si le programme principale qui gérer les détecteur de mouvement ect peut fonctionner ou non.

    Donc pour le BUZER je voulais procéder comme suit :

    Code:
    if (signal == 1)
    {
      for (seconde=0; seconde <=30;)
      {
        BUZER = 1;
        delay_ms(125);
        BUZER = 0;
        delay_ms(125);
      }
     
     alarme = 1;
    }

    LA variable seconde est incrémenter par l'interruption TMR0,la boucle for permet de répéter ce qu'elle contiens 30 fois soit 30 seconde,je n'ai pas initialer son incrémentation car elle est déjà incrémenté par le TMR0.

    Vu que j'a besoin que de 2 petit temps de 125ms,ben j'ai utilisé la fonction delay pour faire simple.Donc logiquement sa devrais faire bip,125ms,bip,125ms et celas pendant 30 secondes avant d'incrémenter la variable alarme.

    Sauf que quand signal = 1 le buzer sonne de façon continue et non par intervalle.

    Donc j'ai juste prit cette partie du programme et je suis en train d'essayer de comprend pourquoi et ou est mon erreur.


    D'avance désolé pour mon orthographe pitoyable.
    Dernière modification par terrdala ; 12/08/2015 à 21h27.
    <<La détermination mène a la satisfaction>>

  10. #9
    invite03481543

    Re : Programmation en C,la fonction delay.

    Bonjour,

    hum, ça me parait tiré par les cheveux tout ça.
    D'abord il est difficile de vous suivre quand le code est dispersé un peu partout, si vous postez un code il faut tout poster en bloc.
    Ensuite quand on utilise des interruptions pour faire des tempo (ce qui est la bonne méthode) il est inutile de se servir de la fonction delay_ms() qui est une fonction bloquante même pour peu d'usage, c'est une question de cohérence et de souplesse également.
    Je subodore également une mauvaise déclaration de variables et notamment "variable" justement.
    Montrez votre code en entier et je vous dirai où est votre problème.
    @+

  11. #10
    invite03481543

    Re : Programmation en C,la fonction delay.

    Code:
    void main
    {
     while(1)
     {
       if (variable ==1)
        {
         BUZER = 1:
         delay_ms(50);
         BUZER = 0;
         delay_ms(50);
        }
        
        if (variable == 0)
        {
          BUZER = 0;
        }
      }
    }
    Il serait plus propre d'écrire:
    Code:
     void main
     {
      while(1)
      {
        if (variable)
       {
          BUZER = 1:
          delay_ms(50);
          BUZER = 0;
          delay_ms(50);
         }
         
         else BUZER = 0;
       }
     }

  12. #11
    terrdala

    Re : Programmation en C,la fonction delay.

    Salut,

    Mes code son dispersé mais il faut pas y prêter attention c'est pour montrer un exemple quand j'explique une phrase.

    Variable est un exemple,elle ne s'appel pas du tous variable lol.

    Je suis plus fort en programmation qu'avant,je pense même avoir déjà trouvé le problème du bug.Je voulais juste savoir en gros pourquoi la fonction delay ne se déroule pas comme prévu.Si je dit que la fonction delay dépend du timer et que vu qu'il est déja utilisé celas ralenti la fonction delay c'est possible?


    Au sujet de mon code,la boucle for ne fonctionneras jamais je pense.En gros le TMR0 incrémente une variable (char) nommé timer.

    Celle ci,une fois a 3406 incrémente dans le "main" une variable (unsigned char) nommé seconde.Celle ci permet de décompte les 15 seconde.Il me suffi de faire incrémenter une autre variable (timer2) avec le TMR0.Celle ci une fois a 487 incrémente par exemple une variable nommé (buzok) de type "bit" cette fois ci.

    Alors pourquoi une "bit" c'est simple,si la variable faut 1 ben alors le buzer il faudra 1 sinon buzer = 0.

    Donc je fait 2 compteur en même temps via le TMR0,un pour les 15s et un pour les 125ms.Je ne cherche pas de précision dans les temps.

    Attention que je veille a reset les variables seconde et buzok quand le décompte doit vraiment commencé.Donc quand signal est = 1 ben je fait un reset pour être sur d'être a 0 et tous peut décompter normalement.

    Celas donne donc :

    Code:
    for (je m'arrangerais pour qu'elle soit executer 1 fois)
    {
     if (SIGNAL == 1)
     {
      seconde = 0;
      buzok = 0;
      
      if (seconde <=30)
      {
        if (buzok == 1)
        {
          BUZER = 1;
    	}
    	
    	else BUZER = 0;
      }
    
      if (seconde == 31)
      {
       alarme++;
      }	  
     }	 
    }
    Le reste du programme seras dans une while a part.Car je veut que ce que j'ai écrit au dessus soit exécuter q'une fois.Si je met ça dans la while principal du programme d'alarme il va se répéter et c'est pas le but.

    Dite moi ce que vous en pensé.
    Dernière modification par terrdala ; 13/08/2015 à 09h09.
    <<La détermination mène a la satisfaction>>

  13. #12
    terrdala

    Re : Programmation en C,la fonction delay.

    Y a du nouveau , voici mon nouveau code.

    Code:
    #define BUZ PORTA.B1
    #define LED PORTA.B4
    
    bit bascule;
    char timer1;
    char timer2;
    unsigned char s;
    bit ms;
    
    
    void interrupt()
    {
     if(INTCON.INTF == 1)
     {
      INTCON.INTF = 0;
      bascule++;
     }
     
     if (INTCON.T0IF == 1)
     {
      INTCON.T0IF = 0;
      timer1++;
      timer2++;
      TMR0 = 99;
    
     }
    }
    
    void buzzer()
    {
     while(s<=15)
     {
      if (timer1 == 15)
      {
       timer1 = 0;
       s++;
      }
    
      if (timer2 == 1)
      {
       timer2 = 0;
       ms++;
      }
    
      if (ms == 1)
      {
       BUZ = 1;
      }
    
      if (ms == 0)
      {
       BUZ = 0;
      }
     }
    }
    
    void main() 
    {
     PORTA = 0;
     PORTB = 0;
     TRISA = 0b00000000;
     TRISB = 0b00000001;
     
     CMCON = 0b111;
     PCON = 0b00000100;
     INTCON = 0b10110000;
     OPTION_REG = 0b11000101;
     
     TMR0 = 99;
     bascule = 0;
     timer1 = 0;
     timer2 = 0;
     s = 0;
     ms = 0;
     
     while(1)
     {
      if (bascule == 1)
      {
       s = 0;
       ms = 0;
       buzzer();
       LED = 1;
      }
      
      if (bascule == 0)
      {
       LED = 0;
       s = 0;
       ms = 0;
       BUZ = 0;
      }
     }
    }
    Mais celas ne fonctionne toujours pas comme prévu.

    J'ai beau chercher j'ai du mal a trouvé comment réalisé ce que je veut faire,qui me semble plus complexe que je l'avais prévu pour faire un truc a la base simple.
    <<La détermination mène a la satisfaction>>

  14. #13
    invite03481543

    Re : Programmation en C,la fonction delay.

    Déjà remplace bit par char et la variable bascule doit être de type volatile (puisque présente dans l'interruption).

  15. #14
    invite03481543

    Re : Programmation en C,la fonction delay.

    De même que timer1 et timer2.

  16. #15
    invite03481543

    Re : Programmation en C,la fonction delay.

    De plus il existe le else qui te permettrait d'écrire:

    Code:
    void buzzer()
    {
     while(s<=15)
     {
      if (timer1 == 15)
        {
       timer1 = 0;
       s++;
      }
    
      if (timer2)
      {
       timer2 = 0;
       ms++;
      }
    
      if (ms)  BUZ = 1;
      else BUZ = 0;
      
     }
    }
    C'est pas plus lisible comme ça?

  17. #16
    terrdala

    Re : Programmation en C,la fonction delay.

    L'interruption s'enclenche que quand j’appuie sur une bouton.

    Il faut qu'elle soit de "type bit" pour prendre 0 ou 1.Le timer 1 et 2 son en char pour avoir un nombre assez grand vu qu'il servent pour compté.

    Je pense que le bug viens d'un incohérence entre le main et la fonction quand elle est appelée.MAis je ne vois pas comment procéder,ma logique en programmation ne va pas plus loin que ça :s.
    <<La détermination mène a la satisfaction>>

  18. #17
    terrdala

    Re : Programmation en C,la fonction delay.

    Citation Envoyé par HULK
    C'est pas plus lisible comme ça?
    Oui je sais mais je préfère avec des if,je sais pour quelle raison j'avais eu un problème avec des else que quand je les notais ça ne fonctionnais pas.
    <<La détermination mène a la satisfaction>>

  19. #18
    invite03481543

    Re : Programmation en C,la fonction delay.

    Pas sur que MikroC sait gérer une variable bit.
    De toute façon ces variables doivent être impérativement de type volatile.

  20. #19
    invite03481543

    Re : Programmation en C,la fonction delay.

    Citation Envoyé par terrdala Voir le message
    Oui je sais mais je préfère avec des if,je sais pour quelle raison j'avais eu un problème avec des else que quand je les notais ça ne fonctionnais pas.
    C'est une bien mauvaise raison, la vraie raison est que tu as dû mal l'employer, il vaut donc mieux comprendre pourquoi plutôt que de renoncer à un test indispensable en C.

  21. #20
    invite03481543

    Re : Programmation en C,la fonction delay.

    Il n'y a pas que ça qui ne va pas dans ton code.
    Tu emploies bit pour bascule alors que cette variable ne peut donc prendre que 2 états, alors pourquoi faire un bascule++? que se passe-t-il si bascule vaut 1 et que tu fais ++ dessus?
    Il aurait mieux valut, il me semble, tester bascule en interruption, si vaut 1 bloquer l'interruption le temps de faire la manip dans la fonction principale puis une fois fait reseter bascule et débloquer l'interruption.

    Tu veux faire quoi au fait exactement? (j'ai la flemme de tout relire)
    Dernière modification par HULK28 ; 16/08/2015 à 15h55.

  22. #21
    terrdala

    Re : Programmation en C,la fonction delay.

    Ah mais si je t'assure que bascule fonctionne.

    Quand j'appuie sur le bouton poussoir relier a RB0/INT.Celas déclenche comme tu le lis l'interruption.Donc si le flag déborde il incrément la variable bascule.

    Comme la variable ne peut prendre que 0 ou 1,ci celle ci est a 1 quand je l'incrémente elle repasse d'office a 0.Celas fait une fonction "télérupteur" si tu préfère.

    J'appuie sur le bouton,bascule passe de 0 a 1,j'appuie a nouveau elle passe de 1 a 0.Si je met un char elle va passé a 2 puis a 3 et celas ne m'arrange pas.


    En gros mon but est que quand cette variable est a 1,elle fasse sonné un buzer(a intervalle de 120ms) pendant 30s puis active une led.

    Donc si bascule = 1 alors décompte de 30 seconde lancé (pendant ce décompte fait bip bip avec un buzer),30 seconde plus tard LED = 1.Attention qu'a tout moment je doit pourvoir sorti de celas et remettre bascule a 0 et repassé comme ci je n'avais rien fait.

    Du pourquoi je ne peut pas utilisé la fonction "delay" car elle bloque le pic.
    Dernière modification par terrdala ; 16/08/2015 à 16h12.
    <<La détermination mène a la satisfaction>>

  23. #22
    invite03481543

    Re : Programmation en C,la fonction delay.

    J'appuie sur le bouton,bascule passe de 0 a 1,j'appuie a nouveau elle passe de 1 a 0.Si je met un char elle va passé a 2 puis a 3 et celas ne m'arrange pas.
    Oulalaa!...
    Je te conseille de réviser les variables et leurs usages.
    Dans un espace mémoire les variables sont déclarées et un espace leur est alloué, elles se retrouvent donc les unes à la suite des autres, si tu déclares une variable pouvant contenir 256 bits par exemple et que tu t'amuses à dépasser cette valeur maximale tu vas avoir de drôles de surprises.
    C'est à toi de veiller à respecter l'espace mémoire alloué, en tout cas avec un compilateur tel que MikroC que je connais bien.
    bit n'est pas une variable ordinaire en C, d'ailleurs cette variable n'existe pas en C, elle fait parti d'un champ de bits donc créée à partir par exemple d'une structure.
    "je constate que" donc "je peux faire ça" n'est pas la bonne manière d'aborder les langages en général, sinon tu vas rencontrer de gros déboires.
    Par exemple dire le mot "verre" au lieu du mot "ver" n'a pas la même signification en français et pourtant ça s'entend bien de la même manière mais chacun de ces 2 mots à une définition différente.

  24. #23
    invite03481543

    Re : Programmation en C,la fonction delay.

    Bon si j'ai un peu de temps en soirée je vais t'écrire ton code selon ce que tu indiques comme cahier des charges.
    @+

    PS:indique moi ton µC, ton quartz et tout ce qui m'évitera de chercher dans les posts précédents.

  25. #24
    terrdala

    Re : Programmation en C,la fonction delay.

    Je ne cherche pas vraiment a ce que l'on m'apporte le code tous fait.Si tu fait ça j'apprendrais quoi?

    Moi on ma toujours dit que la variable "bit" prendre 1 ou 0.Donc forcément si elle est a 1 elle ne peut pas passé a 2 car c'est binaire.Donc je ne comprend pas très bien ton explication la dessus.Je ne savais même pas qu'elle n'existais pas de base ^^.

    Tu peut faire le teste si tu veux,si tu incrémente elle passe a 1,tu incrémente a nouveau elle reprend son 0 au lieu de passé a 2 par exemple.

    Enfin pour répondre a ta question le PIC est un 16f628A,j'utilise l'oscillateur interne (registre PCON) que l'on peut initialisé soit a 48khz ou 4MHZ.

    On ma déjà dit que si je demandais un code tous fait que je n'apprendrais surement rien.On me dit ca ici sur ce forum dans mon tous premier post sur la programmation en C.
    Dernière modification par terrdala ; 16/08/2015 à 17h13.
    <<La détermination mène a la satisfaction>>

  26. #25
    invite03481543

    Re : Programmation en C,la fonction delay.

    Comme tu veux.Moi ça m'arrange remarque.Ce que je peux te dire c'est que ton code est très mal organisé.Concernant la variable bit tu n'es pas obligé de me croire fais comme bon te semble.Bonne chance.

  27. #26
    terrdala

    Re : Programmation en C,la fonction delay.

    C'est pas que je te crois pas c'est que je comprend pas ^^.


    Il faut obligatoirement que tu me programme le code en entier pour m'aider?
    <<La détermination mène a la satisfaction>>

  28. #27
    bisou10

    Re : Programmation en C,la fonction delay.

    Si ta fonction Delay_ms() n'attend pas autant que prévu, ou trop, c'est qu'elle s'appuie sur des valeurs inexactes.

    Il peut y avoir plein de raisons pour ça, mais elles sont généralement toutes liées au mauvais paramétrage de FCYC, qui vient de FOSC, rapport à ton PIC.

    - si c'est une IT timer, la valeur du compteur n'est pas correcte
    - si c'est une boucle statique, le nombre de boucle n'est pas correct

    Pour changer FOSC, c'est dans les ConfigBits de MPLabX. N'oublie de prendre en compte la PLL.

    Et puis écoute les conseils de HULK28 sur ton code, ils sont pertinents

  29. #28
    terrdala

    Re : Programmation en C,la fonction delay.

    Oui c'est conseils son bon mais j'ai juste pas comprit avec les variables.
    <<La détermination mène a la satisfaction>>

  30. #29
    invite03481543

    Re : Programmation en C,la fonction delay.

    Pas besoin de MPLABX avec mikroC pour les bits de config et debugger Une chance !

  31. #30
    bisou10

    Re : Programmation en C,la fonction delay.

    ben bascule++, si bascule vaut 1, ca va donner 2... Ce qui est impossible dans un typage de type booleen.

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Réponses: 8
    Dernier message: 14/08/2015, 14h11
  2. Programmation fonction recursive scilab
    Par invitefeb30a8e dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 24/04/2011, 17h15
  3. programmation de la fonction d'autocorrélation
    Par spray_kim dans le forum Électronique
    Réponses: 4
    Dernier message: 30/04/2009, 18h37
  4. Scilab : fonction "delay" pour un retard pur ?
    Par invite1e8ad136 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 01/02/2009, 20h20
  5. fonction delay sous quartus II
    Par mokermann dans le forum Électronique
    Réponses: 4
    Dernier message: 11/06/2008, 17h21
Découvrez nos comparatifs produits sur l'informatique et les technologies.