Aprendiendo a Programar. Microcontroladores PIC en. Lenguaje C Con CCS

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS Los compiladores de lenguaje C hoy son ampliamente

Views 229 Downloads 13 File size 2MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

Los compiladores de lenguaje C hoy son ampliamente utilizados para la creación de programas con microcontroladores PIC. El compilador que mejor soluciona las necesidades del programador enmascarando el hardware y simplificando la implementación de una aplicación es el fabricado por la compañía CCS. Por Andrés Raúl Bruno Saravia

Entrega Nº 1. Hasta hace unos 5 años los programas se seguían escribiendo en lenguaje Assembler, pero gracias a que los compiladores de lenguaje C se mejoraron, en cuanto a su relación de compresión, y los microcontroladores ampliaron su capacidad de memoria, hoy en día prácticamente el 99% de las aplicaciones para microcontroladores se realiza en lenguaje C (también existe el compilador para lenguaje BASIC y PASCAL, sin embargo los compiladores de lenguaje C son los mas usados por sus prestaciones). Hoy cuando tenemos que sentarnos a trabajar con un microcontrolador el desarrollador se encuentra ante una gran oferta de compiladores en el mercado, y surge la pregunta: ¿Cuál elijo? Sin duda alguna el compilador mas completo para microcontroladores PIC es el desarrollado por la firma CCS inc.(Custom Computer Services. Inc), el cual es muy popular en América Latina por la gran documentación que existe sobre el mismo. En esta sección aportaremos nuestro granito de arena, enseñándoles a trabajar con el mismo en el Entorno de Desarrollo Integrado (IDE) de Microchip MPLAB.

Aprendiendo a crear nuestro Primer Proyecto. Como creemos que la enseñanza es un proceso dinámico, progresivo y divertido, utilizaremos la metodología de ir introduciendo conceptos en la medida que los necesitamos y “sobre la marcha”. Nuestro primer paso será aprender a crear un proyecto en MPLAB IDE para el Toolsuite (herramienta de compilación) CCS. Antes que nada debemos tener Instalado el MPLAB el cual lo podemos descargar gratuitamente desde la propia compañía Microchip: www.microchip.com/mplab Atención: Al momento de escribir esta primer nota, el MPLABX versión 1.00 No Beta tiene problemas el editor del mismo indicando las funciones embebidas como NO DECLARADAS, por tanto aconsejamos por ahora no instalar dicho entorno hasta que el problema no sea subsanado, por tal motivo recomendamos descargar : La versión corriente de MPLAB 8.83 Una vez descargado el MPLAB IDE 8.83 o similar, instalarlo en modo CUSTOM y habilitar el toolsuite del compilador CCS. En la siguiente figura podemos apreciar la habilitación referida en el párrafo anterior:

Una vez finalizada la instalación tenemos que instalar el compilador CCS.

Puede bajarse desde la misma WEB de la compañía CCS: http://www.ccsinfo.com/ Una versión demo limitada o recurrir a las versiones del compilador CCS que se “comparten” en TARINGA: www.taringa.net, en este caso una vez instalado el compilador debemos copiar los archivos .CRG que vienen en la versión “compartida” y que deberán pegarse dentro de la carpeta que genera el compilador al instalarse y que se llama PICC. El sistema operatívo Windows nos advierte que esos archivos ya existen y si queremos reemplazarlos, a lo cual accederemos con la opción aceptar. Para aquellos que van a optar por las versiones “compartidas” de Taringa, busquen una de las ultimas versiones, por ejemplo la 4.114 o la 4.124. No aconsejamos anteriores por los problema que tienen cada una y que han ido solucionados en estas. Ahora que ya tenemos el MPLAB IDE, y el compilador instalados, realizaremos nuestro primer proyecto: •

Disparemos el MPLAB y vayamos a la solapa PROJECT:

• Hagamos click con el Mouse sobre el item PROJECT WIZARD y se desplegará la ventana de bienbenida:

Ahora pulsamos en botón [Siguiente] y aparecerá la siguiente ventana para que seleccionemos el microcontrolador con el cual vamos a trabajar:

Nosotros seleccionamos el PIC16F887, pero usted puede seleccionar el que tenga. Nuevamente luego de pulsar el botón [Siguiente] le aparecerá la siguiente ventana donde cargaremos el Toolsuite, es decir la herramienta o conjunto de herramientas de programación. Nosotros seleccionaremos el Toolsuite de CCS, para lo cual deberá usted accionar el botón del control desplegable y picará con el Mouse sobre el compilador CCS:

Algunas veces, según la versión de Windows instalada, Windows no encuentra la ruta de acceso al compilador, lo cual genera que el toolsuite seleccionado aparezca con una cruz roja por delante, lo que se puede corregir simplemente buscando el archivo del compilador manualmente mediante el botón [Browse] El tercer paso es seleccionar la carpeta donde almacenaremos nuestro proyecto y le ponemos un nombre al mismo. Nosotros creamos en el escritorio (desktop) una carpeta MPLAB_CCS para almacenar en ella los proyectos que haremos. Dentro de dicha carpeta creamos una capeta llamada ProyectoInicial. De esta forma la ruta total es: C:\Users\andres\Desktop\MPLAB_CCS\ProyectoInicial\ProyectoInicial

Ahora pulsamos nuevamente el botón [Siguiente] y se desplegará la ventana del cuarto paso mediante la cual podemos adjuntar a nuestro proyecto archivos prearmados, lo cual es muy útil para ahorrar tiempo de escritura de código, sin embargo en nuestro primer proyecto no utilizaremos esta opción, por lo cual pasaremos la misma por alto :

…y pulsaremos siguiente, lo cual nos llevará al final de la creación de nuestro proyecto con el método asistido (WIZARD) que tiene el MPLAB

En esta última pantalla se nos indica un resumen de cómo se creará el proyecto. Si uno lo desea puede volver hacia atrás para modificar algún paso. Si todo esta correcto podemos pulsar simplemente el botón de [finalizar].

Y volveremos al espacio de trabajo principal con la ventana del worksapce (espacio de trabajo) ya desplegada con las carpetas que forman parte del proyecto:

De esta forma ya hemos creado nuestro primer proyecto al cual le insertaremos nuestro primer programa en la próxima entrega. Continuará ....

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

Los compiladores de lenguaje C hoy son ampliamente utilizados para la creación de programas con microcontroladores PIC. El compilador que mejor soluciona las necesidades del programador enmascarando el hardware y simplificando la implementación de una aplicación es el fabricado por la compañía CCS. Por Andrés Raúl Bruno Saravia

Entrega Nº 2. En nuestra entrega anterior aprendimos a crear un proyecto dentro del MPLAB para escribir nuestro primer código en lenguaje C, hoy crearemos nuestro primer código y aprenderemos la función que cumplen sus elementos principales .

Creando Nuestro Primer Código Ya que hemos aprendido a crear nuestro primer proyecto, escribiremos nuestro primer código, el cual adicionaremos a nuestro proyecto. Para ello nos moveremos con el Mouse hasta el ícono de New File y haremos clic sobre el mismo:

Y se desplegará una nueva ventana en la cual escribiremos el código de nuestro programa. Por ser este nuestro primer programa, simplemente haremos titilar un LED con un tiempo de flashing de 500ms. La idea es introducirnos de a poco, y muchas veces querer comenzar con un código demasiado elaborado es complejo. #include #use delay(osc=4000000) //configura fusibles de configuración #fuses XT //Oscilador a cristal standar #fuses NOWDT //sin WatchDog Timer #fuses NOPROTECT //sin proteccion de memoria de programa #fuses NOPUT //sin PowerUp Timer #fuses NOBROWNOUT //sin brownout #fuses NOLVP //sin programación en baja tensión //rutina principal void main(void) { //abrimos la función principal Setup_adc_ports(NO_ANALOGS);//configuramos los puertos digitales

}

while(1) //creamos un bucle infinito { //abrimos el bucle output_high(PIN_B0); //prendemos RB0 delay_ms(500); //esperamos 500 ms output_low(PIN_B0); //borramos RB0 delay_ms(500); //esperamos 500 ms } //cerramos el bucle //cerramos la función principal

