TxBuffer[TxData++] = estructura.direccion[0]->entrada1;
TxBuffer[TxData++] = estructura.direccion[0]->entrada2;
Hey Gera. ¿Se puede hacer esto en C?
str.string = "Hola mundo";
char string[16];
string="hola";Ya que en este caso string es un puntero estatico. No podemos hacer q apunte a otro lugar q no sea el q le fue asignado. Por lo tanto, si queremos q apunte a un "hola", tenemos q copiar esa cadena a su espacio de memoria.Osea que no puedo utilizar punteros a variables que están en la ROM en CCS, ouch! pequeño gran problema :D
Es buena la idea que das Bruno, pero se le dan muchas vueltas para algo tan sencillo.
Es buena la idea que das Bruno, pero se le dan muchas vueltas para algo tan sencillo.
:D Uno hace lo que puede, dentro de lo que el lenguaje le permite! Si tenes la posibilidad de hacerlo con C18 y te parece mejor, ni lo dudes! :D
This application has requested the Runtime to terminate it in an unusual way.:D :D
Please contact the application's support team for more information.
void vFuncion(....,OBJECTS_ANALOG_OUTPUT *ObjectsParameters, ...)
{
UINT8 byte3, byte2, byte1, byte0; //MSB a LSB
UINT8 *apuntador;
...
apuntador = (UINT8 *)&ObjectsParameters[k].OUTPUT_VALOR;
byte0=*(apuntador); //little endian
byte1=*(apuntador + 1);
byte2=*(apuntador + 2);
byte3=*(apuntador + 3);
}
1.
LB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR);
2.
HB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+1);
3.
UB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+2);
4.
MB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+3);Bueno, C internamente también creará otra variable para almacenar el apuntador temporal usando tu pseudo-código. Además, un apuntador en un PIC18 sólo emplea 2 bytes de RAM. ;)
En tu código veo dos problemas.Código: [Seleccionar]1.
LB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR);
2.
HB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+1);
3.
UB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+2);
4.
MB=*((UINT8*)ObjectsParameters[k].OUTPUT_VALOR+3);
Al poner OUTPUT_VALOR+1 o OUTPUT_VALOR+2 no estás modificando la dirección RAM de OUTPUT_VALOR, estás modificando su valor Flotante.
Si luego haces un casting (UINT8 *) entonces estás copiando exactamente la misma dirección RAM de OUTPUT_VALOR pero en cada línea te dará un resultado diferente por lo que te comento arriba.
LB=*((UINT8*)&ObjectsParameters[k].OUTPUT_VALOR);
HB=*( (UINT8*)&ObjectsParameters[k].OUTPUT_VALOR + 1);
UB=*( (UINT8*)&ObjectsParameters[k].OUTPUT_VALOR + 2);
MB=*( (UINT8*)&ObjectsParameters[k].OUTPUT_VALOR + 3);Sí, sí, tenés razón ( :mrgreen: )
Entonces si quieres imaginar que estás ahorrándote una variable, corrijamos tu código...Código: [Seleccionar]
LB=*((UINT8*)&ObjectsParameters[k].OUTPUT_VALOR);
HB=*( (UINT8*)&ObjectsParameters[k].OUTPUT_VALOR + 1);
UB=*( (UINT8*)&ObjectsParameters[k].OUTPUT_VALOR + 2);
MB=*( (UINT8*)&ObjectsParameters[k].OUTPUT_VALOR + 3);
Para la segunda línea, una interpretación sería:
- Extrae la dirección RAM de OUTPUT_VALOR.
- Interpreta la dirección RAM como un apuntador a un entero de 1 byte (casting).
- Le suma 1, pero como es apuntador entonces le suma el número de bytes que ocupa la variable. En este caso al ser un byte, pues la suma es dirección RAM + 1.
- El * pide que el contenido de la dirección RAM sea leído y asignado a HB.
Creo que sólo faltaban los ampersands.