Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Telescopage d'interruptions ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » jeu. 16 févr. 2017 21:20

Bonsoir à tous,

Je rencontre quelques difficulté à effectué un "REPORT" de transmission UART !

Je m'explique :

N'arrivant pas à piloter proprement mon module GSM2 ( encore lui, croyez moi ça me saoule aussi) afin de faire un tuto explicite ,
j'ai décidé de relier mon câble USB/TTL au PIC par la liaison UART2 et mon PIC au module GSM2-click par l'UART1 .

PC <-- câble --> PIC (UART2) <--> PIC (UART1) --> Module GSM2-Click

Comme j'aime bien me tracasser l'esprit, je souhaite également affiché le tout sur un LCD !

En littérale avec un exemple cela donne !

Depuis mon logiciel hyper terminal, j'envoie une commande simple disons "AT" ( peut pas faire plus simple :-D) avec le CR qui va bien .
Je souhaite donc affiché cette commande sur une ligne du LCD .
Donc mon UART2 va recevoir cette commande via une INTerruption RX, puis mon UART1 va envoyer cette même commande sur le TX UART1 pour aller au module.

Le module doit répondre "OK" ( en théorie) . donc l'UART1 va recevoir cette réponse par INTerruption sur le RX, et l'UART 2 doit envoyer cette réponse à mon PC par un envoie de l'UART2 via le câble. et la réponse doit s’afficher sur le LCD bien entendu !

Je n'arrive pas a obtenir ce comportement, je n'en suis pas trés loin mais quelque chose doit m’échapper, j'ai tellement le nez dedans que je ne trouve pas !

PS: pas de baud-rate nécessaire la valeur est déjà enregistré dans le module !
Re-PS: je joue des bip pour me faciliter la tache , c'est mioeux que des LEDs ! Cela ne gène en rien l'UART

Voila ou j'en suis :

Code : Tout sélectionner

/*

Tutoriel du module GSM2 pour :  http://www.FantasPIC.fr
lien command AT du module M95 : http://www.quectel.com/UploadImage/Downlad/M95_AT_Commands_Manual_V1.2.pdf
Data-Sheet du PIC 18F46K22     : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf

version du 16/02/17

*/

#define PWRKEY  RE1_bit

// Connexionsdu LCD
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;

sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;

// Variables
short ReponseID = -1;
char Valeur=0;
char tmp2Index_buffer2F_buffer2_plein ;
char  tmpIndex_buffer1F_buffer1_plein ;
int i;

char Buffer1[50]={0};
char Buffer2[50]={0};

//##############################################################################
// Lecture des données dans le buffer UART par INT
void interrupt(){

  if (
RC1IF_bit == 1) {      // Si INT UART détecté
      
tmp UART1_Read();      // On récupere et stock la donnée
      
      
if (tmp == 13){
          
Buffer1[Index_buffer2] = tmp;
          
Index_buffer1 0;
          
F_buffer1_plein 1;
      }
      else {
          
Buffer1[Index_buffer1] = tmp;
          
Index_buffer1++;
      }
  }
  if (
RC2IF_bit == 1) {      // Si INT UART détecté
      
      
tmp2 UART2_Read();      // On récupere et stock la donnée
      
      
if (tmp2 == 13){
        
//  Buffer2[Index_buffer2] = tmp;
          
Buffer2[Index_buffer2] = 0;
          
Index_buffer2 0;
          
F_buffer2_plein 1;
      }
      else {
          
Buffer2[Index_buffer2] = tmp2;
          
Index_buffer2++;
      }
  }
}
//##############################################################################
//###########################     MAIN     #####################################
//##############################################################################
void main(){
  
ANSELA ANSELB ANSELC ANSELD ANSELE 0// Tous en numerique
  
TRISA  TRISB  TRISC  TRISD  TRISE  0// Tous en sortie
  
LATA LATB LATC LATD LATE 0;           // RAZ des sorties

//------------------------------------------------------------------------------
// Réglages de l'interruption sur Reception UART
  
GIE_bit  1;     // Active toutesl es INT
  
PEIE_bit 1;     // Active les INT peripherique
  
RC1IE_bit 1;    // Active les Interruptions sur Rx UART 1
  
RC2IE_bit 1;    // Active les Interruptions sur Rx UART 2

//------------------------------------------------------------------------------
  
UART1_Init(9600); // Initialisation de l'UART1 à 9600 bauds
  
UART2_Init(9600); // Initialisation de l'UART2 à 9600 bauds
  
Sound_Init (&PORTC);
  
Lcd_Init();
  
Lcd_Cmd(_LCD_CURSOR_OFF);
  
Lcd_Cmd(_LCD_CLEAR);
  
delay_ms(200);

  
PWRKEY 0;             // Mise à zéro
  
Delay_ms(2000);         // Maintenir à 0 pendant plus de 2S
  
PWRKEY 1;             // Allume le module
  
Delay_ms(2000);         // Le temps de congiguration code pin etc ..
  
PWRKEY 0;

  for (
i=0;i<3;i++){
      
Sound_Play(1000200);
      
Delay_ms(100);
   }

  
F_buffer1_plein 0;
  
Lcd_Cmd(_LCD_CLEAR);
  
Lcd_Out(1,1,"Rx:");
  
Lcd_Out(2,1,"Tx:");
  
//##############################################################################
//####################### BOUCLE PRINCIPALE     ################################
//##############################################################################
  
while(1) {

     if (
F_buffer2_plein == 1){
         
F_buffer2_plein 0;
         
Lcd_Out(2,4,"            ");  // j'efface la deuxieme ligne
         
delay_ms(50);
         
Lcd_Out(2,4,Buffer2);
         
UART1_Write_Text(Buffer2);
         
UART1_Write(13);
      }

     if (
F_buffer1_plein == 1){
         
F_buffer1_plein 0;
         
Lcd_Out(1,4,"            ");  // j'efface la premiere ligne
         
delay_ms(50);
         
Lcd_Out(1,4,Buffer1);
         
UART2_Write_Text(Buffer1);
         
UART1_Write(13);
      }
 }


Si vous avez une meilleure méthode ou idée , je suis preneur !

Merci de m'avoir lu !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Telescopage d'interruptions ?
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » ven. 17 févr. 2017 09:09

bonjour,

l'affichage sur LCD prend trop de temps..
surtout avec reception par machine d'état.
ou le temps maxi dispo de traitement est inferieur
à la duree d'un car (1ms?) pour qu'il n'y ait pas de telescopage

contrairement à l'envoi uart2,qui prend quelques uS

une reception par buffer pourrait pallier
à cela..l'affichage lcd se faisant sur fin de msg recu.
Aide toi, le ciel ou FantasPic t'aidera

Telescopage d'interruptions ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » ven. 17 févr. 2017 09:17

Hello PAul ,

Jai étudié ton code ( enfin ce que j'ai compris), et je vois que tu as galérè pour "comprendre" un vrai message ! en effet le module retourne des "CR" et des "LF" à tout bout de champs .

Donc mon buffer des fois affiches des "LF" je pense !

Ce matin j'ai changé de méthode en me rappelant ce que tu m'avais dit une fois ! en utilisant TXREGx

Avec ce programme ca fonctionne trés bien, j’envoie ma commande par mon PC que je visualise sur hyper terminal , puis je reçois ma réponse du module que je visualise aussi via hyper-terminal.

Il me reste donc plus qu'a affiche cela sur le LCD !

Code : Tout sélectionner

/*

Tutoriel du module GSM2 pour :  http://www.FantasPIC.fr
lien command AT du module M95 : http://www.quectel.com/UploadImage/Downlad/M95_AT_Commands_Manual_V1.2.pdf
Data-Sheet du PIC 18F46K22     : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf

version du 16/02/17

*/

#define PWRKEY  RE1_bit

// Connexionsdu LCD
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;

sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;

// Variables
short ReponseID = -1;
char Valeur=0;
char tmp2Index_buffer2F_buffer2_plein ;
char  tmpIndex_buffer1F_buffer1_plein ;
int i;

char Buffer1[50]={0};
char Buffer2[50]={0};

//##############################################################################
// Lecture des données dans le buffer UART par INT
void interrupt(){

  if (
RC1IF_bit == 1) {      // Si INT UART détecté
  
      
tmp UART1_Read();      // On récupere et stock la donnée
      
TXREG2 tmp ;
  }
  if (
RC2IF_bit == 1) {      // Si INT UART détecté
      
      
tmp2 UART2_Read();      // On récupere et stock la donnée
      
TXREG1 tmp2 ;
  }
}
//##############################################################################
//###########################     MAIN     #####################################
//##############################################################################
void main(){
  
ANSELA ANSELB ANSELC ANSELD ANSELE 0// Tous en numerique
  
TRISA  TRISB  TRISC  TRISD  TRISE  0// Tous en sortie
  
LATA LATB LATC LATD LATE 0;           // RAZ des sorties

//------------------------------------------------------------------------------
// Réglages de l'interruption sur Reception UART
  
GIE_bit  1;     // Active toutesl es INT
  
PEIE_bit 1;     // Active les INT peripherique
  
RC1IE_bit 1;    // Active les Interruptions sur Rx UART 1
  
RC2IE_bit 1;    // Active les Interruptions sur Rx UART 2

//------------------------------------------------------------------------------
  
UART1_Init(9600); // Initialisation de l'UART1 à 9600 bauds
  
UART2_Init(9600); // Initialisation de l'UART2 à 9600 bauds
  
Sound_Init (&PORTC);
  
Lcd_Init();
  
Lcd_Cmd(_LCD_CURSOR_OFF);
  
Lcd_Cmd(_LCD_CLEAR);
  
delay_ms(200);

  
PWRKEY 0;             // Mise à zéro
  
Delay_ms(2000);         // Maintenir à 0 pendant plus de 2S
  
PWRKEY 1;             // Allume le module
  
Delay_ms(4000);         // Le temps de congiguration code pin etc ..
  
PWRKEY 0;

  for (
i=0;i<3;i++){
      
Sound_Play(100050);
      
Delay_ms(50);
   }

  
//##############################################################################
//####################### BOUCLE PRINCIPALE     ################################
//##############################################################################
  
while(1) {

 }
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Telescopage d'interruptions ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#4 Message par Jérémy » ven. 17 févr. 2017 10:02

J'en suis rendu la ! Cela fonctionne parfaitement pour la partie émission des commandes au module !

Le hic c'est pour la reception ou plutôt l'affichage de la réponse du module ! Car celui-ci ,quand on lui envoie une commande "AT" répond par CrLf OK CrLf

Comment sortir la réponse de cette chaine de caractère ? si il n'y avait que le "OK", ce serait facile, mais il me faut ne solution pour toute les réponses du module et pas seulement le "OK" ??? :mur:

EDIT :

j'avance tranquillement mais je tombe sur une impasse !

Comme le signale Paul l'affichage LCD est très lent par rapport à l'UART . Alors je n'est pas le temps d'effacer le buffer avant l'arrivée d'une nouvelle réponse , je me retrouve donc avec deux réponses écrites dans le buffer ! ce qui est moche à l'affichage !

Voici un exemple pour me comprendre :

J'envoie au module la commande : AT+CGMI + CR .
Le module me répond ceci :

Code : Tout sélectionner

Quectel_LtdCrLf
Quectel_M95CrLf
Revision
: MTK 0828CrLfCrLf
OKCrLfCrLf  


Avec le code suivant (simplifié) , je vois ceci sur mon LCD : OKvision: MTK 0828
► Afficher le texte


C'est normal, car la réponse "OK" se rajoute à mon buffer bien avant que celui-ci ne soit affiché.

Comment résoudre cela, je ne vois pas trop ! Car si j'interdis la reception, je ne verrais plus les réponses
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Telescopage d'interruptions ?
HULK28
Avatar de l’utilisateur
Amateur
Amateur
Messages : 106
Enregistré en : août 2015
Localisation : IdF

#5 Message par HULK28 » ven. 17 févr. 2017 17:12

Bonsoir Jeremy,

mon conseil quand tu veux faire de la communication est d'écrire tes propres fonctions, soit en C soit en assembleur (mon avis est de gérer les fonctions bas niveau toujours en assembleur).
Les fonctions MikroC sont pour la plupart justes bonnes pour des newbies ou des hobbystes qui bricolent par contre dès que tu veux faire des choses un peu plus sérieuses tu te confrontes à des problèmes puisque tu ne sais pas comment sont traitées les variables dans la fonction, les registres et les mécanismes d'interruptions sont cachés, ce qui dans un contexte plus lourd en terme de code est perdu d'avance et surtout source de plantage.

Exemple de fonctions peu pertinentes sous MikroC:

-Adc -> ne sait pas gérer +/-Vref interne (entre autres)
-Lcd -> ne gère pas le bit "busy", mode 4 bits uniquement (ne supporte que le controlleur HD44780)
-UART -> inutilisable en mode interruption
-etc....

C'est ce que tu as fait avec les mesures ADC dans ton tuto, et bien il faut faire de même avec l'UART. :wink:
"Pour la carotte, le lapin est la parfaite incarnation du mal" -Robert Shecley-

Telescopage d'interruptions ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » ven. 17 févr. 2017 18:31

C'est ce que tu as fait avec les mesures ADC dans ton tuto, et bien il faut faire de même avec l'UART.


Je ne me sens pas vraiment capable de faire un Tuto sur l'UART, j'ai pas le niveau et j'ai encore moi même tellement à apprendre!

Perso je me considère comme un bricoleur newbee hobbyste humour!! Par contre je mets énormément de volonté et d’acharnement dans ce que j'entreprends !

Je crois que je vais quand même laissé tombé mon tuto sur le GSM car c'est trop chaud à expliquer ! et j'avoue saturer un peu depuis le temps que j'y suis !

Les fonctions que j'ai faite je n'en suis pas sur du tout par exemple: l'envoi de commande avec time-out et re-envoie) ! ( même si ça fonctionne)
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Telescopage d'interruptions ?
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#7 Message par paulfjujo » ven. 17 févr. 2017 18:51

bonsoir Jeremy,



Je n'ai pas mon application GSM2 sous la main , ( tri, rangement ...en preparatif de demenagement ...)
mais j'avais noté ceci

Remise en cause de la partie Reception UART2 et interruption .

La fin de message etait basée sur la detection du caractere LF (terminaison CR LF),
MAIS ! le GSM renvoi une trame comportant plusieurs CR LF , et donc message tronqué
L'IT UART2 est toujours declenchée sur l'apparition d'un LF, MAIS la comm. n'est pas fermée pour autant
et le buffer continue à se remplir , pendant un temps minimum de plusieurs secondes
Le contenu du buffer , arrivé à terme, est alors inspecté et visualisé, et des que recupéré,
RAZ du buffer, RAZ du drapeau IT et reautorisation nouveau remplissage si LF reçu.
On ne perd ainsi, aucun caractere.
La fin de message 'OK' en temoigne.
=> Reception SMS OK et fiable.
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 46 invités