CCS - Directivas para el compilador

De Ucontrol
Saltar a: navegación, buscar

<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!.
<linkedimage>

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>

Dado electrónico
<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>

¿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>

Comunicación inalámbrica
<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>

Gráficos con CCS
<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>

Carteles de LEDs
Foroizq.jpg
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.
Foroder.jpg
CCS - Directivas para el compilador

Introducción

Programando en CCS.

Llamadas 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.

Contenido

#ASM / #ENDASM

Este 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
}


La variable predefinida _RETURN_ puede utilzarse para transferir un valor desde el código ASM a CCS.

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").

#BIT

Permite 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)


#BYTE

Permite 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

#DEFINE

La 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 es una potente herramienta para la creación de macroinstrucciones, ya que soporta el uso de variables. Veamos algunos ejemplos de esto:

#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.

#DEVICE

Esta 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:

  • ADC=x : Determina el número de [bit]]s que devuelve la función read_adc().
#DEVICE PIC16F877 *=16 ADC=10  //PIC 1616F877, punteros de 16 bits y 10 bits en el ADC.
  • ICD=TRUE : Genera código compatible con el ICD de [www.microchip.com Microchips]].
#DEVICE PIC16F877 ICD=TRUE//PIC 1616F877, punteros de 8 bits y código para ICD.

  • WRITE_EEPROM=ASYNC :
  • HIGH_INTS=TRUE : Define la prioridad de las interrupciones en los PIC18.

#FUSE

Permite 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

  • Tipo de oscilador: LP, XT, HS, RC
  • Wach Dog Timer: WDT, NOWDT
  • Protección de código: PROTECT, NOPROTECT
  • Power Up Timer: PUT, NOPUT
  • Brown Out Reset: BROWNOUT, NOBROWNOUT

#INCLUDE

Permite 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:

  1. INT_AD Conversión A/D finalizada.
  2. I NT_ADOF Conversión A/D timeout.
  3. INT_BUSCOL Colisión en bus.
  4. INT_BUTTON Pushbutton.
  5. INT_CCP1 Unidad CCP1.
  6. INT_CCP2 Unidad CCP2.
  7. INT_COMP Comparador.
  8. INT_EEPROM Escritura finalizada.
  9. INT_EXT Interrupción externa.
  10. INT_EXT1 Interrupción externa #1.
  11. INT_EXT2 Interrupción externa #2.
  12. INT_I2C Interrupción por I2C.
  13. INT_LCD Actividad en el LCD.
  14. INT_LOWVOLT Bajo voltaje detectado.
  15. INT_PSP Ingreso de datos en el Parallel Slave Port.
  16. INT_RB Cambios en el port B (B4-B7).
  17. INT_RC Cambios en el port C (C4-C7).
  18. INT_RDA Datos disponibles en RS-232.
  19. INT_RTCC Desbordamiento del Timer 0 (RTCC).
  20. INT_SSP Actividad en SPI o I2C.
  21. INT_TBE Buffer de transmisión RS-232 vacío.
  22. INT_TIMER0 Desbordamiento del Timer 0 (RTCC).
  23. INT_TIMER1 Desbordamiento del Timer 1.
  24. INT_TIMER2 Desbordamiento del Timer 2.
  25. INT_TIMER3 Desbordamiento del Timer 3.

Ejemplo:

#int_ad
adc_handler() {
  adc_active=FALSE;
}
#int_rtcc noclear //"noclear" evita que se borre el flag correspondiente.
isr() {
       ...
}

Temas relacionados

Puedes 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

Ariel.jpg Datos del Autor
Nombre: Ariel Palazzesi
email: arielpalazzesi@gmail.com
Ver los artículos de este autor. Página con el perfil del autor.

</center>
Cclicence.png

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.

Herramientas personales