Introduccion a La Programacion de Microcontroladores Pic en C-John Caipa

February 4, 2017 | Author: johncaipa | Category: N/A
Share Embed Donate


Short Description

Download Introduccion a La Programacion de Microcontroladores Pic en C-John Caipa...

Description

2011

INTRODUCCION A LA PROGRAMACION DE MICROCONTROLADORES PIC EN CCS C Por John Caipa Roldan Este material es una traducción y actualización del libro original de Nigel Gardner titulado "An introduction to programming the Microchip PIC in CCS C", copyright © Bluebird Electronics 2002.

Ing. John F. Caipa Roldan Institución Educativa Politécnico "AGS" 18/02/2011

Tabla de contenido INTRODUCCION .................................................................................................................................. 4 PORQUE USAR C? ........................................................................................................................... 4 TERMINOLOGIA .............................................................................................................................. 5 RECOMENDACIONES EN LA ESCRITURA DE CODIGO C ................................................................... 7 1.

FUNDAMENTOS DE C .................................................................................................................. 8 ESTRUCTURA DEL CODIGO C ........................................................................................................... 8 COMPONENTES DEL CODIGO C ....................................................................................................... 9 #PRAGMA ...................................................................................................................................... 10 MAIN() ........................................................................................................................................... 10 #INCLUDE ...................................................................................................................................... 10 FUNCION PRINTF ........................................................................................................................... 11 VARIABLES ..................................................................................................................................... 12 CONSTANTES ................................................................................................................................. 13 COMENTARIOS .............................................................................................................................. 14 FUNCIONES.................................................................................................................................... 14 COMPATIBILIDAD CON HARDWARE.............................................................................................. 15 PALABRAS CLAVES DE C................................................................................................................. 15

2.

VARIABLES ................................................................................................................................ 17 TIPOS DE DATOS ............................................................................................................................ 17 DECLARACION DE VARIABLES........................................................................................................ 18 ASIGNACION DE VALORES A VARIABLES ....................................................................................... 20 ENUMERACION ............................................................................................................................. 21 TYPEDEF......................................................................................................................................... 22 CONVERSION DE TIPO ................................................................................................................... 23 CLASES DE ALMACENAMIENTO PARA VARIABLES ........................................................................ 23

3.

FUNCIONES ............................................................................................................................... 25 FUNCIONES.................................................................................................................................... 25 FUNCION PROTOTIPO ................................................................................................................... 25 VOID .............................................................................................................................................. 27 USANDO LOS ARGUMENTOS DE UNA FUNCION ........................................................................... 27 USANDO FUNCIONES QUE RETORNAN VALORES ......................................................................... 28 1

DECLARACION CLASICA Y MODERNA DE FUNCIONES .................................................................. 30 PASANDO CADENAS CONSTANTES A FUNCIONES ........................................................................ 31 4.

OPERADORES ............................................................................................................................ 32 OPERADORES ARITMETICOS ......................................................................................................... 32 OPERADORES RELACIONALES ....................................................................................................... 33 OPERADORES LOGICOS ................................................................................................................. 34 OPERADORES DE BIT A BIT ............................................................................................................ 34 OPERADORES INCREMENTALES Y DECREMENTALES .................................................................... 36 PRECEDENCIA DE OPERADORES .................................................................................................... 37

5.

DECLARACIONES DE CONTROL DEL PROGRAMA ..................................................................... 39 DECLARACION if .......................................................................................................................... 39 DECLARACION if-else .............................................................................................................. 40 OPERADOR ? ................................................................................................................................. 42 DECLARACION for ....................................................................................................................... 42 DECLARACION while................................................................................................................... 43 DECLARACION do-while ........................................................................................................... 44 DECLARACIONES DE CONTROL ANIDADAS.................................................................................... 45 DECLARACION break................................................................................................................... 46 DECLARACION continue ........................................................................................................... 46 DECLARACION switch ................................................................................................................ 47 DECLARACION null(;) .............................................................................................................. 49 DECLARACION return ................................................................................................................ 50

6.

ARREGLOS Y CADENAS ............................................................................................................. 51 ARREGLOS UNIDIMENSIONAL ...................................................................................................... 51 CADENA DE CARACTERES .............................................................................................................. 53 ARREGLOS MULTIDIMENSIONALES ............................................................................................... 54 INICIALIZANDO ARREGLOS ............................................................................................................ 55 ARREGLOS DE CADENAS ................................................................................................................ 56 FUNCIONES PARA MANIPULAR CADENAS .................................................................................... 56

7.

PUNTEROS................................................................................................................................. 58 INTRODUCCION A LOS PUNTEROS ................................................................................................ 58

2

RESTRICCIONES PARA PUNTEROS ................................................................................................. 59 PUNTEROS Y ARREGLOS ................................................................................................................ 61 PASANDO PUNTEROS A FUNCIONES ............................................................................................. 62 8.

ESTRUCTURAS Y UNIONES........................................................................................................ 64 INTRODUCCION A LAS ESTRUCTURAS ........................................................................................... 64 PUNTEROS A ESTRUCTURAS.......................................................................................................... 67 INTRODUCCION A LAS UNIONES ................................................................................................... 69

9.

LENGUAJE C ESPECIFICO PARA PIC ........................................................................................... 71 ENTRADAS Y SALIDAS .................................................................................................................... 71 MEZCLANDO C Y ASSEMBLER ........................................................................................................ 73 MANIPULACION AVANZADA DE BIT .............................................................................................. 75 TEMPORIZADORES ........................................................................................................................ 76

3

INTRODUCCION Un gran avance en la programación de microcontroladores son las herramientas que utilizan el lenguaje de alto nivel C como es el caso del compilador C de CCS®. Con dicha herramienta teniendo algo de conocimiento del lenguaje C facilita mucho el desarrollo de programas y aplicaciones con microcontroladores, en este caso el PIC de Microchip®. El lector de este material aunque debe tener las bases de la programación en el lenguaje Assembler y conocer las características principales de los microcontroladores PIC no debe preocuparse, ya que el objetivo de este material es presentar los fundamentos del lenguaje C apoyado en algunos ejemplos y ejercicios, con la finalidad de que el lector tenga las bases necesarias para empezar su camino en el desarrollo de aplicaciones con PIC utilizando el compilador C de CCS® y el Simulador PROTEUS® de Labcenter Electrónics.  Para el desarrollo de los ejemplos y ejercicios que se muestran en el transcurso del libro se recomienda sean compilados en Microsoft Visual C++ Express®, el cual puede descargarse gratuitamente de la página de Microsoft®. El Microcontrolador empleado en este material es el PIC16F84A de Microchip®, además los programas ejemplo que utilizan este Microcontrolador se escribieron y compilaron en PIC C Compiler de CCS®. PORQUE USAR C? El lenguaje C fue desarrollado en los laboratorios Bell a finales de los 60s por Dennis Ritchie y Brian Kernighan. Una de las primeras plataformas para su implementación fue PDP-11 que corría bajo el ambiente UNIX. Desde su introducción, este ha evolucionado, estandarizado y se ha establecido en toda la industria de software como el lenguaje de programación más empleado. C es un lenguaje portable desarrollado para tener mínimas modificaciones cuando se transfieran programas de un computador a otro. Esto está bien cuando se trabaja con PCs y capas principales. Pero los Microcontroladores y Microprocesadores son un caso diferente. El flujo del programa principal básicamente permanece sin cambios, pero las diferentes configuraciones de puertos y control de periféricos son específicos para cada Microcontrolador. Un ejemplo de esto es que los registros de puertos sobre un PIC son configurados 1=Input (entrada) 0=Output (salida), mientras que en H8 son 0=Input (entrada) 1=Output (salida). El uso del lenguaje C en las aplicaciones con Microcontroladores es debido a que provee programas más complejos con un desarrollo más fácil y tiempo de diseño más corto comparado con el lenguaje Assembler, pero con el inconveniente que no es tan eficiente en lo relacionado con memoria de programa.

4

TERMINOLOGIA Comencemos con la terminología básica empleada en este contexto. Microcontrolador – Es un circuito integrado programable que contiene todos los componentes necesarios para controlar el funcionamiento de una tarea determinada. El Microcontrolador empleado en este libro es el PIC16F84A de Microchip® (Fig. 1). I/O – Pin de conexión con el mundo exterior que puede ser configurado como entrada o salida. I/O es necesario en la mayoría de los casos para permitirle al Microcontrolador comunicarse, controlar y leer información. Software – La información que el Microcontrolador necesita para operar o correr. Este tiene que estar libre errores para una aplicación exitosa. Puede ser escrito en una variedad de lenguajes como C, Pascal o Assembler. Hardware – El Microcontrolador, memorias, periféricos, fuentes de voltaje, y todos los demás componentes conectados a este para hacer que trabaje y se comunique con el mundo exterior. Simulador – Aplicación en la que puede probar y depurar sus diseños de manera interactiva y rápida evitando la programación del dispositivo real, ejemplo: ISIS PROTEUS ®. Programador – Unidad que permite al programa ser cargado dentro de la memoria del Microcontrolador. Estos vienen en diferentes formas, protocolos de comunicación y precios, ejemplos: PICSTART PLUS®, PICKIT® de Microchip. Archivo Fuente – Programa escrito en un lenguaje como Assembler o C que usted puede entender. Este archivo tiene que procesarse antes de que el Microcontrolador lo reciba. Compilador – Paquete software que convierte al archivo fuente en un archivo objeto. El compilador C que se utiliza en este material es PIC C Compiler de CCS®. Archivo Objeto – Archivo que se produce después de compilar el archivo fuente. La extensión es .OBJ o .HEX, y es el archivo que necesita el Simulador y el Microcontrolador para funcionar.

5

(a)

(b) Fig. 1. (a) Diagrama de pines PIC16F84A, (b) Diagrama de bloques PIC16F84A Fuente: http://ww1.microchip.com/downloads/en/devicedoc/35007b.pdf

6

RECOMENDACIONES EN LA ESCRITURA DE CODIGO C La escritura de un programa es como construir una casa, si la base es firme, el resto del código permanecerá solido. Pero si la base es débil, el código perderá su firmeza en algún punto. Las siguientes recomendaciones tomadas del estándar C++ han sido adaptadas para el PIC. Etiquetas – Defínalas para que identifiquen su función Los nombres de las etiquetas son el corazón de la programación, así que defínalas apropiadamente a su función y su uso en el programa. Ejemplo: use ErrorCheck en vez de ERRORCHECK. Corchetes o llaves – úselas de manera ordenada, ejemplo: if (condición) { …… }

Tabulación e Indentación Use espaciado en lugar de tabulación (8 espacios), recuerde que la configuración de tabulación de un editor no es la misma en otro, haga el código portable, utilice Indentación para que su código luzca organizado. Longitud de línea Mantenga una longitud de línea de máximo 78 caracteres para mantener compatibilidad entre monitor e impresora. Formato de instrucción else if Se puede incluir una instrucción else extra para decidir cualquier condición no cubierta por las instrucciones precedentes if, ejemplo: if (condicion1) { } else if (condición2) { } else { …… //decide cualquier condición no cubierta anteriormente }

Inicialice todas las variables Coloque todas las variables en un valor conocido para prevenir condiciones aleatorias o flotantes. Comentarios Los comentarios permiten descifrar la historia que usted está escribiendo. ¿Usted sabe como su programa está funcionando hoy pero en dos semanas o dos años podrá recordar, o puede alguien diferente entender su programa como lo tiene ahora? Use comentarios para marcar áreas donde hay que hacer alguna modificación, errores a depurar o complementos futuros de su código. 7

1. FUNDAMENTOS DE C Este capítulo presenta algunos de los aspecto clave del lenguaje de programación C. Se entregará una vista rápida de cada aspecto. El objetivo es proporcionar al lector un conocimiento básico de C tal que puede comprender los ejemplos de los siguientes capítulos. ESTRUCTURA DEL CODIGO C Todos los programas escritos en C contienen: directivas del preprocesador, declaraciones, definiciones, expresiones, instrucciones y funciones. Directivas del preprocesador Una directiva es un comando del preprocesador de C (el cual es invocado automáticamente como el primer paso en la compilación de un programa). Las directivas más comunes son la directiva #define, la cual substituye una etiqueta por un identificador especifico, y la directiva #include, la cual incluye funciones de un archivo externo al programa actual. Declaraciones Una declaración establece el nombre y atributos de las variables, funciones y tipos usados en el programa. Las variables globales son declaradas fuera de las funciones y son visibles desde el final de la declaración hasta el final del archivo. Una variable local es declarada dentro de una función y es visible desde el final de la declaración hasta el final de la función. Definiciones Una definición establece el contenido de una variable o función. Una definición también asigna el espacio de almacenaje necesario para las variables y funciones. Expresiones Una expresión es una combinación de operadores y operandos que producen un único valor Instrucciones Controlan el flujo y orden en la ejecución del programa en un código C. Funciones Una función es una colección de declaraciones, definiciones, expresiones e instrucciones que desempeñan una tarea específica. Los corchetes encierran el cuerpo de una función. Las funciones no se pueden anidar en C. Función main Todos los programas hechos en C deben incluir una función llamada main donde la ejecución del programa comienza. Los corchetes que encierran la función main definen el comienzo y punto de finalización del programa. El siguiente ejemplo muestra la estructura general de un programa C escrito en Microsoft Visual C++ Express®, el cual puede descargarlo desde la web de Microsoft®. #include #define PI 3.142

/* directiva del preprocesador */ /* Incluye el encabezado estándar de C*/ /* define una constante simbólica */

8

float area; int cuadrado (int r);

/* declaración variable global */

void main() { /* Comienza la función main */ int radio_alCuadrado; /* declaración variable local */ int radio = 3; /*declaración e inicialización*/ radio_alCuadrado = cuadrado(radio); /*función de usuario*/ area = PI * radio_alCuadrado; printf("El area es %6.4f unidades cuadradas\n",area); getchar(); /* función de terminación*/ } /*fin de la función main */ int cuadrado(int r) /* encabezado de la función*/ { int r_alCuadrado; r_alCuadrado = r * r; return(r_alCuadrado); }

COMPONENTES DEL CODIGO C Todos los programas escritos en C contienen ciertos componentes esenciales tales como instrucción y funciones. Las instrucciones son la parte del programa que realiza las operaciones. Todos los programas en C contienen una o más funciones. Las funciones son subrutinas, cada una de las cuales contienen una o más instrucciones y pueden ser llamada por otras partes del programa. Cuando escribe programas con líneas en blanco, usar indentación y comentarios mejora la visualización, no solo para usted en el futuro, sino también para aquellas personas interesadas en su trabajo. El siguiente ejemplo muestra algunas de las partes requeridas de un programa en C. #include /* mi 1er codigo en C */ void main() { printf("Hola Mundo!"); getchar(); /* termina el programa oprimiendo ENTER */ }

La sentencia #include le dice al compilador que incluya el archivo fuente llamado stdio.h al programa. La extensión .h pertenece a archivos de encabezado. Un archivo de encabezado contiene información acerca de funciones estándar que está usando el programa como printf() y getchar(). El archivo stdio.h (Standard Input and Output), contiene muchas de las funciones de entrada y salida. /* mi 1er código en C */ es un comentario en C. Todos los comentarios están precedidos por un /* y terminan con un */. Los comentarios son ignorados por el compilador y por consiguiente no afectan la velocidad ni el tamaño del código compilado. Todos los programas escritos en C deben tener la función main(). Esta función es el punto de entrada del programa. Todas las funciones tienen el mismo formato, el cual es el siguiente:

9

TipoFuncion NombreFuncion() { Código; }

Las instrucciones dentro de una función son ejecutadas secuencialmente, comenzando con el corchete abierto y terminando con el corchete cerrado. Los corchetes {} muestran el comienzo y el fin de bloques de código en C. Finalmente, printf("Hola Mundo"); representa una instrucción típica en C. Casi todas las instrucción en C terminan con punto y coma (;). El carácter final de línea no es reconocido por C como un terminador de línea. En consecuencia, no hay restricciones sobre la posición de las instrucciones en una línea ni del número de estas. Todas las líneas tienen un punto y coma (;) al final para informar al compilador que ha alcanzado el final de la instrucción. El error común de no incluirlo es señalado como error en la línea siguiente. La excepción a esta regla es con el comando if donde el punto y coma necesita estar al final de la siguiente línea, ejemplo: if (EstoEsVerdad) HagaEstaFuncion();

#PRAGMA El comando pragma le informa al compilador que desempeñe una acción particular al momento de realizar la compilación como el PIC especifico usado en la aplicación. Ejemplo: #pragma device PIC16F84A

En CCS C el comando pragma es opcional, el siguiente comando es el que más se utiliza: #device PIC16F84A

MAIN() Como ya se ha dicho anteriormente todo programa debe incluir una función main la cual puede aparecer solo una vez en el programa. Ningún parámetro es necesario dentro de los paréntesis (). Como main está clasificada como función, todo el código siguiente a esta función debe estar dentro de un par de corchetes {}. void main() { Cuerpo del programa }

#INCLUDE El archivo de encabezado, (denotado por la extensión .h) contiene información acerca librerías de funciones tales como registros especiales de un PIC específico, etc. Ejemplo: #include

10

Esta información la utiliza el compilador para conectar detalles específicos de hardware y el programa fuente. El siguiente ejemplo es hecho en el compilador C de CCS®. #include //definicion del PIC especifico #include #fuses XT,NOWDT, PUT, NOPROTECT //palabra de configuración #use delay(clock=4000000) //frecuencia del oscilador #use rs232(baud=9600,xmit=PIN_B0,rcv=PIN_B1) void main() { Printf("Escriba caracteres:"); while(TRUE) putc(toupper(getc())); //toupper convierte a mayúsculas }

Las definiciones de PIN_B0 y PIN_B1 se encuentran en el archivo de encabezado 16F84A.h. La función toupper() se encuentra en el archivo de encabezado ctype.h. Ambos archivos deben estar en el programa para que el compilador tenga la información acerca de las funciones que usted está usando. Habrá notado probablemente que la directiva #include no termina con punto y coma. La razón para esto es que esta directiva no es una palabra clave de C, pero en cambio es una instrucción del compilador. Todo el contenido de la librería incluida es insertado en el archivo fuente en la etapa de compilación. FUNCION PRINTF Es una función estándar contenida en el archivo de encabezado stdio.h. printf() le permite al programa imprimir información en pantalla. El formato general para printf() es: printf("Texto de control", Argumentos);

Texto de control es una cadena de caracteres entre comillas dobles. La cadena de caracteres puede ser una combinación de letras, números y símbolos. Algunos símbolos especiales de formato están denotados con el símbolo %. Argumentos es una entrada opcional y puede estar compuesto por constantes y variables que utilice el programa y que se quieren imprimir. Los siguientes dos ejemplos muestran a printf() imprimiendo un mensaje e imprimiendo una constante del programa. printf("Hola Mundo!"); printf("Microchip es el #%d!",1);

%d da el formato para la constante que se está imprimiendo. La Tabla 1 muestra todos los especificadores de formato de C y el tipo de datos que afectan.

11

Tabla 1. Especificadores de formato en C. Especificador de formato Tipo de dato que afecta %c Carácter sencillo %uc Carácter sin signo %s Cadena de caracteres %d Enteros decimales con signo %f Punto flotante (notación decimal) %e Punto flotante (notación exponencial o científica) %g Punto flotante (%f o %e, cualquiera en su formato corto) %u Enteros decimales sin signo %x, %X Enteros hexadecimales sin signo %p Apuntador %o Enteros octales sin signo l Prefijo usado con %d, %u, %x, %o para especificar entero largo

NOTA: Un 0 (cero) seguido del símbolo % dentro de un formato de cadena obliga a imprimir los ceros que están al comienzo. El siguiente número especifica el tamaño del campo a imprimir. Ejemplo: printf("El Hex del decimal 12 es %03x\n",12);

Imprime en pantalla lo siguiente: El Hex del decimal 12 es 00c Tabla 2. Caracteres especiales. \n

Símbolos Especiales Línea nueva

\t \r \f \’ \”

Tab horizontal Retorno de carro Formfeed Comilla sencilla Comilla doble

\\

Backslash

\? \a \b \0 \v \xhhh %%

Símbolo de interrogación Beep Backspace Carácter nulo(null) Tab vertical Inserta código hex hhh Signo de porcentaje

El formato de especificación puede ser también así: %[flags][ancho][.presicion], entonces retomando un ejemplo anterior: printf("El area es %6.4f unidades cuadradas\n",area);

Esta instrucción imprime en pantalla el valor de area en un espacio con ancho de 6 y precisión decimal de 4 posiciones. VARIABLES Una variable es un nombre que se le da a una localización específica de memoria. Esta localización de memoria puede guardar varios valores dependiendo de cómo haya sido declarada la variable. En C, todas las variables deben declararse antes de ser usadas. Una declaración de variables le

12

informa al compilador que tipo de variable está siendo usada. Todas las declaraciones de variables son instrucciones en C y por consiguiente deben finalizar con un punto y coma. Los cinco tipos básicos de datos que soporta C son: char, int, float, double, void. El formato general para declarar una variable es el siguiente: TipoVariable NombreVariable;

Un ejemplo de declaración de un variables es: char ch;. El compilador interpreta esta instrucción como la definición de la variable ch como tipo char (caracter o entero sin signo de 8 bits). CONSTANTES Una constante es un valor fijo que no puede ser alterado por el programa. Por ejemplo, 25 es una constante. Las constantes enteras son especificadas sin ninguna componente fraccional como -100 o 40. Constantes en punto flotante requieren punto decimal seguido por su componente fraccional. El número 456.75 es una constante en punto flotante. Los caracteres también son constantes y deben estar encerradas por comillas sencillas como 'A' o '&'. Cuando el compilador encuentra una constante en el programa, este decide qué tipo de constante es. El compilador C podrá, por defecto, acomodar la constante dentro del tipo de dato más pequeño que lo pueda contener. Así que 15 es un tipo int, 64000 es un tipo long y 105020 es un tipo int32. Una constante es declarada usando la sentencia #define. #define valor

define el nombre que usará a través del programa, valor es el valor que se le asignara a . Ejemplos: #define VERDADERO 1 #define pi 3.14159265359

Usted puede especificar el tipo de constante usando los siguientes sufijos: F U

punto flotante unsigned

FL L

long double long

C le permite especificar constantes en los formatos hexadecimal y octal. Las constantes hexadecimales deben tener el prefijo '0x'. Por ejemplo 0xA4 es una constante hexadecimal valida. En adición a las constantes numéricas, C soporta constantes tipo string (cadena de caracteres). Las cuales son una serie de caracteres encerrados entre comillas dobles. Las constantes no son almacenadas en memoria, son resueltas en tiempo de compilación. Para guardar constantes en la memoria ROM del chip, use la palabra clave const en la declaración de una variable. Por ejemplo: char const id[5]={"1234"};

13

Se están usando cinco localizaciones de memoria para guardar la cadena porque esta debe terminar con el carácter null (\0) como se explicará más adelante. COMENTARIOS Los comentarios son empleados para documentar el significado y operación del código fuente. Todos los comentarios son ignorados por el compilador. Un comentario puede ser puesto en cualquier parte del programa excepto en la mitad de alguna instrucción, nombre de función o nombre de variable. Los comentarios pueden abarcar muchas líneas y pueden ser usados para remover temporalmente una línea de código. Finalmente, los comentarios no se pueden anidar. Los comentarios tienen dos formatos. El primer formato es usado por todos los compiladores de C y es el siguiente: /* Este es un comentario */

El segundo formato es soportado por la mayoría de compiladores y es el siguiente: // Este es un comentario

FUNCIONES Las funciones son los bloques de construcción básicos de un programa en C. todos los programas en C contienen al menos una función, main(). La mayoría de los programas que usted escribe contendrá muchas funciones. El formato para un programa en C con muchas funciones es el siguiente: void main() { } funcion1() { } funcion2() { }

main() es la primera función llamada cuando el programa se está ejecutando. Las otras funciones, funcion1() y funcion2(), pueden ser llamadas por cualquier otra función en el programa. Tradicionalmente main() no es llamada por ninguna otra función, sin embargo, no hay restricciones en C con respecto a esto. El siguiente es un ejemplo de dos funciones en C. #include void main() { printf("Me ");

14

funcion1(); printf("C."); } funcion1() { printf("gusta programar en"); }

