Pic 16F886 pour générer des pulses à 38Khz
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

Pic 16F886 pour générer des pulses à 38Khz



  1. #1
    Ezechkiel

    Pic 16F886 pour générer des pulses à 38Khz


    ------

    Bonjour,

    Voila je vous expose ma mission je doit réaliser entre autre chose une série de pulse à 38Khz, puis une pause et rebelote.
    Pour cela j'utilise un pic 16F886 sur l'horloge interne à 8Mhz avec SDCC comme compilateur et Context comme "IDE".

    Je me suis dit que j allai utiliser les interruptions avec un timer, vu qu'il ne va pas réaliser que cette opération, loin de la.

    Bref, mon souci est que je n'arrive pas quoi que je tente à avoir une fréquence de pulse fiable à 38Khz, voir je n'arrive pas du tout à l'atteindre.

    donc voici mon code :

    Code:
    // Main program
    // Pic 16F886
    // version : 16/07/2011
    
    
    #include "pic16F886.h"
    
    int count=0;
    
    void main(void) {
    
    
    OSCCON = 0x71; //configuration horloge interne du pic à 8MHz
    
    T1CON = 0x81 ; // enable timer 1 sans prescaler
    TMR1H = 0xFF ;
    TMR1L = 0xE3 ; // 0xFFFF - 0xFFE3 = 28 => 28 x 0.5 µs = 14 µs
    TMR1IE = 1 ; // On autorise les interruptions du timer 1
    
    // Autorisation des interruptions
    PEIE = 1 ; // Autorisation des IT peripherique
    GIE = 1 ; // Autorisation général des IT
    
      // *********************GPIO  Initialization  *********************
      ANSEL=0x00;
      TRISA0=0;
      TRISC0=0;
      TRISC1=0;
      RA0=0;
      RC0=0;
    // **********************************************************
    while(1)
     {
        RC0=1;            //allume la LED1
     }
    }
    
    void Intr(void) __interrupt 0
    {
     if(TMR1IF==1)
     {
       count++;
       if (count <=30){    // lance 30 toggle=15 pulse
          if (RA0==0){
             RA0=1;
          }
          else {
          RA0=0;
          }
       TMR1H = 0xFF ;
       TMR1L = 0xE3 ;
       }
       else{
       count=0;
       TMR1H = 0xDF ;   //Delay entre deux series de pulse
       TMR1L = 0xCF ;   // reste a définir
       }
     TMR1IF = 0 ;
    
     }
    }
    donc si quelqu'un aurait une idée, du pourquoi cela ne marche pas comme je le suette. Sinon si quelqu'un a une astuce plus intéressante je suis preneur (changer de timer, utiliser une autre façon de coder...). Je tien à re-souligner qu'il faut absolument que cela ne mobilise le pic que sur de courte période et pas tout le temps.

    Je vous remercie d'avance pour vos futur proposition

    Amicalement Ezechkiel

    PS: je débute sur les PICs, juste une semaine à mon actif.

    -----

  2. #2
    Ezechkiel

    Re : Pic 16F886 pour générer des pulses à 38Khz

    pardon j'oubliai les config que je fais manuellement sous le soft du pickit3:

    config1:0x2cf4
    config2:0x0700

  3. #3
    ftorama

    Re : Pic 16F886 pour générer des pulses à 38Khz

    Qu'obtiens-tu à la place de ton 38kHz?

    Il faudrait vérifier la datasheet, mais les oscillateurs internes ne sont pas réputés pour leur précision. Il faudrait peut-être songer à mettre un quartz...

  4. #4
    MiGaNuTs

    Re : Pic 16F886 pour générer des pulses à 38Khz

    Citation Envoyé par Ezechkiel Voir le message
    pardon j'oubliai les config que je fais manuellement sous le soft du pickit3:

    config1:0x2cf4
    config2:0x0700
    Bonjour,

    Déja remplace ton
    Code:
    if (RA0==0){
             RA0=1;
          }
          else {
          RA0=0;
          }
    par

    Code:
    RA0=!RA0
    Tu va gagner un peu de temps d'exécution de ta boucle d'interruption, parce que si tu rate des top, c'est qu'a un moment il y'en a un (ou plus) qui se produit alors que tu est encore dans ton sous prog d'interruption.

    Il y'a moyen de gagner encore un peu en décrementant ta variable count et en la comparant a zéro, plutôt que de la comparer a une certaine valeur.

    du genre :
    Code:
    count --
    if count !=0
     machin
    else 
     count=30
     truc
    endif

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

    Re : Pic 16F886 pour générer des pulses à 38Khz

    Est-ce que la durée sans pulse est un multiple de la durée de ton IT ?

    Si oui : utilise un Timer fixe qui s'auto ré-arme (au hasard : Timer2) calé sur tes 14uS + une variable pour savoir si tu dois générer des pulses ou non.

    Et remplace ton int par un unsigned char ... dans un uCPU, le int c'est le mal !!! ;o) ... il faut toujours bien dimensionner ses variables !
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  7. #6
    Ezechkiel

    Re : Pic 16F886 pour générer des pulses à 38Khz

    Citation Envoyé par ftorama Voir le message
    Qu'obtiens-tu à la place de ton 38kHz?

    Il faudrait vérifier la datasheet, mais les oscillateurs internes ne sont pas réputés pour leur précision. Il faudrait peut-être songer à mettre un quartz...
    le point fort de ce pic est que l'oscilo interne tourne à 8Mhz à 1% prés.
    Sinon pour le moment j'obtiens du 11Khz.
    Je vais tester vos suggestion, je vous au courant.

    Merci ^^

  8. #7
    Ezechkiel

    Re : Pic 16F886 pour générer des pulses à 38Khz

    Avec les modifes de MiGaNuTs que je trouve trés astucieuse, je passe à 10Khz.

    utilise un Timer fixe qui s'auto ré-arme (au hasard : Timer2) calé sur tes 14uS + une variable pour savoir si tu dois générer des pulses ou non.
    Je faisais cela avant de choisir les interruptions, avec les Timer0 que je réinitialisé lorsque je généré mon toggle (changement d'état), mais j'avai pas une super stabilité dans mon résultat. Je vais peut être retenter cela en optimisant un peux plus la chose.

    encore merci.

  9. #8
    Seb.26

    Re : Pic 16F886 pour générer des pulses à 38Khz

    Si tu trouve que ça consomme trop de CPU, utilise le module PWM du PIC ... il ne te restera plus qu'a faire le timing pour ON/OFF du PWM ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  10. #9
    Ezechkiel

    Re : Pic 16F886 pour générer des pulses à 38Khz

    Si je pouvais utiliser le pwn sa serait pas mal, mais je doit avoir un gros soucit avec ma clock.

    pour le moment avec un simple code comme celui-ci

    Code:
    #include "pic16F886.h"
    
    
    
    
    void main(void) {
    
    
    
    
      //configuration horloge interne du pic à 8MHz
      OSCCON = 0x71;
    
    
    
      // *********************GPIO  Initialization  *********************
      ANSEL=0x00;
      TRISA0=0;
      TRISC1=0;
      RC1=0;
      RA0=0;
    // **********************************************************
    while(1)
     {
    
    
        RA0=!RA0;
    
     }
    }
    je tourne a 37Khz... c'est vraiment pas normal, j ai beau lire la datasheet dans tous les sens, je trouves rien qui cloche dans les configue

  11. #10
    Aurélien

    Re : Pic 16F886 pour générer des pulses à 38Khz

    Qu'il nen déplaise aux spécialistes du "bouh l'assembleur c'est pour les vieux, c'est depassé", il va falloir regarder ce qui se passe dans ce qu'a produit ton compilo a partir de ton code en C si simple !
    Ton PIC n'execute pas du C mais des codes assembleurs, qu'il va falloir décortiquer.

    Sinon, pour ton appli, je rejoins ce qui a été dit plus haut, utilises un module PWM pour générer le 38kHz, que tu viens commuter quand tu veux, ça soulagera grandement ton programme car tu pourras faire des choses apres...

    Aurélien

  12. #11
    Seb.26

    Re : Pic 16F886 pour générer des pulses à 38Khz

    Citation Envoyé par Aurélien Voir le message
    Qu'il nen déplaise aux spécialistes du "bouh l'assembleur c'est pour les vieux, c'est depassé", il va falloir regarder ce qui se passe dans ce qu'a produit ton compilo a partir de ton code en C si simple !
    Très probablement une perte de temps, mais il faut le faire ... ... on sait jamais ...

    Poste ton .asm si tu veux ... les pro-ASM te diront que c'est du sale code, mais que c'est OK ...

    je tourne a 37Khz... c'est vraiment pas normal, j ai beau lire la datasheet dans tous les sens, je trouves rien qui cloche dans les configue
    Pas sûr que ce soit si anormal ... 8MHz c'est pas énorme ...

    Et comme je suis quand même un gars sympa, j'ai repris une carte avec un 18F2550 qui tourne sur son osc interne à 8MHz, et j'ai mis le même code que toi : un while(1) qui inverse une pin et aucune IT.

    ça donne : Nom : while.png
Affichages : 112
Taille : 11,9 Ko

    En gros : utilise le PWM hard !!!
    Dernière modification par Seb.26 ; 19/07/2011 à 11h07.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  13. #12
    Seb.26

    Re : Pic 16F886 pour générer des pulses à 38Khz

    Avec un if à la place du ! ... mon compilo va + vite ...

    Peu importe ... de toute façon : utilise le PWM hard, ça n'a aucun sens de faire ça en soft ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  14. #13
    Ezechkiel

    Re : Pic 16F886 pour générer des pulses à 38Khz

    Citation Envoyé par Seb.26 Voir le message
    Avec un if à la place du ! ... mon compilo va + vite ...
    Vi j'ai eut les méme résultat que toi ^^ j'ai tester un peut toute sorte de possibilité aujourd hui... et en effet le if est le plus rapide, je vais tester le hard pwm demain, on verra bien.

    En tout cas merci de vos réponse

    PS: j ai maté les code .asm aussi ... sa ma rappelé de lointain souvenir, je suis loin d être un expert mais j'arrive à comprendre ... les grosses lignes.

    Je vous tien au jus de mon avancé

  15. #14
    alainav1

    Re : Pic 16F886 pour générer des pulses à 38Khz

    bonjour,
    ne peux tu pas insérer de l'assembleur (des bcf et de bsf pour inverser et quelques nop entre ces commandes pour ajuster le temps) ?

    cordialement
    alain
    Décider de faire, c'est bien . Décider quand, c'est mieux !

  16. #15
    Ezechkiel

    Re : Pic 16F886 pour générer des pulses à 38Khz

    Bonjour,
    ne peux tu pas insérer de l'assembleur
    Moi je pourrai, mais les personnes qui risque d'utiliser le programme, le ne peuvent pas.

    Sinon je tien à vous remercier tous, j'ai utilisé le pwm du pic, et ça marche nickel.

    Il n'y avait pas de probléme de config ou autre, dison juste pour faire simple, comme l'on dit certain :
    8MHz c'est pas énorme ...
    Encore un grand merci a tous

  17. #16
    alainav1

    Re : Pic 16F886 pour générer des pulses à 38Khz

    bonjour,
    tu as utilisé le pwm du pic .
    tu peux nous en dire plus ?
    cordialement
    Alain
    Décider de faire, c'est bien . Décider quand, c'est mieux !

  18. #17
    Ezechkiel

    Re : Pic 16F886 pour générer des pulses à 38Khz

    Citation Envoyé par alainav1 Voir le message
    tu as utilisé le pwm du pic .
    tu peux nous en dire plus ?
    Bien sur J'ai utiliser les Pwm qui permet notamment de gérer les pont en H ( c est une amélioration du pic 16F886 par rapport au 16F876), car les GPIO CCP1 et CCP2 sont déjà utilisé et ne peuvent être changé. Du coup j'utilise le GPIO RB2 pour cela.

    Voici le code de configuration de mon PWM pour obtenir du 38Khz:

    Code:
    // Pic 16F886
    // version : 16/07/2011
    
    
    #include "pic16F886.h"
    void Init_PWM();
    
    int main ()
    {
      TRISB2=0;                     //Output PWM
      //GPIO value Initialization
      RB2=0;
     
    Init_PWM();
    
    while(1)
    {
    }
    }
    
    void Init_PWM()
    {
    OSCCON=0x71; //8MHZ 
    PR2= 51; // Set the PWM period by loading the PR2 register.
    CCP1CON = 0xCC ; // Configure the CCP module for the PWM mode
    CCPR1L=25; // Set the PWM duty cycle by loading the CCPRxL registe
    //Configure and start Timer2:
    T2CON=4; // Enable PWM output after a new PWM cycle has started:
    }
    Il est vraiment stable. Cela est très pratique ci vous désiré obtenir un signal indépendant de tout ce qu'il ce passe dans votre main.

  19. #18
    alainav1

    Re : Pic 16F886 pour générer des pulses à 38Khz

    merci pour ces infos.
    cordialement
    Alain
    Décider de faire, c'est bien . Décider quand, c'est mieux !

Discussions similaires

  1. Generer des impulsions de 25ms pour commande de pompe.
    Par invite2313209787891133 dans le forum Électronique
    Réponses: 20
    Dernier message: 07/01/2012, 09h36
  2. PWM sur un Pic 16f886 - Besoin d'une autre paire d'yeux...
    Par invite08c749d2 dans le forum Électronique
    Réponses: 4
    Dernier message: 16/02/2010, 21h08
  3. Aide pour LCD graphique + PIC 16F886
    Par invite1817c4c0 dans le forum Électronique
    Réponses: 7
    Dernier message: 27/01/2010, 20h52
  4. [PIC 16f886] Un simple code ne marche pas
    Par blinkseb dans le forum Électronique
    Réponses: 2
    Dernier message: 01/02/2009, 14h34
  5. Réponses: 5
    Dernier message: 29/07/2008, 22h23
Découvrez nos comparatifs produits sur l'informatique et les technologies.