77
Website:  http://www.aquiha yapuntes.com/ programacion-pi c-en-c.html?start=8  Prog rama ción en C con CSS Índice curso de progra ma ción PIC en C con CC S  Introducción  Mi primer programa en C con el compilador PCW C.  Simular nuestro primer programa con proteus.   Variables y Tipos de Datos.  Constantes.   Depuración de programas con Proteus y CCS   Funciones de Entrada / Salida serie RS232 o La función printf(). o Funciones getc(), getch() y getchar().  o Funciones gets() y puts().  Operadores.   Sentencias repetitivas. o Bucle while o Bucle for o Bucle do-while  Sentencias condicionales o Sentencia if  o Sentencia if-else o Sentencia switch  Funciones (1)  Funciones (2)  Punteros (1)  Sentencias goto, break, continue.   Sentencia return.  Arrays.  Cadenas de caracteres.  Funciones para manipular cadenas de caracteres. o Función strcyp (cadena 1, cadena 2). o Función strcat (cadena 1, cadena 2). o Función strlen (cadena). o Función strcmp (cadena 1, cadena 2).  Arrays Multidimensionales.  Arrays de cadenas.  Punteros y Arrays.  Array de punteros.  Relación entre Arrays y Punteros.  Aritmética de Punteros y errores mas comunes.  Estructuras.  Estructuras y Punteros. Paso de Estructuras como argumentos a funciones.  Uniones.  Enumeraciones.

Programación en C con CSS

Embed Size (px)

