TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Nocturno en 15 de Diciembre de 2006, 02:47:07
-
Desconozco si es la traducción correcta de las preprocessor directives pero es sobre este tema sobre el que tengo dudas.
Conozco algunas directivas, como #define, #ifdef, #endif pero no he encontrado ningún documento donde vengan todas explicadas, así como las normas sintácticas que las regulan.
Por ejemplo, me gustaría saber si se pueden manejar variables y operaciones matemáticas dentro de dichas directivas.
Concretamente mi problema es resolverlo con C30, aunque desconozco si estas directivas forman parte del estándar de C o es algo propio de cada compilador.
-
Yo recuerdo haber traducido algo de eso en la ayuda del MKB, esta por la pagina 60 aunque no aclara mucho sobre que rutinas o no se pueden usar. Pero imagino que se podran usar cosas segun entiendo es para excluir o no partes de codigo o ejecuciones de programa.
En linux cuando se compilan paquetes siempre vienen esas directivas ya que si se tiene lo necesario -librerias por ejemplo- ejecuta algo y si no hace otra cosa.
-
Al menos el CCS permite usar variables globales en estas directivas, no expresiones (por lo que pude constatar, pero puedo estar equivocado)
#BIT id = x.y
Elements: id is a valid C identifier,
x is a constant or a C variable,
y is a constant 0-7.
Examples:
#bit T0IF = 0xb.2
...
T0IF = 0; // Clear Timer 0 interrupt flag
int result;
#bit result_odd = result.0
...
if (result_odd)
y en todas las asignaciones tipo #BYTE id = XX también se pueden poner variables pero no expresiones, por ej
int k=5;
#byte puerto_a = k // funciona
#byte puerto_a = k+1 // no funciona
-
para asm si hay
http://ww1.microchip.com/downloads/cn/DeviceDoc/cn012417.pdf
-
Yo no creo que sea asi, mira esta asignacion que hago en un programa para referirme a la memoria EEPROM:
enum Mapa_Memoria
{
CTE_CALIB = 0x40, //es una Float, ocupa 4 lugares
LIMITE_INF_PRES = (CTE_CALIB + 4), //es una Int16, ocupa 2 lugares
LIMITE_SUP_PRES = (LIMITE_INF_PRES + 2), //es una Int16, ocupa 2 lugares
LIMITE_MAX_TEMP = (LIMITE_SUP_PRES + 2), //es una Int16, ocupa 2 lugares
eeOFFSET = (LIMITE_MAX_TEMP + 2), //es una Int16, ocupa 2 lugares
eeSPAN = (eeOFFSET + 2), //es una Int16, ocupa 2 lugares
LIMITE_CALIB = (eeSPAN + 2), //es una Int16, ocupa 2 lugares
Numero_Conv_AD = (LIMITE_CALIB + 2) //es una Int8, ocupa 1 lugar
};
Del mismo modo deberias poder asignar posiciones de memoria para tu programa, pero recuerda siempre que el CCS siempre sera mas eficiente asignandola ya que luego la reutiliza para usar las mismas posiciones para las variables locales en una funcion... :lol: :lol:
-
Cada compilador tiene las suyas exclusivas pero hay muchas que son estandar,como por ejemplo el #define.
Este #define se usa para definir etiquetas,al igual que #bit o #byte.Estas últimas lo que hacen es asociar esa etiqueta que se define,con una dirección de memoria (#byte) o con un bit de una dirección de memoria concreta (#bit).
Esto para lo que vale es para poder crear cierto orden y legibilidad,pudiendo usarse para simplificar el código.
El #define lo que hace es asociar una etiqueta a la expresión que le pongas después,por lo que cada vez que en tu código aparezca la etiqueta lo que está apareciendo realmente es la expresión.
#define FALSO FALSE
#define VERDADERO TRUE
#define incrementa_uno(x) (x = x + 1)
void programita()
{
if(!condicion)
{
incrementa_uno(numero);
condicion = VERDADERO;
}
}
O sea,un #define no es un recurso para realizar operaciones ni tareas,es un simple sustituto,una etiqueta que te sirve para hacer tu codigo más legible.
En la ayuda de CCS vienen explicadas todas las directivas del mismo,no se si en C30 también vendrán explicadas,pero debería...
-
Entonces, Modulay, el abuso de los #define complejos puede consumir mas memoria que hacer una función ¿no?
Si uso #define incrementa_uno(x) (x = x + 1) cada vez que uso el incrementa_uno(numero); escribo realmente (numero = numero + 1) pero si hago void imcrementa_uno(int* x){ x= x+1;} solo lo escribo una vez y todas las demás seran solo calls ... ¿cierto?
En el ejemplo este probablemente no sea este el caso ya que incrementar un posición de memoria es mas pequeño en instrucciones que un call a una dirección pasando un parámetro, pero se entiende lo que quiero decir ... :mrgreen:
-
Es obvio que deben sustituir algunas expresiones en las que clarifiquen y faciliten la lectura del programa. Llegado el caso, el abuso de las mismas puede distorsionar tanto el lenguaje que no sea reconocido por alguien que sepa C.
Mi pregunta concreta persigue resolver un problema que tengo al intentar implementar un retardo variable en C30, que dependa de los MIPS a los que tenga configurado el micro. Lo mejor será poner un ejemplo:
#define MIPS 40
#define RETRASO (MIPS-15)
Ya sé que la segunda de las sentencias es errónea pero, ¿sabéis cómo podría implementarla?
-
Puedes usar el define que te determina los mips como parámetro a una función,aunque claro eso también lo puedes hacer con una constante.
-
Para lo que pretendo hacer no me sirve utilizar una función, porque sólo entrar en la misma y salir con un return come varios ciclos de instrucción que no puedo permitirme.
-
Pues no le veo otra forma posible,o eso o algún algoritmo repetitivo en el que tengas controlados el número de ciclos que consumes en función del retardo que quieres obtener.
Hazlo en asm y actuando sobre el PC,te será más fácil controlar la temporización.
-
Es obvio que deben sustituir algunas expresiones en las que clarifiquen y faciliten la lectura del programa. Llegado el caso, el abuso de las mismas puede distorsionar tanto el lenguaje que no sea reconocido por alguien que sepa C.
Mi pregunta concreta persigue resolver un problema que tengo al intentar implementar un retardo variable en C30, que dependa de los MIPS a los que tenga configurado el micro. Lo mejor será poner un ejemplo:
#define MIPS 40
#define RETRASO (MIPS-15)
Ya sé que la segunda de las sentencias es errónea pero, ¿sabéis cómo podría implementarla?
Buenas amigos!!!
Manolo prueba este código puede que te valga para lo que quieres hacer ;)
#DEFINE MIPS 40
#IF MIPS == 40
INT CONST RETARDO = MIPS-15;
#ENDIF
PD: El Geshi ya no está en la actualización del foro??? :cry:
Saludos!
Diego J.
-
Es obvio que deben sustituir algunas expresiones en las que clarifiquen y faciliten la lectura del programa. Llegado el caso, el abuso de las mismas puede distorsionar tanto el lenguaje que no sea reconocido por alguien que sepa C.
Mi pregunta concreta persigue resolver un problema que tengo al intentar implementar un retardo variable en C30, que dependa de los MIPS a los que tenga configurado el micro. Lo mejor será poner un ejemplo:
#define MIPS 40
#define RETRASO (MIPS-15)
Ya sé que la segunda de las sentencias es errónea pero, ¿sabéis cómo podría implementarla?
Buenas amigos!!!
Manolo prueba este código puede que te valga para lo que quieres hacer ;)
#DEFINE MIPS 40
#IF MIPS == 40
INT CONST RETARDO = MIPS-15;
#ENDIF
PD: El Geshi ya no está en la actualización del foro??? :cry:
Saludos!
Diego J.
Yo haria asi:
#DEFINE MIPS 40
#IF DEFINED MIPS
INT CONST RETARDO = MIPS-15;
#ELSE
INT CONST RETARDO = Algun_Valor_Fijo;
#ENDIF
Suerte !! :-/ :-/
Marcos
-
Disculpad la paja mental.
Esto funciona perfectamente: #define RETRASO (MIPS-15)
No sé cómo lo probé para concluir que no funcionaba.
Espero poder terminar mis rutinas de retardo en breve y las postearé.