Probleme avec delay_us()
Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

Probleme avec delay_us()



  1. #1
    invite49060bcb

    Question Probleme avec delay_us()


    ------

    Bonjours !
    svp je veux creer un code qui me donnera sur la broche C0 de mon PIC16F876A un signal carre TTL de 1 us comme periode (1MHz)
    mon Pic fonctionne avec un oscillateur de 20 MHz, j'utilise comme compilateur le CCS PIC C Compiler.

    quand je compile le code suivant ca me donne un signale avec une frequence tres faible, 2 ou 3 et quelques KHz...!!

    while(1)
    {
    ouput_high(PIN_C0);
    delay_us(1);
    output_low(PIN_C0);
    delay_us(1);
    }

    certain me proposeront le truc du NOP mais plutot ce que je veux est creer une fonction qui recevera en parametre un chiffre qui se traduira par la suite en delais en microsecondes et non pas en millisecondes

    le signal avec la frequence la plus grande (7 kHz) que j'ai pu obtenir, je l'ai obtenu grace a la fonction suivante :

    void delais_perso(int32 x)
    {
    while(x--);
    }


    je ne crois pas qu'il existe un code plus optimise que celui la !

    ou resite l'incapacite pour generer mon signal de 1us de periode ?
    dans mon code, mon pic, mon oscillateur ou dans mon compilateur ?

    MErci d'avance

    -----

  2. #2
    invite29971eb1

    Re : Probleme avec delay_us()

    Un PIC16 à 20MHz fonctionne en réalité à 5MHz, ce qui veut dire que si tu veux sortir un signal à 1MHz, il faut que ta boucle tienne en 5 instructions assembleur.
    Là tu utilises des fonctions C qui doivent prendre plusieurs dizaines de temps de cycle pour y entrer et en revenir, sans compter tout le fonctionnement interne de ces fonctions.

    De toutes façons, le calcul est simple, pour un quartz à 20MHz, fonctionnement à 5MHz:
    - pour un signal à 7kHz, le processeur a besoin de 5000000/7000= 714 instructions assembleur environ
    - pour un signal à 3kHz, 5000000/3000 = 1666 instructions environ

    Tu as deux solutions:
    - te coller à l'assembleur et attaquer directement les bits du registre (sous réserve que ce soit possible en si peu de cycles sur PIC16
    - utiliser un timer qui fonctionne indépendamment du programme pour générer ton signal

  3. #3
    Forhorse

    Re : Probleme avec delay_us()

    +1
    Le but recherché, et surtout la méthode, n'est pas réaliste.
    D'autant plus que le 16F876 est équipé d'un module capture/compare/PWM qui est précisément fait pour ça.

  4. #4
    invite29971eb1

    Re : Probleme avec delay_us()

    Citation Envoyé par Forhorse Voir le message
    +1
    Le but recherché, et surtout la méthode, n'est pas réaliste.
    D'autant plus que le 16F876 est équipé d'un module capture/compare/PWM qui est précisément fait pour ça.

    Ca tient en assembleur, mais c'est sur que c'est peu efficace et aux limites du PIC16....

    Tu peux descendre à 4 temps de cycle soit 1,25MHz, mais le micro ne devra rien faire d'autre. Pour du 1MHz, on rajoute un NOP:
    Code:
    loop:
    bcf PORTC,0    ; 1 temps de cycle (tcy)
    bsf PORTC,0    ; 1 tcy
    nop                  ; 1 tcy
    goto loop          ; 2 tcy
    ; total: 5 tcy
    Il faudra prendre soin de désactiver les optimisations de code sur cette portion, certains compilos n'appréciant pas de voir une broche changer d'état dans deux instructions consécutives

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

    Re : Probleme avec delay_us()

    et si mon programe reste toujours en C mais par contre je crees une fonction delais avec du code assembleur de dans, est ce ca ferais l'affaire ou bien ca revienderais en meme ?

  7. #6
    invite29971eb1

    Re : Probleme avec delay_us()

    Citation Envoyé par bimo Voir le message
    et si mon programe reste toujours en C mais par contre je crees une fonction delais avec du code assembleur de dans, est ce ca ferais l'affaire ou bien ca revienderais en meme ?
    Tu lis les réponses qu'on te fait ou non?

    Re-regarde la réponse #2, le C mange des dizaines de temps de cycle et ta méthode requiert que tout passe en 5 temps de cycle, ce qui est rigoureusement impossible avec ta méthode. Il faut utiliser un timer....

    A quoi va servir ce signal? Je crains un problème mal compris, et donc une méthode mauvaise à la base

  8. #7
    invite49060bcb

    Re : Probleme avec delay_us()

    Rebonjour et desole si j'ai tarde pour repondre
    oui je crois que vous avez raison, bon...si vous voulez j'ai un peu exagere quand j'ai demander un signal de 1 MHz, en verite j'ai volu savoire quellle frequence pourrais-je atteindre avec
    mon pic et toute cette histoire ete pour pouvoir generer un signal PWM a frequence d'enviren 22 kHz ou un peu plus....bon j' expose mon soucis..
    j'ai concus un ciruit pour controler la vitesse d'un moteur DC, avec un MOSFET et tout....etc
    le circuit fonctionnr tres bien , j'ai ecris un code qui me genere un signal PWM sur la broche C0 de mon PIC16F876A et sans utilise le module PWM intergrer de mon pic (car je ne vais pas vous cacher que je ne le maitrise pas encore et que je n'ai jamais fais un test avec)
    bon jusqu'a maitenant tout fouctionnais tres bien jusqua ce que je me suis apercus du son nuisant que mon moteur DC emet, avec un oscilloscope j'ai visualiser mon signal sortant du PIC et calcule la frequence que j'ai trouve egale a enviren 1.4 Khz en optimisant encore et encore mon code j'ai pu attendre une frequence d'enviren 7 Khz mais qui ete encore plus pire que la premiere car le son s'est accentue encore plus !
    quand j'ai fais le test avec un generateur de fonctions, j'ai genere un signal PWM de 20 Khz avec le quel j'ai pu controler bien la vitesse de mon moteur DC et le son ete presque inaudible . donc a 22 ou a 24 Khz je crois que je n'entenderais plus rien car les oreilleshummaines n'entends pas les son qui sont au delas des 24 Khz.
    donc voici ma problematique, avec mon code acctuel je ne peu plus augmenter de frequence, est ce que vous pensez qu'avec la methode du Timer et le module PWM integre de mon PIC je pourrais generer un tel signal ?
    et autre question svp si je n'abuse pas trops de votre temps...est ce que c'est modules (PWM) fonctionnent independement dans le pic ou bien leurs resultats sont influences par le code du programme ? autrement dit...si le module est configure pour me sortir un signal de X Khz en frequence et 30% de rendement (par expl) et j'effectue des test sur des entrees (boucles....conditions...etc) est ce que ca affectera le signal ?

    Merci d'avance

  9. #8
    RISC

    Re : Probleme avec delay_us()

    Salut,

    L'avantage de l'unité CCP (Capture Compare PWM) est que c'est une unité indépendante avec son propre timer et donc une fois programmé le PWM n'a aucun jitter et fonctionne complètement indépendamment du programme ;=)

    On peut ainsi atteindre des fréquences beaucoup plus élevées que ce que l'on peut faire par logiciel sur une broche ;=)

    Au vu de tes fréquences faibles de PWM tu n'auras aucun problème

    A ce sujet, je te recommande d'utiliser plutôt le PIC16F886 qui est compatible broche à broche avec le PIC16F876A pour piloter un moteur DC ou BLDC. Une des principales différences est qu'une des unités de PWM est un ECCP au lieu de CCP.

    L'unité ECCP (Enhanced CCP) gère automatiquement l'insertion du Dead-time ;=)
    Donc si tu pilotes un demi-pont ou un pont en H, cela empêche le court-circuit lors de la commutation ;=)
    De plus la résolution PWM est je crois supérieure à celle du PIC16F876A ainsi que la fréquenc de fonctionnement max.

    cherches sur g..gle tu trouveras des dizaines d'exemples de pilotage de moteurs DC avec les PIC16.

    a+
    Dernière modification par RISC ; 29/12/2011 à 00h54.

  10. #9
    invite49060bcb

    Thumbs up Re : Probleme avec delay_us()

    Merci Beaucoup Mr.RISC pour tout ces eclaircissement !! you've been a big help
    j'irais tout de suite car toutes cette histoire commence a me prendre un peu la tete
    Merci encore pour votre aides
    je fairais un test et je vous posterais le raport
    Bonne soiree

  11. #10
    invite49060bcb

    Re : Probleme avec delay_us()

    Bon.... apres une sacree recherche sur internet j'ai pu comprendre le mecanisme interne
    des module PWM, et j'ai eu quelques exemples qui expliquent comment determiner la
    frequence ainsi que le rapport cyclique ce qui a donne comme fruit le code suivant :

    //============================== ============================== ======
    void main()
    {
    long duty=0;

    SET_TRIS_C(0x00); // toutes les broches en sortiees
    SET_TRIS_B(0xFF); // toutes les broches en entrees
    setup_ccp1(CCP_PWM);
    setup_timer_2(T2_DIV_BY_1 , 249 , 1); // pour un signal de 20Khz


    ouput_C(0x00);


    while(1)
    {
    if(!input(PIN_B0)) // entree du boutton "Accelerer"
    {
    duty++;
    set_pwm1_duty(duty);
    }

    if(!input(PIN_B1) && duty > 0) // entree du boutton "Decelerer"
    {
    duty--;
    set_pwm1_duty(duty);
    }

    }

    }
    //============================== ============================== =======

    alors j'ai branche la sortie C2 de mon PIC sur mon oscillo, et surprise !
    des que j'alimente ce dernier, je recupere un signal carre de frequence 20 KHz exact !

    deja pas mal!

    parcontre...,je ne sais pas pour quelle raison il ne se passe auccun changement quand j'appuis sur mes bouttons !!

    et autre chose, dans le premier test, le signal que j'ai eu avais un rapport cyclique de 50%
    (ou plus ou moin), en redemarrant mon PIC j'ai eu un Rappor cyclique different , d'envirent 10%....et encore et encore...!
    a chaque fois je redemarrais mon PIC je recuperais un nouveau signal !

    mais d'ou vien ce signal ?!

    est ce que je me suis trompe dans quelque chose ?
    pourquoi mes bouttons ne repondent pas ?

    j'ai meme annule la lecture des entree B0 et B1 pour virer la theorie que ca peut venir des entrees elles meme, donc j'ai remplace par le code suivant :


    while(1)
    {
    duty++;
    set_pwm1_duty(duty);
    delay_ms(100);
    }

    mais idem !....le signal reste fige !

    je ne comprend plus rien !

    des idees ?

    MErci d'avance

  12. #11
    invite49060bcb

    Re : Probleme avec delay_us()

    Svp ........................?!!

  13. #12
    RISC

    Re : Probleme avec delay_us()

    Salut,

    Je ne connais pas le compilateur CCS...
    Il faut commencer par lire la datasheet du PIC16F876A chapitre 8. C'est la référence

    2/ tu lis le manuel de ton compilateur CCS

    3/ le plus simple est de chercher des exemples de PWM sur le site de CCS ;=)
    Il y a aussi des forums ...

    En 5s montre en main on trouve cela : http://www.ccsinfo.com/forum/viewtop...=17729&start=1
    http://www.roboticsindia.com/showthr...-CCS-compiler?

    Et il y en a plein d'autres...

    Aide-toi...le ciel t'aidera et g..gle reste ton meilleur allié

    a+

  14. #13
    invite49060bcb

    Re : Probleme avec delay_us()

    Mais c'est exactement de ce site la d'ou je me suis inspirer pour ecrire mon petit programme test sidessus....oui j'irais la bas et j'exposerais mon soucis si vous pensez que le probleme pourra provenir de mon compilateur ...?
    mais au moin est ce que vous pensez que mon code est juste et je n'est pas oublie quelque choses ?
    MErci encore !

  15. #14
    RISC

    Re : Probleme avec delay_us()

    Salut,

    Le compilateur CCS est particulier...Il intègre des librairies spécifiques pour tous les périphériques qui sont facile à comprendre pour les utilisateurs mais...incomptible avec tous les autres compilateurs. Je n'ai donc aucune base pour dire si ton programme est correct ou non.

    Je te rassure...la probabilité que cela vienne d'un PB du compilateur est de 0,00001%...la plupart du temps le PB se trouve tout simplement dans le programme ;=)
    Si tu utilises ce compilateur, la meilleure source reste bien sûr les forums sur le site de ...CCS ou tu trouveras des experts de ce compilateur ;=)

    a+

  16. #15
    invite49060bcb

    Re : Probleme avec delay_us()

    chose faite

    Merci encore !

  17. #16
    invite49060bcb

    Re : Probleme avec delay_us()

    apres un sacret casse tete, en fin j'ai pu trouve le problem...et j'ai volu partaer ca avec vous, au cas ou quelque comme oui dans le future roncontrera le meme soucis
    bon...sans introductions..le probleme provenais de mon compilateur qui ete une version tres anciene est non corrige de tout les bug (et pourtant j'arrivais a ecrire plusieurs code pour des PIC16F877 et 876) masi je n'ai jamais travaille avec les module CCP1 PWM de mes pic....c'est le moment alors
    mon enciene verci ete CCS PCM 3.200, que j'ai remplace maintenant par "PIC C Compiler CCS PCWHD 4 093" et qui possede une interface tres explicite et genere un conde qui fonctionne a 100%
    (je ne fais pas de pub mais je decrit juste ce que j'ai trouve)

    bon je vous remerci tous pour vos suggestions et a la prochaine

  18. #17
    RISC

    Re : Probleme avec delay_us()

    Salut,

    Merci de ton retour.
    La conclusion c'est qu'il faut toujours vérifier si on utilise une version récente des compilateurs...et le mettre à jour si nécessaire
    Plus elle est récente et moins on risque d'éponger des bogues de jeunesse ;=)

    a+

Discussions similaires

  1. problème avec exercice asm avec nasm et interruption dos 21h
    Par inviteb17448ba dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 13/12/2011, 06h27
  2. Réponses: 0
    Dernier message: 26/04/2011, 22h25
  3. Réponses: 10
    Dernier message: 22/03/2009, 11h34
  4. [Blanc] Probleme avec tele Philips avec chassis L01.E
    Par invite7bf023ca dans le forum Dépannage
    Réponses: 2
    Dernier message: 20/03/2009, 19h27
  5. probleme avec vista -> lecture du son avec fichier .mpg
    Par invite7f1547ae dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 23/01/2008, 23h28
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...