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 :

Fonction : générer des impulsions.


Sujet :

C

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Points : 76
    Points
    76
    Par défaut Fonction : générer des impulsions.
    Tout d'abord, bonjour. Je ne voudrais pas faire mon mal polit alors je vais vite fait me présenter : je suis étudiant en première année de GEII à Rennes. GEII, pour ceux qui connaissent pas, ca signifie Génie Electrique et Informatique Industrielle. Et donc en informatique, sur ce deuxième semestre nous avons commencé la programation en language C de programmes gérant les entrées/sorties d'une carte microcontrolleur Rabbit de chez Z-World. Pour tout vous dire, je ne savais pas trop où poster mon topic car ce n'est pas non plus du C pur et dur, c'est du C Dynamic (il y à juste quelques différences mais ca reste du C quand même). Et donc pour notre prochain TP, nous devons préparer un exercice où l'on va utiliser un lecteur de carte à puce type carte téléphonique. Et dans cet exercice il nous demande de créer une fonction void Impulsions(void) afin de générer des impulsions qui serviront à incrémenter le compteur lors de la lecture séquentielle des informations (des bits représentant des unités, ici.) Et le truc, c'est que je ne voit pas trop comment créer cette fonctions ... J'ai ma petite idée mais je craint que ce soit trop facile ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Impulsions(void)
    {
      do
      {
         digOut(CLK,ON);
         digOut(CLK,OFF);
         msDelay(0,001);
       }
       while(1);
    }
    Avec :
    + digOut qui sert pour gérer une sortie : digOut(sortie,état)
    + ON => 0
    + OFF => 1 (la carte marche en logique négative)
    + msDelay fait appelle a une fonction de temporisation avec la valeur en ms. J'ai mit cette attente de 1 us car c'est ce qu'ils demandent entre chaque fronts montants des impulsions.

    J'espère avoir été assez clair ... Pensez vous que ma fonction tient la route où alors c'est completement nul ... (Perso, je suis vraiment pas sûr de moi sur ce coup-ci)

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Points : 69
    Points
    69
    Par défaut
    L'intérêt de Dynamic C (et pas C Dynamic), c'est son coté multitâche.
    Donc si tu lances ta fonction au moyen de l'ordonnanceur temps réel, tu devras juste appeler ta fonction (qui me semble correcte à ce que je me rappelle du DynC)

    ici ta fonction msDelay va rendre la main à ton ordonnanceur.
    Par contre j'ai un doute sur le temps d'attente, tu utilises ne fonction d'attente en millisecondes, et il te faut une impulsion toutes les microsecondes. Il te faut quoi alors?

    C'est tout ce que tu as à faire avec Dynamic C. N'oublie que dans ton main, tu devras gérer l'appel de ta tâche.

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Points : 76
    Points
    76
    Par défaut
    Merci DaffyDuck d'avoir pris mon problème en main Donc à croire que mon idée de départ serait bonne ... ce que j'avais peur c'est que le fait de mettre un digOut(CLK,OFF); juste après un ON ne puisse pas créer une impulsion ... et est ce que Sleep(X) est assez précis ? Parce que comme je l'ai dit, nous devons mettre une micro seconde entre chaque fronts montants ...

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Points : 76
    Points
    76
    Par défaut
    Personne d'autre ? Je pense pas que des connaissance en Dynamic C soit récquises sur ce problème ... on doit pouvoir faire ce genre de fonctions en C pure ... non ?!

  5. #5
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut,

    Pour ton générateur d'impulsions, je te conseillerai de mettre une temporisation entre ton front montant et descendant. C.a.d. que tel quel, tu vas avoir une impulsion de largeur très faible (dépend de la fréquence de travail de ton micro-contrôleur).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Impulsions(void)
     {
      do
      {
         digOut(CLK,ON);
         msDelay(0,001);  /* Niveau haut de 1µs */
         digOut(CLK,OFF);
         msDelay(0,001);  /* Niveau bas de 1µs */
      }
      while(1);
    }
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Points : 76
    Points
    76
    Par défaut
    Bonjour,

    Alors, j'ai écris à mon proff d'info avant hier et il m'a donné quelques explications... Déja, le programme doit générer en réalité qu'une seule impulsion (on appellera cette fonction à chaque fois) comme l'avais dit DaffyDuck et ne pas l'intégrer dans un boucle sinon la programme passerait la mémoire à vitesse grand V et ... ca donnerai ... euh je sais pas trop quoi Mais il me l'a déconseillé ... En réalité la base serait plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Impulsion(void)
    {
      digOut(CLK,OFF);
      msDelay(1);
      digOut(CLK,ON);
      msDelay(1);
      digOut(CLK,OFF);
      msdelay(1);
    }
    Par contre ce que je ne comprends c'est son histoire des "msDelay()" car normalement on doit mettre une période de 1 us entre chaque fronts montants et de plus ... un collègue m'a dit que le minimum qu'on pouvais utiliser avec notre fonction msDelay c'était (1) ... mais bon, ça on peut le modifier ! Je vais réfléchir de nouveaux à cette fonction ...

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par banban56
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Impulsion(void)
    {
      digOut(CLK,OFF);
      msDelay(1);
      digOut(CLK,ON);
      msDelay(1);
      digOut(CLK,OFF);
      msdelay(1);
    }
    Tu parles de générer un signal carré ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      digOut(CLK,ON);  /* Front montant */
      msDelay(1);        /* Stable pendant 1 ms */
      digOut(CLK,OFF); /* Front descendant */
      msdelay(1);        /* Stable pendant 1 ms */
    Ce qui produit :
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Tu parles de générer un signal carré ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      digOut(CLK,ON);  /* Front montant */
      msDelay(1);        /* Stable pendant 1 ms */
      digOut(CLK,OFF); /* Front descendant */
      msdelay(1);        /* Stable pendant 1 ms */
    Ce qui produit :
    Oui exactement ! Je parle bien d'un signal carré, un signal d'horloge en fait ! Mais le truc c'est que ici je ne dois pas générer ce signal à l'infini soit dans une boucle mais faire appel à celui-ci à chaque fois que j'en ai besoin notemment pour l'initialisation de la carte à puce où il faut détecter à la fois un état haut de l'horloge mais aussi un état bas d'un second OUT qui s'appelle RESET. Je vais vous scanner le chronogramme pour être plus exact.


  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par banban56
    Oui exactement ! Je parle bien d'un signal carré, un signal d'horloge en fait ! Mais le truc c'est que ici je ne dois pas générer ce signal à l'infini soit dans une boucle mais faire appel à celui-ci à chaque fois que j'en ai besoin notemment pour l'initialisation de la carte à puce où il faut détecter à la fois un état haut de l'horloge mais aussi un état bas d'un second OUT qui s'appelle RESET. Je vais vous scanner le chronogramme pour être plus exact.

    Visiblement, le signal n'est pas carré. Le temps stable à 0 est plus long que le temps stable à un. A toi d'ajuster les temps.

    La fonction génère une impulsion. Si les fonctions d'attentes de DynC ne sont pas bloquantes, tu peux faire autre chose pendant les suspensions (polling...)... Evidement, il faut une conception multi-tâches...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Générer des impulsions sinudoidales
    Par nizaboum dans le forum LabVIEW
    Réponses: 0
    Dernier message: 04/02/2014, 14h22
  2. [delphi 2007]fonction pour générer des caracteres
    Par shell13010 dans le forum Langage
    Réponses: 1
    Dernier message: 31/03/2009, 00h37
  3. générer des impulsions
    Par Invité dans le forum Windows
    Réponses: 5
    Dernier message: 04/12/2008, 09h03
  4. Réponses: 3
    Dernier message: 27/09/2008, 11h46
  5. Réponses: 4
    Dernier message: 15/08/2008, 19h34

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