IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

[PIC] Débutant question sur "unsigned char"


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut [PIC] Débutant question sur "unsigned char"
    Bonjour

    J'utilise le compilateur C Microchip C18 pour PIC et je cherche stocker une chaine ascii appelée 'hour_event' dans une eeprom avec la fonction suivante :

    Visiblement la fonction XEEWrite attend un unsigned char, cependant je 'hour event' est déclaré avec char, que dois je faire pour transformer

    char hour_event[3]; en unsigned char ?

    Actuellement le compilateur m'indique un Warning : suspicious pointer conversion ...

    Est ce qu'un unsigned char c'est BYTE ?

    Je vous remercie de votre aide,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /******************************************************************************
     * Function:        XEE_RESULT XEEWrite(unsigned char val)
     * PreCondition:    XEEInit() && XEEBeginWrite() are already called.
     * Input:           val - Byte to be written
     * Output:          XEE_SUCCESS
     * Side Effects:    None
     * Overview:        Adds a byte to the current page to be writen when
     *                  XEEEndWrite() is called.
     * Note:            Page boundary cannot be exceeded or the byte
     *                  to be written will be looped back to the
     *                  beginning of the page.
     ******************************************************************************/
    XEE_RESULT XE0Write(unsigned char val, unsigned char EEpromNumber)
    {
        *EEPROMBufferPtr++ = val;
     
        if( EEPROMBufferPtr == EEPROMBuffer + EEPROM_BUFFER_SIZE )
        {
            DoWrite(EEpromNumber);
        }
     
        return XEE_SUCCESS;
    }
    Mon code est le suivant :

    Déclaration en tête de programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char hour_event[3];
    char eeprom_hour[3] = {'-'};
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        XE2BeginWrite(EEPROM_CONTROL, 0x000000);
        XE2Write(hour_event);
        XE2EndWrite();
     
    	// Lit l'EEPROM n°2 à l'adresse location 0x000000 et copies le contenu dans un buffer appelé "eeprom_hour"
    	XE2ReadArray(0, 0x000000, eeprom_hour, 0x02);
    	eeprom_hour[3] = 0;		// Ajoute un "0" en fin de chaine pour pouvoir utiliser la fonction httpgetvar

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par lcoulon Voir le message
    Est ce qu'un unsigned char c'est BYTE ?
    BYTE n'est pas un type de base en C (contrairement à char et unsigned char).
    Il doit être définit dans un des fichiers .h de ta plateforme.

    en général, on trouve
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef unsigned char BYTE;
    ou
    EDIT : si XEEWrite attend un char ou un unsigned char, il faut lui donner les éléments de hour_event les uns à la suite des autres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int count, i;
    count = sizeof hour_event / sizeof *hour_event;
     
    XE2BeginWrite(EEPROM_CONTROL, 0x000000);
    for(i = 0; i < count; ++i) {
        XE2Write(hour_event[i]);
    }
    XE2EndWrite();
    Cela dit, dans la mesur où il existe un XEEReadArray, il existe peut-être un XEEWriteArray, non ?

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Après, je ne comprends plus, tu parles de XEEWrite, tu montres le code de XE0Write, mais tu appelles XE2Write...
    Le code est capable de reconnaitre le chiffre après XE et en fonction de celui ci , il s'adresse à la bonne EEPROM.

    La fonction XE2Write fonctionne bien dans mon programme, mon pb c'est que la fonction XExWrite n'accepte que des unsigned char .

    je ne sais pas comment transformer un char en unsigned char et inversement .
    Ceci fait, je pense que la fonction d'ecriture dans mon eeprom fonctionnera ...

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    Le code est capable de reconnaitre le chiffre après XE et en fonction de celui ci , il s'adresse à la bonne EEPROM.

    La fonction XE2Write fonctionne bien dans mon programme, mon pb c'est que la fonction XExWrite n'accepte que des unsigned char .

    je ne sais pas comment transformer un char en unsigned char et inversement .
    Ceci fait, je pense que la fonction d'ecriture dans mon eeprom fonctionnera ...
    Oui, j'ai fini par comprendre mieux ton problème, j'ai édité mon premier post.

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Je suis dans un case, donc ton code me renvoi une erreur de syntaxe.

    Est il possible créer une static void pour ensuite appeler cette fonction qui me permettrait de stocker une donnée 'char' dans mon eeprom ?

    Je te remercie de ton aide,

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    Je suis dans un case, donc ton code me renvoi une erreur de syntaxe.
    Alors il suffit de créer un bloc :

    interdit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    switch(...) {
        case 0:
           int i = 0;
           printf("i = %d\n", i);
        break;
    }
    autorisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    switch(...) {
        case 0:
           {
               int i = 0;
               printf("i = %d\n", i);
           }
        break;
    }
    dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    {
        int count, i;
        count = sizeof hour_event / sizeof *hour_event;
        XE2BeginWrite(EEPROM_CONTROL, 0x000000);
        for(i = 0; i < count; ++i) {
            XE2Write(hour_event[i]);
        }
        XE2EndWrite();
    }
    Citation Envoyé par lcoulon Voir le message
    Est il possible créer une static void pour ensuite appeler cette fonction qui me permettrait de stocker une donnée 'char' dans mon eeprom ?
    Oui et d'ailleurs c'est plus propre que d'ajouter des bloc dans un case.

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par mabu Voir le message
    Oui et d'ailleurs c'est plus propre que d'ajouter des bloc dans un case.

    je ne sais pas comment écrire une telle fonction, l'idée serait de reprendre ton extrait de code qui lit chaque caractère du char pour les stocker uns à uns dans l'eeprom.

    Serait il également possible que cette fonction attende qu'on lui indique l'adresse à partir de laquelle on veut écrire les données ?

    D'ailleurs, pour m'entrainer , j'ai essayé d'utilise une fonction static void appelée "EraseAll" que quelqu'un d'autre à crée, mais mon compilateur m'indique :
    static function 'EraseAll' never referenced

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    //*****************************************************************************
    // EraseAll2 - erase eeprom2 from 0x000000 to 0x01FFFF
    //*****************************************************************************
    static void EraseAll(LWORD EStart, LWORD EEnd)
    {
        int i;
        LWORD  Eep2_Address;
     
        Eep2_Address = EStart;
        while (Eep2_Address < EEnd)
        {
           XE2BeginWrite(EEPROM_CONTROL, Eep2_Address);
           for ( i = 0; i < 256; i++ )
           {
              XE2Write(0xFF);
           }
           XE2EndWrite();
           Eep2_Address += 0x100;
        }
    }
    Ah ... pas facile de débuter !
    Je te remercie de ton aide,

  8. #8
    Invité(e)
    Invité(e)
    Par défaut
    Serait il également possible que cette fonction attende qu'on lui indique l'adresse à partir de laquelle on veut écrire les données ?
    Oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /**
     * array : zone mémoire à écrire dans l'eeprom.
     * size : nombre d'éléments dans la zone mémoire.
     * /!\ on ne peut plus utiliser sizeof qui ne fonctionne qu'avec des 
           tableaux et non des pointeurs 
     */
    void Write_char_array(const char *array, size_t size)
    {
        int i;
        XE2BeginWrite(EEPROM_CONTROL, 0x000000);
        for(i = 0; i < size; ++i) {
            XE2Write(array[i]);
        }
        XE2EndWrite();
    }
    D'ailleurs, pour m'entrainer , j'ai essayé de créer une fonction static void appelée "EraseAll" mais mon compilateur m'indique :
    static function 'EraseAll' never referenced
    Il te dit juste que tu as défini une fonction que tu n'utilises pas.

    Ah ... pas facile de débuter !
    Rassure toi, on est tous passé par là.
    Dernière modification par Invité(e) ; 06/10/2009 à 20h02. Motif: oubli d'un *

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Merci, j'ai ajouté la fonction que tu as crée dans mon programme principal, mais j'ai cette erreur :

    Error [1129] [] operator requires a pointer and an integer as operands


    le compilateur pointe vers la ligne : XE2Write(array[i]);

    En utilisant static void, ça semble passer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    static void Write_char_array(const char *array, size_t size)
    {
        int i;
        XE2BeginWrite(EEPROM_CONTROL, 0x000000);
        for(i = 0; i < size; ++i) 
    	{
            XE2Write(array[i]);
        }
        XE2EndWrite();
    }

    Cela implique t-il qu'en tête de mon programme, je définisse array comme ceci ?
    Ainsi, si je stocke dans char array le mot "ESSAI"
    La fonction enregistrera dans l'eeprom chaque caractère du mot à la suite ?

    0x000000 : E
    0x000001 : S
    0x000002 : S
    0x000003 : A
    0x000004 : I


    Serait il possible d'ajouter à cette fonction la possibilité de choisir l'adresse d'écriture de départ ?

    Ainsi l'adresse 0x000000 serait remplacée par une valeur que je définirai moi même à chaque utilisation de la fonction ?

    Comme je ne suis pas très à l'aise avec les fonctions , pourrais tu me donner un exemple avec la bonne syntaxe à utiliser ?

    -> Je pensais a une utilisation comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Write_char_array(array, 5, 0x000000);

    Merci de votre aide,

  10. #10
    Invité(e)
    Invité(e)
    Par défaut
    Merci, j'ai ajouté la fonction que tu as crée dans mon programme principal, mais j'ai cette erreur :
    Error [1129] [] operator requires a pointer and an integer as operands
    Oui, j'avais oublié le '*' dans mon post précédent.

    La fonction Write_char_array va permettre d'écrire une suite d'octets directement dans la mémoire eeprom.

    Le second paramètre dit à la fonction combien d'octets sont à écrire.
    Le premier paramètre est un pointeur de char, c'est à dire l'emplacement en mémoire du premier élément du tableau que l'on écrire.

    Serait il possible d'ajouter à cette fonction la possibilité de choisir l'adresse d'écriture de départ ?

    Ainsi l'adresse 0x000000 serait remplacée par une valeur que je définirai moi même à chaque utilisation de la fonction ?

    Comme je ne suis pas très à l'aise avec les fonctions , pourrais tu me donner un exemple avec la bonne syntaxe à utiliser ?
    On peut faire ça sans ajouter d'argument. L'arithmétique des pointeurs est là pour ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char exemple[] = "bonjour";
    char *p = exemple;
     
    /* écriture de "bonjour" en eeprom */
    Write_char_array(p, 8)
     
    /* écriture de "jour" en eeprom */
    Write_char_array(p+3, 5)
    un peu de lecture :
    http://emmanuel-delahaye.developpez....age=Page5#LXXI
    Dernière modification par Deepin ; 25/07/2011 à 08h16.

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Merci Mabu.

    Mais si je veux utiliser la fonction que tu as crée pour ecrire dans mon eeprom, il faut que je puisse définir à chaque utilisation l'adresse de départ.

    A présent, la fonction est définie pour écrire systématiquement à partir de 0x000000


    Si par exemple je veux écrire les variables suivantes aux adresses respectives suivantes, comment dois je faire ?

    Ecrire donnee1 à partir de 0x000100 :
    Ecrire donnee2 à partir de 0x00FFFF :
    Pourrait on avoir la possibilité de spécifier dans la fonction l'adresse d'écriture de départ sans avoir à créer une nouvelle fonction à chaque fois ?

    L'ideal serait pour moi une utilisation de ce type :

    Write_char_array(nom_du_buffer_char_a_ écrire, longueur_ecriture, adresse_de_depart);

    -> l'utilisation pourrait ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Write_char_array(donnee2, 5, 0x00FFFF)
    ( j'espére que me explications ne sont pas trop confuses )

    Cordialement,

  12. #12
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    Si par exemple je veux écrire les variables suivantes aux adresses respectives suivantes, comment dois je faire ?
    Tu parles bien de l'adresse dans l'eeprom ?

    Sans connaitre plus que ça, je dirai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /**
     * array : zone mémoire à écrire dans l'eeprom.
     * size : nombre d'éléments dans la zone mémoire.
     * start : adresse à laquelle écrire en eeprom
     * /!\ on ne peut plus utiliser sizeof qui ne fonctionne qu'avec des 
           tableaux et non des pointeurs 
     */
    void Write_char_array(const char *array, size_t size, const void * start)
    {
        int i;
        XE2BeginWrite(EEPROM_CONTROL, start);
        for(i = 0; i < size; ++i) {
            XE2Write(array[i]);
        }
        XE2EndWrite();
    }

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Oui, je parlai bien de l'adresse de départ de l'eeprom.

    J'ai essayé de compiler ce nouveau code mais le compilateur m'indique :

    Warning [2054] suspicious pointer conversion pour cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XE2BeginWrite(EEPROM_CONTROL, start);
    "start" devra alors être remplacé par l'adresse hexa ou débutera l'écriture.

  14. #14
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    J'ai essayé de compiler ce nouveau code mais le compilateur m'indique :

    Warning [2054] suspicious pointer conversion
    Oui, j'ai mis start en void * sans savoir quel type était attendu par XE2BeginWrite. À toi de mettre le type attendu par cette fonction.

  15. #15
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    La compilation passe si je modifie comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void Write_char_array(const char *array, size_t size, LWORD start)
    {
        int i;
        XE2BeginWrite(EEPROM_CONTROL, start);
        for(i = 0; i < size; ++i) {
            XE2Write(array[i]);
    }
        XE2EndWrite();
    }
    A présent je voudrai utiliser la fonction créée :

    en tête de code j'ai défini ceci :

    si ensuite je veux écrire le contenu de hour_event dans l'eeprom, dois je faire ainsi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *p = hour_event;
     	/* écriture de "hour_event" en eeprom */
    	Write_char_array(p, 3, 0x000000)
    en procédant ainsi, j'ai une erreur de syntaxe sur char *p = hour_event;

    Peux tu me dire ce qu'il ne va pas ?

  16. #16
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Bonjour Mabu,

    Pourrais tu me dire pourquoi, j'ai une erreur de syntaxe pour cette ligne lors de la compilation ?


  17. #17
    Invité(e)
    Invité(e)
    Par défaut
    Ne manque-t-il pas un point virgule quelque part ?

    EDIT:
    Pouvez vous poster un code minimal -qui compile- et qui reproduise l'erreur ?

  18. #18
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Le char *p ne doit-il pas être située DANS la FONCTION elle même ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *p = eeprom_buffer;

    Pouvez vous me dire si ce qui suit est correct ?

    Actuellement, la fonction est déclarée ainsi dans mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    static void Eeprom_save(const char *array, size_t size, LWORD address_start)
     
    {
        int i;
    	char *p = eeprom_buffer;
     
    	XE2BeginWrite(EEPROM_CONTROL, address_start);
     
        for(i = 0; i < size; ++i) 
    	{
        XE2Write(array[i]);
        }
        XE2EndWrite();
    }

    ensuite, mon but final est d'utiliser la fonction ailleurs dans le programme, dans un case par exemple ,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    case CGI_CMD_TIMER:
    strcpy(hour_event, argv[2]);
     
    Eeprom_save(eeprom_buffer, 3, 0x000000);  // Lit le contenu de eeprom_buffer et stocke ces 2 premiers bytes à partir de l'adresse 0x000000
     
    memcpypgm2ram((void*)argv[0],(ROM void*)SEETIMER_PAGE, SEETIMER_PAGE_LEN);
    break;

  19. #19
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static void Eeprom_save(const char *array, size_t size, LWORD address_start)
     
    {
        int i;
    	char *p = eeprom_buffer;
                // ne sert à rien :  p n'est pas utilisé dans la fonction
    ....
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  20. #20
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Mon probleme est de savoir comment utiliser le pointeur pour que chaque caractère contenu dans char eeprom_buffer soient pris uns à uns puis écrit dans mon eeprom.

    Pouvez vous me dire comment faire svp ?

Discussions similaires

  1. [débutant] Questions sur le Transact-SQL
    Par nagty dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 05/07/2005, 17h43
  2. [parseur] [Débutant] Question sur les parseurs
    Par steph-n dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 02/05/2005, 19h17
  3. [Débutant] questions sur Visibroker
    Par Man Dak dans le forum CORBA
    Réponses: 1
    Dernier message: 29/06/2004, 23h02
  4. [débutant] question sur les #
    Par Ultros dans le forum C
    Réponses: 3
    Dernier message: 29/04/2004, 12h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo