Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programando PICs CCS 02 PDF
Programando PICs CCS 02 PDF
Microcontroladores PIC en
Lenguaje C con CCS
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 .
//rutina principal
void main(void)
{ //abrimos la función principal
Setup_adc_ports(NO_ANALOGS);//configuramos los puertos digitales
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:
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
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.
Debe observarse también que las sentencias siempre terminan con un punto y coma.
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.
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.
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á ......