CCS - Directivas para el compilador
<keywords content="TTL 74Ls164N, electronica, circuito, pic, NE555, PIC BASIC, PIC SIMULATOR IDE, esquema, circuito impreso, proyecto, gratis, download, programa, CMOS, pin, e/s, i/o, ucontrol, PIC, 16F628a, 16f84a" /> <center>
| Inicio | Foro | Revista uControl | Circuiteca | Microcontroladores | Electrónica Básica | Herramientas y Software | Tutoriales | Colaboradores | Enlaces |
|
¿Ya descargaste los ejemplares GRATUITOS de la Revista uControl? ¡No te los pierdas!. | |||||||||
|
wikipage=Dado electrónico con PIC
tooltip=Dado electrónico con PIC
img_src=Image:dado100.jpg
img_width=150px
img_alt=Dado electrónico con PIC
</linkedimage> |
wikipage=Como trucar un servo
tooltip=Como trucar un servo
img_src=Image:trucaservo150.jpg
img_width=150px
img_alt=Como trucar un servo
</linkedimage> |
wikipage=Comunicación inalámbrica entre PICs
tooltip=Comunicación inalámbrica entre PICs
img_src=Image:TXRX150.jpg
img_width=150px
img_alt=Comunicación inalámbrica entre PICs
</linkedimage> |
wikipage=CCS - Libreria de gráficos para GLCD K0108
tooltip=CCS - Libreria de gráficos para GLCD K0108
img_src=Image:GLCD-100.gif
img_width=150px
img_alt=CCS - Libreria de gráficos para GLCD K0108
</linkedimage> |
wikipage=Funcionamiento de una matriz de LEDs
tooltip=Funcionamiento de una matriz de LEDs
img_src=Image:GNUxx.jpg
img_width=150px
img_alt=Funcionamiento de una matriz de LEDs
</linkedimage> |
![]() |
Todos los articulos y proyectos de uControl tienen su lugar en el foro. Si tienes dudas o comentarios, busca o crea el hilo correspondiente, y tendrás una rapida respuesta.
|
![]() |
|
CCS - Directivas para el compilador
| ||||||||||
IntroducciónLlamadas en inglés "preprocessor directives", son comandos que interpreta el primer paso de la compilacíon que lleva a cabo CCS. Las directivas más comunes son #define e #include, pero deberías dar un vistazo a todas.
#ASM / #ENDASMEste par de instrucciones permite que utilicemos un bloque de instrucciones en assembler dentro de nuestro código CCS. El siguiente es un ejemplo de uso tomado de la ayuda del CCS: int find_parity (int data) {
int count;
#ASM
movlw 0x8
movwf count
movlw 0
loop:
xorwf data,w
rrf data,f
decfsz count,f
goto loop
movlw 1
awdwf count,f
movwf _return_
#ENDASM
}
Si en lugar de #ASM utilizamos #ASM ASIS, CCS no intentará efectuar cambios de bancos de memória automaticos para las variables que no pueden ser accedidas desde el banco actual. El codigo assembler es utilizado "as-is" ("como es"). #BITPermite crear una nueva variable de un bit de tamaño, que es colocada en la memoria del PIC en la posición del byte x y el bit y. Esto es muy útil para acceder de una manera sencilla a los registros. Por supuesto, estas variables puedem ser empleadas de la misma manera que cualquier otra variable tipo short. El formato de #BIT es el siguiente: #BIT nombre = x.y donde nombre es un nombre de variable CCS válido, x es una constante o una variable CCS válida e y es una constante de 0 a 7. Estos son alguno ejemplos de uso: #BIT T0IF = 0xb.2 . . . T0IF = 0; // Limpia el flag de interrupción del Timer 0
int resultado; #BIT resultado_primer_bit = resultado.0 . . . if (resultado_primer_bit)
#BYTEPermite crear una nueva variable de un Byte de tamaño, que es colocada en la memoria del PIC en la posición del byte x. Esta es una herramienta muy útil para acceder de una manera sencilla a los registros. Por supuesto, estas variables puedem ser empleadas de la misma manera que cualquier otra variable tipo int. El formato de #BYTE es el siguiente: #BYTE nombre = x donde nombre es un nombre de variable CCS válido, y x es una constante o una variable CCS válida. Estos son alguno ejemplos de uso: #BYTE STATUS = 3 #BYTE PORTB = 6 #DEFINELa instrucción #define tiene la siguiente forma: #DEFINE <label> value <label> es la etiqueta que usaremos en nuestro programa. Y value es el valor que estamos asignando a esta etiqueta. Las instrucciones #DEFINE no generan codigo ASM, si no que el preprocesador realiza los reemplazos que ellas indican en el momento de la compilación. El uso de #DEFINE permite construir programas más ordenados y faciles de mantener. Veamos algunos ejemplos de #DEFINE #DEFINE TRUE 1 Cada vez que en nuestro programa aparezca la etiqueta TRUE, el precompilador la reemplazará por 1 #DEFINE pi 3.14159265359 Cada vez que en nuestro programa aparezca la etiqueta pi, el precompilador la reemplazará por 3.14159265359 #DEFINE MENOR_DE_EDAD (EDAD < 18) . . . . . if MENOR_DE_EDAD printf(“JOVEN”); El ejemplo anterior permite una mayor claridad en el programa. Por supuesto, no hay que abusar de #DEFINE, por que podemos obtener el efecto contrario, haciendo nuestros programas bastante dificiles de comprender.
#DEFINE var(x,v) unsigned int x=v; var(a,1) var(b,2) var(c,3) Cuando el preprocesador se encuentra con el código anterior, hace lo mismo que si hubiesemos escrito lo siguiente: unsigned int a=1; unsigned int b=2; unsigned int c=3; Como puedes ver, #DEFINE puede hacer mucho por tus programas. #DEVICEEsta directiva informa al compilador que arquitectura de hardware utilizaremos, para que pueda generar código apropiado para la cantidad de RAM, ROM y juego de instrucciones disponibles. Para los chips con más de 256 bytes de RAM se puede seleccionar entre emplear punteros de 8 o 16 bits. Si deseamos emplear punteros de 16 bits basta con añadir *=16 a continuación del nombre microcontrolador seleccionado. Veamos algunos ejemplos: #DEVICE PIC16C74 //PIC 16C74, punteros de 8 bits. #DEVICE PIC16C67 *=16 //PIC 16C67, punteros de 16 bits. Hay más opciones que podemos agregar en las lineas #DEVICE:
#DEVICE PIC16F877 *=16 ADC=10 //PIC 1616F877, punteros de 16 bits y 10 bits en el ADC.
#DEVICE PIC16F877 ICD=TRUE//PIC 1616F877, punteros de 8 bits y código para ICD.
#FUSEPermite modificar el valor de los fuses del microcontrolador que estamos empleando. Los valores posibles dependen de cada microcontrolador en particular, y los valores posibles se cargan al utilizar #ICNLUDE seguido del archivo correspondiente. La forma de #FUSE es la siguiente: #FUSE opciones donde opciones es una lista de las opciones posibles separadas mediante comas. Antes de seguir, recuerda que puedes ver dentro del archivo con extensión .h correspondiente cuales son los valores posibles para ese microcontrolador. Están al comienzo del archivo, en forma de comentarios. Algunos valores comunes son
#INCLUDEPermite incluir en nuestro programa uno o mas archivos (conocidos como header file) que posean extensión .h. Estos archivos contienen información sobre funciones, sus argumentos, el nombre de los pines de un modelo determinado de PIC o cualquier otra cosa que usemos habitualmente en nuestros programas. Esto permite no tener que escribir un montón de cosas cada vez que comenzamos un programa nuevo: basta con incluir el .h correspondiente. La forma de utilizar esta instrucción es la siguiente: #INCLUDE <archivo> Esto hará que el contenido de <archivo> se compile junto con nuestro programa. Por ejemplo: #INCLUDE <PIC16F877A.H> hace que todas las especificaciones de nombres y registros del PIC16F877A se incluyan en nuestro programa. Esto permitirá referirnos al pin 0 del PORTB del PIC mediante PIN_B0. Existe la posibilidad de utilizar #INCLUDE "archivo" en lugar de #INCLUDE <archivo>. La diferencia es que si usamos "", el archivo se buscará primero en el directorio actual. Si empleamos <>, el archivo será buscado primero en la ruta por defecto para los archivos .h. #INT_xxx#INT_xxxindica que la función que le sigue (en el código fuente CCS) es una función de interrupción. Estas funciones no deben tener parámetros. Por supuesto, no todos los PICs soportan todas las directivas disponibles:
Ejemplo: #int_ad
adc_handler() {
adc_active=FALSE;
}
#int_rtcc noclear //"noclear" evita que se borre el flag correspondiente.
isr() {
...
}
Temas relacionadosPuedes encontrar el resto de los temas que componene este tutorial sobre CCS en esta categoría. Hay toda una colección de ejemplos sobre este tema. Puedes consultarlos para reforzar lo aprendido aquí. Además, los siguientes artículos de uControl se relacionan con éste, y pueden serte de utilidad: Autor
| ||||||||||
|
Este contenido se rige por la licencia de Creative Commons "Licencia Creative Commons Atribución-No Comercial-Sin Obras Derivadas 3.0". Para más información, véase la licencia en su forma reducida y completa. |