Una cuestión que hay que tener en cuenta al escribe sus propias funciones es que cuando el corchete de cierre es alcanzado, el programa continuará ejecutándose una línea después del punto en el cual la función ha sido originalmente llamada. COMPATIBILIDAD CON HARDWARE El compilador necesita saber acerca del hardware para que el código pueda ser compilado correctamente. Un programa típico en el compilador C de CCS® puede comenzar así: #include #fuses XT,NOWDT, PUT, NOPROTECT #use delay(clock=4000000)

La primera línea incluye las definiciones específicas del dispositivo tales como nombre de pines, registros especiales, etc. La segunda línea establece la palabra de configuración del PIC, para este caso se deja al oscilador de cristal como oscilador del dispositivo, se desactiva el Watch Dog Timer, se habilita el Power-up Timer y se desactiva la protección de código. La última línea le informa al compilador la velocidad del oscilador. Las siguientes líneas son otro ejemplo: #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7) #use i2c(master,scl=PIN_B6,sda=PIN_B7)

//config. RS232 //config. I2C

En adición, las variables de C pueden ser creadas y mapeadas a registros del hardware. Estas variables pueden ser bits o bytes. Después que son definidas, pueden ser utilizadas en un programa como cualquier otra variable. Ejemplo: #bit carry=3.0 #byte portb=6 #byte intcon=11

PALABRAS CLAVES DE C El estándar C ANSI define 32 palabras clave para usar en el lenguaje C. En C, ciertas palabras son reservadas del compilador para definir tipos de datos y para su uso en loops (bucles o lazos). Todas las palabras claves de C deben escribirse en minúscula para que el compilador las reconozca. Típicamente, la mayoría de los compiladores de C agregan varias palabras adicionales que toman ventaja de la arquitectura del procesador. La siguiente es una lista de las palabras claves de C:

15

auto break case char const continue default do

double else enum extern float for goto if

int long register return short signed sizeof static

struct switch typedef union unsigned void volatile while

Ejercicios 1. Escriba un programa en Microsoft Visual C++ Express® que imprima en pantalla su nombre, su documento de identidad y su email e líneas diferentes. 2. Escriba un programa en Microsoft Visual C++ Express® que declare una variable tipo entera llamada year. Esta variable debe entregar el valor del año actual y luego, usando la función printf(), mostrar el valor del año en pantalla. El resultado de su programa debe parecerse a lo siguiente: El año es 2011.

16

2. VARIABLES Un aspecto importante del lenguaje C es como este almacena datos. Este capítulo examinará más en detalle cómo se usan las variables en C para almacenar datos. TIPOS DE DATOS El lenguaje de programación C soporta cinco tipos de datos básicos (como se había comentado en el capitulo anterior) y cuatro tipos de modificadores. La Tabla 3 muestra la definición de los tipos de datos básicos y el tipo de modificador. Tabla 3. Tipos de datos y modificadores en C. Tipo Significado Carácter Dato carácter Entero Números enteros con signo Flotante Números con punto flotante Doble precisión Números con punto flotante de doble precisión Vacio (void) Sin valor Con signo Números positivos o negativos Sin signo Solo números positivos Largo Duplica el tamaño de un número corto Mitad del tamaño de un número

