por raro que suene y sin querer queriendo, escribí un código que hace exactamente lo que quería.
Se trata de almacenar numeros de 2 bytes de longitud en la memoria Eeprom de un 16F877.
La función
write_eeprom del ccs guarda los datos de 1 byte por vez, analicemos este código:
int16 lPepe[2];
...
#zero_ram
void main(){
disable_interrupts(GLOBAL);
lPepe[0]=0xBECA;
lPepe[1]=0x1984;
vGrabar_Trama_Eeprom(lPepe);
bLeer_Trama_Eeprom(1);
}
void vGrabar_Trama_Eeprom(int8 *tiempos){
int8 iConta;
for(iConta=1;iConta<5;iConta++){
write_eeprom(iConta, *tiempos++);
}
}
...
a primera vista pareciera que el puntero hace un casteo de datos con
lPepe, pero no es así.
tiempos es un puntero que guarda la dirección de
lPepe, supongamos que
lPepe se guarda en la posición 0x20 de la RAM
entonces:
lPepe[0] está en la dirección 0x20
lPepe[1] está en la dirección 0x22
al llamar
vGrabar_Trama_Eeprom(lPepe);
estamos haciendo tiempos apunte a 0x20
ahora al escribir
*tiempos++ dentro de
write_eeprom en el bucle for, estamos haciendo:
0x20 + 1
0x20 + 2
0x20 + 3
0x20 + 4
esto desde el punto de vista de punteros está mal porque estamos truncando el contenido de la dirección exactamente a la mitad.
recuerden que el puntero se incrementa en el ancho del tipo de datos, esto es el puntero debe ser del mismo tipo de datos que el array. Lo correcto es hacer
*(tiempos++) -la suma viene primero antes que el puntero-
pero este es un caso especial en donde la excepción a la regla es benéfica, porque el hecho de que se trunque el dato a la mitad sirve justamente para guardar un dato de 2 byte a través de un direccionamiento de 1 byte
¡Estupendijirijillo!