Este código lo hemos escrito en lo que se conoce en la jerga técnica como “codigo en C nativo” ya que usamos las funciones de control de entrada / salida de CCS El código inicia siempre en lo que se conoce como “cabecera”, es decir el principio. En esta cabecera encontraremos instrucciones dirigidas al compilador y no al microcontrolador, dichas instrucciones se denominan “directivas”. Las directivas se diferencian de las instrucciones en que: • •

Siempre se encuentran en la cabecera del programa Todas comienzan con el símbolo del numeral #

En nuestro caso estas son las directivas: #include #use delay(crystal=4000000) //configura fusibles de configuración #fuses XT //Oscilador a cristal standar #fuses NOWDT //sin WatchDog Timer #fuses NOPROTECT //sin proteccion de memoria de programa #fuses NOPUT //sin PowerUp Timer #fuses NOBROWNOUT //sin brownout #fuses NOLVP //sin programación en baja tensión

La directiva : #include nos permite decirle al compilador para que microcontrolador hemos escrito el código.

Seguidamente con la directiva #use delay(crystal=4000000) le indicamos a que frecuencia esta funcionando nuestro oscilador. El orden de las directivas es crucial ya que siempre primero debemos indicarle al compilador cual es el PIC que estamos usando y luego cual es la frecuencia del oscilador. Posteriormente podemos agregar el resto de directivas. Si esto no se respeta podemos tener errores en el proceso de compilación sobre todo cuando usamos alguna función propia del compilador (llamadas funciones embebidas) para manejar algún periférico, y que la misma necesita saber la frecuencia del oscilador. La directiva puede tener distintas formas ya que amolda la configuración interna a la frecuencia que le indicamos. Así esta directiva nos permite activar multiplicadores y divisores internos, o accionar los osciladores internos cuando el microcontrolador los trae; por ejemplo: #use delay(crystal=4000000, clock=16000000)

Le indica al compilador que tenemos un cristal externo de 4Mhz, y que la frecuencia que llega a la CPU es de 16Mhz, por lo tanto el compilador configurará correctamente el PLL de la CPU para alcanzar los 32Mhz. Otro ejemplo pero usando el reloj interno es el siguiente: #use delay(internal=8000000, clock=16000000)

Sin embargo esta directiva debe usarse con precaución ya que el clock que definimos nunca debe sobrepasar la máxima velocidad de procesamiento del PIC que se esté usando. Este parámetro se denomina MIPS (Millones de Instrucciones por Segundo) y se obtiene dividiendo la frecuencia de entrada por cuatro. MIPS = fosc/4

La directiva #fuse xx nos permite activar o desactivar las características del nucleo, como ser el circuito de Watch Dog Timer, que reseta al microcontrolador ante un cuelgue del mismo, el Brown Out Detect, que resetea el microcontrolador ante un fallo de la alimentación, el tipo de oscilador, etc. Las etiquetas usadas para activar o desactivar la propiedad, están incluidas en el archivo de cabecera y deben ser consultadas siempre, ya que las mismas suelen cambiar entre versiones del compilador o tipos de microcontroladores. En líneas generales podemos decir que anteponiendo la palabra NO al fusible de configuración (así se llama al seteo de las propiedades), se le informa al compilador que el fusible en cuestión está desactivado, mientras que colocando solo el nombre activamos la propiedad. Por otra parte para activar o desactivar los distintos fusibles se puede realizar en varias líneas (como en el ejemplo) o se pueden activar y desactivar en una sola línea separando cada fusible con comas: #fuse NOWDT,HS,NOPUT,NOLVP,NOMCLR,NOPROTECT,NOBROWNOUT

La cabecera además puede incorporar redefinición de nombres de pines, definición de variables y constantes. Y prototipo de funciones. Esto será visto en nuestras próximas lecciones.

Finalizada la cabecera, continúa el código, que es el que se traducirá en instrucciones al microcontrolador luego del proceso de compilación. En nuestro caso nuestro código es bastante sencillo: void main(void) { //abrimos la función principal setup_adc_ports(NO_ANALOGS);//configuramos los puertos digitales

}