Palabra clave char int float double void signed unsigned long short

Cada tipo de dato representa un rango particular de números, que pueden cambiar dependiendo del modificador usado. La Tabla 4 muestra los posibles rangos de valores para algunos tipos de datos básicos y los modificadores en CCS C. Tabla 4. Rangos de valores de los tipos de datos en CCS C. Tipo Tamaño bit short (int1) 1 int (int8) 8 long (int16) 16 long long (int32) 32 float (float32) 32 char (unsigned int8) 8 void signed int8 8 signed int16 16 signed int32 32

Rango 0 a 1 0 a 255 0 a 65535 0 a 4294967295 -1.5E45 a 3.4E38 0 a 255 Sin valor -128 a 127 -32768 a 32767 -2147483648 a 2147483647

NOTA: revisar la documentación del compilador C para tipos de datos y rangos numéricos actualizados. Todos los tipos, excepto float, por defecto son unsigned. C permite una notación más corta para los tipos unsigned int, short int, y long int. Simplemente use las palabras unsigned, short o long sin la palabra int. Para realizar las operaciones aritméticas de una forma sencillas para la CPU, C representa todos los números negativos en el formato complemento a 2. Para encontrar el complemento a 2 de un número simplemente invierta todos los bits y sume 1 al resultado. Por ejemplo, para convertir el número con signo +29 en complemento a 2 se procede así:

17