Citation preview

  • 5/28/2018 Programacin en C con CSS

    1/77

    Website:http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=8

    Programacin en C con CSS

    ndic e cur so de p rogr amacin PIC en C co n CCS

    Introduccin Mi primer programa en C con el compilador PCW C.

    Simular nuestro primer programa con proteus.

    Variables y Tipos de Datos.

    Constantes. Depuracin de programas con Proteus y CCS

    Funciones de Entrada / Salida serie RS232

    o La funcin printf().

    o Funciones getc(), getch() y getchar().

    o Funciones gets() y puts().

    Operadores.

    Sentencias repetitivas.

    o Bucle whileo Bucle foro Bucle do-while

    Sentencias condicionaleso Sentencia ifo Sentencia if-elseo Sentencia switch

    Funciones (1)

    Funciones (2)

    Punteros (1)

    Sentencias goto, break, continue.

    Sentencia return. Arrays. Cadenas de caracteres. Funciones para manipular cadenas de caracteres.

    o Funcin strcyp (cadena 1, cadena 2).o Funcin strcat (cadena 1, cadena 2).o Funcin strlen (cadena).o Funcin strcmp (cadena 1, cadena 2).

    Arrays Multidimensionales. Arrays de cadenas. Punteros y Arrays. Array de punteros. Relacin entre Arrays y Punteros. Aritmtica de Punteros y errores mas comunes. Estructuras. Estructuras y Punteros. Paso de Estructuras como argumentos a funciones. Uniones. Enumeraciones.

    http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=8http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=8http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=8http://www.aquihayapuntes.com/programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/programacion-pic-en-c.html?start=1http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=1http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=2http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=2http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=4http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=4http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=5http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=5http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=6http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=6http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=7http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=7http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=7http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=7http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=8http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=8http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=9http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=9http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=10http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=10http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=11http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=11http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=11http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=11http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=12http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=12http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=13http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=13http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=14http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=14http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=14http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=14http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=15http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=15http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=16http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=16http://www.aquihayapuntes.com/component/content/article/42-microcontroladores/168-curso-de-programacion-pic-en-c-con-ccs-funciones-1.htmlhttp://www.aquihayapuntes.com/component/content/article/42-microcontroladores/168-curso-de-programacion-pic-en-c-con-ccs-funciones-1.htmlhttp://www.aquihayapuntes.com/component/content/article/42-microcontroladores/169-curso-de-programacion-pic-en-c-con-ccs-funciones-2.htmlhttp://www.aquihayapuntes.com/component/content/article/42-microcontroladores/169-curso-de-programacion-pic-en-c-con-ccs-funciones-2.htmlhttp://www.aquihayapuntes.com/component/content/article/42-microcontroladores/171-curso-de-programacion-pic-en-c-con-ccs-punteros-1.htmlhttp://www.aquihayapuntes.com/component/content/article/42-microcontroladores/171-curso-de-programacion-pic-en-c-con-ccs-punteros-1.htmlhttp://www.aquihayapuntes.com/component/content/article/42-microcontroladores/177-curso-de-programacion-pic-en-c-con-ccs-sentencias-goto-break-continue.htmlhttp://www.aquihayapuntes.com/component/content/article/42-microcontroladores/177-curso-de-programacion-pic-en-c-con-ccs-sentencias-goto-break-continue.htmlhttp://www.aquihayapuntes.com/component/content/article/42-microcontroladores/177-curso-de-programacion-pic-en-c-con-ccs-sentencias-goto-break-continue.htmlhttp://www.aquihayapuntes.com/component/content/article/42-microcontroladores/171-curso-de-programacion-pic-en-c-con-ccs-punteros-1.htmlhttp://www.aquihayapuntes.com/component/content/article/42-microcontroladores/169-curso-de-programacion-pic-en-c-con-ccs-funciones-2.htmlhttp://www.aquihayapuntes.com/component/content/article/42-microcontroladores/168-curso-de-programacion-pic-en-c-con-ccs-funciones-1.htmlhttp://www.aquihayapuntes.com/programacion-pic-en-c.html?start=16http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=15http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=14http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=14http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=13http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=12http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=11http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=11http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=10http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=9http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=8http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=7http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=7http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=6http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=5http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=4http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=2http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=1http://www.aquihayapuntes.com/programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/programacion-pic-en-c.html?start=8
  • 5/28/2018 Programacin en C con CSS

    2/77

    Uso de la palabra clave typedef. Campos de bits

    Programacin PIC en CDetalles

    ltima actualizacin el Lunes, 25 Noviembre 2013 20:44Escrito por biblioman

    Pgina 1 de 18

    Curso para aprender a programar en lenguaje C utilizando uncompilador para PIC, en concreto el PCW compiler de la casa CCS. Cursossobre C en Internet a miles, pero todos los que yo he visto estn realizadossobre compiladores de propsito general, como Vicual C++ de Microsoft Builder C++ de Borlan, sin duda son excelentes compiladores que nospermiten realizar aplicaciones para

    ordenadores de escritorio tanto en C como en C++ (la versin orientada a objetos de C),pero no sirven para programar PIC, es decir con el ejecutable que generan al compilar no sepuede programar un Microcontrolador.Lo habitual hasta ahora es que los usuarios que se inician en este apasionante mundo de laprogramacin de Microcontroladores, sea de la marca que sea, primero lo hacan utilizandoel lenguaje ensamblador, especifico no solo ya para cada marca de microcontrolador sinopara cada modelo, ya que hay que conocer perfectamente los recursos de cadaMicrocontrolador (Nmero de puertos de Entrada/Salida Relojes internos, etc. ). Al principiode los tiempos de estos dispositivos esto era obligatorio ya que los recursos de memoria yvelocidad de procesamiento no eran muy grandes y haba que optimizar el cdigo almximo, esto implicaba que haba que utilizar a la fuerza un lenguaje de programacin debajo nivel que bien utilizado explotara los recursos de estos dispositivos sin desperdiciarmemoria y velocidad de procesamiento, pero al igual que ha ocurrido con los ordenadorespersonales las prestaciones de estos dispositivos ha ido creciendo exponencialmente con el

    tiempo, siendo ya perfectamente factible el utilizar un lenguaje de alto nivel para programarestos dispositivos y aprovecharnos de las ventajas de portabilidad que ofrecen este tipo delenguajes, de esta manera por ejemplo podemos hacer un programa para un PIC enconcreto y utilizarlo en otro de mayores prestaciones sin modificar apenas nada del cdigofuente.

    Quien puede sacar provecho de este curso?. Este curso es para ti si: Has programado PIC en Ensamblador y quieres hacerlo en un lenguaje de alto nivel

    como el C. No has programado nunca Microcontroladores pero conoces el lenguaje de

    programacin C de haberlo utilizado para otros propsitos. No has programado nunca un PIC en Ensamblador, ni conoces ningn lenguaje de alto

    nivel como el C. Es decir, no tienes ni idea de Microcontroladores ni de programacin(Esto es posible porque el curso va ha empezar desde cero es decir con el clsico HolaMundo con el que empiezan todos los libros de iniciacin a la programacin.

    Bueno alguno pensar que para aprender a programar en C vale cualquier compilador deuso generaly lo que realmente interesa es saber las instrucciones de C que tengo que utilizar paraconfigurar por ejemplo un puerto como entrada o salida, o que cdigo tengo que utilizarpara utilizar los convertidores A/D que incorporan ya casi todos los PIC, indudablementeese es el propsito final de este cursoy para ello paralelamente a l va haber otro

    http://www.aquihayapuntes.com/programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/programacion-pic-en-c.html
  • 5/28/2018 Programacin en C con CSS

    3/77

    donde se van a ver aplicaciones prcticas. Pero hay que tener en cuenta que loscompiladores para Microcontroladores son especficos para estos dispositivos embebidos yno cumplen con el Estndar ANSI C al 100 %, por lo que cuando ests programando lo msseguro es que te vayas dando cuenta que una funcin que en el C estndar funcionaperfectamente aqu te da un error al compilar. Adems te irs quedando con mucho cdigoque lo has probado y sabes que te funciona perfectamente, cuando tengas que hacer una

    aplicacin prctica no tendrs la duda si puedes usar una determinada estructura en tuprograma si es posible utilizar punteros o no y como hacerlo, porque ya lo sabrs a la vezque has ido aprendiendo el lenguaje de programacin y no solo eso, te irs familiarizandocon las instrucciones especficas del compilador: de que herramientas dispone, susfunciones precompiladas, su sistema de depuracin de errores, etc.Que herramientas voy a necesitar para realizar el curso?.El compilador CCS seguro, vaya es de pago ya empezamos con problemas te puedes bajaruna versin de Evaluacin por 30 das desde aqu:

    http://www.ccsinfo.com/ccsfreedemo.php

    Despus de rellenar el formulario te descargas el programa de instalacin y lo instalas en tuordenador como un programa ms de Windows, aunque tienes que tener en cuenta que solopodrs programar un pequeo conjunto de PIC de cada familia, otro inconveniente es quetienes que estar conectado a Internet para que te funcione si no te aparecer esta ventanitapoco amigable:

    http://www.ccsinfo.com/ccsfreedemo.phphttp://www.ccsinfo.com/ccsfreedemo.phphttp://www.ccsinfo.com/ccsfreedemo.php
  • 5/28/2018 Programacin en C con CSS

    4/77

    Otra limitacin es que el tamao del programa no puede superar los 2K de memoria,aunque para los ejemplos que vamos a hacer aqu te sobra. Bien ya tenemos solucionado eltema del compilador, bien sea por que con la demo nos apaamos o porque tengo un amigocojonudo que me va ha prestar uno con licencia para que pueda realizar el curso (je,je..

    ).Bien ya tengo el compilador y puedo empezar a programar y a crear mis .HEX (para el queno lo sepa es el archivo que tenemos que cargar en nuestro PIC para que funcione). Todoesto es muy elemental para el que lo sabe, pero como dije al principio este curso estpensado tambin para el que no tiene ni idea de programar microcontroladores. As es quesigamos.Una vez que tenemos nuestro .HEX tendremos que comprobar que funciona realmente paraello tenemos dos opciones: Montar nuestro circuito con todos sus componentes, programar el PIC con un

    programador comercial como el PICSTART de Microchip o con uno de los muchos quehay en Internet que sirven perfectamente para empezar a programar estosdispositivos.

    Utilizar un programa de simulacin electrnica como Proteus que tiene la ventaja dedisponer de una extensa biblioteca de microcontroladores PIC junto con loscomponentes auxiliares que normalmente utilizan estos dispositivos: leds, pantallasLCD, teclados, memorias, etc.

    Bien nosotros utilizaremos la segunda opcin, aunque en una prctica veremos comohacerlo de la primera forma.La versin de evaluacin de Proteus te la puedes descargar desde aqu:

    http://www.labcenter.co.uk/download/prodemo_download.cfm

    Claro que tiene limitaciones, sino no sera una demo, la principal es que no podemosguardar nuestros

    trabajos y la segunda es que no lleva incorporado muchas de las libreras dinmicasnecesariaspara realizar la simulacin de algunos microcontrloladores. Mira a ver si el amigo que tedejo el compilador te puede dejar tambin una licencia para este magnfico Simulador.

    Nota: en este sitio est prohibido el mostrar facilitar enlaces a lugares de descarga dedudosa reputacin. Lo digo tambien para que se tenga en cuenta en el foro queprximamente estar a vuestra disposicin y donde podremos exponer nuestras dudas experiencias sobre este tema y sobre otros que irn saliendo.

    Otra cosa que quiero aclarar es que el curso va a ser todo lo prctico que pueda y la formade proceder serla siguiente: ir mostrando uno varios ejemplos de cada tema y posteriormente har unaExplicacin de los mismos. Yo no se vosotros pero yo cada vez que he querido aprenderalgo nuevo lo primero que he hecho a sido mirar los ejemplos, despus vosotros tendrisque comprobar que lo que he dicho es cierto y que el ejemplo compila y funciona sinerrores.Para facilitar la navegacin el prximo da presentar el ndice de los tems que va a tratarel cursoAunque puede que lo vaya modificando segn vallamos avanzando.Un saludo y hasta el prximo da.

    http://www.labcenter.co.uk/download/prodemo_download.cfmhttp://www.labcenter.co.uk/download/prodemo_download.cfmhttp://www.labcenter.co.uk/download/prodemo_download.cfm
  • 5/28/2018 Programacin en C con CSS

    5/77

    Vamos a crear nuestro primer ejemplo paso a paso: abrimos el IDE de nuestro compilador yseleccionamos New->Source File segn se muestra en la figura de abajo:

    Nos saldr un cuadro de dialogo de guardar de Windows, donde le pondremos un nombre anuestro archivo y lo guardaremos.

    Despus escribimos el cdigo fuente que se muestra en la figura de abajo y guardamos eldocumento:

  • 5/28/2018 Programacin en C con CSS

    6/77

    Comentario del programa:

    En primer lugar nos encontramos con tres directivas del prepocesador, las identificaremosporque empiezan por el smbolo (#): La primera de ellas es una directiva include su funcin es introducir un documento

    dentro de otro. En la posicin del programa donde se encuentra esta directiva, seincluir el archivo indicado. Se suele usar para incluir los archivos de cabecera(generalmente con extensin.h). En este caso concreto se incluye el archivo,en este archivo se incluyen las definiciones de los registros del PIC.

    #use delay (clock=4000000); directiva para el uso de retardos, entre parntesis

    tenemos que poner la frecuencia de reloj que vamos a utilizar. #use rs232 (baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) esta directiva es

    para la comunicacin del PIC con otro dispositivo va RS232, por ejemplo unordenador, en ella se encuentran definidas los prototipos de las funciones de entraday salida como printf().

    En segundo y ltimo lugar se encuentra la funcin main. Este es el ncleo del programa, elque va ha incluir todos los pasos a seguir durante su ejecucin. En nuestro primer ejemplosolo contiene una sentencia que hace una llamada a la funcin printf(), esta funcin seencarga de mostrar un mensaje por el dispositivo de salida RS-232.

  • 5/28/2018 Programacin en C con CSS

    7/77

    El mensaje que muestra la funcin printf es el que recibe como parmetro (el texto entreparntesis). Dicho mensaje es delimitado por las comillas dobles, que indican el principio yel fin de una cadena de texto.

    Bien una vez creado el archivo .c de nuestro programa tenemos que crear un proyecto y

    asociarle el archivo que acabamos de crear, tenemos dos opciones crearlo manualmente utilizar el wizard que tiene el IDE, en este primer ejemplo utilizaremos la opcin manual.

    Despus seleccionamos New ->Project Manual

    Y aadimos el Ejemplo1.c que hemos creado a nuestro proyecto:

  • 5/28/2018 Programacin en C con CSS

    8/77

    Seleccionamos la pestaa Compile y pulsamos sobre Build All para construir todo.

  • 5/28/2018 Programacin en C con CSS

    9/77

    Vemos que el archivo de salida no nos ha producido ningn error. Por tanto el proyecto seha generado correctamente.

    Y si vamos a la carpeta donde habamos guardado nuestro primer ejemplo, tenemos todoslos archivos que nos ha creado el IDE:

  • 5/28/2018 Programacin en C con CSS

    10/77

    De todos estos archivos los que mas nos interesa son los que estn marcados en la figurade arriba. El archivo Ejemplo1.hex es el que tenemos que utilizar para programar el PIC y elque termina con extensin .cof lo utilizaremos para cargarlo en el simulador Proteus y podersimular el programa paso a paso, entre otras posibilidades muy tiles a la hora de

    depurar nuestro cdigo.

    Bien ya tenemos nuestro primer ejemplo generado y listo para cargarlo en nuestrosimulador Proteus. Vamos a ello: Arrancamos nuestro simulador Proteus y pasamos acolocar nuestros dispositivos en el rea de trabajo. Empezaremos colocando el PIC, paraello hacemos clic en el botn que pone Pick Devices segn se muestra en la figura de abajo:

  • 5/28/2018 Programacin en C con CSS

    11/77

    En la ventana que nos aparece en el campo Keywords escribimos el nombre de nuestro PIC.

    Una vez seleccionado hacemos doble clic sobre el para incorporarlo a nuestro proyecto.

  • 5/28/2018 Programacin en C con CSS

    12/77

    Bien, vamos por el segundo y ltimo elemento que necesitamos para simular nuestroprograma. Hay que tener en cuenta que el simulador es capaz de hacer funcionar nuestrocircuito sin algunos elementos que seran necesarios si decidimos montar nuestro circuito enuna placa real (por ejemplo la alimentacin del PIC y el cristal de cuarzo).

    El segundo elemento que necesitamos es un Terminal Virtual que har las veces de monitor,para poder ver las salidas en formato texto de nuestro PIC como si se tratar del smbolodel sistema en un ordenador de escritorio con el Windows instalado. En la figura de abajo semuestra donde podemos incorporar dicho instrumento.

  • 5/28/2018 Programacin en C con CSS

    13/77

    Con esto ya tendremos los dos elementos necesarios para simular nuestros programas,recordemos que en este curso se va a ver las generalidades del lenguaje C aplicadas a este

    compilador, en el caso de las aplicaciones prcticas que empezaremos pronto en otroarticulo tendremos que hacer un circuito independiente para cada ejemplo ya que cada unode ellos incorporar elementos diferentes como: diodos Led, motores, teclados, displays,etc.

    La interconexin de los dos dispositivos es muy sencilla segn se muestra en la figura deabajo, solo hay que hacer clic con el puntero del ratn en forma de lpiz entre losterminales que queremos conexionar:

  • 5/28/2018 Programacin en C con CSS

    14/77

    El pin del PIC que habamos elegido como transmisin de datos en nuestro programa irconectado al terminal RXD de recepcin de datos en el Terminal Virtual y viceversa.

    Bien ahora tenemos que cargar nuestro programa en el PIC para poder simularlo, para ellohacemos doble clic sobre el PIC y nos aparecer la ventana de la figura de abajo:

  • 5/28/2018 Programacin en C con CSS

    15/77

    Los valores que en un principio tenemos que introducir para que nuestra simulacinfuncione son los que estn sealados en la figura de arriba. En Program File pincharemossobre la carpeta y seleccionaremos el archivo con extensin .cof que se haba creado al

    compilar nuestro programa, si en vez de este seleccionamos el que tiene extensin .Hexfuncionar igual pero no podremos realizar la simulacin paso a paso. El otro valor a teneren cuenta es que la frecuencia del reloj del PIC debe coincidir con el valor que le habamospuesto en el programa en nuestro caso 4 MHz.Una vez hecho esto guardamos nuestro proyecto.

  • 5/28/2018 Programacin en C con CSS

    16/77

    Si ahora hacemos clic sobre el botn Play se nos abrir una terminal al estilo MSDos dondenos mostrar la salida de nuestro programa:

    Ahora si le damos al botn de simulacin paso a paso podremos simular nuestroejemplo paso a paso.

    Si en vez de ello nos sale una ventana mostrando dos advertencias de que no se puedeencontrar el cdigo fuente de nuestro ejemplo, como se muestra en la figura de abajo.

  • 5/28/2018 Programacin en C con CSS

    17/77

    Seguiremos los siguientes pasos:En el men seleccionamos Source y hacemos clic sobre Define Code Generation Tools

    Nos aparecer la ventana de abajo en la que pulsaremos sobre el botn New

  • 5/28/2018 Programacin en C con CSS

    18/77

    Buscamos en nuestro directorio donde se ha instalado el compilador y seleccionamosCCsc.exe tal y como se muestra en la figura de abajo:

  • 5/28/2018 Programacin en C con CSS

    19/77

    Despus en el combo Tool seleccionamos el compilador y configuramos el resto deparmetros tal y como se muestra en la figura de abajo y pulsamos OK:

    Ahora nos queda aadir nuestro cdigo fuente para ello vamos al men seleccionamosSource Add/Remove Source files

    Y aadimos nuestro cdigo fuente ejemplo1.c

    Si ahora volvemos a simular nuestro ejemplo paso a paso nos aparecer la ventanasiguiente:

  • 5/28/2018 Programacin en C con CSS

    20/77

    Donde podemos ver la ejecucin del programa lnea a lnea o poner puntos de interrupcinen las partes del programa que nosotros queramos. Saber que existe un plugin que permiteintegrar un visor de proteus en el famoso simulador MPLAB. Incluir un video en la seccinde descargas donde explica como hacerlo, aunque nosotros seguiremos utilizando este

    mtodo.Bien a partir de ahora ya podemos empezar a estudiar el lenguaje de programacin C eneste compilador como si fuera un compilador cualquiera como Microsoft Visual C++ perocomprobando las particularidades de este compilador. Todos los ejemplos van a seguir elmismo procedimiento por lo que solo pondr el cdigo y la explicacin del mismo.

    Un saludo y hasta el prximo da.

  • 5/28/2018 Programacin en C con CSS

    21/77

    Volver al ndice

    Qu son las variables? pues sencillamente el poder identificar con un nombre una o variasposiciones de memoria de la RAM de nuestro PIC y de esta manera el poder almacenar alllos datos que va a utilizar nuestro programa.En C para poder utilizar una variable primeramente hay que declararla siguiendo la

    siguiente sintaxis:

    tiponombre_variable [=valor];

    Lo que va entre corchetes es porque es opcional es decir, las variables se pueden inicializar no al declararlas.Ejemplo de variable declarada:

    int i;

    Ejemplo de variable declarada e inicializada:

    int i=5;

    En una misma lnea se puede declarar ms de una variable siguiendo el siguiente formato:

    tipo nombre_variable1,nombre_variable2,....;

    Hay que tener en cuenta que la lnea tiene que acabar en punto y coma.El tipo de datos es obligatorio ponerlo y le dice al compilador cuantas celdillas de memoriatiene que reservar para almacenar el valor de la variable. Los tipos de datos pueden variarde un compilador a otro, vamos a ver los tipos de datos que podemos usar con nuestrocompilador CCS.

    Los tipos de datos bsicos que utiliza nuestro compilador son los siguientes:

    Sin embargo el compilador CCS tambin admite los siguientes tipos de datos definidos en elestndar C y que son los que normalmente se utilizan a la hora de programar:

    http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.html
  • 5/28/2018 Programacin en C con CSS

    22/77

    Todos los tipos excepto float son por defecto sin signo, aunque pueden llevar elespecificador unsigned signed y su rango de valores ser el que corresponda a su tipobsico.

    Estos son los tipos bsicos, tambin estn los tipos de datos compuestos comoEnumeraciones, Estructuras y Uniones que estn formados por una combinacin de losbsicos y que los veremos ms adelante.

    El nombre de la variable no puede ser una palabra clave (reservada por el compilador pararealizar unas funciones determinadas y los caracteres que podemos utilizar son las letras: a-z y A-Z ( ojo! la o no est permitida), los nmeros: 0-9 y el smbolo de subrayado _.Adems hay que tener en cuenta que el primer carcter no puede ser un nmero.

    Dnde se declaran las variables?

    Las variables segn el lugar en que las declaremos pueden ser de dos tipos: globales olocales. La variables globales se declaran fuera de las funciones y pueden ser utilizadas en

    cualquier parte del programa y se destruyen al finalizar ste. Las variables locales se declaran en la funcin en que van a ser utilizadas. Slo

    existen dentro de la funcin en que se declara y se destruye al finalizar dicha funcin.Si una funcin va a usar argumentos (DATOS), entonces debe declarar las variablesque van a aceptar los valores de esos argumentos. Estas variables son los parmetrosformales de la funcin. Se comportan como cualquier otra variable local de la funcin,crendose al entrar en la funcin y destruyndose al salir. Cuando veamos el tema delas funciones veremos ejemplos de estas variables.

    Bueno ya est bien de teora vamos hacer un ejemplo donde vamos a declarar y a usarvarios tipos de variables:

  • 5/28/2018 Programacin en C con CSS

    23/77

    Este programa generar la siguiente salida:

  • 5/28/2018 Programacin en C con CSS

    24/77

    Comentario del programa:

    El compilador utiliza 8 bits para representar los nmeros enteros sin signo con lo cualpodemos representar desde el 0 hasta el 255 que corresponde en binario al nmero:11111111. Por lo que al asignarle a la variable el valor 256 el compilador no generarun error pero el dato guardado ser errneo, nos mostrar 0 que es el siguiente valor

    a 255 en binario. Para los nmeros enteros con signo tambin se utilizan 8 bits pero el ltimo bit se

    reserva para el signo, con lo que se podrn representar los nmeros desde: -127 al127.

    El tipo short se utilizar para las variables de un bit y tendrn como valor 0 1. Para los nmeros tipo long int se reservan 16 bits sin signo con lo que su rango va de

    0 a 65535 Para el tipo signed long se reservan tambin 16 bits pero se utiliza uno para el signo,

    por lo que se tiene un rango que va desde -32767 a 32767. El tipo float define un nmero de 32 bits en punto flotante. y con el podremos

    representar los nmeros reales. El tipo char se utiliza para almacenar los caracteres, utiliza 8 bits sin signo suficientes

    para representar los 256 caracteres del cdigo ASCII. Los smbolos %D, %lu, %ld, %c le indica a la funcin printf en que formato tiene que

    representar el nmero. En la ayuda del compilador vienen los diferentesespecificadores que hay para los diferentes tipos de datos. A lo largo de los siguientesejemplos se irn mostrando algunos ms.

    CONSIDERACIONES:Hay que intentar siempre utilizar el tipo de dato que menos memoriaocupe dentro de los valores que pueda utilizar la variable. Si abusamos de los tipos grandespara almacenar valores pequeos nos quedaremos sin memoria y en los programas grandeses un dato que tenemos que tener en cuenta.

    Nota:en los ejemplos que tengan poco cdigo fuente como este y para que el formato de

    texto salga con los mismos colores que utiliza el compilador utilizar imgenes para mostrarel cdigo y en la seccin de descargas ir incluyendo los ejemplos del curso para que todo elque no quiera teclearlos a mano se los pueda descargar. Otra cosa no incluir el circuito enProteus ya que es el mismo para todos los ejemplos a excepcin de que en algunosejemplos pueda ir cambiando el tipo de PIC.

  • 5/28/2018 Programacin en C con CSS

    25/77

    Pgina 6 de 18

    Volver al ndice

    Antes de empezar con el tema de las constantes voy a comentar valga la redundancia laforma de poner comentarios a nuestros programas.

    Hay dos formas de poner comentarios en C:

    Poniendo doble barra (la que hay encima del 7), esta forma es prctica para comentaruna lnea.

    Ejemplo:

    //Este texto es un comentario.//y este otro tambin. la otra forma es meter el texto a comentar dentro de estos smbolos /* mi

    comentario*/. La ventaja de este sistema es que podemos comentar bloques detextos enteros.

    Ejemplo:

    /*Mi comentario empieza aqu.....mas comentarios ..y termina aqu */

    El comentar nuestro cdigo es una buena costumbre que no debemos pasar por alto, ya quesi pasado un tiempo queremos volver a un programa y modificar alguna parte de l ayudamucho el que su cdigo est comentado. Otra forma en la que se utilizan los comentarios esa la hora de depurar cdigo, en vez de estar borrando y escribiendo trozos de cdigo que nofuncionan correctamente los comentamos, de est forma el compilador no los tratar comocdigo fuente y podremos realizar ajustes y pruebas de una manera ms fcil. Muchas

    veces tambin vemos que revisando cdigo que han hecho otras personas hay partes delcdigo que estn comentadas esto es para hacerlo mas funcional, es decir, por poner unejemplo, si utilizas el PIC 16F877 des comenta esta parte y si utilizas otro PIC lo dejascomentado, de esta manera comentando o descomentando unas cuantas lneas podemosutilizar el programa en varias situaciones.

    Bueno, todo esto para el que tenga una idea de programacin seguro que ya lo sabe, perocomo dije al principio voy ha intentar que este curso le sirva tambin al que no tenga niidea de programacin aunque, en este caso, hay que decir tambin si se es honesto, queaprender un lenguaje de programacin al igual que aprender un idioma nuevo supone unesfuerzo considerable y no vasta con leerse un libro de C y decir ya soy un programador deC!, bajo mi modesta opinin lo que hay que hacer es practicar mucho, es decir teclearmucho cdigo compilarlo y comprobar que funciona como nosotros queremos que lo haga,al principio cometeremos muchos errores pero el descubrir cual es la causa del error nosservir para aprender mas todava y sobre todo no desanimarse a la primera de cambiocuando algo no funcione. La constancia y la perseverancia son las claves del xito paraconseguir cualquier objetivo, no solo el aprender a programar PIC en C. Y ya est bienporque menudo rollo estoy soltando, as que vamos a empezar con lo que era el tema deeste capitulo: las constantes.

    Las constantes se refieren a valores fijos que no se pueden alterar por medio del programa.

    http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.html
  • 5/28/2018 Programacin en C con CSS

    26/77

    Pueden definirse constantes de cualquiera de los tipos de datos simples que hemos visto.Se declaran colocando el modificador const delante del tipo de datos.

    Ejem:

    const intMINIMO=10,INTERVALO=15;

    Esto definir dos constantes MINIMO con el valor de 10 e INTERVALO con el valor de 15.

    Otra forma de definir constantes es usando la directiva de compilacin #define.

    Ejem.

    #defineMAXIMO 30

    Esta orden se ejecuta de la siguiente forma: en la fase de compilacin al ejecutar #define elcompilador sustituye cada operacin de la primera cadena de caracteres por la segunda,MAXIMO por el valor 30 adems, no se permite asignar ningn valor a esa constante.

    Es decir si pusiramos:

    #define MAXIMO = 30

    Al compilar tendramos un error.

    Nota:La declaracin #define no acaba en ";"

    Tambin podemos tener en nuestro programa Constantes de cadena: una cadena de textoes una secuencia de caracteres encerrados entre dobles comillas. Se usa para funciones deentrada y salida estndar, como funcin de entrada y salida de texto estamos utilizando lafuncin printf que esta definida dentro de-> #use rs232, pero ya veremos que el compilador

    CCS proporciona un nmero considerable de funciones listas para usarse y que nos sirvenpara comunicarnos con el dispositivo de entrada y salida RS-232.

    Hemos dicho que podemos definir constantes prcticamente de cualquier tipo de dato, peroCCS nos permite tambin representar esas constantes en diferentes sistemas denumeracin como hexadecimal, binario, octal, decimal y adems definir tambin constantesde caracteres especiales que el compilador utilizar para realizar acciones concretas. De lossistemas de numeracin permitidos los que ms se usan son los siguientes:

    Decimal

    Ejemplo: 222

    Hexadecimalempiezan por 0x

    Ejemplo: 0x2A

    Binarioempiezan por 0b

    Ejemplo:

  • 5/28/2018 Programacin en C con CSS

    27/77

    0b00001011

    Este ltimo formato es muy til, por ejemplo el PIC dispone de unos registros que sirvenpara configurar los puertos del PIC como entradas de datos o salida de datos, por defecto

    vienen configurados como entradas y si quiero utilizar algn pin como salida porque quieroutilizarlo para encender un LED o lo que sea, tengo que poner a cero dicho registro. En elformato binario se ve fcilmente que valores se le va asignar al registro, teniendo en cuentaque los registros empiezan por 0.

    Como siempre vamos hacer un ejemplo para ver si nuestro compilador se traga todo lo quehe dicho:

    Bien si todo va bien obtendremos la siguiente salida:

  • 5/28/2018 Programacin en C con CSS

    28/77

    Comentario:Como dije en la introduccin de este curso la finalidad es aprender a

    programar PIC en lenguaje C eso conlleva saber el lenguaje C, que seguiremos viendo enesta parte del curso, pero tambin el saber utilizar los recursos y funcionalidades que nosofrecen los PIC como por ejemplo saber programar sus contadores, como enviar datos a unLCD, el utilizar los conversores A/D, etc. Para ello voy a iniciar prximamente un segundoartculo donde empezaremos a estudiar ejemplos prcticos de los PIC.Un saludo y hasta el prximo da.

  • 5/28/2018 Programacin en C con CSS

    29/77

    Pgina 7 de 18

    Volver al ndice

    En la ltima prctica que hemos visto (el uso del TMR0 como contador) vimos que elentorno de Proteus nos proporciona una ventana de visualizacin del estado de los registro

    SFR de nuestro PIC , muy til cuando estamos depurando nuestro programa, pero Proteusnos proporciona ms ventanas para ver el estado de los registros de nuestro PIC quepodemos acceder a ellas por medio del men Debug --> PIC-CPU cuando estamosejecutando nuestro programa en el modo de simulacin paso a paso cuando hemospulsado el botn de pausa, una vista condensada de todas esas ventanas la tenemos en lafigura de abajo:

    Como vemos aparte de poder ver el estado de los registros SFR del PIC podemos ver elestado de la memoria EPROM del PIC, El contenido de la memoria de programa (donde seencuentra grabado de forma permanente nuestro programa ), el estado de PILA (tilcuando se trabaja con interrupciones y funciones), otra ventana nos muestra el estado de la

    memoria RAM reservada a los datos registros de propsito general (GPR) en formatohexadecimal y otra donde podemos ver el estado de las variables que tenemos activas enese momento, recordar que si utilizamos variables locales por ejemplo dentro de unafuncin, ests se destruirn al salir de la funcin. Pero todo esto como he dicho lo tenemoscuando estamos ejecutando nuestro programa en el modo paso a paso tenemos nuestroprograma en pausa.

    http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr0-como-contador.htmlhttp://www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr0-como-contador.htmlhttp://www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr0-como-contador.htmlhttp://www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr0-como-contador.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.html
  • 5/28/2018 Programacin en C con CSS

    30/77

    Si estamos en modo Run e intentamos acceder a estas ventanas vemos que estndeshabilitadas:

    Qu otro sistema tenemos para depurar nuestros programas? Pues bien una manera quesiempre podemos utilizar es utilizar la funcin printf como herramienta de depuracin, esdecir, ponemos la funcin printf en determinadas partes del programa donde queramossaber el estado de una o varias variables y por medio de la terminal podemos saber el valorque van tomando, una vez comprobado que nuestro programa funciona como nosotrosqueremos borramos las funciones printf que hayamos introducido con propsitos dedepuracin.

    Pero Proteus nos proporciona otro mtodo para ver el estado de las variables cuandoestamos ejecutando nuestro programa ya sea en modo Run en modo paso, es la ventanaWatch Window y podemos acceder a ella por medio del men Debug --> Watch Windows.Vamos a ver cmo podemos utilizarla. Para ello compilaremos el siguiente ejemplo:01.#include 02.#use delay(clock=4000000)03.#fuses XT,PUT,NOWDT

    04.#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_B4, RCV=PIN_B5)05.intx;06.inty;07.voidmain() {08.x,y=0;09.while(TRUE)10.{11.if(x

  • 5/28/2018 Programacin en C con CSS

    31/77

    25.}26.}27.}28.}

    Es un programa que lo nico que hace es incrementar la variable X de 0 a 10 y despus hace lo mismo

    con la variable Y, pero es suficiente para ver cmo utilizar la ventana Watch Windows para ver el valorque van tomando las variables X e Y.Primeramente compilamos el ejemplo y despus dentro del IDE del compilador hacemosclic en el icono Symbol Map segn se muestra en la figura de abajo:

    Esto har que nos aparezca el archivo Symbol Map en modo lectura, en este archivopodemos ver en qu posicin de memoria se guardarn las diferentes variables quetengamos declaradas en nuestro programa, este archivo se actualizar en cada compilacinque hagamos.

    Como vemos en la figura de arriba las variable X e Y tienen asignadas las direcciones dememoria 0x011 y 0x012 en la memoria RAM de propsito general (GPR), que como yasabemos es la que el programador dispone para almacenar los valores de sus variables.

    Bien, una vez anotadas estas direcciones volvemos al entorno de Proteus y abrimos laventana Watch Windows, dentro de ella hacemos clic con el botn derecho del ratn yseleccionamos Add Items (By Address) , segn se muestra en la figura de abajo:

  • 5/28/2018 Programacin en C con CSS

    32/77

    Nos aparecer una nueva ventana donde iremos aadiendo las variables con su direccincorrespondiente:

    Una vez aadidas las variables podemos ver el valor que van tomando mientras ejecutamosnuestro programa en la ventana Watch Windows, segn se muestra en la figura de abajo:

    Pero tenemos an mas opcciones, por ejemplo podemos establecer condiciones para ellohacemos clic en la variable con el botn derecho y seleccionamos Watchpoint Condition

  • 5/28/2018 Programacin en C con CSS

    33/77

    Nos aparecer la ventana que se muestra abajo:

    Por ejemplo yo la he configurado para que cuando la variable X sea igual a cinco se pare lasimulacin, pero admite ms condiciones solo hay que ponerse y experimentar con lasdiferentes opciones que tenemos, tambin decir que podemos hacer que la ventana WatchWindows nos muestre los registros SFR que nos interesan junto con las variables quenosotros hemos declarado, en fin muchas posibilidades de depuracin. El conocer estasherramientas nos puede facilitar mucho el aprendizaje porque vemos la secuencia real quesigue nuestro programa, que algunas veces puede que no coincida con nuestra lgica defuncionamiento del programa.

    Como siempre espero vuestros comentarios y os agradecera que las preguntas que tengissobre estos temas, pues las hagis directamente en el foro que para eso est.

    Un saludo a todos y hasta el prximo articulo.

  • 5/28/2018 Programacin en C con CSS

    34/77

    Pgina 8 de 18

    Volver al ndice

    Aunque no hemos visto el tema de las funciones todava, pero ya que estamos utilizandoesta funcin muy a menudo, vamos a ver alguna de las posibilidades que nos ofrece. El que

    tenga conocimientos del lenguaje C sabr que para utilizar esta funcin que pertenece alestndar ANSI de C hay que incluir previamente el archivo de cabecera #include ,pero esto con el compilador PCW de CCS no funciona, en este compilador esta funcin estdefinida en la directiva:

    #use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_B1,RCV=PIN_B2)

    Esto quiere decir que cada vez que queramos utilizar la funcin printf tenemos que haberincluido previamente esta directiva, que posibilita la comunicacin del PIC con otrodispositivo utilizando el protocolo de comunicacin serie RS232, adems de la funcin printfesta directiva permite el uso de otras funciones para la entrada y salida de datos seriecomo: getc, getchar, gets, puts y kbhit que iremos viendo poco a poco, pero la ms

    importante para la salida de datos sin duda es printf, porque nos permite formatear la salidade esos datos de la forma que nosotros queramos.

    Como vemos la directiva #use RS232 admite una serie de parmetros que son los que vanentre parntesis separados por comas, estos son los siguientes:

    BAUDcon este parmetro establecemos la velocidad en baudios a la que queremosque se transmitan los datos por el puerto serie, 9600 es lo normal.

    BITSnmero de bits que utilizaremos en la transmisin, el estndar establece quepueden ser 8 9, para la comunicacin con microcontroladores con 8 son suficientes.

    PARITYnos permite utilizar un bit de paridad para la comprobacin de errores, estopcin la dejamos a No.

    XMITest opcin nos configura porque patilla del PIC saldrn los datos, est opcinjunto con la siguiente s que la tendremos que cambiar a nuestras necesidades.

    RCVnos configura porque patilla del PIC se recibirn los datos. En el ejemplo, losdatos se transmiten por el PIN RB1 y se reciben por RB2.

    La forma de hacer la llamada a la funcin printf es la siguiente:

    printf(Nombre Funcin, Cadena de caracteres , valores);

    Como vemos la funcin printf tambin admite parmetros que podremos utilizar paraformatear el texto de salida. Vamos a ver cules son:

    El primero es opcional y es el nombre de una funcin, si no lo ponemos los datos se

    transmitirn va RS232 a travs de los pines que hayamos configurado en la directiva #useRS232.El segundo parmetro es una cadena de caracteres encerrada entre comillas dobles.Y el tercero son datos o nombres de variables cuyo valor queremos que se muestren.Vamos a ver todo esto con ejemplos que es como mejor se ven las cosas:

    1 Ejem plo :

    http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/index.php/progranacion-pic-en-c.html?start=1http://www.aquihayapuntes.com/indice-programacion-pic-en-c.html
  • 5/28/2018 Programacin en C con CSS

    35/77

    #include

    #use delay(clock=4000000)

    #include

    #use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_B1,RCV=PIN_B2)

    void main()

    {

    int i1=9;lcd_init(); //funcin de inicializacin del LCD

    //Mostramos una cadena en la terminal

    printf("Esto es una cadena\r");

    //Mostramos una cadena de texto junto con el valor de una variable

    //en la terminal.

    printf("El valor de la variable i1 es: %d",i1);

    //Mostramos el valor de la variable por el LCD

    printf (lcd_putc,"El valor de i1 es: %d",i1);

    }

    Comentar io:

    En este primer ejemplo vamos a ver el uso de la funcin printf utilizando diferentesparmetros. Como vamos a utilizar la librera que incluye el compilador para el manejo deun LCD tenemos que incluir la directiva:

    #include

    Declaramos una variable i1 de tipo entero que nos va a servir para mostrar su valor en laterminal y en un LCD.Cuando utilicemos la librera LCD.C y antes de utilizar cualquier otra funcin incluida en la

    librera tenemos que llamar a la siguiente funcin que sirve para inicializar el LCD.

    lcd_init();

    En la primera llamada a la funcin printf como parmetros solo incluimos una cadena decaracteres constante que termina en (\r), esa barra invertida junto con la r se le llamasecuencia de escape y le est diciendo al compilador que al final de la cadena introduzca unretorno de carro (tecla enter). Las secuencias de escape se utilizan para representarcaracteres o acciones especiales.

    printf("Esto es una cadena\r");

    En la tabla de abajo se muestran las secuencias de escape que tenemos disponibles parautilizar con la funcin printf:

    \r Retorno de carro

    \t abulador

    \' Comilla simple

  • 5/28/2018 Programacin en C con CSS

    36/77

    \" Comillas dobles

    \\ Barra invertida

    \? Smbolo de interrogacin

    \0 Caracter nulo

    \% Smbolo Tanto por ciento

    \b Retroceder un caracter

    Vamos con la segunda llamada a la funcin:

    printf("El valor de la variable i1 es: %d",i1);

    En este caso tampoco est definido el primer parmetro, por tanto, al igual que en laprimera llamada a la funcin, los datos se enviaran por el puerto serie al pin que hayamosdefinido en la directiva #use RS232, en esta llamada vemos que tenemos la cadena decaracteres limitada por las comillas dobles y separado por una coma, como tercerparmetro el nombre de la variable i1 que habamos declarado previamente. En la cadenade caracteres vemos que aparece el carcter de % seguido de la letra d, ese es un carcterespecial para la funcin y lo que le indica a la funcin es que en esa posicin muestre elvalor de la variable i1, la d le indica a la funcin que represente ese valor en formato denmero entero. Podemos representar el valor de la variable en diferentes formatos segn semuestra en la tabla de abajo:

    c Caracter

    s Cadena caracter

    u Entero sin signo

    d Entero con signo

    Lu Entero largo sin signo

    Ld Entero largo con signo

    x Entero Hexadecimal (minsculas)

    X Entero Hexadecimal (maysculas)

    Lx Entero largo Hexadecimal (minsculas)

    LX Entero largo Hexadecimal (maysculas)

    f Nmero real en coma flotante con truncado

  • 5/28/2018 Programacin en C con CSS

    37/77

    g Nmero real en coma flotante con redondeo

    e Nmero real en formato exponencial

    wEntero sin signo con decimales insertados.Especifica dos nmeros para n. La 1 cifra indicael total y la 2 el nmero de decimales

    Si quisisemos mostrar el valor de ms de una variable lo haramos de la siguiente forma:

    printf("El valor i1 es: %del de i2: %dy el de i3: %d",i1,i2,i3);

    Vamos con la ltima llamada a la funcin del 1 ejemplo:

    printf (lcd_putc,"El valor de i1 es: %d",i1);

    En esta llamada hemos incluido el primer parmetro y hemos puesto el nombre de la

    funcin lcd_putc, est funcin est definida en la librera LCD.C que trae el compilador paraayuda del manejo de los dispositivos LCD y que hemos incluido en nuestro programa pormedio de la directiva #include , vemos que la librera est encerrada entre lossmbolos de esto le indica al compilador que busque la librera en el directorio en que seinstalo el compilador, si copiramos esa librera en otro directorio tendramos que indicarlela ruta completa, pero esta vez encerrada entre comillas dobles.

    Ejemplo:

    #include C:\Ejemplos de C\lcd.c

    Pues bien ahora la funcin printf no enviar los datos al puerto serie, sino a la funcinlcd_puct que ser la encargada de envirselos al LCD, esta funcin por defecto enva losdatos al puerto D del PIC, pero accediendo a la librera se puede modificar el puertofcilmente.

    Aqu tenis un video demostrativo del ejemplo:

    2 Ejem plo

  • 5/28/2018 Programacin en C con CSS

    38/77

    Salida del programa:

  • 5/28/2018 Programacin en C con CSS

    39/77

    Comentar io del programa:

    El especificador de formato %x indica al sistema que escriba en hexadecimal (base16) el valor sustituido.

    El ejemplo tambin escribe el carcter 'A', apoyndose en cuatro formas distintas derepresentaciones inciales. En todos los casos se almacenar el mismo valor numrico,

    pero son diferentes las representaciones usadas. El carcter (A) sale en la terminal en una lnea diferente cada vez que se imprime, eso

    es debido a la secuencia de escape (\r) utilizada. Observar que el ejemplo se ha hecho sobre el PIC 16f84 que no dispone de una

    USART hardware para la comunicacin serie , pero sin embargo el programa se haejecutado correctamente, eso es debido a que la comunicacin serie se ha establecidopor software por medio de las libreras implementadas en el compilador PCW.

  • 5/28/2018 Programacin en C con CSS

    40/77

    Pgina 9 de 18

    Volver al ndice

    Vamos a continuar con las funciones disponibles en CCS para la entrada y salida de datos a

    travs del puerto serie RS-232. Hasta ahora solo hemos visto que con la funcin printf(),podemos enviar datos formateados a travs del pin que hayamos seleccionado en ladirectiva:

    #use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_D1,RCV=PIN_D2)

    En este caso los datos saldrn por el pin RD1 del PIC. Pero de que funciones disponemospara recibir datos desde fuera hacia nuestro PIC?. El que haya programado en C echar demenos la funcin scanf() definida en la librera stdio.h y perteneciente al estndar ANSI C.Pero desgraciadamente esa funcin tampoco est disponible en CCS. Pero tampoco hay porqu preocuparse mucho, porque disponemos de otras. En este caso vamos a ver lasfunciones: getc(), getch() y getchar(). Las tres hacen lo mismo por lo que podemos usarlas

    indistintamente.Estas funciones esperan un carcter por la patilla del PIC que hayamos definido en ladirectiva #use RS232 con el parmetro RCV. En el caso del ejemplo de arriba, los datossern recibidos por el pin RD2 del PIC.

    Pues vamos a ver nuestro primer ejemplo acerca del uso de estas funciones:

    Comentar io:

    El ejemplo lo que hace es mostrar el valor de la tecla que pulsemos en el teclado y suequivalente en cdigoASCII

    http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://es.wikipedia.org/wiki/ASCII#Caracteres_imprimibles_ASCIIhttp://es.wikipedia.org/wiki/ASCII#Caracteres_imprimibles_ASCIIhttp://es.wikipedia.org/wiki/ASCII#Caracteres_imprimibles_ASCIIhttp://es.wikipedia.org/wiki/ASCII#Caracteres_imprimibles_ASCIIhttp://www.aquihayapuntes.com/index.php/progranacion-pic-en-c.html?start=1http://www.aquihayapuntes.com/indice-programacion-pic-en-c.html
  • 5/28/2018 Programacin en C con CSS

    41/77

    Vamos a explicar su funcionamiento paso a paso:

    Primeramente, como siempre, incluimos por medio de la directiva #include el archivode cabecera del PIC que vamos a utilizar, en este caso el PIC16F877.

    Por medio de #use delay le decimos al compilador la frecuencia de reloj que vamos a

    utilizar en nuestro circuito. Configuramos los parmetro de la directiva #use RS232, fijaros que XMIT=PIN_D0 y

    que RCV=PIN_D1. Con lo cual los datos saldrn del PIC por el pin RD0 y entrarn porel pin RD1.

    Dentro de la funcin principal main(), escribimos lo que queremos que haga nuestroprograma. Las instrucciones siempre empezarn a ejecutarse una a una a partir deesta funcin y de arriba hacia abajo.

    Lo primero que hacemos es declarar una variable de tipo char donde almacenaremosel valor de la tecla que pulsemos en el teclado.

    Despus se nos mostrar un mensaje en la terminal invitndonos a queintroduzcamos un carcter.

    printf("Introduzca un caracter :\r");

    Despus se ejecutar la sentencia:ch=getch()

    Que esperar hasta que pulsemos una tecla y almacenar su valor en la variable ch. La siguiente instruccin:printf("El caracter %c tiene un valor ASCII decimal de %d.\r",ch,ch);

    muestra el valor del carcter y su equivalente en cdigo ASCII Despus se repite el proceso dos veces ms, pero esta vez utilizando las funciones

    getc() y getchar()Al utilizar solo la variable ch, el valor de la nueva tecla pulsada sobrescribir el valor

    anterior de la variable.La salida de nuestro programa ser el siguiente:

  • 5/28/2018 Programacin en C con CSS

    42/77

    Bien, hay que decir que el programa finalizar al llegar a la ltima sentencia incluida en lafuncin main(). Para que el programa termine cuando nosotros queramos tenemos queincluir como mnimo un bucle y establecer una condicin para que podamos salir de l,vamos a ver esto con otro ejemplo:

    En este ejemplo se irn mostrando en la terminal las teclas que vayamos pulsando por elteclado hasta que pulsemos la tecla n momento en el cual finalizar el programa.

    Los cdigos fuentes de los ejemplos los tenisaqu.

    Gracias por vuestros comentarios y en especial al equipo deABCdatospor incluirlo en sudirectorio y considerarlo como el mejor tutorial de la semana.

    http://www.aquihayapuntes.com/foro/viewtopic.php?f=5&t=3&p=20#p20http://www.aquihayapuntes.com/foro/viewtopic.php?f=5&t=3&p=20#p20http://www.aquihayapuntes.com/foro/viewtopic.php?f=5&t=3&p=20#p20http://www.abcdatos.com/http://www.abcdatos.com/http://www.abcdatos.com/http://www.abcdatos.com/http://www.aquihayapuntes.com/foro/viewtopic.php?f=5&t=3&p=20#p20
  • 5/28/2018 Programacin en C con CSS

    43/77

    Pgina 10 de 18

    Volver al ndice

    Un par de funciones mas que se pueden utilizar en la entrada y salida de datos serie RS232son las funciones gets() y puts().

    gets(string):esta funcin lee los caracteres que se introducen por el teclado hasta queencuentra un retorno de carro (tecla Enter). El pin asignado para la lectura de los caractereses el que hayamos configurado en RCV. En el ejemplo de abajo el pin RD5.

    puts(string):esta funcin enva la cadena de texto contenida dentro de los parntesis alpin que hayamos configurado en el parmetro XMIT de la directiva #use RS232, en elejemplo de abajo el pinRD4. Una vez enviada la cadena aade un retorno de carro.

    #use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_D4, RCV=PIN_D5)

    Vamos a ver un ejemplo sencillo que utilice estas dos funciones:

    ComentarioEn este ejemplo se ha declarado un tipo de dato que todava no hemos visto, un array decaracteres:

    char nombre[9];

    http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.html
  • 5/28/2018 Programacin en C con CSS

    44/77

    Aunque veremos los tipos de datos compuestos ms adelante, podemos adelantar que unarray es un conjunto de variable del mismo tipo de datos. Cada una de esas variables secoloca de forma consecutiva en la memoria RAM del PIC y se les llama elementos del array.Los elementos del array se enumeran empezando por el 0, (es una caracterstica dellenguaje C). En el ejemplo de arriba se ha declarado un array de caracteres (tipo char) y elnmero mximo de elementos que podemos almacenar en el es de 9. Sus elementos

    estarn numerados del 0 al 8. Y podemos acceder a ellos de la siguiente forma:

    valor = nombre[0];

    .. = ..[.];

    valor = nombre[8];

    El ejemplo lo nico que hace es enviar un mensaje a la terminal dicindonos queintroduzcamos nuestro nombre (puede ser tambin una password o lo que queramos).Cuando introduzcamos el nombre y pulsemos la tecla Enter, la cadena de caracteres ser

    guardada en el array que hemos declarado previamente y luego con la primera funcinprinf() mostramos el valor de la cadena de texto guardada en el array, con la segundafuncin prinf() mostramos el tercer carcter del nombre introducido (nombre[2]). Este serla salida de nuestro programa:

    Si intentamos introducir una cadena ms larga, el valor se mostrar en la terminal perotruncado.

    Por ejemplo si intentamos introducir la cadena:

    Microcontroladores PIC

    La terminal nos mostrar:

    Microcont

  • 5/28/2018 Programacin en C con CSS

    45/77

    Como he dicho antes los elementos del array se almacenan en posiciones consecutivas de lamemoria RAM del PIC. Esto lo gestiona automticamente el compilador, lo mismo quecuando haces un programa en C en otro lenguaje de alto nivel para un PC de escritorio elprogramador no est preocupado de en qu posicin de la memoria RAM se almacenarn lasvariables que declara. Pero si a pesar de ello quieres saberlo haces lo siguiente:

    Despus de compilar el ejemplo, te vas al men compile > Symbol Map y nos aparecer laventana de abajo:

    Donde vemos las posiciones de memoria donde se han mapeado nuestras variables. Comovemos nuestro array ha ocupado las posiciones de memoria de la 0x21 a la 0x29 de losregistros GPR del PIC (en total 9 bytes), ya que los elementos que componen el Array sonde tipo char que son de un byte (8 bits) cada uno.

    Si queremos ver los valores que va tomando cada uno de los elementos del Array en tiempode ejecucin. Lo podemos hacer por medio de la ventana Watch Windows en Proteus. Si note acuerdas de cmo se hace mraloaqu

    Y obtendremos lo siguiente:

    http://www.aquihayapuntes.com/progranacion-pic-en-c.html?start=7http://www.aquihayapuntes.com/progranacion-pic-en-c.html?start=7http://www.aquihayapuntes.com/progranacion-pic-en-c.html?start=7http://www.aquihayapuntes.com/progranacion-pic-en-c.html?start=7
  • 5/28/2018 Programacin en C con CSS

    46/77

    Consideraciones:En C existe el concepto de memoria dinmica. La memoria dinmica es aquella que sepuede reservar y liberar en tiempo de ejecucin, es decir, durante la ejecucin del programase liberar y se asignar memoria para optimizar los recursos de la CPU, para ello sedispone de funciones como malloc() y free(). El compilador CCS tambin admite este tipo de

    funciones, para utilizarlas debemos de incluir el archivo de cabecera stdlibm.h, ya veremosun ejemplo sobre la asignacin de memoria dinmica, si no utilizamos estas funciones lareserva de memoria es esttica, es decir, si declaramos un array de nueve elementos elcompilador le reservar memoria contigua a dicho array al compilar el programa en losregistros de propsito general (GPR). Esa memoria se reserva cuando el PIC empieza aejecutar su programa y permanece reservada hasta que desconectamos el PIC. Con todoesto quiero decir que tenemos que tener siempre claro de la memoria RAM de quedisponemos, segn el modelo de microcontrolador que utilicemos en nuestro proyecto, si nolo sabes consulta el data sheet del PIC que ests utilizando. Por ejemplo si en el PIC delejemplo que hemos hecho (16f877) en vez de un array de 9 elementos declaramos uno de100 elementos el compilador nos mostrar el siguiente error al compilar:

    Y como ya he dicho en alguna ocasin, utiliza el tipo de datos ms pequeo posible, en el

    ejemplo que he puesto he declarado un array de nueve elementos, para introducir elnombre Antonio que tiene seis caracteres, con lo cual estoy desperdiciando dos bytes dememoria RAM, eso en un ordenador de escritorio es insignificante pero en unmicrocontrolador si que es importante y puede que nos quedemos sin memoria suficientepara declarar todas las variables de nuestro programa.

    El cdigo del ejemplo lo tenisaqu

    Aunque existen algunas funciones ms para la entrada y salida de datos serie, las quellevamos vistas hasta ahora son las ms importantes, as que el prximo da empezaremoscon los operadores, indispensables para hacer operaciones con los datos que introduzcamosen nuestro programa.

    No os olvidis de comentar el artculo y de participar en elforo.Un saludo y hasta el prximo da.

    http://www.aquihayapuntes.com/foro/viewtopic.php?f=5&t=3&p=21#p21http://www.aquihayapuntes.com/foro/viewtopic.php?f=5&t=3&p=21#p21http://www.aquihayapuntes.com/foro/viewtopic.php?f=5&t=3&p=21#p21http://www.aquihayapuntes.com/foro/viewtopic.php?f=5&t=3&start=0http://www.aquihayapuntes.com/foro/viewtopic.php?f=5&t=3&start=0http://www.aquihayapuntes.com/foro/viewtopic.php?f=5&t=3&start=0http://www.aquihayapuntes.com/foro/viewtopic.php?f=5&t=3&start=0http://www.aquihayapuntes.com/foro/viewtopic.php?f=5&t=3&p=21#p21
  • 5/28/2018 Programacin en C con CSS

    47/77

    Pgina 11 de 18

    Volver al ndice

    El lenguaje C dispone de una gran cantidad de operadores que nos sirven para operar con

    los datos dentro de nuestros programas, se pueden clasificar en varios apartados:aritmticos, relacionales, de asignacin, de manejo de un solo bit, etc. Pero lo importanteno es saber a qu grupo pertenece cada operador, sino en conocer la operacin que sepuede realizar con cada uno de ellos. Vamos a ver los operadores que nos permite utilizarnuestro compilador CCS.

    Operadores Aritmticos:permiten la realizacin de operaciones matemticas ennuestros programas.

    Operador Descripcin

    + Suma

    - Resta

    * Multiplicacin

    / Divisin

    % Mdulo (Resto de una divisin entera)

    ++ Incrementa en uno el valor del operando

    -- Decrementa en uno el valor del operando

    Operadores relacionales:compara dos operandos y devuelve 1 (verdadero) 0(falso) segn el resultado de la expresin. Se utilizan principalmente para elaborarcondiciones en las sentencias condicionales e iterativas que se vern ms adelante.

    Operador Descripcin

    < Menor que

    > Mayor que

    = Mayor o igual que

    == Igual a

    = Distinto de

    http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.html
  • 5/28/2018 Programacin en C con CSS

    48/77

    Operadores de asignacin:permiten asignar valores a las variables. Tenemos las

    siguientes.

    Operador Descripcin

    += Asignacin de suma. x+=y es lo mismo que x=x+y

    -= Asignacin de resta. x-=y es lo mismo que x=x-y

    *= Asignacin de multiplicacin. x*=y es lo mismo que x=x*y

    /= Asignacin de divisin. x/=y es lo mismo que x=x/y

    %= Asignacin de resto de divisin. x%=y es lo mismo que x=x%y

    y

    &= Asignacin de AND de bits. x&=y es lo mismo que x=x&y

    |= Asignacin de OR de bits. x|=y es lo mismo que x=x|y

    ^= Asignacin de OR exclusivo de bits (XOR). x^=y es lo mismo que x=x^y

    Operadores Lgicos:Al igual que los operadores relacionales, stos devuelven 1(verdadero), 0 (falso) tras la evaluacin de sus operandos. La tabla siguiente ilustraestos operadores.

    Operador Descripcin

    ! NO lgico

    && Y lgico

    || O lgico

    Operadores de manejo de bits:Estos operadores permiten actuar sobre losoperandos para modificar un solo bit, los operandos slo pueden ser de tipo entero(incluyendo el tipo char).

    Operador Descripcin

    ~ Negacin de bits (complemento a 1)

  • 5/28/2018 Programacin en C con CSS

    49/77

    & Y de bits (AND)

    | O de bits (OR)

    ^ O exclusivo de bits (XOR)

    >> Desplazamiento a la derecha

    Acceder a los miembros de una estructura por medio de punteros

    Los que se inician en el mundo de la programacin suelen encontrar complicado el emplearpunteros en sus programas pero, una vez que se entiende el concepto se simplifica yoptimiza mucho nuestro cdigo. Ya dijimos que el PIC dispone de unos registros depropsito general (GPR) que el programador utiliza para almacenar all sus variables y poderutilizarlas a lo largo del programa, pues bien un puntero es otra variable a la cual se leasigna la direccin del registro memoria de otra variable.

    La forma de utilizar los punteros lo veremos en profundidad ms adelante, pero aqu tienesun pequeo ejemplo de cmo utilizarlos.

    Ejemplo:

    int y,z;//declaracin de las variables x e y de tipo entero:

    int *x;//declaracin de la variable puntero x que guardar la direccin de memoria de una

    variable de tipo entero.

    x=&y;// a travs del operador de direccin (&) le asigno al puntero x la direccin dememoria donde est guardada la variable y.

    z=*x;//a travs del operador de indereccin (*) le asignamos a z el valor de la variablecuya direccin est almacenada en la variable puntero x.

  • 5/28/2018 Programacin en C con CSS

    50/77

    Nota:como vemos los smbolos de direccin (&) e indereccin (*) son los mismos que elAND en el manejo de bits (&) y el operador aritmtico de multiplicacin, el compilador losdiferencia segn los operandos que le preceden.

    Precedencia de los operadores:

    Expresiones en orden descendente de precedencia

    (expr)

    !expr ~expr ++expr expr++ --expr expr --

    (type)expr *expr &value sizeof(type)

    expr*expr expr/expr expr%expr

    expr+expr expr-expr

    exprexpr

    expr=expr

    expr = = expr expr!=expr

    expr&expr

    expr^expr

    expr | expr

    expr&& expr

    expr || expr

    expr ? expr: expr

    value = expr value+=expr value-=expr

    value*=expr value/=expr value%=expr

    value>>=expr value

  • 5/28/2018 Programacin en C con CSS

    51/77

    Ejemplo:

    a*b+c/d-e

    Las operaciones se realizarn en el siguiente orden:

    1. a*b resultado = x2. c/d resultado = y3. x+y resultado = z4. z-e

    Nota:Es aconsejable el uso de parntesis para evitar errores en la precedencia deoperadores, adems el cdigo fuente queda ms legible.

    Ejemplo:

    a*(b+c)+d

    En este caso el orden en realizarse las operaciones ser el siguiente:

    1. b+c resultado = x

    2. a*x resultado = y

    3. y+d

    sizeof(type)--> nos da el tamao en bytes del tipo de dato variable que le pongamosentre los parntesis.

    Para conocer bien los resultados que se obtienen al utilizar cada uno de los operadores, lo

    mejor es practicar con ellos. Vamos a ver un ejemplo donde se muestra el uso de algunosde ellos:

  • 5/28/2018 Programacin en C con CSS

    52/77

    Comentario del programa:En este ejemplo introducimos unos valores por el teclado del ordenador y se los enviamos alpic via serie por el dispositivo RS-232, luego realizaremos diferentes operaciones con ellos ymostraremos el resultado en la Terminal, pero hay que tener en cuenta que que esosvalores que introducimos por el teclado son caracteres y por tanto no se los podemosasignar directamente a una variable de tipo entero para operar con ellos, primero tenemosque convertirlos. CSS nos proporciona las siguientes funciones para ello:

    - atoi(cadena) --> devuelve un valor entero de 8 bits de tamao.- atol(cadena)--> devuelve un valor entero de 16 bits- atoi32(cadena)--> devuelve un valor entero de 32 bits

  • 5/28/2018 Programacin en C con CSS

    53/77

    Para saber el rango de valores admisible por cada funcin repasa lostipos de datos

    Estas funciones estn definidas en el fichero de cabecera stdlib.h, por tanto no hay queolvidarse de incluirlo previamente por medio de la directiva: #include .

    Fijaros en la instruccin de la lnea 31 que nos da el tamao de la variable y:

    printf("El tama\xa4o de y es: %d bytes\r",sizeof(y));

    \xa4--> es la secuencia de escape para representar la letra . Esto es porque el compiladorno reconoce los caracteres en castellano.

    Tabla equivalente de caracteres en castellano:

    \xa0

    \x82

    \xa1

    \xa2

    \xa3

    \xb5

    \x90

    \xd6

    \xe0

    \xe9

    \xa4

    \xa5

    \xa8

    La salida del programa para los valores dex=50e y=6es la siguiente:

    http://www.aquihayapuntes.com/index.php/progranacion-pic-en-c.html?start=5http://www.aquihayapuntes.com/index.php/progranacion-pic-en-c.html?start=5http://www.aquihayapuntes.com/index.php/progranacion-pic-en-c.html?start=5http://www.aquihayapuntes.com/index.php/progranacion-pic-en-c.html?start=5http://www.aquihayapuntes.com/index.php/progranacion-pic-en-c.html?start=5
  • 5/28/2018 Programacin en C con CSS

    54/77

    El cdigo fuente y el DSN de proteus lo tenisaqui.

    Una precaucin que tenemos que tener en cuenta es que si utilizamos valores numricosgrandes y un PIC con poca memoria RAM, pronto la agotaremos. Esto solo es un ejemploterico del uso de operadores aritmticos, aplicaciones prcticas puede tener muchas,depende de lo que quieras hacer.

    Un ejemplo sencillo pero prctico, lo tienesaqu.

    Espero vuestros comentarios y cualquier duda error que veis en el ejemplo, lo podisexponeraqu.

    http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3#p28http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3#p28http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3#p28http://www.aquihayapuntes.com/component/content/article/44-ejemplos-basicos-de-pic-en-c/106-ejemplos-basicos-de-pic-en-c-secuencia-de-luces-utilizando-operadores-aritmeticos.htmlhttp://www.aquihayapuntes.com/component/content/article/44-ejemplos-basicos-de-pic-en-c/106-ejemplos-basicos-de-pic-en-c-secuencia-de-luces-utilizando-operadores-aritmeticos.htmlhttp://www.aquihayapuntes.com/component/content/article/44-ejemplos-basicos-de-pic-en-c/106-ejemplos-basicos-de-pic-en-c-secuencia-de-luces-utilizando-operadores-aritmeticos.htmlhttp://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=14http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=14http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=14http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=14http://www.aquihayapuntes.com/component/content/article/44-ejemplos-basicos-de-pic-en-c/106-ejemplos-basicos-de-pic-en-c-secuencia-de-luces-utilizando-operadores-aritmeticos.htmlhttp://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3#p28
  • 5/28/2018 Programacin en C con CSS

    55/77

    Pgina 12 de 18

    Volver al ndiceSENTENCIAS REPETITIVAS:

    Son aquellas que ejecutan un bloque de sentencias mientras se cumpla una expresinlgica. Este bloque de sentencias que se ejecuta repetidas veces, se denomina bucle, y cadaejecucin se denomina iteracin.

    De las diferentes sentencias repetitivas que hay vamos a empezar con while.

    La sentencia while permite la ejecucin de un bloque de sentencias si se evala comoverdadera una expresin lgica. La expresin lgica aparece al principio del bloque desentencias.En la figura de abajo se muestra el Pseudocdigo, el diagrama de flujo y la sintaxis de lasentencia while.

    El Pseudocdigo es una forma informal de representar la secuencia del programa, sin teneren cuenta la sintaxis particular del lenguaje en que vayamos a programar y el diagrama deflujo es una representacin grfica del Pseudocdigo.

    http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.html
  • 5/28/2018 Programacin en C con CSS

    56/77

    Cuando vayamos a crear un programa el dibujar previamente un diagrama de flujo elPseudocdigo de la secuencia de nuestro programa puede ayudarnos en la tarea deprogramacin, pero en ningn caso es un paso obligatorio.

    El bloque delimitado por las llaves puede reducirse a una sentencia, y en este caso se

    suprimen las llaves.

    La expresin lgica debe estar delimitada por parntesis.

    Cuando el programa llega a una sentencia while, sigue los siguientes pasos. Evala la expresin. Si es falsa, continua la ejecucin tras el bloque de sentencias. Si es verdadera entra en el bloque de sentencias asociado al while. Ejecuta dicho bloque de sentencias, evaluando de nuevo la expresin y actuando en

    consecuencia.

    Si la primera evaluacin resulta falsa, el bloque de sentencias no se ejecuta nunca.

    Si la expresin es siempre cierta el bucle es infinito.

    Vamos con el primer ejemplo:

    ComentarioEl ejemplo lo que hace es mostrar en la terminal la tabla de multiplicar del nmero cuatro,utilizando un bucle while. Para ello necesitamos declarar una variable auxiliar de tipo enterollamadai1, inicializada con el valor de 1, en cada iteracin se comprueba el valor de lavariable auxiliar, mientras el valor de i1sea

  • 5/28/2018 Programacin en C con CSS

    57/77

    que incrementar el valor de i1, de esta manera nos aseguramos en algn momento la salidadel bucle, cuando i1 llegue a 11 la condicin ser falsa y la secuencia del programa saltara la lnea 19 finalizando el programa.

    La salida del programa ser el siguiente:

    Si queremos que el programa este siempre ejecutndose (lo normal en un programa paraMicrocontroladores), hay que colocar un bucle infinito, mira el siguiente ejemplo:

  • 5/28/2018 Programacin en C con CSS

    58/77

    Comentar io

    truees una constante booleana que equivale a 1 verdadero. Por tanto la evaluacin delbucle siempre ser cierta y no habr manera del salir de l. El programa estar siempreesperando a que pulses una tecla y mostrar el valor de la tecla pulsada en la terminal.

  • 5/28/2018 Programacin en C con CSS

    59/77

    Pgina 13 de 18

    Volver al ndice

    Bu cle for()En el ejemplo de la tabla de multiplicar utilizamos el bucle while para obtener los diezvalores de la tabla, y si recordis necesitbamos una variable de control que tenamos queinicializar antes de entrar en el bucle, comprobar el valor de la variable para la continuacinen el bucle y la modificacin posterior de la variable de control para poder salir del bucle enun momento determinado.

    Pues bien, casi siempre que se hace algo, C proporciona frecuentemente un modo mscompacto de hacer lo mismo.

    El bucle for permite indicar estos tres elementos en un solo lugar, al principio del bucle,facilitando as la obtencin de un cdigo compacto, pero legible. Veamos cual es su sintaxis:

    En un bucle for, el parntesis que acompaa a la palabra reservada forgeneralmentecontiene tres expresiones:Expresin 1;inicializa la variable variables de control delbucle. Expresin 2; representa la condicin de continuacin en el bucle. Expresin3;modifica el valor de las variables de control en cada iteracin del bucle.Los puntos y comas que separan cada expresin son obligatorios.

    http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.html
  • 5/28/2018 Programacin en C con CSS

    60/77

    Vamos a ver un ejemplo donde se muestran las diferentes posibilidades de que disponemoscuando utilicemos el bucle for:

    Comentar io

    1 bucle for:

    indice=1, inicializa a la variable de control del bucle. La segunda expresin,indice

  • 5/28/2018 Programacin en C con CSS

    61/77

    expresin, indice++, utiliza el operador de incremento para modificar a la variable decontrol en cada iteracin del bucle.Los pasos que sigue la sentencia for son los siguientes:

    1. indice es la variable de control. Se inicializa a 12. se testea la condicin de expresin_2.

    3. se ejecutan las sentencias4. la variable de control indice se incrementa en uno5. si se cumple que indice

  • 5/28/2018 Programacin en C con CSS

    62/77

    El cdigo fuente lo tenisaqu.

    Como veis el lenguaje C posee mucha flexibilidad y se puede hacer una misma cosa devarias formas. Segn el caso ser ms cmodo y legible utilizar una sentencia que otra.

    Como ejercicio podis hacer la tabla de multiplicar de un nmero utilizando el bucle for.

    Un saludo

    http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=31#p31http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=31#p31http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=31#p31http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=31#p31
  • 5/28/2018 Programacin en C con CSS

    63/77

    Pgina 14 de 18

    Volver al ndice

    Bu cle do-while()A diferencia de los bucles for y while, que analizan la condicin del bucle al principio delmismo, el bucle do-while analiza la condicin al final del bucle. Esto significa que el bucledo-while siempre se ejecuta al menos una vez. La forma general del bucle do-while es laque se muestra en la figura de abajo:

    Vamos a ver un ejemplo:

    http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/index.php/progranacion-pic-en-c.html?start=1
  • 5/28/2018 Programacin en C con CSS

    64/77

    Comentar io

    Este ejemplo pide un valor entre 1 y 10, ejecutndose repetidas veces hasta que seintroduce un valor entre ambos lmites. Por ltimo el programa visualiza el valor ledo.

    Este bucle se ejecutar como mnimo una vez porque el programa no sabe cul es lacondicin de continuacin hasta que se encuentra el while del final del cuerpo del bucle. Sila condicin sigue siendo cierta (es decir, si el valor ledo est fuera del intervalo deseado),el programa regresa al principio del bucle do-while y lo ejecuta de nuevo.

    Fijaros en la orden ifque aparece dentro del cuerpo del bucle. Esto se permite porque lasestructuras de control se pueden anidar unas dentro de otras.

    RECUERDA:En el bucle while la comprobacin de la condicin de control del bucle se

    encuentra al principio, por lo que dicho bucle puede no ejecutarse nunca; la comprobacinen el bucle do-while est al final del bucle, por lo que al menos se ejecutar una vez.

    El cdigo fuente lo tenisaqu.

    Volver al ndice

    http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=32#p32http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=32#p32http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=32#p32http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=32#p32
  • 5/28/2018 Programacin en C con CSS

    65/77

    Pgina 15 de 18

    Volver al ndice

    IfVamos a empezar las sentencias condicionales, con la ms simple de todas, la sentencia if.Si se evala como cierta la expresin que hay entre parntesis al principio de la sentencia ifse ejecuta el bloque de sentencias contenido entre las llaves y si se evala como falsa lacondicin, el programa se salta ese bloque de instrucciones. En la figura de abajo tenis lasintaxis de esta sentencia.

    Si slo hay una sentencia se pueden suprimir las llaves, ejemplo:

    if (x=1)printf(Sin llaves solo una sentencia asociada al if);

    Como ejemplo de sentencias if tenis eldecodificador de binario a decimal.

    http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/component/content/article/44-ejemplos-basicos-de-pic-en-c/59-ejemplos-basicos-de-pic-en-c-decodificador-de-binario-a-decimal.htmlhttp://www.aquihayapuntes.com/component/content/article/44-ejemplos-basicos-de-pic-en-c/59-ejemplos-basicos-de-pic-en-c-decodificador-de-binario-a-decimal.htmlhttp://www.aquihayapuntes.com/component/content/article/44-ejemplos-basicos-de-pic-en-c/59-ejemplos-basicos-de-pic-en-c-decodificador-de-binario-a-decimal.htmlhttp://www.aquihayapuntes.com/component/content/article/44-ejemplos-basicos-de-pic-en-c/59-ejemplos-basicos-de-pic-en-c-decodificador-de-binario-a-decimal.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/index.php/progranacion-pic-en-c.html?start=1
  • 5/28/2018 Programacin en C con CSS

    66/77

    Pgina 16 de 18

    Volver al ndice

    Sentencia IfElse

    Cuando el programa llega a una sentencia condicional del tipo If Else, primero se evalauna expresin; si se cumple (es cierta) se ejecuta un bloque de sentencias y si es falsa seejecuta otro bloque.

    En la figura de abajo se muestra la sintaxis de esta sentencia condicional.

    Ejemplo:

    http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.html
  • 5/28/2018 Programacin en C con CSS

    67/77

    ComentarioEste ejemplo visualiza en el display de ctodo comn, conectado a la puerta B del PIC, el0 si el interruptor conectado a RA0 est abierto y 1 si est cerrado, para ello utiliza lasentencia if-else, dentro de un bucle infinito para que el programa est siempre chequeando

    el estado de la patilla RA0.En este ejemplo hemos incluido una directiva nueva #use fast_io(puerto). Esta directivase utiliza para optimizar el cdigo generado por el compilador cuando se utilizan funcionesde manejo de entrada y salida como input(pin) definidas yaen CCS.Si no se incluye esta directiva el compilador tomar por defecto la directiva #usestandard_io(A),que har que cada vez que se utilicen estas funciones se reprograme elpin correspondiente como entrada salida, lo que har que el cdigo ASM generado tras lacompilacin sea mayor.

    Podemos comprobar esto si despus de compilar nuestro ejemplo, dentro del IDE de CCSseleccionamos Compile--> C/ASM List

  • 5/28/2018 Programacin en C con CSS

    68/77

    Como se ve en la figura la memoria de programa (ROM) ocupa 21 palabras.

    Ahora se pueden hacer las siguientes pruebas, la primera poner la directiva #usestandard_io(A), y la segunda simplemente quitar la directiva #use fast_io(A)y no ponernada, segn se muestra en la figura de abajo:

  • 5/28/2018 Programacin en C con CSS

    69/77

    Volvemos a compilar y en ambos casos obtendremos lo siguiente:

  • 5/28/2018 Programacin en C con CSS

    70/77

    En ambos casos la memoria ROM utilizada es de 24 palabras, tres ms que cuandoutilizbamos la directiva #use fast_io(A).

    Otras funciones para el manejo de bits de los puertos de entrada y salida que vienendefinidas en CCS y que dependen de la directiva #use*_io() son:

    output_bit(Nombre_pin,valor) --> coloca el pin indicado a 0 1. output_high(Nombre_pin) --> coloca el pin indicado a 1. output_low(Nombre_pin) --> coloca el pin indicado a 0

    Fijaros que no he utilizado la directiva #use fast_io(B)para el puerto B, ya que no seutilizan funciones del compilador para el manejo de los bits de salida. En este caso el puertoB del PIC se controla mapeando la direccin de memoria del puerto B como una variablems en la RAM del PIC, por medio del identificador port_b.

    Circuito del ejemplo:

    El cdigo del ejemplo y el circuito en Proteus lo tenis aqu

    Un saludo

    http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=33#p33http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=33#p33http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=33#p33http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=33#p33
  • 5/28/2018 Programacin en C con CSS

    71/77

    Pgina 17 de 18

    Volver al ndice

    Sentencia switchLa sentencia switch se compone de las siguientes palabrasclave: switch, case, defaulty break.

    Lo que hace est sentencia es comparar sucesivamente el valor de una expresin (dichaexpresin tan solo puede ser de tipo entero o de tipo carcter) con una lista de constantesenteras o de caracteres. Cuando la expresin coincide con la constante, ejecuta lassentencias asociadas a sta.

    La estructura de la sentencia switch es la siguiente:

    http://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.htmlhttp://www.aquihayapuntes.com/indice-programacion-pic-en-c.html
  • 5/28/2018 Programacin en C con CSS

    72/77

    La sentencia break hace que el programa salte a la lnea de cdigo siguiente a la sentenciaswitch. Si se omite se ejecutar el resto de casos case hasta encontrar el prximo break.

    La sentencia default se ejecuta cuando no ha habido ninguna coincidencia. La parte defaultes opcional y, si no aparece, no se lleva a cabo ninguna accin al fallar todas las pruebas y

    el programa seguir a partir de la llave que cierra la sentencia switch

    Consideraciones a la hora de usar esta sentencia:

    En una sentencia switch No puede haber dos sentencias case con el mismo valor deconstante.

    Una constante char se convierte automticamente a sus valores enteros. Switch difiere del if en que switch solo puede comprobar la igualdad mientras que if

    puede evaluar expresiones relacionales o lgicas. Adems cuando la comparacin se

  • 5/28/2018 Programacin en C con CSS

    73/77

    basa en variables o se trabaja con expresiones que devuelven float deberemos usar elif-else.

    Hay que decir que la secuencia de sentencias en un case no es un bloque (no tieneporque ir entre llaves). Por lo tanto no podramos definir una variable local en l.Mientras que la estructura swith global s que es un bloque.

    Vamos a ver un ejemplo para ver todo esto:

    Comentar io

    En el ejemplo introducimos un carcter numrico, lo almacenamos en el array llamadocadena1 y por medio de la funcin atoi() lo convertimos a un valor entero y guardamos suvalor en la variable de tipo entero num, no hay que olvidarse de incluir el archivo decabecera stdlib.h necesaria para la funcin atoi().

    Ahora introducimos valores para ver que obtenemos a la salida.

  • 5/28/2018 Programacin en C con CSS

    74/77

    Si introducimos un 1, coincidir con el valor de la constante asignada al primer case, porlo cual se ejecutan las dos primeras sentencias y el programa para de ejecutar sentenciasporque se ha encontrado con un break, despus ejecuta el ltimo printf() por estar estasentencia fuera de las llaves que delimitan a switch.

    Fijaros en el segundo case, he omitido su break correspondiente a posta (el compilador no

    da error si se quita), para que veis el resultado cuando se introduce un 2:

    Como veis en la figura de arriba se ejecutan las sentencias pertenecientes al segundo case,pero al no encontrar la sentencia break, ejecuta tambin la sentencia del tercer case. Estohay que tenerlo en cuenta para tener claro que lo que hace salir de la sentencia switch es elbreak correspondiente a cada case.

    Si introducimos por ejemplo un 9 al no a ver coincidencia con el valor de ningn case, se

    ejecutar la sentencia perteneciente a default.

    El cdigo fuente del ejemplo lo tenisaqu.

    Un ejemplo un poco ms prctico del uso de esta sentencia, lo tenisaqu,gracias a

    QuijotescoXp, que ha hecho una mejora en el decodificador binario a decimal que en su dainclu en laseccin de prcticas,os animo a que participes en el foro aportando mejoras

    ejemplos nuevos, de esta forma ayudas a que el curso vaya para adelante.

    Un saludo y hasta pronto

    http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=36#p36http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=36#p36http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=3&p=36#p36http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&