Problème de chaine de données en CCS
Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

Problème de chaine de données en CCS



  1. #1
    HAYAC

    Problème de chaine de données en CCS


    ------

    Bonjour à tous, Tout d’abord mon environnement :
    (MLAB 8.83/CCS 4/PicKit2/16F877A-Quartz20Mhtz/LCD-GDM1602K).
    Mon problème :
    J’aimerais pouvoir contrôler simplement les messages de l’afficheur or après plusieurs essais infructueux je ni arrive toujours pas (avec la bibliothèque standard 4Bit LCD.C).
    Voici mes essais :
    Code:
       
      char Sec;//[3];
      char Min;//[3];
      char Heu;//[3];
      char Mes[9];
      char *Texte;
      int value = 123;
      void main ()
      {
                  SetupADC();                                                  // Configuration des ports analogiques
                  SetupPSP();                                                    // Configurations du Parallèle Slave Port
                  SetupSPI();                                                     // Configurations du Serial Port Interface
                  SetupUART();                                    // Configurations de la liaison UART
                  SetupTimer();                                      // Configuration des timers
                  SetupWatchDogTimer();                     // Configuration du Watch Dog Timer
                  SetupCompar();                                              // Configurations du comparateur
                  EnableInterrupt();                                // Activation des interruptions
                  lcd_init();                                                        // initialisation du LCD
                  lcd_putc("\fDemarrage\n");       // Affiche Démarrage après initialisation
                  Tempo_Sec(1);                                               // Pause d'une seconde avant démarrage du programme
                  while(TRUE)                                                   // Boucle sans fin du programme principal
                  {
                              restart_wdt();                          // Réinitialisation du Watch Dog Timer
                              Tempo_DiziemeSec(1);           // Temporisation d'affichage
                              
                              // Test 1 OK
                              lcd_putc("\fHorloge :\n14:59:45");
                              
                              /*
                              // Test marche pas et reboot
                     sprintf (Heu,"%u",Heures);
                     lcd_putc(Heu);
                     lcd_putc(":");
                     sprintf (Min,"%u",Minutes);
                     lcd_putc(Minutes);
                     lcd_putc(":");
                     sprintf (Sec,"%u",Secondes);
                     lcd_putc(Secondes);*/
       
                     /*// Test marche pas et Affiche 7
                     sprintf(Mes, "%u : %u : %u",Heures Minutes Secondes );
                     lcd_putc(Mes);*/
                     
                     /*// Test marche pas affiche 1
                     Texte="14:59:45";
                     lcd_putc(*Texte);*/
                     
                     /*// Test presque ok
                     sprintf(Heu, "%u", Heures);
                     lcd_putc(Heu[0]);
                     lcd_putc(Heu[1]);
                     lcd_putc(":");
                     sprintf(Min, "%u", Minutes);
                     lcd_putc(Min[0]);
                     lcd_putc(Min[1]);
                     lcd_putc(":");
                     sprintf(Sec, "%u", Secondes);
                     lcd_putc(Sec[0]);
                     lcd_putc(Sec[1]);*/
         }
      }
    Merci de mettre du code entre balises code

    -----
    Dernière modification par Jack ; 02/09/2012 à 10h32. Motif: Ajout balises code

  2. #2
    HAYAC

    Re : Problème de chaine de données en CCS

    Re,

    L'idée étant d'afficher en une seule fois le message crée dans une variable, de sort à pouvoir le modifier en cour de fonctionnement exemple affichage d'un comteur.

    Merci d'avance pour vos conseils et lumieres sur le sujet,
    Cordialement,

  3. #3
    Jack
    Modérateur

    Re : Problème de chaine de données en CCS

    Pas très clair ...

    Quel est le problème en fait? La compilation ne passe pas ou l'exécution du programme ne produit pas l'effet escompté?

    Je note un problème flagrant de gestion des chaines en C, mais comme il s'agit d'un compilateur CCS, on peut s'attendre à tout. En tout cas, en C standard il y a un gros problème avec ta variable Texte:
    Code:
      char *Texte;
    Attention, Texte n'est qu'un pointeur et aucun place n'est réservée en mémoire pour stocker les caractères. Il faudra soit gérer dynamiquement la mémoire à coup de malloc/free soit réserver statiquement suffisamment de mémoire lors de la déclaration de la variable. Par exemple:
    Code:
    char Texte[41];
    pour pouvoir mémoriser une chaîne de 40 caractères.

    Ensuite:
    Code:
    Texte="14:59:45";
    On ne peut pas affecter de chaine en C. Il faut utiliser des fonctions comme strcpy ou mieux strncpy.

    A+

  4. #4
    HAYAC

    Re : Problème de chaine de données en CCS

    Bonjour Jack,
    Tout d’abord excuses pour les balises code je ne connaissais pas cette fonction.
    Mon problème exact est de pouvoir composer un message avec des sources et format différent puis de l’afficher par la fonction
    Code:
    lcd_putc(Message);
    .
    Exemple :
    J’ai trois sources déclarées en int (Secondes/Minutes/Heures) puis du texte déclaré en char (Début de message, Milieu de message, caractères de contrôle…) pour composer un message final du type
    Code:
    \fcompteur :\n14:59:45
    Mes problèmes sont :
    • la conversion de int vers char, j’ai testé avec sprintf (Heu,"%u",Heures) sans certitude,
    • la concaténation de la chaine testée d’après la doc avec strcat (s1, s2)
    • et enfin le passage du message entier dans lcd_putc()
    J’ai, dans mes exemples, essayer de différentes façons de stocker en variable un message simple pour le transmettre à l’afficheur sans résultat.

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

    Re : Problème de chaine de données en CCS

    PS: j'ai effectivement essayé avec
    Code:
    char Texte[41];
    Texte="14:59:45";
    lcd_putc(Texte);

  7. #6
    Jack
    Modérateur

    Re : Problème de chaine de données en CCS

    Tu ne réponds toujours pas à cette question
    Quel est le problème en fait? La compilation ne passe pas ou l'exécution du programme ne produit pas l'effet escompté?
    Code:
    char Texte[41];
    Texte="14:59:45";
    Apparemment, tu persistes à affecter une chaîne au pointeur Texte, ce qui ne fonctionne pas en C standard comme je l'ai indiqué plus haut. C'est dû au fait que le type chaîne de caractère n'existe pas en C.

    A+

  8. #7
    Jack
    Modérateur

    Re : Problème de chaine de données en CCS

    Il n'y a pas de debugger dans CCS. Pourquoi n'essaies-tu pas d'afficher le contenu de la variable Texte en pas à pas au moment des affectations?

    A+

  9. #8
    HAYAC

    Re : Problème de chaine de données en CCS

    Alors pour repondre à ta question, je n'est dans aucun des cas d'erreur de compilation mais que des résultats non escomptés.
    Je viens de faire un nouvelle essai avec :
    Code:
    char Texte[11]="\f12:12:12";
           lcd_putc(Texte[0]);
           lcd_putc(Texte[1]);
           lcd_putc(Texte[2]);
           lcd_putc(Texte[3]);
           lcd_putc(Texte[4]);
           lcd_putc(Texte[5]);
           lcd_putc(Texte[6]);
           lcd_putc(Texte[7]);
           lcd_putc(Texte[8]);
           lcd_putc(Texte[9]);
    Ce programme fonctionne mais pourquoi ne pas afficher directement le message si j'utilise :
    Code:
    lcd_putc(Texte);
    ou dans ce cas il me remplie l’écran du caractère @

  10. #9
    Jack
    Modérateur

    Re : Problème de chaine de données en CCS

    N'ayant pas la doc, je ne peux faire que des supputations: pour moi, le "c" de "lcd_putc" veut dire caractère. Le paramètre dit donc être un caractère.
    Texte[0] est un caractère puisque la variable Texte est un tableau de caractères (en fait un pointeur constant contenant l'adresse des caractères.
    Par contre Texte n'est pas un caractère.

    Mais tout ceci doit être expliqué dans la doc du compilateur. Et si celui-ci est bien fait, il doit générer un warning pour la ligne
    Code:
    lcd_putc(Texte);
    A+

  11. #10
    HAYAC

    Re : Problème de chaine de données en CCS

    non ce n'ai pas le cas car ceci fonction bien :
    Code:
    // Test 1 OK
    //lcd_putc("\fHorloge :\n14:59:45");
    Ci-joint un extrait de la bibliothèque :
    Code:
    void lcd_putc( char c) {
       switch (c) {
         case '\f'   : lcd_send_byte(0,1);
                       delay_ms(2);
                                               break;
         case '\n'   : lcd_gotoxy(1,2);        break;
         case '\b'   : lcd_send_byte(0,0x10);  break;
         default     : lcd_send_byte(1,c);     break;
       }
    }
    void lcd_send_byte( BYTE address, BYTE n ) {
    
          lcd.rs = 0;
          while ( bit_test(lcd_read_byte(),7) ) ;
          lcd.rs = address;
          delay_cycles(1);
          lcd.rw = 0;
          delay_cycles(1);
          lcd.enable = 0;
          lcd_send_nibble(n >> 4);
          lcd_send_nibble(n & 0xf);
    }
    La question reste donc entière, pour moi, un texte (de plusieurs caractère) entre "" fonctionne mais le passage d'une variable contenante ce même texte ne fonctionne pas ???

  12. #11
    HAYAC

    Re : Problème de chaine de données en CCS

    un autre problème est que les trois suites de caractères de contrôle
    Code:
    ////                      \f  Clear display                            ////
    ////                      \n  Go to start of second line               ////
    ////                      \b  Move back one position                   ////
    ne sont plus reconnu par la fonctions lcd_putc(c) en passage caractère par caractère.
    Ce qui me ramène à la question d'origine sur le gestion du type de variable, et pour le cas de mon conteur à la transformation de type et la concaténation dans une variable chaine et non tableau.
    Enfin je pense, s'est ce que je faisais en C# il y à long temps

  13. #12
    Jack
    Modérateur

    Re : Problème de chaine de données en CCS

    Je crois que tu te trompes complètement. Les extraits de la bibliothèque montrent bien que le paramètre de la fonction lcd_putc est un CARACTERE. Donc
    Code:
    lcd_putc("\fHorloge :\n14:59:45");
    n'a aucun sens et les effets, même s'ils existent, ne sont pas forcément ceux escomptés.

    Donc, en résumé, pour envoyer une chaine au LCD, soit il faut faire une boucle en expédiant la chaine caractère par caractère, soit il existe une fonction pour envoyer directement une chaine au LCD.

    A+

  14. #13
    HAYAC

    Re : Problème de chaine de données en CCS

    Hé bien, je ne sais pas, je suis loin d'être un programmateur.
    Le seul constat que je peux faire est que la fonction lcd_putc avec entre parenthèse et guillemet un texte affiche bien le message voulu (sans bug) mais pas en remplacent les guillemets et le texte par une variable
    Ça reste un mystère car je ne veux pas afficher qu’un simple texte prés défini.

  15. #14
    Jack
    Modérateur

    Re : Problème de chaine de données en CCS

    Pourquoi n’essaierais-tu pas:
    Code:
    // dans les déclaration:
      char Texte[]="12:12:12";
      int i = 0;
    
    // Dans le programme:
      lcd_putc('\f');    // on remet le curseur ligne 1 colonne 1 du LCD
      while (Texte[i] != 0 {  // Tant qu'on n'a pas atteint la fin de la chaine
        lcd_putc(Texte[i]);  // Envoi du ième caractère
      }
    
    A+

  16. #15
    HAYAC

    Re : Problème de chaine de données en CCS

    le fais que le lcd_putc fonctionne lors que l'on passe le texte entre guillemets reste un mistere mais effectivement je viens de tester ceci :
    Code:
    char Mes[19]; // nombre maximum de 18 caractères sur deux lignes
    int nb,i,add; 
    
           sprintf(Mes, "\fHorloge :\n%u:%u:%u",Heures Minutes Secondes );
           add=0;
           nb=strlen(Mes);
           for (i=1;i<=nb;++i)
           {
               lcd_putc(Mes[add]);
               add++;
            }
    et effectivement tous ce passe normalement, merci encore

  17. #16
    Jack
    Modérateur

    Re : Problème de chaine de données en CCS

    le fais que le lcd_putc fonctionne lors que l'on passe le texte entre guillemets reste un mistere
    Comme diraient certains de mes petits camarades ici présents, ton code est "tombé en marche".

    Pourquoi 2 variables i et add, les 2 étant liées?
    Code:
           
      for (i=1;i<=nb;++i)
      {
          lcd_putc(Mes[add]);
          add++;
      }
    Un seule suffit:
    Code:
      for (i=0;i<nb;++i)
      {           
          lcd_putc(Mes[i]);
      }

Discussions similaires

  1. Probléme d'interruption PIC12F683 CCS
    Par HAYAC dans le forum Électronique
    Réponses: 22
    Dernier message: 03/08/2012, 14h17
  2. Problème d'Intégration CCS dans MPLAB
    Par invite72f64164 dans le forum Électronique
    Réponses: 21
    Dernier message: 02/09/2008, 18h31
  3. Problème MPLAB / CCS
    Par invitec4f3b95a dans le forum Électronique
    Réponses: 2
    Dernier message: 06/11/2007, 12h56
  4. code en CCS problème
    Par invitefc1671e3 dans le forum Électronique
    Réponses: 9
    Dernier message: 13/10/2007, 18h36
  5. CCS C... problème
    Par invitea093086b dans le forum Électronique
    Réponses: 2
    Dernier message: 16/09/2005, 11h45
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...