[PIC18F2455] Problème avec Delay1TCY
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

[PIC18F2455] Problème avec Delay1TCY



  1. #1
    Tupac Shakur

    Angry [PIC18F2455] Problème avec Delay1TCY


    ------

    Bonjour à tous,

    Je suis en train de programmer un pic 18f2455 avec MPLAB et le compilateur C18.

    Dans mon programme j'ai besoin de faire des pauses de 480µs et 230µs et 70µs.

    Le compilateur C18 à une librairie delays.h avec les fonctions suivantes :

    Delay1TCY(); // Temporisation fixe de 1 temps de cycle.

    Delay10TCYx(unsigned char unit); // Tempo = unit * 10 * Tcyc
    Delay100TCYx(unsigned char unit);
    Delay1KTCYx(unsigned char unit);
    Delay10TCYx(unsigned char unit);

    Tcyc = 4/Fquartz

    Dans mon cas le PIC tourne à 48MHz donc j'ai créer la fonction suivante mais elle ne semble pas marcher ou du moins ellle n'est pas précise... :

    Tcyc = 4/48MHz = 1/12µs

    Code:
    void delay_us(int us)
    {
         int i,j =0;
    
          for(i=0;i<us;i++) 
         {
              for(j=0;j<12;j++) 
                  Delay1TCY();      // 12*1/12µs = 1µs
         }
    }
    Si jamais vous avez deja eu à faire à ce genre de problème merci de m'éclairer.

    Bonne journée.

    -----

  2. #2
    kronanberg

    Re : [PIC18F2455] Problème avec Delay1TCY

    Salut !!

    Essaie d'observer sur la valeur d'un bit d'un port! par exemple :

    while(1)
    {
    PortAbits.RA0 = 1;
    Delay100TCYx(1);
    PortAbits.RA0 = 0;
    Delay100TCYx(1);
    }

    Tu devrais trouver 8,33 us à l'état haut et 8,33 us à l'état bas !

    Sinon ça peut être que ta fréquence de fonctionnement n'est pas de 32 MHz !!

    @+

  3. #3
    sdec25

    Re : [PIC18F2455] Problème avec Delay1TCY

    Bonjour,
    En écrivant ton code tu as oublié un gros détail : une instruction C peut durer plus d'un cycle processeur.
    Dans ton code il y a 1 appel fonction, 2 boucles for imbriquées.
    Une boucle for comporte une initialisation, des tests, une incrémentation et des sauts, ça prend facilement plus de 10 cycles processeurs, alors 1 boucle de 12 itérations ça fait beaucoup !
    Ce qui fait que ton délai total sera de + de 100 cycles au lieu de 12.

    Conclusion :
    Pour faire des délais, soit travailler en assembleur, soit utiliser des fonctions toutes faites. Utiliser le C uniquement quand le délai est grand (pour 1 ms on ne voit pas trop la différence).
    Pour un délai de 12 cycles tu peux utiliser 12 NOP moins le temps d'appel de la fonction, c'est simple et fiable.

    Il y a un outil intégré à MPLAB qui permet de mesurer le temps en cycles processeurs et en µs, ça peut t'éviter de compter les instructions ASM à la main.
    Dernière modification par sdec25 ; 26/05/2010 à 12h08.

  4. #4
    Tupac Shakur

    Re : [PIC18F2455] Problème avec Delay1TCY

    Bonjour,

    Merci pour vos réponses...

    kronanberg, j'ai vérifié avec le delayTCY() et je tombe bien sur le bon résultat donc ma fréquence est bonne...

    sdec25, merci et effectivemetn j'avais oublié ce gros détail...

    Je vais utiliser les fonctions DelayxxTCYx() et faire mes calculs à la main pour trouver les bonnes durées...

    Bonne journée

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

    Re : [PIC18F2455] Problème avec Delay1TCY

    ... j'espère que tu n'utilise aucune interruption ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  7. #6
    RISC

    Re : [PIC18F2455] Problème avec Delay1TCY

    Salut,
    Citation Envoyé par Tupac Shakur Voir le message

    Tcyc = 4/Fquartz

    Dans mon cas le PIC tourne à 48MHz donc j'ai créer la fonction suivante mais elle ne semble pas marcher ou du moins ellle n'est pas précise... :

    Tcyc = 4/48MHz = 1/12µs
    Avec ces calculs tu es très très mal parti....

    Fcy = Fosc / 4 (attention...Fosc est la fréquence à la sortie du diviseur APRES la PLL)

    Tcy = 4 x Tosc
    Tosc = 1/48MHz donc Tcy = 4 / 48MHz = 1/12MHz = 83ns !!!!

    Si tu n'obtiens pas cela c'est que la programmation des prescalers n'est pas correcte.

    Exemple : Avec un quartz de 4MHz on peut multiplier par 24 --> 96MHz qui est ensuite divisé au-moins par 2, ce qui donne 48MHz (Fosc).
    La fréquence du quartz n'a rien à voir avec Fosc...

    La meilleure solution dans tes routines de délais est d'utiliser le simulateur (Debug > MPLAB SIM) dans MPLAB qui est précis au cycle prêt. Tu entres ta fréquence Fosc et le simulateur te donnera très précisemment les durées en us, ms ou autres...à condition que tu n'aies pas d'interruptions qui claquent pendant tes délais

    a+

Discussions similaires

  1. I2c pic18f2455
    Par invite7f65a815 dans le forum Électronique
    Réponses: 2
    Dernier message: 07/04/2010, 10h34
  2. Réponses: 10
    Dernier message: 22/03/2009, 10h34
  3. [Blanc] Probleme avec tele Philips avec chassis L01.E
    Par LEDOCTEUR dans le forum Dépannage
    Réponses: 2
    Dernier message: 20/03/2009, 18h27
  4. Probleme avec la connection USB avec PC sous linux !! !
    Par invite36d52cc8 dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 12/12/2008, 21h45
  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, 22h28
Découvrez nos comparatifs produits sur l'informatique et les technologies.