IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Gérer un compteur de temps


Sujet :

Embarqué

  1. #1
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut Gérer un compteur de temps
    Bonjour à tous,

    j'ai besoin de créer une fonction utime() qui retournerait le nombre de microsecondes écoulées depuis l'allumage de mon microcontroleur.

    Je travaille en C sur le µC Renesas SH72516 (RISC 32 bits). Celui-ci inclut un périphérique nommé CMT (Compare Match Timer) qui me permet de lever une interruption tous les T tics de mon horloge à C Hz.

    J'ai donc implémenté mon timer de manière naïve : j'ai un volatile unsigned long long counter déclaré quelque part ; le CMT lève une interruption qui l'incrémente de 1 ; et ma fonction utime()est déclarée comme suit

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    inline unsigned long long utime()
    {
    	const float c= 50000000.0f/8.0f;
    	const float t= (float)CMT0.CMCOR;
    	const float usec = 1000000; // µs / s
    	return usec * ( counter/ (c / t) );
    }

    Malheureusement, il semble que ma fonction dérive de manière significative en fonction de T. Pour indication, avec T=0x006 j'ai une dérive de 9 secondes toutes les 64 secodnes ; avec T=0xffff une dérive d'environ 1 seconde toutes les 64 secondes.

    Pouvez-vous m'aider ? J'imagine que ma conception est bancale quelque part.
    Cordialement,
    -- Yankel Scialom

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Un stagiaire dans ma boite en ce moment travaille sur un problème de temporisation sur un micro-contrôleur. Il récupère un projet existe et doit régler ce problème.

    L'origine de ce problème ? Pas le soft, non ; "simplement" le quartz permettant de générer les ticks qui dérive en température. Les interruptions ne sont donc pas à intervalles réguliers. Ce µC est un Renesas justement. Le quartz utilisé est le quartz interne.

    Je ne sais pas si tu as le même soucis mais c'est possible.

    Comment intervient T dans ta fonction utime() ?

  3. #3
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour,

    Citation Envoyé par Bktero Voir le message
    Comment intervient T dans ta fonction utime() ?
    À la ligne 4 du code-exemple de ma fonction utime, on trouve l'expression CMT0.CMCOR qui est la constante T (petite erreur de copier/coller).

    Sur quel renesas travaille ton stagiaire ? Pour ma part je pense avoir réglé le problème. Je vais faire des tests sur de longues périodes (mesure de dérive sur plusieurs jours), je reviendrai alors pour donner mes résultats et ce que, concrètement, j'ai fait.

    Bon weekend pour les chanceux qui font le pont.
    -- Yankel Scialom

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Ah c'est mieux avec l'explication ! La variable c'est la fréquence du quartz divisé par le pré-scalaire ?

    Je ne pourrais pas te donner la référence du µC, je n'ai pas mon stagiaire donc je ne connais pas les détails.

    Tu nous diras ce que tu as fait

  5. #5
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour,

    comme promis je viens vous donner les résultats de mes tests. Ils sont plutôt décevants. Mon système dérive d'environ une seconde par heure : je n'ai rien réglé de tout .

    Si quelqu'un avait une idée de comment améliorer, par le software, mon timer ...
    -- Yankel Scialom

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Pardon mais tu es passé d'une dérive de l'ordre de 1/60 à une dérive de l'ordre de 1/3600 ! Tu as déjà très largement réglé le problème !

    Je vais revenir sur le problème dont j'ai déjà parlé : la fréquence de ton quartz. Sans aller jusqu'au soucis de dérive en température, es-tu sûr de la valeur de c ?

  7. #7
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Pardon mais tu es passé d'une dérive de l'ordre de 1/60 à une dérive de l'ordre de 1/3600 ! Tu as déjà très largement réglé le problème !
    Effectivement, mais je n'ai fait que peaufiner la configuration du CMT (dont j'avais parlé au message #1).

    Citation Envoyé par Bktero Voir le message
    Je vais revenir sur le problème dont j'ai déjà parlé : la fréquence de ton quartz. Sans aller jusqu'au soucis de dérive en température, es-tu sûr de la valeur de c ?
    C'est la fréquence qui est donné par la doc du µC. Mais tu as raison, il faudrait que je la contrôle à l'oscillo. Je reviens quand c'est fait.

    Merci pour ton aide.
    -- Yankel Scialom

Discussions similaires

  1. [PIC18F4520] Comment gérer une horloge en temps réel
    Par cochy dans le forum Autres architectures
    Réponses: 1
    Dernier message: 06/03/2009, 10h10
  2. Réponses: 5
    Dernier message: 14/09/2007, 20h44
  3. Réponses: 2
    Dernier message: 20/05/2007, 11h39
  4. [SGBD]Gérer un emploi du temps
    Par rayst dans le forum Schéma
    Réponses: 1
    Dernier message: 22/10/2006, 19h13
  5. [C#] Creer un compteur de temps
    Par baddounet dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/03/2005, 17h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo