Programmation C
Répondre à la discussion
Affichage des résultats 1 à 22 sur 22

Programmation C



  1. #1
    invite34aea5f7

    Programmation C


    ------

    Bonjour,

    dans le cadre de mes PPE, en TS SI, je dois programmer un µC pour notre système. Le but est de distribuer du grain en pleine nature. Pour cela on controle un moteur par µC, qui est lui même relié en série avec un ordinateur (normalement à distance).

    Dans le programme, je vais appeler une sous fonction, qui générera un signal PWM pour le moteur, mais seulement une fois toutes les 12hrs par exemple.
    Le problème est que je voudrais aussi pouvoir gérer quelques truc grace à l'hyperterminal grace à un petit menu. Et c'est la que ca coince. Le PWM, le délais, les capteurs ca marche très bien dans un programme. Le menu marche très bien dans un autre, mais la réunion des 2 me pose problème.

    J'aimerais pouvoir communiquer avec le µC grace a l'hyperterminal (pour voir le niveau de grain, la batterie, ou lancer une distiution de grain) et en même temps que le delay entre 2 distribution ne s'arrete pas (que le comptage ne s'arrete pas en fait).
    De plus, je me demande comment appeler le Menu depuis l'hyperterminal sachant que pendant la plupart du temps, le µC utilise la fonction delay_ms(...)?

    Je ne vous demande pas de programme, mais plutot comment pourrai-je faire cela? (forme du programme?)

    voila, merci d'avance!

    -----

  2. #2
    Seb.26

    Re : Programmation C

    Plutot que d'attendre dans un delay_ms(), place ton code dans une boucle du genre :
    Code:
    while(1)
    {
      flag_100ms = false;
      while(!flag_100ms);
    
        //
        // Ici le code exécuté toute les 100 ms
        //
    
      count_100ms++;
      if( count_100ms>=10 )
      {
        count_100ms -= 10;
        //
        // Ici le code exécuté toute les 1s
        //
        count_1s++;
        
      }
    }
    
    interupt_timer_100ms
    {
      flag_100ms = true;
    }
    Tu obtiens une boucle cadencée à 100ms, il te suffit ensuite de compter les secondes, minutes ... pour avoir une RTC sommaire ...

    Si tu ajoute un quartz pour avoir une IT externe, cela te permet aussi de mettre ton uCPU en sleep() si c'est possible ...

    @++
    Seb.

  3. #3
    invite74b5b8f7

    Re : Programmation C

    Bonjour,

    Je n´ais pas tès bien compris ce que tu veux faire (histoire de menu?), tu veux pouvoir communiquer avec ton processeur grâce à hyperterminal?

    De ce que j´ai compris:
    -t´utilise un Timer en pour générer ton signal PWM
    -pour la liaison série tu restes en attente d´une interruption sur ton Tx (arrivée du bit de start),tu d´clenche un autre Timer (ou tu utilise le même) et tu travail avec des prioritées

    Mais là je suis très vague car tout dépend des performances de ton processeur (nombre de Timer, multi-tache, fréquence de l´horloge?) et des erreurs autorisées pour ta PWM...

  4. #4
    invite34aea5f7

    Re : Programmation C

    Le travail principal du micro controlleur (un ATmega16) est de lancer une fonction pwm (qui dure environ 3 min), toute les 12hrs. Il reçoit aussi des infos des capteurs (niveau de grain, température moteur, grace a des signaux ToR ou analogique qui seront converties en numériques).

    Grâce à l'hyperterminal j'aimerais pouvoir voir les différents état de ces capteurs pour savoir s'il faut remettre du grain etc.

    Pour le moment le µC fonctionne comme ça:
    fction Pwm>>>delay 12heures>>>fction Pwm>>>delay12heurs....

    Mais dans ce fonctionnement j'aimerais pouvoir accéder aux infos des capteurs grâce à l'hyerterminal, sans que cela n'arrete le delay, et c'est la que ça coince.

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

    Re : Programmation C

    Si tu utilise un timer pour ton délais de 12 heures normalement il ne s´arrête pas quand tu fais autre chose!(je sais que ton Timer ne doit pas durer 12h mais tu dois avoir le temps d´envoyer ou recevoir des commandes/infos pendant la durée de ton Timer).

    Tu veux demander les infos par hyperterminal ou les envoyer dés que tu peux ou tout le temps?

    Là, je dirais que le plus simple pour ne pas avoir de problème de "superposition des taches"(une commande qui arrive en même temps que tu fais autre chose), il faudrait que tu mettes un boutons poussoir sur une entrée et quand tu appuie dessus, tu envois les infos que tu veux dés que t´as assez de temps (pendant que tu attends que ton Timer ait finit de compter)
    Mais sinon, logiquement la génération d´un PWM est assez courte donc avec des interruptions qui sont plus ou moins prioritaires tu devrait pouvoir tout gérer.

    (Je suppose que je ne suis pas très clair, mais je suis attendu...)

  7. #6
    Seb.26

    Re : Programmation C

    Citation Envoyé par Revenn Voir le message
    Mais dans ce fonctionnement j'aimerais pouvoir accéder aux infos des capteurs grâce à l'hyerterminal, sans que cela n'arrete le delay, et c'est la que ça coince.
    C'est impossible ... ton uCPU est mono-core ... et un delay_ms() est en fait une boucle sur un NOP ...

    Regarde le squelette de code que je t'ai posté ... tout est dedans ...

  8. #7
    invite74b5b8f7

    Re : Programmation C

    C'est impossible ... ton uCPU est mono-core ... et un delay_ms() est en fait une boucle sur un NOP ...
    c´est pour ca qu´il faut utiliser un Timer...qui lui ne s´arrete pas pendant que tu fais autres choses

  9. #8
    Seb.26

    Re : Programmation C

    Citation Envoyé par lil-vince Voir le message
    c´est pour ca qu´il faut utiliser un Timer...qui lui ne s´arrete pas pendant que tu fais autres choses
    C'est bien ce que je dis depuis le début ...

  10. #9
    invite74b5b8f7

    Re : Programmation C

    C'est bien ce que je dis depuis le début ...
    J´avais point compris

    (c´est que t´as mis une boucle while pour l´attente)

  11. #10
    Seb.26

    Re : Programmation C

    Citation Envoyé par lil-vince Voir le message
    J´avais point compris
    (c´est que t´as mis une boucle while pour l´attente)
    Oui, avec un Timer à 100ms qui ecrit un flag ... de cette façon, tu execute périodiquement le code que tu souhaite ( donc pour le terminal ), et tu garde une notion de RTC pour les autres taches à "horaires fixes" ( déclenchement PWM ) ...

  12. #11
    invite34aea5f7

    Re : Programmation C

    Je vais essayer ton code merci à toi.

    Je savais bien que 2 actions à la fois il ne pourrait le faire, mais je me demandais si y'avais pas un moyen de faire ça sans que ca ressemble à une usine à gaz (© mon prof de GE ).

    Par contre avec ce code, ce qui arrive sur l'hyperterminal se passe a horaire fixe non?

    PS: que signifie RTC?

  13. #12
    invite74b5b8f7

    Re : Programmation C

    Par contre avec ce code, ce qui arrive sur l'hyperterminal se passe a horaire fixe non?
    logiquement oui.

    C´est parsque moi, j´aurais plutôt vu ce genre de chose (pour le timer)mais au lieu d´exécuter une tache avec le terminal tu attend une commande d´hyperterminal (mais après faut voir combien de temps dure ta gestion du PWM au cas où tu envoi une commande au moment oú tu fais autre chose, c´est pour ca que c´est plus simple soit d´envoyer periodiquement comme te le propose Seb.26 soit comme je te l´ais proposé avant déclencher l´envoi avec par exemple un bouton poussoir relié à une entrée de ton processeur (quand tu détecte l´appui (par interuption) tu attend d´avoir assez de temps pour l´envoi,et t´envoi (ou en plusieurs fois si y a beaucoup d´infos à envoyer)))

    Sinon RTC = Real Time Clock = horoge temps réel (au cas où)

  14. #13
    invite74b5b8f7

    Re : Programmation C

    Au fait, si tu te serts du code de Seb.26, n´oublie pas de déclencher le Timer et d´activer le interruptions (il faut chercher dans la doc de ton processeur comment programmer tout ca)

  15. #14
    invite34aea5f7

    Re : Programmation C

    Je viens de me remettre la dessus (un peu occupé ces derniers jours).

    J'ai quelques possibilité pour faire ce que je veux, mais je viens de regarder la doc de l'ATmega 16 et je suis tombées sur les "Interruptions" (choses que je ne connaissait pas du tout).

    N'est-il pas possible d'interrompre une action en cours grâce à une info envoyée pas l'hyperterminal?

    du genre, un exemple très simple:
    void main(void)
    {
    init(); //prog de configuration du pwm, liaison série, ports....

    while(1)
    {
    pwm(); .//fonction pour controller mon moteur, qui s'éxécute toutes les 10min ici
    delay_ms(60000000);
    };
    }

    C'est très simple et n'est pas vraiment mon programme mais c'est juste comme exemple. Et surtout ça bloque le µC pendant 10min de delay...
    Est-il possible d'interrompre le delay_ms grâce à l'hyperterminal pour appeler une autre fonction?

  16. #15
    invite74b5b8f7

    Re : Programmation C

    Oui mais si ton delais_ms n´est qu´une boucle NOP ton délais va se mettre en pause(et donc se décaler), on te parle d´interruptions depuis le début et surtout de TIMER (pour remplacer delais_ms) car un timer ne s´arreterais pas de tourner pendant que tu fais autre chose!

  17. #16
    Seb.26

    Re : Programmation C

    @Revenn : arrête de bidouiller, prends un papier et un crayon, et fait un minimum de cahier des charges de ton programme, ensuite fais un algo minimaliste, et fini par le programme ...

    Parfois en faisant les choses de la façon qui semble compliquée, tout est simple ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  18. #17
    Seb.26

    Re : Programmation C

    Citation Envoyé par Revenn Voir le message
    delay_ms(60 000 000);
    C'est une abération logicielle ... tu balance à la poubelle 60000 secondes d'énergie CPU ... imagine le gain de conso si tu était dans un sleep() durant tout ce temps ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  19. #18
    invite74b5b8f7

    Re : Programmation C

    J'ai quelques possibilité pour faire ce que je veux, mais je viens de regarder la doc de l'ATmega 16 et je suis tombées sur les "Interruptions" (choses que je ne connaissait pas du tout).

    N'est-il pas possible d'interrompre une action en cours grâce à une info envoyée pas l'hyperterminal?
    Une chose à faire: apprendre les interruptions(vraiment rien de compliqué) et ca sera possible! Et comme te conseil Seb.26, utilise les mode de faible consommation (arret de certaines parties du CPU)

    Du coup, ton CPU "se repose" mais tu peux le réveiller à tout moment par une INTERRUPTION(provenant d´un Timer quand il est temps de déclancher ton sous prog pwm() ou par l´arrivée d´une commande par hyperterminal par exemple)...

  20. #19
    invite34aea5f7

    Re : Programmation C

    J'ai bien avancé ces derniers temps sur mon programme, le delay a été remplacé par un timer + interruptions, tout fonctionne bien.

    Dans l'état mon programme est terminé, il reste juste a rentrer les valeurs de certaines variables (temps de fonctionnement du moteur, temps entre 2 déclenchement etc..), mais j'aimerais bien si possible encore améliorer mon programme.
    Pour le moment le µC ne se met pas en sleep, je peux le faire mais je me pose une question, avec mon timer, j'ai une interruption toutes les 0.004s pour incrémenter une variables qui au bout d'une certaine valeur fait 1s, donc je me demande si mettre mon µC en sleep(); est vraiment utile si toutes les 0.004s il est réveillé? parce qu'il se réveille bien à chaque interrupt?
    au pire, je peut augmenter le temps entre 2 interrupt jusqu'à 8s en passant sur le timer 16 bits, est-ce util?

    merci d'avance.

  21. #20
    Seb.26

    Re : Programmation C

    Citation Envoyé par Revenn Voir le message
    Pour le moment le µC ne se met pas en sleep, je peux le faire mais je me pose une question, avec mon timer, j'ai une interruption toutes les 0.004s pour incrémenter une variables qui au bout d'une certaine valeur fait 1s, donc je me demande si mettre mon µC en sleep(); est vraiment utile si toutes les 0.004s il est réveillé? parce qu'il se réveille bien à chaque interrupt?
    au pire, je peut augmenter le temps entre 2 interrupt jusqu'à 8s en passant sur le timer 16 bits, est-ce util?
    Verifie par contre si le Timer que tu as chois tourne quand ton uCPU est en sleep()

    Si tu as besoins d'une IT toutes les 8s, pourquoi donc avoir mis 0.004s ???
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  22. #21
    invite34aea5f7

    Re : Programmation C

    Il y a plusieurs modes de sleep(), dont un ou les timer tournent.
    Mais la question est surtout, est-ce que ça sert a quelque-chose de mettre mon µC en sleep() sachant que j'ai une interruption toutes les 0.004s? (une interruption réveille le µC sachant qu'il y a une routine d'interruption??)

    Que ce soit 0.004 ou 8s entre 2 interruptions n'est pas trop important, c'est 0.004 pour le moment car je suis sur un timer 8 bits et que c'est un chiffre qui tombait bien pour la fréquence d'horloge et pour les prédivieurs etc
    Ce que je veux avec ça c'est compté les seconde, les min.
    Je peux passer à 8s entre chaque interruptions, mais est-ce que mettre en sleep pendant 8 seconde entre chaque interruption est utile?

  23. #22
    Seb.26

    Re : Programmation C

    Citation Envoyé par Revenn Voir le message
    Je peux passer à 8s entre chaque interruptions, mais est-ce que mettre en sleep pendant 8 seconde entre chaque interruption est utile?
    bah, tu vas exécuter moins de code par seconde, donc consommer moins ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

Discussions similaires

  1. programmation
    Par inviteb595f793 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 30/09/2007, 13h44
  2. programmation
    Par invite70772835 dans le forum Électronique
    Réponses: 0
    Dernier message: 01/05/2007, 20h03
  3. Programmation
    Par invitee4eb1a4a dans le forum Internet - Réseau - Sécurité générale
    Réponses: 2
    Dernier message: 13/11/2006, 12h50
  4. Programmation 3D
    Par invite769675d7 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 01/11/2005, 07h07
  5. programmation
    Par invite3d7be5ae dans le forum Logiciel - Software - Open Source
    Réponses: 15
    Dernier message: 30/06/2005, 21h45
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...