Répondre à la discussion
Affichage des résultats 1 à 19 sur 19

Temps d'un cycle dans un PIC



  1. #1
    jorg1n

    Temps d'un cycle dans un PIC


    ------

    Bonjour,

    voila, je viens de tester un petit programme avec un PIC 18F. Ce programme utilise le timer0. Voici mon programme qui fonctionne parfaitement, il fait clignoter ma diode sur RA2:
    Code:
    #include <p18f4525.h>
    #include <delays.h>
    #include <adc.h>
    #include <stdlib.h>
    
    //Déclaration des PORTXbits.RXX utilisés
    #define BUZZER PORTBbits.RB3
    #define LEDA5 PORTAbits.RA5 
    #define LEDA4 PORTAbits.RA4 
    #define LEDA3 PORTAbits.RA3
    #define LEDA2 PORTAbits.RA2
    
    //Configuration Bits
    #pragma config OSC = HS			//OSCILLATOR
    #pragma const config FCMENB = OFF	//Fail Safe Clock Monitor Disabled
    #pragma const config IESOB = OFF	//Internal External Osc. Switch Disabled
    #pragma config PWRT = OFF		//Power Up Timer Disabled
    #pragma const config BOR = BOHW 	//Brown Out Reset Enabled in HW, SBOREN disabled
    #pragma const config BORV = 20		//Brown Out Voltage : 2.0V
    #pragma config WDT = OFF		//WATCHDOG HW Disabled - SW Controlled
    #pragma config DEBUG = OFF		//DEBUG Disabled
    #pragma config LVP = OFF		//Low Voltage Programming Disabled
    
    //Sous programmes
    void init_uc(void);
    void config_timer(void);
    
    
    //Déclarations des variables
    
    
    
    
    
    #pragma interrupt LED
    void LED(void)
    {
    	if (INTCONbits.TMR0IF)
    	{
    	INTCONbits.TMR0IF = 0;	//efface le drapeau d'IT
    	LEDA2=!LEDA2;
    
    	}
    
    
    }
    
    #pragma code vecteur_d_IT=0x08
    void TIMER(void)
    {
    	_asm 
    	goto LED
    	_endasm
    }
    #pragma code
    
    
    /***************************************************************************
    *********************Programme Principal************************************
    ***************************************************************************/
    void main (void)
    {
    init_uc();				//Appel SP Initialisation du microcontroleur
    
    while(1)
    {
    
    config_timer();
    
    
    }//Fin While(1)
    }//Fin Programme Principal
    
    /***************************************************************************
    Nom   : void init_uc(void)
    Role  : Configuration et initialisation des Ports E/S
    *****************************************************************************/
    void init_uc(void)
    {
     ADCON1=0x0F;					// Configuration en numérique
     TRISA=0x00;					// PORTA en sortie
     TRISB=0xF7;					// PORTB en entrée --sauf RB3 en sortie
     TRISC=0x00;					// PORTC en sortie
     TRISD=0x00;					// PORTD en sortie
     TRISE=0x00;					// PORTE en sortie
    
     PORTA=0x20;					//
     PORTB=0x00;					///
     PORTC=0x00;					////Initialisation à 0 des Ports
     PORTD=0x00; 					///
     PORTE=0x00;					//
    }
    
    
    /***************************************************************************
    Nom   : void config_int(void);
    Role  :
    *****************************************************************************/
    void config_timer(void)
    {
    T0CON=0x87;
    INTCONbits.TMR0IE=1;
    INTCONbits.GIEH = 1;
    }
    Le Prescaler est réglé à 1:256 , mais je n'arrive pas a trouver la relation entre cette valeur et la valeur de mon quartz, de meme que je ne sais pas comment calculer le temps d'un cycle...?
    J'aurais besoin de votre aide.
    Encore merci

    -----

  2. Publicité
  3. #2
    f6bes

    Re : Temps d'un cycle dans un PIC

    Bjr Jorg1N,
    Suis pas trop féru sur le sujet,mais,
    Le temps d'un cycle "horloge" reste égal à lui meme ( une période d'horloge).
    Ca c'est le "cycle" quartz.
    Si quartz 4 MHz, alors cycle = 1/4000 000 de seconde.

    Le temps de cycle d'une INSTRUCTION comporte, lui, PLUSIEURS cycle d'horloge.
    Et toute instruction n'a pas le meme cycle que sa voisine pour son accomplissement.Donc faire une relation avec le cycle horloge ......!!
    Mais attendons les pros de la chose !
    Bonne journée

  4. #3
    jorg1n

    Re : Temps d'un cycle dans un PIC

    Je te remercie déja...
    j'en apprend un peux plus..

  5. #4
    jorg1n

    Re : Temps d'un cycle dans un PIC

    Bon, j'utilise le compilateur C18, et les bibliothèques incluent des fonctions pour realiser des delay, mais elles se limitent à 255 x 10K TCy et donc ça fait 127 ms, je sais que je pourrai empiler les fonctions pouréaliser une tempo plus longue mais je souhaiterai réaliser un sous programme style "delay_ms(x)" avec x le nombre de ms...
    Auriez vous une routine?
    Merci d'avance

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

    Re : Temps d'un cycle dans un PIC

    Citation Envoyé par jorg1n Voir le message
    Auriez vous une routine?


    Code:
    void delay_s(unsigned char nb)
    {
      while( nb>0 )
      {
         delay_ms(1000);
         nb--;
      }
    }

    Te voila avec >4 minutes de delay() ...

    PS: tu souhaite quelle precision pour ton delay ? ... car jamais une fonction delay ne sera précise si tu as des IT qui tournent ... sans parler du fait que faire du delay est rarement la meilleure façon de faire les choses ...
    Dernière modification par Seb.26 ; 19/02/2008 à 12h20.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  8. #6
    freepicbasic

    Re : Temps d'un cycle dans un PIC

    1 cycle c'est la fréquence d'horloge /4

    pour le timer 0
    fréquence d'horloge / 256 (ton exemple) / (255 - valeur dans TMR0)
    A+, pat

  9. Publicité
  10. #7
    jorg1n

    Re : Temps d'un cycle dans un PIC

    1 cycle c'est la fréquence d'horloge /4
    Le résultat est en quelle unité?

    encore merci

  11. #8
    freepicbasic

    Re : Temps d'un cycle dans un PIC

    Citation Envoyé par jorg1n Voir le message
    Le résultat est en quelle unité?

    encore merci
    En cycle !

    Avec l'architecture RISC on peut considérer qu'on a une instruction par cycle, donc des MIPS "Millions Instructions Per Second"
    4Mhz fait donc 1Mips
    20Mhz 5Mips
    A+, pat

  12. #9
    jorg1n

    Re : Temps d'un cycle dans un PIC

    Donc une instruction dure 0,2µs...
    merci pour les infos freepicbasic

  13. #10
    Seb.26

    Re : Temps d'un cycle dans un PIC

    PS: il me semble que le simulateur de MPlab sait calculer le nombre de cycles d'une portion de code ...

    .. ce sera peut être plus simple que d'aller fouiner dans le code ASM généré par ton compilo ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  14. #11
    jorg1n

    Re : Temps d'un cycle dans un PIC

    Bon j'ai réussi a faire clignoter ma led avec un delay de 1 seconde, mais je ne comprend pas le principe pour déterminer la valeur du timer, je m'explique,
    comment je regle mon timer pour avoir ma LED qui clignote ENVIRON toutes les secondes?
    Merci encore

  15. #12
    Seb.26

    Re : Temps d'un cycle dans un PIC

    Citation Envoyé par jorg1n Voir le message
    Bon j'ai réussi a faire clignoter ma led avec un delay de 1 seconde, mais je ne comprend pas le principe pour déterminer la valeur du timer, je m'explique,
    comment je regle mon timer pour avoir ma LED qui clignote ENVIRON toutes les secondes?
    Merci encore
    D'abord, tout depend de la source de ton timer ( l'horloge interne ou une hologe externe )

    Ensuite un fois que tu as la source, tu en connais donc la fréquence normalement

    Dans ton timer, tu as un post-scaler qui va te permettre de diviser la freq de ta source ( tu l'as mis à /256 je crois ) ensuite, il ne te reste plus qu'a déterminer la résolution de ton timer ( +1 top timer = combien de uS ? ) pour savoir combien de top tu souhaite ... et donc de gérer les registre de compteur en fonction ...

    [Edit] Je viens de comprendre ( sans doute) ... dans ton IT, tu devrais écrire la valeur du compteur, plutôt que de le laisser aller de 0x00 à 0xFF "bêtement" ... car sinon effectivement, tu peux pas régler grand chose ...

    Par exemple à chaque IT, tu le mets à 0xF0 de façon à avoir une autre IT dans 15 tops timer ...
    Dernière modification par Seb.26 ; 19/02/2008 à 15h02.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  16. Publicité
  17. #13
    jorg1n

    Re : Temps d'un cycle dans un PIC

    Tout d'abord, j'utilise l'horloge externe, un quartz de 20MHz.
    Bon je vais essayé de comprendre et mettre en application ton explication.
    Je te remercie

  18. #14
    jorg1n

    Re : Temps d'un cycle dans un PIC

    Bon en fait je dois fixer le registre TMR0 à 0x0F mais en mettant le nez dans la documentation du 18F4525, j'ai 2 registre, TMR0L et TMR0H...je suppose que c'est le L, car on est en timer 8bits. Mais à quel endroit je fixe la valeur de TMR0L?Au début, quand j'autorise les interruptions?
    Merci encore

  19. #15
    Seb.26

    Re : Temps d'un cycle dans un PIC

    Citation Envoyé par jorg1n Voir le message
    Bon en fait je dois fixer le registre TMR0 à 0x0F mais en mettant le nez dans la documentation du 18F4525, j'ai 2 registre, TMR0L et TMR0H...je suppose que c'est le L, car on est en timer 8bits. Mais à quel endroit je fixe la valeur de TMR0L?Au début, quand j'autorise les interruptions?
    Merci encore
    TMR0L est le registre qui est incrémente sans cesse par le timer, l'IT est declenchée quand il passe de 0xFF à 0x00 ... donc tu dois remettre la valeur à chaque IT sinon, il continue depuis 0x00 ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  20. #16
    jorg1n

    Re : Temps d'un cycle dans un PIC

    D"'accord, jécris donc:
    Code:
    if (INTCONbits.TMR0IF)		//Test du drapeau d'IT
    	{
    	INTCONbits.TMR0IF = 0;		//efface le drapeau d'IT
    	LEDA2=!LEDA2;
    	TMR0L=0xF0;
    	}
    Je vais tester çà...
    Merci encore pour ton aide

  21. #17
    Seb.26

    Re : Temps d'un cycle dans un PIC

    ça devrait fonctionner ...

    ... de nada ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  22. #18
    Seb.26

    Re : Temps d'un cycle dans un PIC

    Citation Envoyé par jorg1n Voir le message
    Code:
    if (INTCONbits.TMR0IF)		//Test du drapeau d'IT
    	{
    	INTCONbits.TMR0IF = 0;		//efface le drapeau d'IT
    	LEDA2=!LEDA2;
    	TMR0L=0xF0;
    	}
    Essaye de plutôt utiliser :
    Code:
    if (INTCONbits.TMR0IF)		//Test du drapeau d'IT
    {
    	TMR0L=0xF0;
    	INTCONbits.TMR0IF = 0;		//efface le drapeau d'IT
            //
    	LEDA2=!LEDA2;
    }
    C'est pas une convention ou quoi que ce soit, c'est juste un conseil ...

    En remettant la valeur du timer à jour le plus vite possible, tu t'évite d'en decaller la durée ... dans ton cas, par exemple, ton timer ne durait pas (0xFF-0x0F)*topTimer comme le code le laissait paraitre, mais (0xFF-0x0F)*topTimer + durée( "INTCONbits.TMR0IF = 0;" )+durée( "LEDA2=!LEDA2;") ...

    Et je pense que tu vas rajouter du code ensuite dans ton gestionnaire d'IT ... autant prendre l'habitude de réinitialiser le timer dès l'entrée dans l'IT...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  23. Publicité
  24. #19
    jorg1n

    Re : Temps d'un cycle dans un PIC

    Je te remercie pour tes explications très clairs.

Discussions similaires

  1. Info PWM Duty Cycle PIC
    Par Lethargy dans le forum Électronique
    Réponses: 6
    Dernier message: 11/11/2012, 17h00
  2. combien de temps dure un cycle de lave vaisselle Whirpool
    Par martine 95 dans le forum Dépannage
    Réponses: 0
    Dernier message: 23/01/2008, 18h23
  3. Réponses: 3
    Dernier message: 14/03/2007, 21h38
  4. Horloge temps réel + PIC I²C
    Par Toufinet dans le forum Électronique
    Réponses: 9
    Dernier message: 15/11/2006, 17h56
  5. PIC et precision du temps
    Par alainav1 dans le forum Électronique
    Réponses: 2
    Dernier message: 28/04/2006, 18h56
Découvrez nos comparatifs produits sur l'informatique et les technologies.