00011101= 11100010 + 1 ________ 11100011=

29 se invierten todos los bits se suma 1 -29

Ejercicios 1. Escriba la siguiente declaración de otra manera. long int i; 2. Para entender la diferencia entre un número con signo y uno sin signo, escriba el siguiente programa en Microsoft Visual C++ Express®. El entero sin signo 35000 es representado por -30536 en el formato entero con signo. #include void main() { short int i; // entero con signo equiv. a signed int16 en CCS unsigned short int u; // entero sin signo equiv. a int16 en CCS u = 35000; i = u; printf("%d %u\n",i,u); getchar();//detiene la ejecución hasta oprimir ENTER }

DECLARACION DE VARIABLES Las variables pueden ser declaradas en dos lugares básicos: dentro de una función o por fuera de todas las funciones. Las variables son llamadas locales o globales respectivamente. Las variables son declaradas de la siguiente forma: TipoVariable NombreVariable;

Donde TipoVariable es uno de los tipos de datos validos en C y NombreVariable es el nombre asignado a la variable. Las variables locales (declaradas dentro de una función) solo pueden ser usadas por las instrucciones dentro de la función donde ha sido declarada. El valor de una variable local no puede ser accesado por otras funciones por fuera de la función de origen. La cosa más importante a recordar acerca de las variables locales es que son creadas al momento de entrar a la función y destruidas cuando la función ha finalizado. Las variables locales deben declararse al comienzo de la función antes de las instrucciones. Es aceptable para variables locales que estas tengan nombres iguales en diferentes funciones. Considere el siguiente ejemplo. #include void f2() { int cont; for (cont=0; contmax || !(max==57) && var>=0

Otra parte de C que emplea los operadores relacionales y lógicos son las instrucciones de control de programa que se estudiarán en el siguiente capítulo. Ejercicios 1. Reescriba la siguiente expresión usando cualquier combinación de operadores relacionales y lógicos. cont == 0; result > expresión

El valor de expresión determina cuantos lugares hacia la izquierda o derecha variable es desplazada. Cada desplazamiento hacia la izquierda causa que todos los bits de corran una posición de bit a la izquierda, y un cero es insertado sobre el lado derecho. El bit que es desplazado fuera del final de variable se pierde. La única situación a resaltar acerca del uso de los desplazamientos es que un desplazamiento hacia la izquierda es equivalente a multiplicar un número por 2 y un desplazamiento hacia la derecha es equivalente a dividir un número por 2. Los operadores de desplazamiento son casi siempre más rápidos que su equivalente operación aritmética debido a cómo trabaja la CPU. Un ejemplo de todos los operadores bit a bit se muestra a continuación.

&

AND 00000101 (5) 00000110 (6) -----------00000100 (4)

^

XOR 00000101 (5) 00000110 (6) -----------00000011 (3)

|

~

DESP IZQ. 00000101 (5) > 2 -----------00000001 (1)

NOTA: no realice desplazamientos mas allá de los bits que el operando posea, debido a que se obtiene un resultado indefinido. a = b | c; Se convierte en: 0007: 0008: 0009:

MOVF IORWF MOVWF

b,W c,W a

;carga b ;opera b OR c ;guarda en a

a = b & c; Se convierte en: 0007: 0008: 0009:

MOVF ANDWF MOVWF

b,W c,W a

;carga b ;opera b AND c ;guarda en a

a = b >> 3; Se convierte en: 0007: 0008: 0009: 000A: 000B: 000C: 000D:

MOVF MOVWF RRF RRF RRF MOVLW ANDWF

b,W a a,F a,F a,F 1F a,F

;carga b ;guarda en a ;rota el contenido ;hacia la derecha ;tres veces ;enmascara el contenido ;del registro para a

j = ~a;

35

Se convierte en: 0007: 0008: 0009:

MOVF MOVWF COMF

a,W j j,F

;carga a ;guarda en j ;complementa j

Ejercicios 1. Escriba un programa que invierta los bits más significativos (MSB) de un dato tipo signed char. 2. Escriba un programa que imprima la representación binaria de un número tipo char. OPERADORES INCREMENTALES Y DECREMENTALES ¿Cómo podría usted incrementar o decrementar en una unidad una variable? Probablemente una de dos formas le vendría a la mente. Tal vez las siguientes: a = a + 1;

o

a = a - 1;

Una vez más, los creadores de C han llegado con una notación abreviada para incrementar o decrementar un número. Los formatos generales son los siguientes: a++; a--;

o o

++a; --a;

para incrementar para decrementar

Cuando los signos ++ o -- preceden la variable, la variable es incrementada y después el valor es usado en una expresión. Cuando los signos ++ o -- van después de la variable, el valor de la variable se usa en la expresión y luego se incrementa. int j, a = 3; 0007: 0008:

MOVLW MOVWF

03 a

;registro asignado a a

j = ++a; 0009: 000A: 000B:

INCF MOVF MOVWF

a,F a,W j

