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

Timer pic18f



  1. #1
    nirvo

    Timer pic18f


    ------

    Bonjour
    j'ai un souci de comprendre la configuration du Timer du pic 18f, je rempli mes TMR0 low et High mais je vois pas différence entre les defirent delais choisis
    j'ai trouvé un cours qui explique sa mais sa marche pas :
    voila pour generer un delais de 1 ms il faut faire :

    4/4MHZ(oscillator externe) = 1 microS pour chaque tick
    1ms donne -->> 1 e-3 / 1 e-6 = 1000 ticks
    alors 1000 -->> 0x03E8

    il ya deux méthode de clacul :
    il faut prendre alors soit la valeur négative de resultat :
    0x03E8 -->> 0xFC18

    soit:
    0xFFFF-REG+1 = 0x03E8
    REG = OxFC18

    alors pour la configuration de mon timer j'ai lelé fait comme suit :
    T0CON=0x88; //timer 0 actif, pas de prescaler
    TMR0H=0xFC;
    TMR0L=0x18;
    INTCONbits.GIE=1; //activer les INT globale
    INTCONbits.PEIE=1;
    INTCONbits.TMR0IE=1; //activer les INT sut TMR0
    INTCONbits.TMR0IF=0; //flag d'interuption
    es ce que cette configuration est bonne ? car je n'arrive pas à générer des bon délais
    mon programme rentre dans la routine d'intérruption mais il genere des tempo de meme durée !!
    j'ai essayer pou 10ms qui donne REG =0xD8FO !!!!

    merci

    -----

  2. Publicité
  3. #2
    RISC

    Re : Timer pic18f

    Salut,

    Si tu veux bien comprendre les PICs je te recommande de lire le cours de Bigonoff (la "bible").
    Pour ce qui concerne les TIMERs, l'interruption se fait à l'overflow (SAUF le timer2 qui est auto-reload).
    Il faut donc toujours SOUSTRAIRE le NB de ticks de 65536 pour connaitre la valeur initiale.
    Exemple : 1000 ticks --> il faut programmer 64536 dans le TIMER.

    Comme il n'est pas auto reload, il faut le recharger dans l'interruption et surtout ne pas oublier de clearer le flag d'interruption

    Attention au TIMER0 car il existe 2 modes...le mode compatibility (8bits) compatible PIC16 et le mode avancé (16 bits).
    Autre chose, il faut IMPERATIVEMENT respecter l'ordre suivant en mode 16 bits pour le TIMER0 ou 1 :
    en écriture : écrire D'ABORD TMR0H puis TMR0L
    en lecture : lire TMR0L puis TMR0H
    En effet, il ne faut pas oublier que le bus de données fait 8 bits, il y a donc un latch pour la partie haute qui est automatiquement écrit/lu en accédant la partie basse pour que cela soit synchrone.

    Tu pourras trouver des exemples en C18 ici.

    a+

  4. #3
    nirvo

    Re : Timer pic18f

    Bonjour
    j'ai lu déja les cours de lien que vous m'avez donné , alors voila mon code que je fait pour generer une temporisation de 10 ms (allumage de led) mais sa march pas toujours ma tempo

    #include <p18f2450.h>

    void traiteIT(void);
    void tempo(char);

    #define duree 1
    volatile unsigned Tms;

    void main(void)
    {
    // Oscillator externe de 4MHZ --> 1 micoS pour un tick -->> 100ms / 1 microS = 10e4 ticks
    // 10000 ticks = 0x2710 -->(en inversant) 0xD8F0
    T0CON=0x88;
    TMR0H=0xD8;
    TMR0L=0xF0;
    TRISB=0x00;
    PORTB=0x00;
    INTCONbits.PEIE=1;
    INTCONbits.GIE=1;
    INTCONbits.TMR0IE=1;
    INTCONbits.TMR0IF=0;


    while(1)
    {
    PORTBbits.RB2=1;
    tempo(duree);
    PORTBbits.RB2=0;
    tempo(duree);
    }
    return ;
    }

    #pragma code it=0x08
    void saut_sur_spIT(void)
    {
    _asm goto traiteIT
    _endasm
    }
    #pragma code

    #pragma interrupt traiteIT
    void traiteIT(void)
    {
    if(Tms) Tms--;
    INTCONbits.TMR0IF = 0;
    }

    void tempo(char ms)
    {
    Tms=ms; while(Tms);
    }
    quand je rentre en interruption je sort jamais et mon timer ne s'arrete pas
    si vous pouvez jetez un oeil sur ce code
    merci

  5. #4
    vede

    Cool Re : Timer pic18f

    Bonjour,

    je comprends pas bien ce que devrait faire le programme...

    faire clignoter une led grâce à une temporisation générée par le timer et son interruption ?

    si oui, 1ms, tu verras rien, même 10ms c'est chaud...

    si non, comment visualises-tu que c'est bien la durée programmée (1ms)?

    vede
    ;O]
    ___________________
    ...

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

    Re : Timer pic18f

    Bonsoir,

    il est toujours souhaitable d'initialiser des variables à des valeurs connues à l'avance, comme dans votre cas Tms que vous décrémentez, sinon il aura une valeur aléatoire donc problème assuré.

    Sinon le principe du timer c'est un overflow après 0xFFFF µcycles qui déclenche une interruption (TMR0IF) si TMR0IE et GIE sont enable.
    Donc soit vous partez d'une plage complète de 0 jusqu'à 65535 soit vous créer un offset (PRELOAD) pour vous préplacer dans la plage de comptage pour obtenir la valeur de temps escomptée.

    La valeur à rentrer dans le registre TMR0 sera:
    registre Timer0 = Plage complète (0xFFFF) - PRELOAD

    Le préchargement du timer avec une valeur de départ vous permet donc d'obtenir un comptage précis au cycle d'horloge près.

  8. #6
    invite03481543

    Re : Timer pic18f

    Timing = Fosc/4*(contenu du registre Timer0)

    Par exemple si Tosc=250ns (F=4MHz)

    On veut Timing=1ms

    soit 4*Timing/Tosc=16000=0xC17F

    valeur à rentrer dans le registre:

    65535-16000=0xC17F

    Le comptage partira de ce PRELOAD=0xC17F pour déborder après 0xFFFF, il se sera écoulé 1ms.

  9. Publicité
  10. #7
    vede

    Cool Re : Timer pic18f

    Bonsoir HULK,

    là je suis pas trop d'accord... ;O]

    si FOsc= 4Mhz, alors TOsc = 1µs...

    non?

    donc faudrait "mettre" 65535 - 1000 = 64535 "dans" TMR1 pour avoir une période de 1ms...
    TMR1H = FC
    TMR1L = 18

    vede
    ;O]
    ____________________
    ...

  11. #8
    RISC

    Re : Timer pic18f

    Bonjour,

    Attention....

    La formule pour calculer l'overflow est : 65536 - valeur (pas 65535)

    Exemple : avec un quartz 32768Hz, il faut écrire 8000H dans PR1.

    a+

  12. #9
    nirvo

    Re : Timer pic18f

    Bonjour;
    Pour le calcul toute est expliqué dans les cours http://www.aix-mrs.iufm.fr/formation...indexPIC_C.htm
    oui j'ai compris que il faut le faire comme suit
    donc faudrait "mettre" 65535 - 1000 = 64535 "dans" TMR1 pour avoir une période de 1ms...
    TMR1H = FC
    TMR1L = 18
    ou comme j'ai lé donné en détail au debut;
    pour mon programme je veux faire clignoter la led chaque 10 ms et je pense que c faisable car avec un dsPIC30f j'ai pu le faire facilement car il faut seulement ecrire dans PR1 le nobre de cycle

    mais pour un PIC18f j'ai pas arrivé à le faire voila mon problème

    alors pour te répondre pour ta question je fait visualiser sur un oscilloscope la durée de ma tempo ;
    ou je verifie mes registre en mode pas à pas dans le watch

    alors es ce que vous pouvez voir cé koi le probleme dans mon code car pour un dsPIC c visualisable tres bien et puis je parle des ms pas de µ ou nano


    merci
    Dernière modification par nirvo ; 10/05/2010 à 22h51.

  13. #10
    RISC

    Re : Timer pic18f

    Salut

    2 petites choses
    Dans ton code tu as :

    INTCONbits.TMR0IE=1;
    INTCONbits.TMR0IF=0;

    Il vaut mieux (par précaution) faire :
    INTCONbits.TMR0IF=0;
    INTCONbits.TMR0IE=1;
    La raison est que si jamais le flag était à 1, cela évite de partir immédiatement en interruption.

    Autre chose, il vaut mieux configurer un TIMER SANS le lancer...et le lancer juste après (ou juste avant) avoir autorisé l'interruption correspondante :
    T0CON = 0x08;
    ...
    T0CONbits.TON = 1;

    Pour les interruptions, préferrer cet ordre :
    INTCONbits.TMR0IF=0;
    INTCONbits.TMR0IE=1;
    INTCONbits.PEIE=1;
    INTCONbits.GIE=1;
    T0CONbits.TON = 1;

    D'autre part, pour des questions de robustesse logicielle, il vaut mieux éviter de tester des égalités et préferrer des tests du style < ou >.

    donc au lieu de while(Tms) ==> while(Tms>0)

    a+

  14. #11
    nirvo

    Re : Timer pic18f

    Bonjour;
    pour la question de duree de la tempo, alors pour avoir une tempo de 100 ms par exemple il faut faire tempo(100) pour un registre timer configurer à 1ms mais il faut d'abord avoir une bonne INT puis on choisira la durée qu'on veux

    alors j'ai organisé ma configuration comme vous l'avez donnée mais je visualise toujours une tempo de 5,4 ms sur oscilloscope pour n'importe quel valeur configuré sur le registre TMR0L et H

    je vous remercie mais je pense qu'il faut ajuster qqchose qqpar

  15. #12
    invite03481543

    Re : Timer pic18f

    Citation Envoyé par vede Voir le message
    Bonsoir HULK,

    là je suis pas trop d'accord... ;O]

    si FOsc= 4Mhz, alors TOsc = 1µs...

    non?

    ...
    Ben non.

    Tosc=1/4MHz=250ns
    Fcy=Fosc/4=1/4*Tosc=1MHz => Tcy=1µs

  16. Publicité
  17. #13
    invite03481543

    Re : Timer pic18f

    Citation Envoyé par RISC Voir le message
    Bonjour,

    Attention....

    La formule pour calculer l'overflow est : 65536 - valeur (pas 65535)

    Exemple : avec un quartz 32768Hz, il faut écrire 8000H dans PR1.

    a+
    Exact, merci d'avoir corrigé.
    Le débordement se faisant au passage de 65535+1 ou 0xFFFF à 0.

  18. #14
    vede

    Cool Re : Timer pic18f

    Citation Envoyé par HULK28 Voir le message
    Ben non.

    Tosc=1/4MHz=250ns
    Fcy=Fosc/4=1/4*Tosc=1MHz => Tcy=1µs
    Bonjour HULK,

    en neffet ;O]
    je me trompais dans les dénominations...

    bonn'journée za toutes zé tous,
    vede
    ;O]
    _______________
    ...

Discussions similaires

  1. Reset PIC18F
    Par Lasta dans le forum Électronique
    Réponses: 2
    Dernier message: 08/05/2010, 01h40
  2. Programmation en C avec Timer 0 et Timer 1
    Par Groundation dans le forum Électronique
    Réponses: 43
    Dernier message: 20/04/2010, 14h27
  3. PIC18F et ADC
    Par boutboutnico dans le forum Électronique
    Réponses: 5
    Dernier message: 04/02/2009, 12h43
  4. Pic18f Adc
    Par twistwind dans le forum Électronique
    Réponses: 1
    Dernier message: 28/07/2006, 15h43
  5. interruption PIC18F
    Par induc dans le forum Électronique
    Réponses: 12
    Dernier message: 19/05/2006, 17h17
Découvrez nos comparatifs produits sur l'informatique et les technologies.