éxecuter simultanément deux instructions sur Microcontroleur
Répondre à la discussion
Affichage des résultats 1 à 25 sur 25

éxecuter simultanément deux instructions sur Microcontroleur



  1. #1
    stephane-mecano

    éxecuter simultanément deux instructions sur Microcontroleur


    ------

    Bonsoir,


    Je cherche un moyen de gérer deux évènements en même temps sur un microcontroleur, j'utilise le PIC18F2550 ainsi que le compilateur mikroc.

    Je voudrais effectuer deux actions en même temps or le langage C ne permet d'effectuer qu'une instruction à la fois.


    Alors supposons que je programme une barre de progression sur un afficheur LCD, pendant que cette barre progresse, je voudrais pouvoir effectuer une autre action lorsque j'appui sur un bouton poussoir par exemple, je voudrais activer une sortie qui genere un son par exemple,

    je sais qu'il y a les interruptions mais l'interruption stoppe le programme pour executer la portion de code contenu dans la routine d'interruption or moi je veux exectuer deux actions simultanément


    comment faites vous ca?


    merci

    -----

  2. #2
    DAUDET78

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Citation Envoyé par stephane-mecano Voir le message
    moi je veux exectuer deux actions simultanément
    Simultanément ?
    • A la même nanoseconde ?
    • A la même microseconde ?
    • A la même milliseconde ?
    • A la même seconde ?

    Tout est relatif !
    J'aime pas le Grec

  3. #3
    stephane-mecano

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    en fait je veux pouvoir effectuer deux actions en parallele mais pas forcement simultanément, je veux pas etre obliger d'attendre qu'une execution se termine pour pouvoir effectuer la deuxieme action, el

  4. #4
    DAUDET78

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Citation Envoyé par stephane-mecano Voir le message
    je veux pas etre obliger d'attendre qu'une execution se termine pour pouvoir effectuer la deuxieme action
    faut chiffrer (en picoseconde !) ton besoin ....sinon, ça va tourner à une discussion au bar de café du Commerce .
    C'est quoi tes deux actions "simultanées" ???????
    J'aime pas le Grec

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

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Sur les picaxes que je programme il y as le pseudo multi_taches ;

    A savoir quatre programme tournant en // , se partageant la frequence d'horloge .

    je ne sais pas si la même fonction existe sur les Pics . mais ca devrait pouvoir le faire quand même .
    C'est en faisant des erreurs; que l'on apprend le mieux !!

  7. #6
    inoxxam

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Au sens strict, ça ne te permettra pas d'exécuter deux instruction simultanément. Mais je pense que ce que tu cherches, ça s'appelle un système d'exploitation. Ca permet de donner l'impression que deux tâches (ou plus) sont exécutées en même temps alors qu'en fait, elles sont saucissonnées, et les tranches sont exécutées alternativement. C'est un description très simplifiée, mais c'est le principe de base.

  8. #7
    vincent66

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Bienvenue dans le monde du RTOS, Real Time Operating System..!
    Il n'y a pas d'autre alternative à programmer deux processus et allouer alternativement 10 à 20 ms à l'un puis à l'autre pour donner l'impression qu'ils s'effectuent simultanément...
    En assembleur c'est assez ardu mais on contrôle tout très bien, sinon programmation en C++ d'une carte équipée d'un rtos...
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  9. #8
    DAUDET78

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Citation Envoyé par vincent66 Voir le message
    En assembleur c'est assez ardu mais on contrôle tout très bien
    J'ai fait ça il y a 30 ans ... No problemo !
    C'était sur un TMS99100
    J'aime pas le Grec

  10. #9
    vincent66

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Et moi en Modula2 sur un GESPAC pour contrôler une maquette de train HO digital, bonne idée de notre prof d'informatique en école d'ingé, c'était ludique...
    Maintenant la maquette existe toujours mais exit le gespac , modula2 et le VAX pour compiler... ça se fait avec un PC et une carte à ATmega avec rtos, tout fout le camp mon brave monsieur..!
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  11. #10
    stephane-mecano

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    je pense que vous avez compris le probleme, en fait il s'agit d'un jeu que je programme sur un afficheur graphique


    il y a 5 questions qui sont posées, lorsque la premiere question est posé dans le jeu (genre question pour un champion), j'ai créer une barre de progression en guise de temps, qui défile, comme une sorte de chrono, apres 10 secondes de non réponses, on passe à la question suivante, sauf


    pendant que cette barre de progression évolue, je n'arrive pas à effectuer autre chose (je devrais pouvoir choisir une réponse parmis 4) mais je ne peux le faire que lorsque la barre de progression se termine cad lorsque la portion de code est finie, ce qui fait que c'est séquentiel, je voudrais pouvoir interagir dans mon programme pendant que la barre de progression évolue

    alors je ne sais pas vraiment si c'est faisable avec des pics? avez vous déja été confronté à ca? solution?


    merci

  12. #11
    DAUDET78

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Citation Envoyé par stephane-mecano Voir le message
    pendant que cette barre de progression évolue, je n'arrive pas à effectuer autre chose (je devrais pouvoir choisir une réponse parmis 4) mais je ne peux le faire que lorsque la barre de progression se termine cad lorsque la portion de code est finie, ce qui fait que c'est séquentiel, je voudrais pouvoir interagir dans mon programme pendant que la barre de progression évolue
    Tu fais une tempo soft pour ta barre de progression ? ??
    Tu sais ce que c'est qu'un timer ? une interruption ??
    J'aime pas le Grec

  13. #12
    stephane-mecano

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    j'ai fais ma barre de progression avec le timer1 du PIC

  14. #13
    DAUDET78

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Je crois qu'il va falloir que tu montres ton soft mais ce n'est pas moi qui le regardera ! Je n'en fait plus depuis 2005
    J'aime pas le Grec

  15. #14
    xberger

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Salut,

    Avant de regarder un OS real-time, tu peux aussi regarder les concepts suivants :
    - les interruptions
    - les tâches non-bloquantes
    - les gestionnaires de tâche

    Tout ceci est implémentable en C

    En particulier si tu attends l'appui sur un bouton
    ce n'est pas forcément la bonne méthode de bloquer le logiciel dans l'attente d'un changement d'état d'une entrée du microcontrolleur.
    Le bonne méthode c'est de configurer une interruption sur cette entrée.
    Si l'entrée n'est pas interruptible alors scruter périodiquement cette entrée (cadencé par un timer ie. tous les 10ms)

    Cordialement

    Xavier

  16. #15
    MiGaNuTs

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Y'a aussi le bon vieux GRAFCET et sa divergence en OU qui permets de faire beaucoup de choses, tout en étant très simple et efficace.

  17. #16
    stephane-mecano

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    bon apres des recherches sur le net, j'ai trouvé une méthode qui consiste à faire croire au microcontroleur que deux taches sont executé en concurrence alors que non, il faudrait que j'écrive à l'intérieur de ma routine d'interruption les deux taches que je veux executér cadencé chacune à 10 ou 50 ms, comme ca le micro n'a pas le temps de voir qu'il s'agit de deux actions en meme temps, je vais voir ca en pratique et je vous tiens au courant

  18. #17
    minioim

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    c'est le principe qui t'a été donné avant... "saucissoner" les tâches.

    ceci étant, si on histoire c'est "juste" de sélectionner une question, alors l'interruption
    fera merveille.

    il faut se replacer dans le contexte temps du PIC. quand tu vas appuyer, il va devoir executer combien d'instructions? 10? 20? admettons que pour changer de réponse sélectionnée, ça demande 50 instructions (soyons fou ^^)

    ça va nécessiter combien de temps? environ 50µs si t'es en 4MHz. 10µs si t'es en 20MHz etc...
    est ce que 50µs (soit 5 centièmes d'une milliseconde hein) vont être visibles par l'utilisateur? si la barre de chargement "freeze" pendant 50 µs...

    enfin si c'est bien l'idée que tu veux implémenter. sinon.. ^^ bref t'as les pistes bon courage

  19. #18
    stephane-mecano

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Salut minioim, merci de t'intéresser à la question.

    pendant que la question est posée et que le jeu attend que le joueur choisit une réponse,il y a une progress barr qui évolue en bas du jeu (En guise de temps qui reste au joueur) c'est à ce moment la que je ne peux pas choisir la réponse, je suis obligé d'attendre que la barre de temps se termine pour pouvoir choisir une réponse donc je vais passer par la méthode que j'ai dite.


    Alors je suis sur un PIC18F2550 à 4Mhz, comment savoir combien de temps prends l'instruction qui permet de sélectionner la réponse? la partie de code qui fait ressemble à ca, c'est juste un exemple

    if (PORTB && 0b00000010) {

    Incr++;
    Lcd_Out(Incr++,2);
    if (Inc == 3) Inc = 1;

    }

  20. #19
    stephane-mecano

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Si ca va etre visible je ne sais pas je vais déja testé et je changerai les timing pour avoir quelque chose de bien

  21. #20
    dje8269

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Tu te prends la tête pour rien .

    Quand tu donne la partie du code qui ressemble a la selection de la question , elle tiens sur 4 lignes . Si ca dur 10ms c'est deja enorme . Fonce tu n'auras aucun ralentissement ! ( du moins tu le verras pas)
    C'est en faisant des erreurs; que l'on apprend le mieux !!

  22. #21
    gabuzo

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Citation Envoyé par stephane-mecano Voir le message

    Alors je suis sur un PIC18F2550 à 4Mhz, comment savoir combien de temps prends l'instruction qui permet de sélectionner la réponse? la partie de code qui fait ressemble à ca, c'est juste un exemple
    Run > start debugger permet de connaître le timing précis d'un programme instruction par instruction. Cette fonction existe sur Mikrobasic, j'imagine qu'elle existe aussi sur MikroC.
    Je suis Charlie

  23. #22
    minioim

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Citation Envoyé par stephane-mecano Voir le message
    Salut minioim, merci de t'intéresser à la question.

    pendant que la question est posée et que le jeu attend que le joueur choisit une réponse,il y a une progress barr qui évolue en bas du jeu (En guise de temps qui reste au joueur) c'est à ce moment la que je ne peux pas choisir la réponse, je suis obligé d'attendre que la barre de temps se termine pour pouvoir choisir une réponse donc je vais passer par la méthode que j'ai dite.


    Alors je suis sur un PIC18F2550 à 4Mhz, comment savoir combien de temps prends l'instruction qui permet de sélectionner la réponse? la partie de code qui fait ressemble à ca, c'est juste un exemple

    if (PORTB && 0b00000010) {

    Incr++;
    Lcd_Out(Incr++,2);
    if (Inc == 3) Inc = 1;

    }
    Vu ton code, il faudrait savoir ce que ça donne en assembleur mais je doute que ça dépasse les 100 microsecondes (pas mili hein, micro!)

    Pour savoir combien de temps ça prend c'est pas compliqué : t'es en 4MHz, une instruction pic demande 4 coups d'horloge. Donc ça fait "1MHz" d'instructions. Soit un million d'instructions exécutées par seconde donc une toutes les microsecondes.

    Tu connais vraiment le principe des interruptions externes?
    Le code est interrompu des qu'un signal vient de l'extérieur (appuie sur un bouton dans ton cas) et "saute" vers la partie de code gérant les inter. Puis il REVIENT LA OÙ IL S'EST ARRÊTÉ. et c'est ça qui est génial...

    Si tu câbles ton bouton pour générer une interruption, et que tu places ton code de sélection de réponse dans la partie "interruptions", quand tu vas appuyer sur le bouton, la barre de chargement va arrêter d'avancer (logique, le pic ayant reçu une interruption va INSTANTANEMENT arrêter TOUT CE Qu'il est en train de faire pour gérer l'Inter) et ton code de sélection de réponse va être lu et exécuté. Une fois fait, le pic va revenir a la barre de chargement pour continuer son avance.

    Donc avec une inter tu peux reprendre la main même pendant que ton pic travaille. En fait tu peux reprendre la main quelque soit la tache accomplie par le pic SAUF si il est en train de gérer une autre interruption. C'est pour ça qu'il ne faut pas mettre d'action longue dans une inter. Pour pas louper les suivantes...

    Mais dans ton cas le code va s'exécuter en moins d'une milliseconde puis la jarre va reprendre son avancée.... Ça sera invisible a l'utilisateur.

    D'ailleurs c'est exactement ce que fait la technique dont tu parles: elle donne des temps d'action a chaque partie du code a tour de rôle. La seule différence c'est que pour ta technique c'est " programmé", défini a l'avance. Chaque tache aura x microseconde d'action avant de rendre la main.
    Alors qu'avec l'interruption, c'est quand ya besoin qu'on alloue du temps a une autre tache.

    Ta technique n'a d'intérêt que si tu as de longues tâches a accomplir en simultané. Mais si c'est une tache très courte et une longue, il vaut mieux gérer la courte via interruptions. Ça évitera de ralentir ou gener la longue. Et ça sera 1000 fois plus facile à coder. (Coder une inter c'est 4 lignes de code)
    Dernière modification par minioim ; 10/06/2014 à 12h54.

  24. #23
    stephane-mecano

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Je crois que j'ai un peu trop simplifié le code, en fait ca prends plus de temps que, voici le code

    l'utilisateur doit entrer des chiffres dans une case vide à certaine questions et donc
    Code:
      if ( kp == 49 || kp == 50 || kp == 51 || kp == 52 || kp == 53 || kp == 54 ){
    
               Play_Song(1750, 25);                                                     
               Mem[cout] =  kp;                                                         
               byteToStr( Mem[cout] % 48, bufferp);                                    
               T6963C_write_text(bufferp,x_cout,3, T6963C_ROM_MODE_XOR);                
               cout++;
               x_cout--;
    
               //
    donc comme vous pouvez le voir, avec une interruption ca va être limite, car une action prend assez de temps, déja la fonction bytetostr et T6963_Write est tres lente sur Mikroc sans compter les 25 ms perdu pour la génération d'un bip sonore par le sound_play


    je pense donc passer par un truc de ce genre comme je l'ai mentionné



    Code:
    void interrupt(){
    
    Init_Timer0;                   // J'initialise le timer pour déclencer une interruption chaque 100 us
    
    
    
    counter_tache_1++;
    if (counter_tache_1 >= 1){                                             // chaque 100 us
                                    counter_tache_1 = 0;
                                    effectuer la tache 1 ;
    }
    
    counter_tache_2++;
    if (counter_tache_2 >= 100){                                       // chaque 10ms
                                    counter_tache_2 = 0;
                                    effectuer la tache 2;
    }
    
    
    counter_tache_3++;                                                   // chaque 100 ms
    if (counter_tache_3 >= 1000){
                                    counter_tache_3 = 0;
                                    effectuer la tache 3;
    }

  25. #24
    stephane-mecano

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Bon j'ai essayé la technique que je viens d'écrire, en adaptant à mon code, et j'arrive à faire des actions pendant que la barre progresse, c'est déja pas mal du tout. merci de votre aide tres précieuse

  26. #25
    Gérard

    Re : éxecuter simultanément deux instructions sur Microcontroleur

    Juste une idée, as-tu pensé que le traitement de chaque interruption devra être plus court que la génération des interruptions ?

Discussions similaires

  1. calculer de temps entre deux instructions
    Par malmou dans le forum Électronique
    Réponses: 0
    Dernier message: 27/05/2014, 08h51
  2. Réponses: 7
    Dernier message: 10/02/2014, 09h48
  3. C'est quoi la diff entre ces deux instructions [ Assembleur PIC16f]
    Par invitec94a51d1 dans le forum Électronique
    Réponses: 7
    Dernier message: 16/12/2010, 23h39
  4. ntldr manquant:je n'arrive pas à exécuter les instructions(autres post lus).
    Par invitee0f26e52 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 23/12/2007, 12h24
  5. utiliser deux souris simultanément sous WINDOWS XP ?
    Par Sushi dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 05/07/2006, 17h01
Découvrez nos comparatifs produits sur l'informatique et les technologies.