while(1) //creamos un bucle infinito { //abrimos el bucle output_high(PIN_B0); //prendemos RB0 delay_ms(500); //esperamos 500 ms output_low(PIN_B0); //borramos RB0 delay_ms(500); //esperamos 500 ms } //cerramos el bucle //cerramos la función principal

Todo programa siempre inicia en una rutina principal. En el lenguaje C las rutinas se denominan funciones. Las funciones son un conjunto de sentencias u ordenes que realizan una operación determinada, como lo hacen las rutinas, sin embargo las funciones tiene una característica extra; a ellas se les puede pasar valores de variables para que las procesen, y son capaces de devolvernos los resultados de dichos procesos. Básicamente actúan como las funciones matemáticas. Todo programa C siempre inicia en la función principal, la cual se denomina main. Dicho nombre no puede ser distinto, todo programa debe tener una función main, de lo contrario el compilador nos indicará un error. La función encierra una serie de sentencias, las cuales forman el bloque de dicha función. Dicho bloque inicia con una llave { y finaliza con otra llave } . Entre estas dos llaves se encuentran las sentencias y las estructuras lógicas. La función main es una función especial ya que no puede recibir ningún valor, ni tampoco puede devolver uno. Por lo tanto observe que va acompañada por dos palabras void lo cual en el lenguaje C significa vacío; es decir que no devuelve ningún valor (primer void) ni puede recibir ningún valor, (segundo void, el cual esta encerrado entre paréntesis). void main(void) { Nuestro código }

Nuestro código lo hemos escrito en formato “CCS nativo”. Esto significa que hemos usado todas las funciones embebidas (incluidas dentro) del compilador para simplificar la escritura del código y que nos ahorran mucho tiempo. Debe observarse que cada línea la hemos decalado (separado del origen) por medio del TABULADOR; esto es una buena práctica para poder advertir a simple vista cuales sentencias son las que estas anidadas dentro de cada bloque del programa principal. La primera línea o sentencia le indica al compilador que debe desactivar todos los puertos analógicos del PIC y que debe configurarlos como puertos digitales: setup_adc_ports(NO_ANALOGS);

Usamos la función embebida setup_adc_ports, la cual esta embebida en el compilador, y que se encarga básicamente de setear que puertos van a trabajar como analógicos y que puertos van a trabajar como digitales. La función configura los bits PCFG o ANSEL dependiendo con que PIC estemos trabajando y lo realiza de forma automática. Observe que hemos escrito entre paréntesis NO_ANALOGS lo cual le dice al compilador que no hay puertos analógicos. Esta etiqueta la obtenemos del archivo de cabecera del procesador (16f887.h). Es importante resaltar que las etiquetas siempre van en mayusculas, mientras que las instrucciones se escriben en minúscula. Es muy importante que se respete el orden mayúscula-minúscula pues el compilador es sensible a ello. Si escribimos una instrucción con mayúscula, NO LA IDENTIFICARÁ. Debe observarse también que las sentencias siempre terminan con un punto y coma. La siguiente sentencia de nuestro código es una instrucción estructural: while El while es una instrucción condicional la cual determina la ejecución de una o mas instrucciones en tanto y en cuanto se cumpla una condición, la cual se encierra entre paréntesis. En programación, si una condición se cumple, se dice que es verdadera, y esto se simboliza con el número 1; por el contrario, si la condición no se cumple, es falsa y se simboliza con el número 0. En un while, lo que este dentro del bloque del mismo, se ejecutará, siempre que la condición de verdadera, caso contrario no se ejecutará ninguna sentencia que se encuentre dentro del while. En nuestro caso hemos forzado la condición 1, con lo cual el while se ejecutará eternamente. Es decir que las sentencias encerradas dentro del bloque while (limitado por las llaves{}), se ejecutaran por siempre. Observe que dentro del while usamos también funciones embebidas: output_high(PIN_B0); output_low(PIN_B0);

Estas son funciones de salida de datos, se encargan de poner en uno o en cero un puerto, el cual la misma función se encarga de configurar como salida, no debe hacerlo el programador. Entre paréntesis le indicamos el PIN a encender o apagar. En nuestro caso es el RB0, al cual CCS lo denomina dentro del archivo de cabecera del microcontrolador como PIN_B0. Este formato si bien parece en principio raro porque no se adapta al usado en el data sheet, es práctico para los programadores NO ELECTRÓNICOS, y es el que ha adoptado CCS. Por ejemplo el RA0 CCS lo llama PIN_A0, y al RC6, PIN_C6, y así sucesivamente. Otra de las sentencias usadas es delay_ms(500);

La cual es una función de tiempo que nos permite crear un tiempo de espera en milisegundos. También existe el delay_us que nos permite crear un delay de microsegundos. La exactitud de la función delay depende de que hayamos definido correctamente la frecuencia de clock. De esta forma hemos hecho falshear un LED en nuestro primer código. Bueno, esto es todo por ahora , en las próximas entregas iremos descubriendo paso a paso las utilidades de la programación en lenguaje C y del entorno CCS. Continuará ......

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

Por Andrés Raúl Bruno Saravia

Entrega Nº 3. En nuestra entrega anterior creamos nuestro primer código, el cual simplemente nos hace falsear un LED conectado al PORTB. Hoy veremos como compilar es código dentro del MPLAB y grabar el mismo dentro del microcontrolador sin salir del entorno de desarrollo y usando la herramienta “PICKIT2” o equivalente

Compilando nuestro primer código... Ya hemos terminado de escribir nuestro primer código, ahora tenemos que convertirlo en hexadecimal para grabarlo dentro del microcontrolador. Este proceso se denomina compilación. El programador de microcontroladores, cualquiera sea el que estemos usando, necesita que le carguemos el código a programar dentro del microcontrolador en formato hexadecimal, él lee un archivo en formato HEX de INTEL, el cual tiene una estructura interna que Microchip adaptó a su necesidad. El compilador CCS es un compilador denominado “de 2 pasos” ya que en el primer paso traduce el programa escrito en lenguaje C al lenguaje Assembler y luego en un segundo paso, traduce este archivo al hexadecimal. Como consecuencia de todo el proceso de traducción o como se lo llama técnicamente compilación, CCS genera una serie de archivos: xxxxx.ERR : contiene los errores del proceso de compilación xxxxx.HEX: contiene el codigo en hexadecimal, este es usado por el programador xxxxx.LST: contiene un listado del proceso de ensamblado xxxxx.STA: contiene cuanta memoria RAM, ROM y STACK esta usando el programa xxxxx.TRE: contiene un árbol de las llamadas a funciones, es visible en el IDE de CCS xxxxx.SYM: contiene la localización de cada registro y variable usada en la RAM xxxxx.ESYM: solo es visible en el IDE de CCS y contiene información para el mismo.

En la siguiente figura podemos ver un ejemplo del resultado del proceso de compilación:

Grabado nuestro código en el PIC Una vez compilado nuestro código, ahora lo cargaremos en nuestro microcontrolador; para ello iremos a la solapa programmer, allí haremos clic con el Mouse sobre la solapa select Programmer y se desplegará un menú. Sobre dicho menú haremos clic sobre el ítem “PICkit 2”:

Esto activará los controles del PICkit2 programmer, los cuales aparecerán como una nueva barra de herramientas:

En dicho menú tenemos los íconos para: programar el microcontrolador, leer el contenido de la memoria de programa del microcontrolador, leer el contenido de la memoria EEPROM de datos del microcontrolador, verificar el contenido de la memoria de programa del microcontrolador, borrar el microcontrolador, verificar si la memoria de programa del microcontrolador esta vacía, sacar el reset del ICSP y arrancar el programa, poner el RESET del ICSP y detener el programa y finalmente, con el ícono del “lapicito”, como se le dice en la jerga de los programadores, establecer una comunicación con el microcontrolador. Observe que si se ha establecido la comunicación sin problemas deberá aparecer el siguiente mensaje en la ventana de salida : Initializing PICkit 2 version 0.0.3.63 Found PICkit 2 - Operating System Version 2.32.0 PICkit 2 Unit ID = OlHoss Target power detected ( 4.70V) PIC16F887 found (Rev 0x2) PICkit 2 Ready En la primera línea nos indica la versión del firmware que esta grabada dentro del microcontrolador de nuestro pickit2, seguidamente nos indica el ID grabado dentro del PICkit 2. A continuación nos indica cual es el valor de VCC leído sobre la placa de aplicaciones, el microcontrolador que tenemos instalado ya que lee su código de revisión interna, y finalmente nos indica que el PICkit 2 está listo para operar. Por tanto, ahora que esta todo listo, programaremos el microcontrolador pulsando el ícono respectivo dentro de las herramientas del programador:

Accionado el control se inicia el proceso de programación, siempre que todo esté realmente bien conectado:

Durante la programación se irán desplegando distintos mensajes en la ventana de salida del PICkit 2:

Programming Target (20/02/2012 20:00:56) PIC16F887 found (Rev 0x2) Erasing Target Programming Program Memory (0x0 - 0x4F) Verifying Program Memory (0x0 - 0x4F) Programming Configuration Memory Verifying Configuration Memory PICkit 2 Ready Bueno hasta aquí hemos llegado en este artículo, nos encontraremos en nuestra próxima nota.

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

Por Andrés Raúl Bruno Saravia

Entrega Nº 4. Se dice que el lenguaje C es un lenguaje de nivel medio. La razón de esta indicación está en que en C se pueden crear programas que manipulan la máquina casi como lo hace el lenguaje Ensamblador, pero utilizando una sintaxis que se asemeja más a los lenguajes de alto nivel. De los lenguajes de alto nivel toma las estructuras de control que permiten programar de forma estructurada. Al tener características de los lenguajes de bajo nivel se puede tomar el control absoluto del microcontrolador. Además tiene atajos que gustan mucho a los programadores al tener una sintaxis menos restrictiva que lenguajes como Pascal por ejemplo, lo que le convierte en el lenguaje idóneo para crear cualquier tipo de aplicación. Sus características básicas son: • • • • •

Es un lenguaje estructurado y modular. Lo que facilita su compresión y escritura Es un lenguaje que incorpora manejo de estructuras de bajo nivel (punteros, bits), lo que le acerca a los lenguajes de segunda generación Permite utilizar estructuras de datos complejas (arrays, pilas, colas, textos,...) Es un lenguaje compilado Permite crear todo tipo de aplicaciones

¿Cual es estructura de un programa en Lenguaje C? Un programa en C consta de una o más funciones, las cuales están compuestas de diversas sentencias o instrucciones. Una sentencia indica una acción a realizar por parte del programa. Una función no es más que (por ahora) un nombre con el que englobamos a las sentencias que posee a fin de poder invocarlas mediante dicho nombre.

La idea es: parámetros nombreDeFunción(parámetros) { Sentencias; } Los símbolos { y } indican el inicio y el final de la función. Esos símbolos permiten delimitar bloques en el código. El nombre de la función puede ser invocado desde otras sentencias simplemente poniendo como sentencia el nombre de la función. Como a veces las funciones se almacenan en archivos externos, necesitamos incluir esos archivos en nuestro código mediante una sentencia especial #include , que en realidad es una directiva de preprocesador. Una directiva de preprocesador es una instrucción para el compilador con el que trabajamos. El uso es: #include La directiva #include permite indicar un archivo de cabecera en el que estará incluida la función que utilizamos. En el lenguaje C estándar los archivos de cabecera tienen extensión h. Los archivos de cabecera son los que permiten utilizar funciones externas (o librerías) en nuestro programa. Una de las librerías más utilizadas en los programas, es la que contiene las etiquetas de todos los registros de funciones especiales del MCU PIC que hayamos seteado en el proyecto. En el caso de CCS esta librería está disponible en la cabecera 16Fxxx.h En todos los lenguajes de programación, el primer programa a realizar es el famoso Hola mundo, un programa que escribe este texto en pantalla. En el mundo de los microcontroladores PIC, este programa se traduce en hacer titilar un led. De esta forma en CCS el código de este programa es: #include #use delay(crystal=12000000)// #fuses HS,NOWDT,NOLVP,NODEBUG,NOBROWNOUT,NOPLLEN,CPUDIV1,PUT,MCLR #define LED1 PIN_B4 void main(void) { setup_adc_ports(NO_ANALOGS); while(1) { output_high(LED1); delay_ms(500); output_low(LED1); delay_ms(500); } }

¿Cuáles son los elementos de un programa en C? Los programas en C se basan en sentencias las cuales siempre se incluyen dentro de una función. En el caso de crear un programa ejecutable, esas sentencias están dentro de la función main. A está función le antecede y precede la palabra void. Ahora bien al escribir sentencias hay que tener en cuenta las siguientes normas: (1) Toda sentencia en C termina con el símbolo "punto y coma" (;) (2) Los bloques de sentencia empiezan y terminan delimitados con el símbolo de llave ({ y }). Así { significa inicio y } significa fin (3) En C hay distinción entre mayúsculas y minúsculas. No es lo mismo main que MAIN. Todas las palabras claves de C están en minúsculas. Los nombres que pongamos nosotros también conviene ponerles en minúsculas ya que el código es mucho más legible así.

¿Qué es un comentario? Se trata de texto que es ignorado por el compilador al traducir el código. Esas líneas se utilizan para documentar el programa. Esta labor de documentación es fundamental. De otro modo el código se convierte en ilegible incluso para el programador que lo diseñó. Tan importante como saber escribir sentencias es utilizar los comentarios. Todavía es más importante cuando el código va a ser tratado por otras personas, de otro modo una persona que modifique el código de otra lo tendría muy complicado. En C los comentarios se delimitan entre los símbolos /* y */ para los bloque y // para las lineas // Esto es un comentario usado para las líneas /* Esto es un comentario el compilador hará caso omiso de este texto*/

¿Qué debemos considerar como importante en C? C no es un lenguaje dócil para enfrentarlo intuitivamente por primera vez; se requiere un mínimo conocimiento de sus fundamentos antes de poner las manos sobre el teclado. En este aspecto es particularmente importante comprender los diferentes tipos de datos y las reglas que rigen su operación. La idea directriz de C es la definición de procedimientos (funciones), que en principio devuelven un valor. Lo que para nosotros es - conceptualmente - el programa principal, también es en C una función (la más externa). Incidentalmente, su valor es devuelto al sistema operativo como código de conclusión del programa. Ante todo, C está diseñado con vistas a la compatibilidad. En este sentido, todas las definiciones que puedan hacerse no serán concretas, pues son adaptables de acuerdo con la implementación. Un entero, por ejemplo, es una entidad con ciertas características generales, pero su implementación diferirá en distintos equipos.

C maneja los datos en forma de variables y constantes, conceptos con los que supondremos que el lector está familiarizado. Las variables, simbolizadas mediante datos alfanuméricos (cuyas reglas de construcción trataremos más adelante), presentan características que será muy importante considerar: • • •

Tipo de dato: cada variable (también las constantes) está caracterizada por el tipo de dato que representa. Visibilidad: en un programa C, cada variable tiene un rango de visibilidad (procedimientos en los que es reconocida), que depende de cómo se la haya declarado. Existencia: relacionado con la anterior característica, es posible que el contenido de una variable perdure, o que se pierda, por ejemplo, al terminarse un procedimiento.

¿Cuál es el grupo de caracteres de C? C emplea dos conjuntos de caracteres: • •

El primero de ellos incluye todos los caracteres que tienen algún significado para el compilador. El segundo incluye todos los caracteres representables.

C acepta sólo ciertos caracteres como significativos. Sin embargo, otros caracteres pueden formar parte de expresiones literales (constantes literales, nombres de archivo, etc.) que no serán analizadas por C. Los caracteres a los que C asigna especial significado se pueden clasificar en alfanuméricos y signos especiales. Los caracteres alfanuméricos incluyen las letras (alfabeto inglés, de A a Z), mayúsculas y minúsculas, los dígitos, y el guión bajo (underscore: ‘_’). En todos los casos, las mayúsculas son consideradas distintas de las minúsculas. Toda cadena alfanumérica con significación en C está compuesta exclusivamente por estos caracteres. Los signos especiales son los listados a continuación. Ellos se emplean como delimitadores, operadores, o signos especiales. Mayúsculas: A - Z Minúsculas: a - z Dígitos: 0 – 9 Guión bajo: _ Coma , Punto . Punto y coma ; Dos puntos : Signo de interrogación ? Signo de admiración ! Comilla simple ‘ Comilla doble “ Barra vertical | Barra / Barra invertida \ Tilde ~

