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

Flasher data dans EEPROM PIC en C
HULK28
Avatar de l’utilisateur
Amateur
Amateur
Messages : 106
Enregistré en : août 2015
Localisation : IdF

#21 Message par HULK28 » sam. 3 oct. 2015 17:04

Bonjour,

dans le même esprit que ce que j'avais expliqué ici: viewtopic.php?f=10&t=86
voici ma version EEPROM pour lire et écrire, tout en vérifiant l'intégrité des données écrites.

Code : Tout sélectionner

/**********************************************************************/
/*                                                                    */
/* File name: _EEprom.c                                               */
/* Hulk28                                                             */
/*                                                                    */
/* Internal EEPROM driver:                                            */
/*               - read / write access                                */
/**********************************************************************/

#include "_EEPROM.h"

/**********************************************************************
 * Read the internal EEPROM content from a specific address.
 * addr:       Start address of the EEPROM
 * length:     Number of byte to read
 * dest:       Where you want the data to be copied
 **********************************************************************/
unsigned char ReadEEPROM(unsigned int addr, unsigned char length, unsigned char *dest)
{
  unsigned char *ptr;
  unsigned char loop;
  ptr = dest;

  EEADR = (unsigned char)(addr & 0x00FF);
  loop = length - 1;
  EECON1bits.EEPGD = 0;
  EECON1bits.CFGS  = 0;
  do
  {
    EECON1bits.RD = 1;
    *ptr = EEDATA;
    ptr++;
    EEADR++;
  }while (loop--);
  return 0;
}

/**********************************************************************
 * Write the internal EEPROM content from a specific address.
 * addr:       Start address of the EEPROM
 * length:    Number of byte to write
 * dest:       From where you want the data to be copied
  **********************************************************************/
unsigned char WriteEEPROM(unsigned int addr, unsigned char length, unsigned char *source)
{
  unsigned char *ptr;
  unsigned char loop;
  ptr = source;

EEADR = (unsigned char)(addr & 0x00FF);
  loop = length - 1;
  EECON1bits.EEPGD = 0;
  EECON1bits.CFGS  = 0;
  EECON1bits.WREN  = 1;
  do
  {
    //INTCONbits.GIEL = 0;
    EEDATA = *ptr;
    EECON2 = 0x55;
    EECON2 = 0xAA;
    EECON1bits.WR = 1;
    //INTCONbits.GIEL = 1;
    while(EECON1bits.WR == 1);
    ptr++;
    EEADR++;
  }while (loop--);
  EECON1bits.WREN  = 0;
  return 0;
}

unsigned char WriteEEPROMconst(unsigned int addr, unsigned char length, const rom unsigned char *source)
{
  unsigned char ptr;
  unsigned char loop;
 
  EEADR = (unsigned char)(addr & 0x00FF);
  loop = length - 1;
  EECON1bits.EEPGD = 0;
  EECON1bits.CFGS  = 0;
  EECON1bits.WREN  = 1;
  do
  {
    ptr = *source++;
    EEDATA = ptr;
    EECON2 = 0x55;
    EECON2 = 0xAA;
    EECON1bits.WR = 1;
    while(EECON1bits.WR == 1);
    ptr++;
    EEADR++;
  }while (loop--);
  EECON1bits.WREN  = 0;
  return 0;
}

/**********************************************************************
 * Write and check the internal EEPROM content from a specific address.
  **********************************************************************/
unsigned char WriteCheckEEPROM(unsigned int ad, unsigned char len, unsigned char *src)
{
    unsigned char temp[16];
    unsigned char i;

    do
    {
        WriteEEPROM(ad, len, src);
        if (len <= 16)
        {
            ReadEEPROM(ad, len, temp);
            for (i = 0; i < len; i++)
            {
                if (temp[i] != src[i])
                    break;
            }
        }
    } while (i != len);
}

/* End of File : _EEPROM.c */


Et le fichier header correspondant: _EEPROM.h à insérer dans votre fichier de travail.

Code : Tout sélectionner

/**********************************************************************/

#ifndef __EEPROM_H_
#define __EEPROM_H_


unsigned char ReadEEPROM(unsigned int addr, unsigned char length, unsigned char *dest);

unsigned char WriteEEPROM(unsigned int addr, unsigned char length, unsigned char *source);
unsigned char WriteEEPROMconst(unsigned int addr, unsigned char length, const rom unsigned char *source);
unsigned char WriteCheckEEPROM(unsigned int addr, unsigned char length, unsigned char *source);

#endif /* __EEPROM_H_ */

/* End of file : _EEPROM.h */
"Pour la carotte, le lapin est la parfaite incarnation du mal" -Robert Shecley-

Flasher data dans EEPROM PIC en C
flolarajasse
Membre
Membre
Messages : 22
Enregistré en : septembre 2015

#22 Message par flolarajasse » dim. 4 oct. 2015 20:23

C'est un PIC18F4431.

Flasher data dans EEPROM PIC en C
HULK28
Avatar de l’utilisateur
Amateur
Amateur
Messages : 106
Enregistré en : août 2015
Localisation : IdF

#23 Message par HULK28 » sam. 24 oct. 2015 10:40

C'est quoi ta question au juste?
"Pour la carotte, le lapin est la parfaite incarnation du mal" -Robert Shecley-

Flasher data dans EEPROM PIC en C
mazertoc
Passioné
Passioné
Messages : 201
Enregistré en : juillet 2015
Localisation : Auvernha

#24 Message par mazertoc » sam. 24 oct. 2015 10:54

HULK28 a écrit :C'est quoi ta question au juste?

Il veut écrire des données en EEPROM "au démarrage", et là j'ai pas compris.

- au moment de l'écriture du programme ?
- au reset du PIC ?

Si c'est au reset c'est le cas général !

Flasher data dans EEPROM PIC en C
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#25 Message par paulfjujo » sam. 31 oct. 2015 19:29

bonsoir,

Pour une init EEPROM du PIC !
Avec mikroC on ne peut malheureusement pas faire comme sous C18 MPLAB

Code : Tout sélectionner

#pragma romdata EEP_=0xF00000
 unsigned char EEPROM_data [][32]={
      //   1234567890123456789012345678901
          "Projet:18F46K22 UART1 UART2   \r",//0  avec terminateur zero
          "Version 01/05/2014            \r",//20 avec terminateur zero
          "Port Com ouvert & Init HARDW. \r",//40  avec terminateur zero
          "Boucle en 1 Sec   <ESC> exit  \r",//60  avec terminateur zero
          "Avec UART1 HARDWARE.......... \r",//80  avec terminateur zero
          "paulfjujo@free.fr        \r\n",//A0   sans terminateur zero
          "MikroC V6.00     \r\n",
          "               \r\n",0
          
};
 #pragma
 



on est obligé de passer par la config EEPROM , avec un editeur un peu chiant !
et de sauvegarder le fichier créé au format *.ihex
à moins que j'ai oublié un episode ?


j'avais demandé à l'equipe MikroE , si ils pouvaient orienter le developpement de MikroC
pour proposer une init dans le code.. sans suite !

pour la config bits dans le code
un costaud de la programmation propose ceci

sinon, on peut toujours utiliser la Flash ROM
à la place de l'EEPROM
si on ne fait que lire

Code : Tout sélectionner

const char chaine0[]="FOSC Q=20MHz + 2x22pF\r"
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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