Programmation MIKROC
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

Programmation MIKROC



  1. #1
    IHCAAMEL

    Exclamation Programmation MIKROC


    ------

    j'ai fait un programme en MIKROC et j'ai utilisé une fonction avec variable de type char comme sous programme.
    mon problème c'est que je fais appel à ce sous programme deux foix et ca resulte une erreur de compilation :

    2 365 Reentrancy is not allowed: function 'Emission_Message' called from two threads PR_PFE.c

    47 365 Reentrancy is not allowed: function 'UART1_Write_Text' called from two threads __Lib_UART_c67.c

    39 365 Reentrancy is not allowed: function 'UART1_Write' called from two threads __Lib_UART_c67.c


    Slvp aidez moi !!!!

    -----

  2. #2
    freepicbasic

    Re : Programmation MIKROC

    réentrance signifie qu'on appelle la fonction dans laquelle on se trouve.
    Vu la taille de la pile des pics , il est préférable de ne jamais le faire.
    A+, pat

  3. #3
    IHCAAMEL

    Re : Programmation MIKROC

    Citation Envoyé par freepicbasic Voir le message
    réentrance signifie qu'on appelle la fonction dans laquelle on se trouve.
    Vu la taille de la pile des pics , il est préférable de ne jamais le faire.
    je n'ai pas bien compris ce que vous avez dit et pour résoudre ce probléme qu'ce que je dois faire

  4. #4
    freepicbasic

    Re : Programmation MIKROC

    vaudrais mieux mettre le code sue le forum
    A+, pat

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

    Re : Programmation MIKROC

    Citation Envoyé par freepicbasic Voir le message
    vaudrais mieux mettre le code sue le forum
    voila mon programme :


    Code:
    void Emission_Message (char X){
    
    UART1_write_text("AT");    // Envoi de la commande AT
    UART1_write(13);    // Code ASCII equivalent pour ENTRE
    UART1_write(10);    // Code ASCII equivalent pour (CTRL+H)
    delay_ms(1000);
    UART1_write_text("AT+CSMS");   // Envoi de la commande "AT+CSMS" pour la selection de service de messagerie
    UART1_write(13);
    UART1_write(10);
    delay_ms(1000);
    UART1_write_text("AT+CMGF=1");   // Envoi de la commande "AT+CMGF=1" pour la selection du format du SMS le 1 pour le mode TEXT
    UART1_write(13);
    UART1_write(10);
    delay_ms(1000);
    UART1_write_text("AT+CMGS=");   // Commande pour l'envoi d'un SMS,on indiquant le numéro du destinataire
    UART1_write(34);  // code ASCII de (")
    UART1_write_text("0633825379");
    UART1_write(34);   // code ASCII de (")
    UART1_write(13);
    UART1_write(10);
    delay_ms(1000);
    UART1_write_text(X);  // le contenu de notre message
    UART1_write(13);
    UART1_write(10);
    delay_ms(1000);
    }
    
    void  reception_message(){
                          UART1_INIT(9600);    // initialisation du protocol UART avec une vitesse d'echange des données de 9600
                          Delay_ms(100);
                          UART1_write_text("AT");    // Envoi de la commande AT
                          UART1_write(13);    // Code ASCII equivalent pour ENTRE
                          UART1_write(10);    // Code ASCII equivalent pour (CTRL+H)
                          delay_ms(1000);
                           UART1_write_text("AT+CMGF=1"); // choisir le mode texte en positionnant en 1
                          UART1_write(13);
                          UART1_write(10);
                          delay_ms(1000);
                          UART1_write_text("AT+CPMS='ME'");// la mémoire choisie est la mémoire de la télephone
                          UART1_write(13);
                          UART1_write(10);
                          delay_ms(1000);
                          UART1_write_text("AT+CNMI=2,1,0,0,0");// extraire touts les message  reçus
                          UART1_write(13);
                          UART1_write(10);
                          delay_ms(1000);}
    
                          void lecture_message (){
                          UART1_write_text("AT+CMGR=1"); // la lecture du message de l'enplacement 1
                          UART1_write(13);
                          UART1_write(10);
                          delay_ms(1000);
                          UART1_write_text("AT+CMGD=1"); // supprimer le message dans l'emplacement 1
                          UART1_write(13);
                          UART1_write(10);
                          delay_ms(1000);}
    void main() { char R;trisb.f0=1;intcon=0x90;trisb.f6=0;
                  UART1_init(9600);
                  Delay_ms(100);
    loop:
                  lecture_message ();
    
    if(UART1_Data_Ready()){
                           R=UART1_Read();if(R=='A'){PORTB.f6=1;Emission_Message("execute");  }
                           if(R=='B'){PORTB.f6=0;}}
                           goto loop;
    }
    void interrupt(){
                     Emission_Message("Presence");
                     intcon.f1=0;
                     }
    Dernière modification par Jack ; 05/05/2011 à 17h04. Motif: ajout balises code

  7. #6
    IHCAAMEL

    Re : Programmation MIKROC

    Toujours pas d'idée ????

  8. #7
    IHCAAMEL

    Re : Programmation MIKROC

    Tout simplement je veut faire un sous programme et quand je fais appel à ce sous programme je remplace un parametre X par un mot :
    car j'ai besoin toujours d'envoyer des SMS et je ne veut pas que je repete le programme d'émission à chaque fois
    Slvp aidez moi

  9. #8
    Tryph

    Re : Programmation MIKROC

    Salut,

    ça n'a peut être rien à voir avec ton problème, mais c'est pas bien bon de faire de longs traitement dans la routine d'interruption. les interruptions doivent être traitées rapidement

    hors, là, tu lances la fonction Emission_Message() depuis directement dans la routine d'interruption...

    un autre problème potentiel: tu appelles la fonction Emission_Message() dans une boucle à la fin de la fonction lecture_message(). si une interruption survient pendant que tu exécute déjà la fonction Emission_Message(), tu vas relancer la même fonction sans en être sorti... c'est peut être plus en rapport avec tes messages d'erreur... faut faire des tests...

  10. #9
    Jack
    Modérateur

    Re : Programmation MIKROC

    Citation Envoyé par freepicbasic Voir le message
    réentrance signifie qu'on appelle la fonction dans laquelle on se trouve.
    Vu la taille de la pile des pics , il est préférable de ne jamais le faire.
    non, ce dont tu parles s'appelle la récursivité.

    la réantrance, c'est autre chose: elle intervient dans les systèmes multitâches et permet à plusieurs processus ou threads d'exécuter le même code.

    C'est d'aiileurs ce que confirment les messages d'erreurs, par exemple: " 'Emission_Message' called from two threads"
    Le problème est celui mis en évidence par Triph
    A+

  11. #10
    IHCAAMEL

    Re : Programmation MIKROC

    Citation Envoyé par Tryph Voir le message
    Salut,

    ça n'a peut être rien à voir avec ton problème, mais c'est pas bien bon de faire de longs traitement dans la routine d'interruption. les interruptions doivent être traitées rapidement

    hors, là, tu lances la fonction Emission_Message() depuis directement dans la routine d'interruption...

    un autre problème potentiel: tu appelles la fonction Emission_Message() dans une boucle à la fin de la fonction lecture_message(). si une interruption survient pendant que tu exécute déjà la fonction Emission_Message(), tu vas relancer la même fonction sans en être sorti... c'est peut être plus en rapport avec tes messages d'erreur... faut faire des tests...
    Merci j'ai changé mon programme ( maitenant pas d'erreur mais j'ai deux petit problème ) voila ce que j'ai changé :
    Code:
    void main() {
                   char R,S=0;trisb.f0=1;intcon=0x90;trisb.f6=0;
                  UART1_init(9600);
                  Delay_ms(100);
    loop:
    if(S==1){S=0;Emission_Message("Presence") ;}
                  lecture_message ();
    if(UART1_Data_Ready()){
                           R=UART1_Read();if(R=='A'){PORTB.f6=1;Emission_Message("execute");  }
                           if(R=='B'){PORTB.f6=0;Emission_Message("execute");}}
                           goto loop;
                           }
    void interrupt(){char S=0;
                     S=1;
                     intcon.f1=0;
                     }
    les deux problème qui me reste :
    le 1 c'est que le mot "execute" ne vient pas je trouve seulement "X" qui est envoyé
    le 2 c'est l'interruption ne marche pas
    pouvez vous m'aider slvp ???
    Dernière modification par Jack ; 05/05/2011 à 17h39. Motif: balises code. C'est la dernière fois que je le fais

  12. #11
    Jack
    Modérateur

    Re : Programmation MIKROC

    pourquoi tu ne mets pas de balises code? Ça ne donne vraiment pas envie de lire le tien et je ne vais pas le faire à ta place à chaque fois.
    Essaie de soigner l'indentation également.

    Le goto en C ça la fout mal. Tu doit avoir moyen de l'éviter.

    A+

  13. #12
    IHCAAMEL

    Re : Programmation MIKROC

    Citation Envoyé par Jack Voir le message
    pourquoi tu ne mets pas de balises code? Ça ne donne vraiment pas envie de lire le tien et je ne vais pas le faire à ta place à chaque fois.
    Essaie de soigner l'indentation également.

    Le goto en C ça la fout mal. Tu doit avoir moyen de l'éviter.

    A+
    je m'excuse je suis nouveau dans ce forum et je ne sais pas comment faire ???

    et Merci pour vous

  14. #13
    Jack
    Modérateur

    Re : Programmation MIKROC

    je m'excuse je suis nouveau dans ce forum et je ne sais pas comment faire ???
    Il faut sélectionner ton code et cliquer sur le # dans la barre d'outil.

    A+

  15. #14
    IHCAAMEL

    Re : Programmation MIKROC

    Slvp j'ai arriver à corriger les erreurs mais il me reste un petit problème d'abord voila la partie du programme :


    void main() { char R,X;trisb.f0=1;intcon=0xA0;tri sb.f6=0;
    UART1_init(9600);
    Delay_ms(100);
    loop:
    lecture_message ();
    if(X==1){ Emission_Message(); Emission_presence();X=0; }

    if(UART1_Data_Ready()){
    R=UART1_Read();

    if(R=='a'){ PORTB.f6=1; Emission_Message();
    Emission_alume();}
    else { if(R=='e' ){ PORTB.f6=0;Emission_Message(); Emission_Eteint();}
    else {Emission_Message(); Emission_Erreur();};};};
    goto loop;
    }
    void interrupt(){char X;X=1;intcon.f0=0;}
    le problème c'est que lorsque je sort de l'interruption et je revient au programme principale je ne touve pa la variable X chargé par 1
    peut etre que la variable ne revient pas avec une valeur ou bien elle n'est pas la meme dans le programme principale ?????
    comment puis je exploiter l'interruption pour agir dans le programme principale ?????
    sachant que mon but et d'envoyer un sms à chaque interruption Mais MIKROC n'autorise pas l'appel da la fonction UART1_WRITE par deux programme c'est pour cela que j'essai à travailer avec une variable sur laquelle je peux agir dans le programme principale

    Slvp aidez moi !!!!!!!!

  16. #15
    IHCAAMEL

    Re : Programmation MIKROC

    Citation Envoyé par Jack Voir le message
    Il faut sélectionner ton code et cliquer sur le # dans la barre d'outil.

    A+
    Ok c bon, Merci.

  17. #16
    Jack
    Modérateur

    Re : Programmation MIKROC

    En C, toute variable déclarée dans une fonction (c'est le cas de X) est LOCALE à cette fonction, donc n'existe plus lorsque la fonction se termine.
    La solution est de déclarer X comme GLOBALE, c'est à dire en dehors de toutes fonction.

    PS : bravo pour les balises code. Reste juste un petit effort pour l'indentation du code afin de le rendre (beaucoup) plus lisible.

    A+

  18. #17
    IHCAAMEL

    Re : Programmation MIKROC

    merci beaucoup pour la solution

  19. #18
    IHCAAMEL

    Re : Programmation MIKROC

    Citation Envoyé par Jack Voir le message
    En C, toute variable déclarée dans une fonction (c'est le cas de X) est LOCALE à cette fonction, donc n'existe plus lorsque la fonction se termine.
    La solution est de déclarer X comme GLOBALE, c'est à dire en dehors de toutes fonction.

    PS : bravo pour les balises code. Reste juste un petit effort pour l'indentation du code afin de le rendre (beaucoup) plus lisible.

    A+
    la solution est bonne
    Un grand Merci pour votre aide Mr. jack

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/03/2010, 22h14
  2. programmation du pic 16F84A avec mikroc
    Par invite184126ed dans le forum Électronique
    Réponses: 3
    Dernier message: 14/03/2010, 16h05
  3. Programmation PIC 16F84A avec MIKROC:AIDE SVP
    Par hissokaaaa dans le forum Électronique
    Réponses: 8
    Dernier message: 09/10/2009, 18h08
  4. programmation des PICs avec mikroc
    Par invite5207145e dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 27/05/2009, 07h53
  5. Programmation MikroC pour fabrication d'un banc d'essai
    Par invite3eea174e dans le forum Électronique
    Réponses: 0
    Dernier message: 14/04/2008, 15h12
Découvrez nos comparatifs produits sur l'informatique et les technologies.