Signo más + Signo menos Paréntesis izquierdo ( Paréntesis derecho ) Corchete izquierdo [ Corchete derecho ] Llave izquierda { Llave derecha { Signo Mayor > Signo Menor < Signo igual = Asterisco * Ampersand & Porciento % Caret ^

¿Qué es un identificador? Los identificaremos se utilizan para identificar, (valga la redundancia): variables, constantes, funciones, etc. Deben comenzar con una letra. Máxima longitud: 32 caracteres. Sólo pueden contener letras y números, pero no caracteres especiales, salvo el guión bajo, (underscore). No se deben confundir con palabras reservadas de C, (una variable, por ejemplo no puede llamarse int, ni main, etc.) y hay diferencias entre mayúsculas y minúsculas. Como norma se utilizan las minúsculas; las mayúsculas se usan para las constantes. Las palabras reservadas o también conocidas como “palabras claves” sirven para indicar al microcontrolador que realice una tarea muy determinada (desde evaluar una comparación, hasta definir el tipo de una variable) y tienen un especial significado para el compilador es por ello que no pueden usarse como identificadores: auto break case char const continue default do

double else enum extern float for goto if

int long register return short signed sizeof static

struct switch typedef union unsigned void volatile while

¿Cuáles son los tipos de datos básicos que maneja CCS? El estándar Ansi define un conjunto de tipos básicos y su tamaño mínimo. En distintas implementaciones del lenguaje C estos tamaños puede cambiar, así por ejemplo: el int se define en Ansi C como un tipo de dato que almacena enteros en un rango de –32767 hasta +32767, sin embargo para el compilador CCS en 8 bits (PCB,PCM y PCH), el valor es un entero positivo en el rango 0 a 255. En CCS los tamaños están definidos por el ancho del bus de datos que posee el microcontrolador PIC, de esta forma los tamaños para los micros de 8 bits (PIC10,PIC12 y PIC16) no son iguales al de los micros de 16 bits de datos (PIC24, dsPIC30 y dsPIC33) :

Micros PIC10, PIC12,PIC16 y PIC18 TIPO ANCHO EN BITS char (carácter) 8 int (entero) 8 long(entero largo) 16 long long (entero extra largo)32 float (real) 32 short 1 void 0

BYTES 1 1 2 4 4 0 0

Micros PIC24, dsPIC30 y dsPIC33 TIPO ANCHO EN BITS char (carácter) 8 int (entero) 16 long(entero largo) 32 long long (entero extra largo)64 float (real) 32 double 64 short 8 void 0

BYTES 1 2 4 8 4 8 1 0

A diferencia del compilador ANSI C CCS tiene sus tipos de datos predefinidos sin signo, es decir que solo podemos almacenar valores positivos excepto que especifiquemos antes del tipo la palabra clave signed

¿Qué son los operadores aritméticos en C ? Son usados para definir una operación aritmética entre distintos operandos, estos pueden ser los siguientes: OPERADOR + * / % -++

ACCIÓN Resta Suma Multiplicación división. (sólo para enteros) Resto de la división entera Decremento Incremento

Los operadores de decremento e incremento equivalen a: a = a + 1 = a++ a=a-1=a-En caso de presentarse a con el operador delante: A = 8; B = ++A; B toma el valor de 9. Pero de plantearse lo siguiente: A = 8; B = A++; B toma el valor de 8. O sea que en este último caso, primero ocurre la asignación y luego el incremento en A.

¿Para qué son los operadores de relación? Estos operadores se usan para establecer una relación comparativa entre dos operandos. Los utilizados son los siguientes: OPERADOR > >=