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

 C Discussion :

interruption d'horloge en c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Développeur Web
    Inscrit en
    Novembre 2008
    Messages
    146
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2008
    Messages : 146
    Par défaut interruption d'horloge en c
    salut tout le monde
    Je suis un peu pressé et stressé depuis quelque jour. je suis en train de développer une application TR en C sous turbo C++ pour faire des acquisitions des informations venant des capteurs pour commencer le prof ma donnée l’exemple du help de turbo C sur les fonctions getvect et setvect. Mais je n’arrive pas à comprendre le fonctionnement !
    Pourriez-vous m’aidez s'il vous plait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <stdio.h>
    #include <dos.h>
    #include <conio.h>
     
    #define INTR 0X1C    /* est ce que  « 0X1C » c’est le numéro de l’interruption dans le vecteur des interruptions */ 
     
    #ifdef __cplusplus /* selon mes recherche sur internet, __cplusplus  définie uniquement dans le cas d'une compilation C++  et on pourra utiliser cette chaîne de remplacement pour distinguer les parties de code écrites en C++ de celles écrites en C */
        #define __CPPARGS ... /* pourquoi cette instruction */
    #else
        #define __CPPARGS /*si elle n’est pas défini alors en la définir maintenant mais elle sert a quoi */
    #endif
    Le grand problème et la :
    void interrupt ( *oldhandler)(__CPPARGS); /*l’utilisation de la fonction interrupt et  différente de la déclaration dans le help du turbo C a cause du  (__CPPARGS); ! */
    int count=0; /*la réinitialisation  du compteur appartient à la procédure void interrupt oldhandler ? Si oui pour quoi on n’utilise pas  accolades {} de la fonction void */
    void interrupt handler (__CPPARGS)
    {
    /* increase the global counter */
       count++; // il est ou le temps!
     
    /* call the old routine */
       oldhandler();
    }
    int main(void)
    {
    /* save the old interrupt vector */
       oldhandler = getvect(INTR);
     
    /* install the new interrupt handler */
       setvect(INTR, handler);
     
    /* loop until the counter exceeds 20 */
       while (count < 20) /*comment se fait l'incrémentation selon quel critère ' je c'est qui'il comptepar l'instruction c++; mais je veux que la fonction dure 30 seconde*/
          printf("count is %d\n",count);
     
    /* reset the old interrupt handler */
       setvect(INTR, oldhandler);
     
       return 0;
    }
    Cordialement.

  2. #2
    Membre confirmé
    Développeur Web
    Inscrit en
    Novembre 2008
    Messages
    146
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2008
    Messages : 146
    Par défaut
    bonjour
    est ce que j'ai commis une erreur concernant les règlement du forum ?
    sinon j'ai avancé de ma part INTR c'est interruption de timer 18,2 fois par seconde

  3. #3
    Membre Expert
    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 : 38
    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
    Par défaut
    Bonjour,
    si je comprends bien, la fonction interrupt handler est appelée à chaque interruption d'horloge (comme par exemple à l'affichage d'une information à l'écran). Cette fonction incrémente la variable globale count.

    Dans votre main, vous affichez la valeur de ladite variable tant que celle-ci est inférieure à 20. Mais le fait de l'afficher provoque une (ou plusieurs) interruption qui est interceptée et qui incrémente count.

    Cordialement,

  4. #4
    Membre confirmé
    Développeur Web
    Inscrit en
    Novembre 2008
    Messages
    146
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2008
    Messages : 146
    Par défaut
    bonsoir,
    tout d'abord merci pour votre réponse.
    alors ,si je peux dire ,lorsque count++ atteint 20 j'aurai 20 * 18,5 a peu plus qu'une secondes ?

  5. #5
    Membre Expert
    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 : 38
    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
    Par défaut
    Aucune idée pour le coté temporel de la chose (en revanche, le nom de la variable est "count", "count++" est l'instruction double qui retourne la valeur de count puis incrémente cette variable).

  6. #6
    Membre confirmé
    Développeur Web
    Inscrit en
    Novembre 2008
    Messages
    146
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2008
    Messages : 146
    Par défaut
    bonjour ,
    merci prgasp pour me répondre ,peu:
    être j'ai mal exprimé mon problème, bon l'objectif et le suivant, je doit faire deux lecture du port 0x3F8 et 0x3F7:
    1-chaque 30 seconde par exécution de la fonction inp(0x3F8)
    2-chaque 45 seconde par exécution de la fonction inp(0x3F7)
    les lecture elle sont assuré par une "synchronisation si je peux dire ou activation par une les interruption matériel du clock " a traver les fonctions handler,oldHandler,setVect() et getVect().
    bon comme solution j'ai abouti a cette idée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #define CNT_C1 546  // = 18.2 * 30 secondes
    #define CNT_C2 819  // = 18.2 * 45 secondes
    void ....{
    volatile int count_c1 = CNT_C1;
    volatile int count_c2 = CNT_C2;
    volatile int flag_c1 = 0;
    volatile int flag_c2 = 0;
    }
    if (--count_c1 == 0)   // Quand on arrive à 0, ça veut dire que 30 secondes sont passées.
    je lance la lecture par un flag  .

Discussions similaires

  1. interruption d'horloge sous windows
    Par mumuri dans le forum Windows
    Réponses: 5
    Dernier message: 11/07/2006, 22h56
  2. interruption clavier
    Par pyrostan dans le forum C
    Réponses: 4
    Dernier message: 13/01/2003, 17h33
  3. Tracer une ligne droite sans les interruptions
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 25/11/2002, 01h22
  4. Bouquins d'Assembleur - interruptions matérielles
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 12/11/2002, 21h23
  5. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 16h15

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