Habs mal so probiert, aber gleiche Warnung (Warning [2054] suspicious pointer conversion):

Code:
static volatile union _tmrGATEcounter {
    unsigned int LH;
    struct {
        char L;
        char H;
    };
} tmrGATEcounter;

void ReadEEdata8(unsigned char *dest, unsigned char addr) {
  	EECON1bits.CFGS = 0;     //0: program memory / EEPROM memory 
	EECON1bits.EEPGD = 0;	 //0: EEPROM memory
	EEADR = addr;            //Adresse laden Low -Byte.
	EEADRH = 0;              //Adresse laden High-Byte.
	EECON1bits.RD = 1;       //Lesezyklus einleiten.
	*dest = EEDATA;          //EEPROM-Daten => Ziel-Variable.
}

void ReadEEdata16(unsigned char *dest, unsigned char addr) {
	unsigned char *p = (unsigned char *)dest;
	ReadEEdata8(p++, addr++);
	ReadEEdata8(p, addr);
}

void InitVars (void) {
    ReadEEdata16 (&tmrGATEcounter.L, 2);   //<- Warnung hier !!!
}
Ne halt, hab vergessen unsigned vor die char's zu schreiben:

So geht's dann, keine Warnung mehr:

Code:
static volatile union _tmrGATEcounter {
    unsigned int LH;
    struct {
        unsigned char L;
        unsigned char H;
    };
} tmrGATEcounter;

void ReadEEdata8(unsigned char *dest, unsigned char addr) {
     EECON1bits.CFGS = 0;     //0: program memory / EEPROM memory
   EECON1bits.EEPGD = 0;    //0: EEPROM memory
   EEADR = addr;            //Adresse laden Low -Byte.
   EEADRH = 0;              //Adresse laden High-Byte.
   EECON1bits.RD = 1;       //Lesezyklus einleiten.
   *dest = EEDATA;          //EEPROM-Daten => Ziel-Variable.
}

void ReadEEdata16(unsigned char *dest, unsigned char addr) {
   unsigned char *p = (unsigned char *)dest;
   ReadEEdata8(p++, addr++);
   ReadEEdata8(p, addr);
}

void InitVars (void) {
    ReadEEdata16 (&tmrGATEcounter.L, 2);   //<- Warnung hier !!!
}
Aber warum geht das aus den oberen Postings nicht? Pointer sind wohl mehr für Strings gedacht.