[Programmation] Fonction delay en langage C
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 31

Fonction delay en langage C



  1. #1
    skapced072

    Fonction delay en langage C


    ------

    Bonjour à toutes et à tous,
    Je me suis lancé il y a 2 semaines dans la programmation de µcontrôleur. comme tout le monde, j'ai commencé par faire clignoter une led avec la fonction delay puis à l'allumer en fonction de l'état d'une entrée qui à bien fonctionner.
    Là où je coince, c'est en combinant les deux fonctions.
    Code:
    //-----fonction annexe-----
    void delay_ms(uns16 millisec)
    {
    	OPTION=2;
    	do
    	{
    		TMR0=0;
    		while(TMR0<125);}
    	while(--millisec>0);}
    
    //----- fonction principale-----
    void main (void)
    {
    	//----- configuration ports & registre -----
    	PORTB=0;
    	TRISB=0b11110000;		// 1 pour entrée et 0 pour sortie
    	do
    	{
    		if(RB5==1){
    			RB0=!RB0;
    			delay_ms(500);}
    		if(RB5==0){
    			RB0=0;}
    	}
    	while(1);}
    Une fois que l'entrée est activée, la LED se met bien à clignoter mais dès que l'entrée est relachée, elle continu de clignoter (une résistance pull-up est installé / rien ne change si elle est présente ou non). J'ai l'impression que le programme est bloqué dans la fonction delay quand il est dans le µcontrôleur.
    Quand je fais la simulation sur MPLAB, celà fonctionne. Est-ce que quelqu'un peut m'aiguiller car là je sèche? Merci.
    µc => PIC16F628A
    MPLAB v8.90 avec CC5X
    bonne journée.

    -----

  2. #2
    jiherve

    Re : Fonction delay en langage C

    Bonjour,
    A mon avis cela ne sort jamais du second while qui est inutile et n'a pas de condition.
    essayes avec :
    while(TMR0<125);
    {_asm nop _endasm};
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    skapced072

    Re : Fonction delay en langage C

    merci pour ton retour jiherve.
    est-ce qu'il serait possible de me donner un peu plus de détails car je ne vois pas trop comment utiliser la ligne de code communiquer?
    ma question va peut être te sembler bête mais si c'est un problème de condition, la simulation ne devrait pas fonctionner?

  4. #4
    jiherve

    Re : Fonction delay en langage C

    Bonjour
    1 :ben il suffit de l’intégrer dans le code en virant le while(--millisec>0);}
    2:Je n'en sais rien.
    JR
    l'électronique c'est pas du vaudou!

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

    Re : Fonction delay en langage C

    Bonjour,

    une version améliorée de ton code en utilisant ton timer0:
    Code:
    void delay_ms( unsigned int millisec)
    // tempo multiple de 1 milliseconde à 4 MHz
    // utilisant le timer TMR0
    {
        unsigned char next = 0;
    
    
        OPTION = 2; // prescaler par 8
        TMR0 = 2;  
        do  {
            next += 125;        
            while (TMR0 != next)   // 125 * 8 = 1000 (= 1 ms)
                ;
        } while ( -- millisec != 0);
    }

  7. #6
    skapced072

    Re : Fonction delay en langage C

    merci pour vos réponses.
    en utilisant ta solution jiherve, il m'annonce une erreur lors de la compilation. je regarderais ca de plus près une fois mon problème résolu. je pense que ça doit être une erreur de syntaxe.

    j'ai utiliser ton code améliorer HULK, la programmation du µc a fonctionné mais je rencontre toujours le même problème. la led se met bien a clignoter dès que l'entrée est activée mais dès qu'elle n'est plus présente, la led continu de clignoter.
    comme la simulation fonctionne mais que ca bloque quand la prog est dans le pic, est-ce que ca pourrait pas être dût à un bit de configuration ou autres paramètres?

  8. #7
    invite03481543

    Re : Fonction delay en langage C

    Il faut que tu compiles en "full optimization".
    Fais l'essai pour voir.

  9. #8
    invite03481543

    Re : Fonction delay en langage C

    Quelle est la fréquence de ton quartz?
    Un schéma de ton montage?
    Je ne connais pas CC5X mais les déclarations indifférenciées de port me semblent farfelues (entre un port utilisé en sortie ou en entrée... c'est toujours RBx ce qui est plutôt curieux)

  10. #9
    paulfjujo

    Re : Fonction delay en langage C

    bonsoir,


    Code:
    while(TMR0<125);
    {_asm nop _endasm};
    il faut enlever le ; de la 1ere ligne !


    Test sous MikroC, aisément transfereable en MPLABX

    Code:
    // specific to Clicker2 PIC18F87J50
    // le timer0 n'utilise pas OPTION avec ce PIC
    
    sbit LD1 at LATD4_bit;
    sbit LD1_Direction at TRISD4_bit;
    sbit BP1 at RD7_bit;
    sbit BP1_Direction at TRISD7_bit;
    
    
    void delay_Tms(unsigned int millisec)
    {
    	
    /*
    bit 2-0 T0PS2:T0PS0: Timer0 Prescaler Select bits
    111 = 1:256 Prescale value
    110 = 1:128 Prescale value
    101 = 1:64 Prescale value
    100 = 1:32 Prescale value
    011 = 1:16 Prescale value
    010 = 1:8 Prescale value
    001 = 1:4 Prescale value
    000 = 1:2 Prescale value
    */
    //	OPTION=2;
    T0CON=0b11000010;// TMR0 ON et Mode 8 bits Prescaler 1/8   (FOSC=8MHz)
    	do
    	{
    	TMR0L=8;          // (256-8)*8*0.5µS  at 8Mhz
            TMR0IF_bit=0;
    	while(TMR0IF_bit==0);
    	}
    	while(--millisec>0);  
    }
    
    
    
    //  main program
    
      LD1=0;
      do
      {
    		if(BP1==0)
    		{
    			LD1=!LD1;
    			delay_Tms(1000);
    			CRLF1 ;  //  pour visualiser le temps sur le terminal
    		}
    		if(BP1==1) LD1=0;
    			
    
       }
        while(1);

    Test fait sous mikroC, avec un autre PIC et à 8MHz
    avec prescaler=1/4 mais init timer0 avec 8 donc reste à faire (256-8) pour deborder
    soit (256-8)x8x0.5=> 992µS
    le 8 initial pour compenser les durees d'execution externe au timer0
    On laisse faire le timer0 .. et on test le bit de depassement TMR0IF !
    ce qui donne

    Code:
    [2016-10-23 17:48:42:927_R:]  Init Terminal UART1: 9600,8,N,1
    [2016-10-23 17:48:43:466_R:]  Version : 23/10/2016
    [2016-10-23 17:48:43:489_R:]  Test sur Clicker2 PIC18F87J50
    [2016-10-23 17:48:43:529_R:]  Test FOSC ( get Fosc value) :       8000 Khz
    [2016-10-23 17:48:43:583_R:]  Test FOSC (chrono 5sec sur Vbray)
    [2016-10-23 17:48:43:624_R:] 
    [2016-10-23 17:48:43:626_R:] *
    [2016-10-23 17:48:48:628_R:] 
    [2016-10-23 17:48:48:632_R:] #
    // si appui sur BP1
    [2016-10-23 17:49:34:016_R:] 
    [2016-10-23 17:49:35:015_R:] 
    [2016-10-23 17:49:36:013_R:] 
    [2016-10-23 17:49:46:172_R:] 
    [2016-10-23 17:49:47:171_R:] 
    [2016-10-23 17:49:48:170_R:] 
    [2016-10-23 17:49:49:168_R:] 
    [2016-10-23 17:49:50:166_R:] 
    [2016-10-23 17:49:51:166_R:] 
    [2016-10-23 17:49:52:164_R:] 
    [2016-10-23 17:49:53:163_R:] 
    [2016-10-23 17:49:54:162_R:] 
    [2016-10-23 17:49:55:161_R:] 
    [2016-10-23 17:49:56:159_R:] 
    [2016-10-23 17:49:57:158_R:] 
    [2016-10-23 17:49:58:157_R:]
    remettre OPTION=2 au lieu de T0CON pour le 16F628
    Dernière modification par paulfjujo ; 23/10/2016 à 17h01.

  11. #10
    skapced072

    Re : Fonction delay en langage C

    pour la compilation, j'utilise Files\Export. ça permet de créer le fichier hex avec les bits de configuration.

    J'ai aussi joint le schéma (désolé je viens de le faire à main levée).
    Quartz: 4MHz
    C1 et C2: 22pF
    Rled: 330ohms
    Rpull-up: 10kohms

    je vais regarder ta solution paulfjujo

    Nom : schema.jpg
Affichages : 1333
Taille : 36,1 Ko

  12. #11
    invite03481543

    Re : Fonction delay en langage C

    N'oublie pas le condensateur de découplage de ton µC à minima (1µF).
    Quand tu compiles quel message tu obtiens?

  13. #12
    invite03481543

    Re : Fonction delay en langage C

    Vérifie aussi que ton port où il y a le BP est bien relié à la résistance de pull-down de 10K.
    Il n'est pas normal que ton port continu de "voir" un "1" après relâchement du BP....
    Je ne vois pas non plus la résistance de reset de 10K au +Vcc.

  14. #13
    skapced072

    Re : Fonction delay en langage C

    Quel condensateur de découplage?
    message obtenu lors de la compilation:
    Executing: "C:\Program Files\CC5X\CC5X.EXE" 16F628A3.c -CC -fINHX8M -p16F628A -a -L -Q -V -FM
    CC5X Version 3.5F, Copyright (c) B Knudsen Data, Norway 1992-2015
    --> FREE edition, 8-16 bit int, 24 bit float, 32k code, reduced optim.
    16F628A3.c:
    Chip = 16F628A
    RAM : -------- -------- -------- -------- ===***** ******** ******** ********
    40h: ******** ******** ******** ******** ******** ******** ******** ********
    80h: -------- -------- -------- -------- ******** ******** ******** ********
    C0h: ******** ******** ******** ******** ******** ******** -------- --------
    100h: -------- -------- -------- -------- ******** ******** ******** ********
    140h: ******** ********
    RAM usage: 3 bytes (3 local), 221 bytes free
    File '16F628A3.fcs'
    Optimizing - removed 1 instructions (-1 %)
    File '16F628A3.var'
    File '16F628A3.asm'
    File '16F628A3.lst'
    File '16F628A3.cod'
    WARNING: File name limit in COD file exceeded (max 64 characters):
    C:\Users\Cedric\Desktop\prog pic perso\16F628A 3 - Copie\16F628A3.c
    -> string changed to: 16F628A3.c
    ***** SEE README.TXT: COD FILE NAME LIMIT
    File '16F628A3.occ'
    File '16F628A3.hex'
    Total of 53 code words (2 %)
    * Estimated CODE SIZE of full optimization: 41 code words (-22 %)
    Loaded C:\Users\Cedric\Desktop\prog pic perso\16F628A 3 - Copie\16F628A3.COD.
    BUILD SUCCEEDED: Sun Oct 23 17:51:41 2016

    concernant la résistance de pull-down de 10k, elle est bien connecté. est-ce qu'il faut pas que je diminue la valeur?
    en parlant de résistance de reset, de quel résistance parles-tu?

  15. #14
    invite03481543

    Re : Fonction delay en langage C

    Citation Envoyé par skapced072 Voir le message
    Quel condensateur de découplage?
    Tout circuit intégré doit avoir son alimentation découplée, à plus forte raison un circuit Cmos qui consomme lors des commutations.
    C'est la B-A-BA.
    Tout µC possède une broche de reset, il faut aussi faire l'effort d'ouvrir la datasheet du µC que tu cherches à utiliser, le code ne fait pas tout, surtout si déjà tu le copies.
    Sans rien chercher à comprendre ou à faire le minimum d'effort tu vas pas aller bien loin .... l'apprentissage ne consiste pas à ça.

    concernant la résistance de pull-down de 10k, elle est bien connecté. est-ce qu'il faut pas que je diminue la valeur?
    Non, 10K suffit, 100K suffirait tout aussi bien, le problème n'est pas là.
    Dernière modification par HULK28 ; 24/10/2016 à 07h23.

  16. #15
    skapced072

    Re : Fonction delay en langage C

    je te rassure, j'ai la datasheet complète (que j'ai ouverte bien entendu même si mon anglais est rouillé) car j'aime bien comprendre ce que je fais et ce qu'il se passe. concernant le condensateur de découplage, je vais regardé ça de plus près pour le dimensionner, ca peut qu'améliorer le montage.

    concernant la broche de reset (je supose que tu parles de MCLR), cette fonction est désactivé par bit de configuration. je vais la remettre en MCLR et la connecter pour voir si il y a un changement quelconque.

  17. #16
    invite03481543

    Re : Fonction delay en langage C

    Je vois que tu utilises une version free donc il n'y a pas d'optimisation.
    CC5X n'est pas ANSI-C, ce qui n'est pas le meilleur des choix possible.
    Je t'aurai plutôt conseillé MikroC qui lui est ANSI-C et gratuit jusqu'à 2K de prog, ce qui est amplement suffisant quand on débute et tu bénéficieras d'une communauté très au point en matière de µC ainsi que de vastes ressources telles que libstock:
    https://libstock.mikroe.com/

    Non seulement ils développent leurs solutions eux mêmes, contrairement à Microchip qui sous-traite absolument tout, mais le support est parfaitement rodé depuis 10 ans.
    Si tu décides d'acheter un jour ce compilateur, sache que tu ne le paieras qu'une seule fois à vie, pour un prix et une qualité défiant toutes concurrences.
    C'est suffisamment rare dans ce monde d'escrocs du µC et des compilateurs pour le signaler.

  18. #17
    invite03481543

    Re : Fonction delay en langage C

    Citation Envoyé par skapced072 Voir le message
    concernant la broche de reset (je supose que tu parles de MCLR), cette fonction est désactivé par bit de configuration. je vais la remettre en MCLR et la connecter pour voir si il y a un changement quelconque.
    Comme on ne voit nul part dans ton code ces bits de config...
    Fais une copie écran de la config projet (µC, freq, bits config, etc), tu as sans doute une page dédiée à ça.

  19. #18
    CaptainDoc

    Re : Fonction delay en langage C

    Salut, niveau language je peux pas trop te dire, mais il me semble que la résistance de pull--- n'est pas correct. On utilise pour le coup une résistance de pull-down et non pull up. Quand ta sortie 4 est HIGH, ta led est bien alimenté. Quand elle est à LOW, tu n'as pas d'après le schéma à la main, de retour à la masse. Je brancherai un résistance de pull down entre la sortie 4 et le GND.
    Peut être c'est ça, peut être non

  20. #19
    invite03481543

    Re : Fonction delay en langage C

    Tu ferais mieux de te rendormir

  21. #20
    antek

    Re : Fonction delay en langage C

    Faut pas laisser trainer des trucs comme ça, c'est une source d'ennuis inconnus :
    Code:
    WARNING: File name limit in COD file exceeded (max 64 characters):
    C:\Users\Cedric\Desktop\prog pic perso\16F628A 3 - Copie\16F628A3.c
    -> string changed to: 16F628A3.c
    ***** SEE README.TXT: COD FILE NAME LIMIT
    Je pense aussi à la gestion absente des rebonds de l'interrupteur.

  22. #21
    polo974

    Re : Fonction delay en langage C

    Bonjour,

    On arrive aux limites du:
    while (pas_fini) {faites_chauffer_le_cpu;}

    quand le micro tourne (comme un fou) dans la tempo, il ne s'occupe pas du clavier.
    les seuls moments où il va voir si ça bouge coté bouton, c'est au moment de changer la led soit 2 fois par seconde.

    mais durant tout ce temps le proc tourne à 100%...

    il faut donc rapidement envisager l'usage des interruptions et instructions du genre sleep (pour mettre le proc en veille jusqu'au prochain moment).

    d'abord avec le timer, puis ajouter les io.

    2 solutions:
    • une interruption qui réveille périodiquement (vive les timers) , et le proc regarde à gauche et à droite ce qu'il se passe sur les io (et traite, tant qu'à faire).
    • des interruptions sur chaque source d'événements, pour se réveiller au plus tôt, mais attention, c'est plus compliqué...
    Jusqu'ici tout va bien...

  23. #22
    skapced072

    Re : Fonction delay en langage C

    je vais regarder avec MikroC, je suis sur MPLAB car il était fournit avec le programmateur.
    pour la page des bits de config, j'en ai bien une, je vais posté la capture ce soir.

    concernant la remarque d'antek, je vais mettre le projet autre part avec un chemin d'accès moins long, ca fera une possible source d'erreur en moins.

    polo, le soucis est que même le bouton est relaché, le µc continu le clignotement de led, je vais regarder la data pour l'utilisation de l'interruption

  24. #23
    Seb.26

    Re : Fonction delay en langage C

    Pin1 = RB5 ... qui peut avoir une pullup interne.

    Donc essaye de retirer ta pulldown, connecte ton BP sur GND+RB5 et vois ce que cela donne (il faudra inverser l’état du BP)

    NB: si ça clignote c'est que ta fonction delay marche bien et que tu ne reste pas coincé dedans
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  25. #24
    invite03481543

    Re : Fonction delay en langage C

    Peut mais à condition de déclarer OPTION_REG<bit7> -> /RBPU à 0, par défaut ce bit est à 1, donc pull-up disabled.

  26. #25
    skapced072

    Re : Fonction delay en langage C

    j'ai installé le condo de découplage.
    Voici les bits de configuration:
    Nom : bits config.jpg
Affichages : 1353
Taille : 82,8 Ko

    concernant la remarque d'antek, j'ai changé le chemin d'accès pour avoir un soucis de moins.

    par contre, suite à la remarque de seb, j'ai constaté un fonctionnement bizarre:
    ¤ à la mise sous tension rien ne se passe (normal)
    ¤ à l'appui sur le bp, la led clignote (ok aussi)
    ¤ je lâche le bp, le clignotement continu (problème qui m'a fais créer le post)

    mais ce que je viens de m'apercevoir, si je met le pôle du bp à la masse et que j'appui dessus (ce qui shunt la résistance de pull) ca eteint la led
    dès que je relache le bp, le clignotement reprend

    autre remarque quand je fais la simulation (uniquement logiciel sur MPLAB): au lancement, TMR0 ne s'incrémente pas (j'ai un visu sur sa valeur grâce à la fenêtre Watch). a l'appui du bp, il se lance.
    quand je relache le bp, la sortie arrête son changement d'état mais TMR0 continu son incrémentation. est-ce que ça ne serait pas lié au problème que je rencontre?

  27. #26
    skapced072

    Re : Fonction delay en langage C

    problème résolu

    merci à tous de m'avoir apporter votre aide et grand merci à HULK et Seb de m'avoir mit sur la voie.

    le problème venait de la config d'OPTION dans la fonction delay:
    Code:
    void delay_ms(uns16 millisec)
    {
    	unsigned char next =0;
    
    	OPTION=2;		//prescaler par 8
    	TMR0=2;
    	do {
    		next+=125;
    		while(TMR0 != next);}//125*8=1000 (=1ms)
    	while (--millisec != 0);}
    en mettant OPTION=2, /RBPU (bit7) était mis à zéro activant les pull-ups (je suppose en interne) alors que j'en ai une physiquement.

    voici le nouveau code:
    Code:
    void delay_ms(uns16 millisec)
    {
    	unsigned char next =0;
    
    	OPTION=0b10000010;		//prescaler par 8
    	TMR0=2;
    	do {
    		next+=125;
    		while(TMR0 != next);}//125*8=1000 (=1ms)
    	while (--millisec != 0);}
    depuis que je laisse le bit /RBPU à 1, ca fonctionne
    je continu mon apprentissage des µC et encore merci à tous

  28. #27
    invite03481543

    Re : Fonction delay en langage C

    Reposte stp ton code actualisé ET complet qui a du évoluer j'imagine depuis le début de cette discussion.
    Quand nous verrons les bits de config qui va avec ton programme on pourra te dire si il y a quelque chose d'anormal.
    Je m'y perd un peu entre le code que tu testes, BP à la masse ou pas, etc

  29. #28
    invite03481543

    Re : Fonction delay en langage C

    Bon ben tant mieux.

  30. #29
    skapced072

    Re : Fonction delay en langage C

    oups désolé
    voici le schéma de base qui est identique au début (sauf un condo de découplage de rajouté):
    Nom : schema.jpg
Affichages : 1260
Taille : 36,1 Ko

    voici le code complet qui fonctionne:
    Code:
    //-----fonction annexe-----
    void delay_ms(uns16 millisec)
    {
    	unsigned char next =0;
    
    	OPTION=0b10000010;		//prescaler par 8
    	TMR0=2;
    	do {
    		next+=125;
    		while(TMR0 != next);}//125*8=1000 (=1ms)
    	while (--millisec != 0);}
    
    //----- fonction principale-----
    void main (void)
    {
    	//----- configuration ports & registre -----
    	PORTB=0;
    	TRISB=0b11110000;		// 1 pour entrée et 0 pour sortie
    	do
    	{
    		if(RB5==1){
    			RB0=!RB0;
    			delay_ms(500);}
    		if(RB5==0){
    			RB0=0;}
    	}
    	while(1);}
    logiciel: MPLAB v8.9 avec CC5X v3.5F
    programmateur: MULTIPIC avec logiciel PICkit2 v2.61

  31. #30
    Seb.26

    Re : Fonction delay en langage C

    Citation Envoyé par skapced072 Voir le message
    problème résolu
    merci à tous de m'avoir apporter votre aide et grand merci à HULK et Seb de m'avoir mit sur la voie.
    De rien, tant mieux, il me semblait bien que ça ressemblait à un truc comme ça ...

    Par contre, tu peux quand même faire comme je proposais en #23 : supprimer ta pulldown externe et utiliser les pullup internes du cpu ...
    @+
    Dernière modification par Seb.26 ; 25/10/2016 à 09h42.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Programmation en C, la fonction delay.
    Par terrdala dans le forum Électronique
    Réponses: 49
    Dernier message: 24/08/2015, 12h16
  2. fonction en langage c
    Par kechnakoya dans le forum Programmation et langages, Algorithmique
    Réponses: 9
    Dernier message: 31/10/2014, 09h30
  3. 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
  4. fonction delay sous quartus II
    Par mokermann dans le forum Électronique
    Réponses: 4
    Dernier message: 11/06/2008, 17h21
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...