;a = 4 ;carga a en w ;almacena w en j

j = a++; 000C: 000D: 000E:

MOVF INCF MOVWF

a,W a,F j

;carga el valor de a en w ;a = 5 ;almacena w en j, j = 4

NOTA: no utilice la siguiente expresión. a = a++;

Porque se genera el siguiente error en el código generado: MOVF INCF MOVWF

a,W a,F a

;valor de a cargado en w ;valor de a incrementado ;el valor previo es recargado sobrescribiendo el ;valor incrementado

36

El siguiente ejemplo ilustra los dos usos. #include void main(void) { int i,j; i = 10; j = i++; printf("i = %d, j = %d\n",i,j); i = 10; j = ++i; printf("i = %d, j = %d\n",i,j); }

El primer printf() imprimirá un 11 para i y un 10 para j. el segundo printf() imprimirá un 11 para ambos i y j. Mezclando operadores Escribiendo sum = a+b++ sum = a+b-sum = a+ ++b sum = a+ --b

Se obtine sum = a+b sum = a+b b = b+1 b = b-1

b = b = sum sum

b+1 b-1 = a+b = a+b

Ejercicios 1. Reescriba los operadores de asignación en el siguiente programa para incrementar o decrementar las variables. void main(void) { int a, b; a = 1; a = a+1; b = a; b = b-1; printf("a=%d, b=%d\n", a,b); }

2. ¿Cuáles son los valores de a y b después de que el siguiente segmento de código se ha ejecutado? a = 0; b = 0; a = ++a + b++; a++; b++; b = --a + ++b;

PRECEDENCIA DE OPERADORES La precedencia se refiere al orden en el cual los operadores son procesados por el compilador C. por ejemplo, si la expresión a+b*c se encontrará en su programa, ¿Qué operación ocurriría en primer lugar, la suma o la multiplicación? El lenguaje C mantiene precedencia para todos los operadores. La siguiente lista muestra la precedencia desde la más alta a la más baja. 37

Prioridad 1 2

Operador () ++ -sizeof & * + - ~ ! ++ --

Ejemplo (a+b)/c a=-b

3 4 5 6 7 8 9 10 11 12 13

* / % + > < > = == != & ^ | && || = *= /= %= += -= = $= ^= |=

a%b a+b a=b>>c a>=b a==b a=b&c a=b^c a=b|c a=b&&c a=b||c a+=b

parentesis mas/menos/NOT/complemento incremento/decremento/sizeof multi/dividir/modulo suma/resta Desp izg. o derecho mayor/menor/igual que AND bit a bit XOR bit a bit OR bit a bit AND lógico OR lógico asignación

Algunos de estos operadores todavía no los hemos estudiado, pero no se preocupe, los estudiaremos más adelante. Los paréntesis pueden usarse para fijar el orden específico en el cual las operaciones se lleven a cabo. Un par de ejemplos del uso del paréntesis para clarificar o cambiar la precedencia de una declaración son los siguientes: 10-2*5 = 0 (10-2)*5 = 40 cont*sum+88/val-19%cont (cont*sum) + (88/val) – (19%cont)

38

5. DECLARACIONES DE CONTROL DEL PROGRAMA En este capítulo aprenderá acerca de las instrucciones que C usa para controlar el flujo de ejecución en un programa. Además aprenderá como los operadores relacionales y lógicos se usan con estas declaraciones de control. DECLARACION if La declaración if es una instrucción del tipo condicional. El bloque de código asociado con la instrucción if es ejecutado basado en el resultado de una condición. Nuevamente, cualquier valor diferente de cero es verdadero y cualquier valor cero es falso. El formato más sencillo es el siguiente: if (expresion) { . instruccones; . }

Los corchetes {} se usan para encerrar el boque de código. Esto le informa al compilador que si la expresión es verdadera, ejecute el código dentro de los corchetes. Ejemplo: if (cont < 0) { Cont = 0; printf("cuenta descendente\n"); } if (TestMode == 1) { ... Haga esto }

Otros operadores de comparación usados en la instrucción if son los siguientes: x x x x x x x x

== y != y > y < y = y && y || y

x igual a y x es diferente a y x es mayor que y x es menor que y x es menor o igual que y x es mayor o igual que y AND lógica OR lógica

Un ejemplo de una de estas funciones convertida en Assembler es el siguiente: int j, a = 3; 0007: 0008: if (j == 2) 0009: 000A: 000B: 000C: { j = a;

MOVLW MOVWF

03 a

;carga a con 3

MOVLW SUBWF BTFSS GOTO

02 j,W STATUS,Z 00F

;carga w con 2 ;testeo entre w y j ;si es cero salta ;j no es igual a 2

39

000D: 000E:

MOVF MOVWF

a,W j

;como es cero ;carga a en j

} 000F:

Ejercicios 1. ¿Cuáles de las siguientes expresiones resultan en un valor verdadero? a. b. c. d. e.

0 1 -1 5*5
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF