Curso Avanzado Lenguaje C-Capitulo 1

66
P O L I T E C N I C O 57 1. INTRODUCCION La primera pregunta que deberíamos hacernos es ¿Por qué mutar a un lenguaje como el C y no seguir programando en assembler?. Algunas de las razones posibles son: El C es un lenguaje de alto nivel: esto implica que nos aisla hasta cier hardware independiente del tipo de microcontrolador que se esté program Es más rápido y fácil de aprender que el assembler: Tiene una cantidad d reducidas y son las mismas independientes del microcontrolador. En cambi assembler cada microcontrolador tiene su propio conjunto de instruccione un número de 30 a más de 100 instrucciones que deberíamos aprender ademá los modos de direccionamiento asociados. Portabilidad: Si quisiera trasladar un programa en lenguaje C de un micr otro (incluso de otra marca) lo podría hacer consiguiendo el compilador introduciendo mínimos cambios. En cambio en assembler tendría que apren conjunto de instrucciones del nuevo microcontrolador y rehacer completam programa Flexibilidad y mantención: Es común que en los programas se tengan que h modificaciones y correcciones que debido a su organización estructurada resultan programas más claros y más fácil de entender, a diferencia del con el tiempo y con la extensión del programa se vuelve extremadamente d entender incluso para el programador original del software. Facilita el trabajo en equipo: Cuando los sistemas son complejos, se pue varios programadores trabajen sobre el mismo. Al permitir el desarrollo modulares se podría dividir el software en varios modulos, cada uno desa programador diferente. Luego el compilador se encargaría de integrarlos los recursos del microcontrolador con los recursos requerido por cada mo Los programas en lenguaje C se desarrolla mucho más rápido que un progra assembler Mas fácil de entender por otros programadores diferente al programador o

Transcript of Curso Avanzado Lenguaje C-Capitulo 1

1. INTRODUCCION La primera pregunta que deberamos hacernos es Por qu mutar a un lenguaje de alto nivel como el C y no seguir programando en assembler?. Algunas de las razones posibles son: El C es un lenguaje de alto nivel: esto implica que nos aisla hasta cierto punto del hardware independiente del tipo de microcontrolador que se est programando. Es ms rpido y fcil de aprender que el assembler: Tiene una cantidad de sentencias reducidas y son las mismas independientes del microcontrolador. En cambio en assembler cada microcontrolador tiene su propio conjunto de instrucciones que varan en un nmero de 30 a ms de 100 instrucciones que deberamos aprender adems de todos los modos de direccionamiento asociados. Portabilidad: Si quisiera trasladar un programa en lenguaje C de un microcontrolador a otro (incluso de otra marca) lo podra hacer consiguiendo el compilador adecuado e introduciendo mnimos cambios. En cambio en assembler tendra que aprender en nuevo conjunto de instrucciones del nuevo microcontrolador y rehacer completamente todo el programa Flexibilidad y mantencin: Es comn que en los programas se tengan que hacer modificaciones y correcciones que debido a su organizacin estructurada del lenguaje C resultan programas ms claros y ms fcil de entender, a diferencia del assembler, que con el tiempo y con la extensin del programa se vuelve extremadamente difcil de entender incluso para el programador original del software. Facilita el trabajo en equipo: Cuando los sistemas son complejos, se puede necesitar que varios programadores trabajen sobre el mismo. Al permitir el desarrollo de programas modulares se podra dividir el software en varios modulos, cada uno desarrollado por un programador diferente. Luego el compilador se encargara de integrarlos y compatibilizar los recursos del microcontrolador con los recursos requerido por cada modulo individual. Los programas en lenguaje C se desarrolla mucho ms rpido que un programa en assembler Mas fcil de entender por otros programadores diferente al programador original

POLITECNIC O

57

Lenguaje C para Microcontroladores PIC

La principal desventaja respecto al assembler es que el cdigo en assembler puede llegar a resultar ms eficiente y usar menos memoria de programa. 1.1 Definicin de la Funcin Main Al comenzar a ejecutarse el programa dentro de un microcontrolador el Contador de Programa apunta a la primera posicin de memoria y es all donde busca la primera instruccin a ejecutar. Siendo que un programa en C es una agrupacin de funciones que interactan entre si, el compilador C necesitar saber cul es la primera funcin a ejecutar. Esta funcin est definida por defecto y tiene el nombre de main(). void main(void) { // Instrucciones en C o llamada a funciones C } Las llaves limitan el comienzo y el final de la funcin main() y de todas las funciones en C Todas la instrucciones deben finalizar con un punto y coma. 1.2 Comentarios. Comentar un programa es una prctica muy importante para el mantenimiento y las modificaciones futuras del mismo. Ya que con el tiempo hasta el propio programador olvida cual era el objetivo de una secuencia determinada de cdigo. Existan dos formas en que se pueden introducir comentarios en un programa en C: Con una doble barra invertida: // comentario Barra con asterisco: /* Comentario */ 1.3 Nombres de Identificadores Los objetos que utiliza el lenguaje C (funciones, variables, etc.) necesitan tener un nombre o identificador para poder ser referenciados. Las reglas respectos a los identificadores son: 565 6 P POLITECNI GI CO N NA 2

No pueden tener smbolos grficos a excepcin del guion bajo ( _ ) No pueden tener acentuacin graficas Un identificador no puede comenzar con un numero Solo los primeros 32 caracteres son significativos Diferencia entre maysculas y minsculas No puede ser una palabra reservada de C o del compilador Ejemplos: contador, Contador, CONTADOR: son tres identificadores diferentes para C Palabras reservadas del C:

1.4 Tipos de Datos Todas las variables de C deben ser previamente definidas antes de poder ser usadas dentro del programa. El tipo de datos que se le asigne a una variable le dice al compilador cual es la cantidad de memoria que tiene que reservar para esa variable, asi como el rango numrico mximo que puede representar. Esto le permite optimizar el usa de la memoria ram ya que de esta forma no dispondr mas byte de lo necesario, para esa variable en particular Existen distintos tipos de formato para representar valores numricos, donde los dos ms distintivos son: representacin en punto fijo y representacin en punto flotante. El punto fijo se usa para representar valores enteros y representa valores consecutivos.

POLITECNIC O

57

Lenguaje C para Microcontroladores PIC

El punto flotante puede representar valores decimales ya que usa una porcin de los bits para la mantisa y otra para los exponentes lo que le da la facilidad de representar nmeros extremadamente grandes o extremadamente pequeos, aunque pierde continuidad entre los nmeros.

1.5 Modificadores de Datos Excepto para void los tipos bsicos tienen modificadores que le preceden. Se usa un modificador para alterar el significado de un tipo base para encajar con las necesidades de diversas situaciones mas precisamente. Una lista de los modificadores es: Signed Unsigned Long Short Los modificadores signed y unsigned se usan para definir si la variable va a representar nmeros solamente positivos o nmeros positivos y negativos. La diferencias entre nmeros con y sin signo es la manera en que el compilador interpreta el bit mas alto. Los nmeros negativos se presentan utilizando el mtodo de complemento a dos En cambio los modificadores long y short se refieren a la cantidad de memoria usada para representar esa variable.

565 6 P GI N NA 2

POLITECNI CO

1.6 Declarando Variables El formato general para la declaracin de variables es: tipo lista_variables; Ej: int i, j, l; short int sf; unsigned int Contador = 0; double balance, ganancias, perdidas; Observar que las variables pueden ser inicializadas en el momento de su declaracin, como pasa con la variable Contador.

POLITECNIC O

57

Lenguaje C para Microcontroladores PIC

1.7 Regla de Alcance de las Variables El lugar donde se declara una variable determina la visibilidad de la misma para las diversas partes del programa. Las reglas que determinan como se puede usar una variable basndose en el lugar del programa que fue declarada se llama regla de alcance. En los programas en C hay tres sitios donde se pueden declarar variables: Fuera de todas las funciones, incluyendo la funcin main(). Se llaman globales Dentro de una funcin. Se las denomina locales. Dentro de la declaracin de los parmetros formales de una funcin.

Las variables globales pueden ser accedidas (ledas y modificadas) por cualquier funcin que forma parte del programa. Las variables locales solo pueden ser accedidas dentro de la funcin en la cual fue declarada, por lo tanto es desconocida para el resto del programa. Por esta razn, dos variables locales definidas en dos funciones diferentes pueden tener el mismo nombre sin que por ello se origine algn conflicto. Sin embargo dos variables globales no pueden tener el mismo nombre. Otra diferencia importante es que las variables locales son creadas al entrar a la funcin y descartadas al salir de la misma. Por lo tanto el uso de variables locales optimiza el uso de la memoria ram. Cuando una variable usa el modificador static, su comportamiento es un hibrido entre una definicin global y una local. Ya que la variable as definida, como sucede con la local, solo es conocida en el interior de la funcin que contiene su definicin. Pero a igual que sucede con la variable global, en ningn momento es destruida y por lo tanto conserva su valor a lo largo del programa. O sea, es una variable local que conserva su valor entre llamadas a la funcin que la define. Ej:

565 6 P GI N NA 2

POLITECNI CO

1.8 Modificadores de Tipo de Acceso El lenguaje C posee dos tipos de modificadores que se usan para controlar la forma en que se pueden acceder o modificar las variables. Estos modificadores son llamados const y volatile Una variable definida como const no puede ser alterado el contenido de la variable dentro del programa, salvo para darle un valor inicial. Una variable definida como volatile le informa al compilador que se puede cambiar el valor de la variable de forma no explicita por el programa. Esto es lo que sucede con las posiciones de memoria ram asociadas a los registros especiales del microcontrolador, ya que su valor puede ser alterados por el hardware. Unos modificadores anexados por el MCC18 y que no corresponde al ANSIS C son: ram y rom que nos permiten determinar donde se guardan las constantes, si en memoria de datos o de programa.

POLITECNIC O

57

Lenguaje C para Microcontroladores PIC

1.9 Constantes Se refieren a los valores fijos que se le asignan a las variables, algunos ejemplos son:

Para formatos diferentes al decimal tenemos:

1.10 Operadores El lenguaje C es muy rico en operadores, entendindose como operador a un smbolo que le dice al compilador que realice manipulaciones matemticas, relacionales y lgicas y sobre bits. Operadores Aritmticos

565 6 P GI N NA 2

POLITECNI CO

Los 4 primeros operadores no requieren mayor explicacin, el operador % devuelve el resto de una divisin, as por ejemplo: 10 % 3 = 1(resto) Aunque este operador no se puede usar sobre los tipos float o double. El operador ++ aade 1 a su operando y el -- le resta 1. x++ es igual a x = x + 1 y-- es igual a y = y 1 Estos operadores pueden preceder o seguir a su operando, pero esto implica una diferencia en el resultado obtenido. As, por ejemplo: x = 10 y = ++x el resultado es y = 11 x = 10 y = x++ el resultado es y = 10 Operadores Relacionales y Lgicos

POLITECNIC O

57

Lenguaje C para Microcontroladores PIC

Se refieren a las relaciones que pueden tener los valores unos con otros. La clave de los conceptos de operadores relacionales y lgicos es la idea de verdadero o falso. En C, cualquier valor distinto de cero es verdad, mientras que si el cero es falso. Las expresiones que usan operadores relacionales y lgicos devolvern 0 para falso y 1 para verdadero. Ejemplo: If( (tecla == 0) &&(Contador = 0 ) ) { LED = 1; } Operadores Bit a Bit

Realizan operaciones lgicas, pero esta vez, bit por bit de las palabras que intervienen en la operacin. Adems se agregan 2 operadores ms, que consisten en desplazar la palabra tanto bits a la derecha o a la izquierda, emulando las operaciones shift rigth y shift left que suelen formar parte del set de instrucciones de todos los microcontroladores. Ejemplo:

565 6 P GI N NA 2

POLITECNI CO

Cuando el resultado de alguna de estas operaciones en general implica a uno de los operando, el C permite una notacin simplificada como la siguiente:

1.11 Expresiones Los operadores, constantes y variables constituyen las expresiones. Una expresin en C es cualquier combinacin valida de estas piezas. Cuando se mezclan constantes y variables de diferentes tipos en una expresin, C las convierte al mismo tipo. El compilador C convertir todos los operandos al tipo del operando ms grande en una operacin segn la base de esta operacin. Tal como describen en estas reglas de conversin de tipos: 1. Todos los char y short int se convierten a int. Todos los float a double. 2. Para todos los operandos, los siguientes ocurre en secuencia. Si uno de los operandos es un long double, el otro se convierte a long double. Si uno de los operandos es double, el otro se convierte a double. Si uno de los opernados es long, el otro se convierte a long. Si uno de los operandos es unsigned, el otro se convierte a unsigned

POLITECNIC O

57

Lenguaje C para Microcontroladores PIC

Despus de que el compilador aplique estas reglas de conversin, cada par de operandos ser del mismo tipo, y el resultado de la operacin ser del tipo de los operandos. Ejemplo:

Operador Cast Se puede forzar una expresin a ser de un tipo especifico usando las construccin llamada cast. El formato general de un cast es: (tipo) expresin Por ejemplo, si x es un entero y se quiere uno asegurar que la computadora evale la expresin x/2 como de tipo float para obtener componente fraccional, podramos usar el operador cast de la siguiente forma: (float) x/2 Aqu el cast (float) se asocia con x, que provoca que el compilador transforme a x de entero a float y como vimos antes, el resultado tambin ser float. 565Sin embargo, hay que ser cuidadoso ya que si la expresin fuera: 6 P POLITECNI GI CO N NA 2

(float) (x/2) el compilador hara primero la divisin entera y luego, ese resultado entero, lo pasara el tipo float. Otro ejemplo: int z; int x = 150; char y = 63; z = (y * 10) + x Qu resultado da? Cmo se puede solucionar? Este ejemplo pone de manifiesto uno de los inconvenientes que se presentan al existir una expresin con varios operadores, que se refiere en qu orden y con qu prioridad se aplican los mismos. Esto se resuelve en la reglas de precedencia. Precedencia de los operandos Los operandos tienen la siguiente precedencia:

POLITECNIC O

57

Lenguaje C para Microcontroladores PIC

El compilador evala de izquierda a derecha los operadores con el mismo nivel de precedencia. Ejemplo: y=3+2*4 // y = 11

y = (3 + 2) * 4 // y = 20 y = 4 >> 2 * 3 // y = 4 >> 6 y = 3 * 2 >> 4 // y = 6 >> 4

565 6 P GI N NA 2

POLITECNI CO

SENTENCIAS DE CONTROL DE PROGRAMA Las sentencias de control de programa son la esencia de cualquier lenguaje de computadora, ya que gobiernan el flujo de la ejecucin del programa. La sentenciad de control del lenguaje C son ricas y poderosas y ayudan a explicar la popularidad del lenguaje. Se pueden dividir las sentencias de control de programa en tres categoras. La primera consta de unas instrucciones condicionales if y switch. La segunda son las sentencias de control del buche while, for y do-while. La tercera catergoria contiene la instruccin de bifurcacin incondicional goto. a. La Sentencia if La forma general de la sentencia if es: if(condicin) sentencia_1; else sentencia_2; o if(condicin) { sentencias_1; } else { sentencias_2; } La clausula else es opcional. Si es verdad la condicin (distinta de cero), se ejecutara la

sentencia o bloque que forma el objetivo de if; de lo contrario, si existe else, se ejecutara la sentencia o bloque que es el objetivo de else. O sea que solo el cdigo asociado con if o el asociado con else se ejecutara, nunca ambos.

El escalonador de if-else-if

POLITECNIC O

57

Lenguaje C para Microcontroladores PIC

Una construccin corriente en programacin es el escalonador if-else-if. Que se ver como: if(condicin) sentencia; else if(condicin) sentencia; else if(condicin) . . . . else sentencia; El compilador evala las expresiones condicionales desde arriba descendiendo, tan pronto como la computadora encuentra una condicin verdadera, ejecuta la sentencia o bloque de sentencias asociada y salta el resto de la escalera. Si no son verdad ninguna condicin, se ejecutara el else final. Si no hay else final y son falsas todas las condiciones, no se hace nada. La expresin condicional Dentro de la expresin condicional del if, se puede usar cualquier expresin valida de C, no se necesita restringir el tipo de expresiones a solo las que invocan operadores relacionales y lgicos. Todo lo que se requiere es que la expresin evaluada de cero o no cero.

b.

La Sentencia switch 565 6 P GI N NA 2

POLITECNI CO

Aunque el escalonador de if-else-if puede realizar comprobaciones mltiples, el cdigo puede ser difcil de seguir y puede confundir al programador. Por esta razones, el C tiene incorporada una sentencia de bifurcacin mltiple llamada switch. En l, el programa comprueba una variable sucesivamente frente a una lista de constantes enteras o de carcter. Despus de encontrar una coincidencia, se ejecuta la sentencia o bloque de sentencias que se asocian con la constante. La forma general de la sentencia switch es: switch(variable){ case constante1: secuencia de sentencias; break; case constante2: secuencia de sentencias; break; . . . . default: secuencia de sentencias; } Donde se ejecutar la sentencia default si no coincide ninguna. El default es opcional; si no est presente, no se hace nada. Cuando se encuentra una coincidencia, el programa ejecuta las sentencias asociadas con el case hasta encontrar un break o en el caso del default (o el ltimo case, si no est presente el default) el final de la sentencia switch. Hay dos cosas importantes que saber sobre la sentencia switch:

1. La sentencia switch solo puede comprobar por igualdad, mientras que la if puede ser de cualquier tipo.

POLITECNIC O

57

Lenguaje C para Microcontroladores PIC

2. No pueden tener dos constantes case valores idnticos en el mismo switch, aunque un switch puede contener a otro switch con constantes de case iguales. La sentencia switch es ms eficiente y es ms clara de leer que el escalonador if-else-if La sentencia break Las sentencias break son opcionales dentro de la sentencia switch. Se usan las sentencias break para terminar la secuencia asociada con cada constante. Si se omite esta sentencia, la ejecucin continuar en las sentencias del siguiente case hasta que se encuentre un break o el final del switch. Ejemplo: switch(t){ case 1: sentencias1; break; case 2: sentencias2; break; case 3: sentencias3; case 4: case 5: sentencias5; break; case 10: sentencias10; break; } De este ejemplo podemos hacer varias observaciones: 565 6 P GI N NA 2

POLITECNI CO

1. Las constantes asociadas a los case, no tienen que ser nmeros consecutivos, en este ejemplo las constantes 6, 7, 8, 9, no existen, y por lo tanto si t asume alguno de estos valores no se ejecuta nada porque no est implementada la opcin default. 2. Las sentencias5 tienen asociadas dos constantes: 4 y 5, si t asume cualquiera de estos dos valores se ejecutarn estas sentencias. 3. Si t asume el valor 3 se ejecutaran las sentencias3, pero al no contener un break, seguir con las sentencias5 hasta encontrar el prximo break. c. Bucles Los bucles permiten repetir un conjunto de instrucciones hasta que se cumple cierta condicin. Los bucles de C son el for, el while y do-while. 2.3.1 El bucles for El formato general de la sentencia for es: for(inicializacin; condicin; incremento) sentencia; En su forma ms simple, la inicializacin es un sentencia de asignacin que el compilador usa para establecer la variable de control del bucle. La condicin es una expresin que comprueba la variable de control del bucle cada vez para determinar cundo salir del bucle. El incremento define la manera en que cambia la variable de control del bucle cada vez que se repite el mismo. Se deben separar estas tres grandes secciones usando punto y coma. El bucle for continuar la ejecucin mientras la condicin sea verdad. Una vez que es falsa, la ejecucin del programa, continuar en la sentencia que sigue al for. Ejemplo vamos a sumar los nmeros naturales del 1 al 100: Resultado = 1 + 2 + 3 + 4 + 5 + ..+ 99 + 100 void main(void)

POLITECNIC O

57

Lenguaje C para Microcontroladores PIC

{ char i; int Res = 0; for(i = 1; i 0; i--) Res = Res + i; El incremento podra ser cualquier expresin vlida de C como: i = i + 5 El bucle for a igual que las sentencias anteriormente vistas, se puede aplicar a un conjunto de sentencias, encerrando las mismas entre corchetes. El bucle infinito Uno de los usos mas interesante para el bucle for es crear un bucle infinito. Debido a que ninguna de las tres expresiones que forman el bucle for se dan, se puede hacer un bucle sin fin teniendo la expresin condicional vaca. for( ; ; ;) { sentencias; }

2.3.2 El bucles while 565 6 P POLITECNI GI CO N NA 2

El formato general es: while(condicin) sentencia; donde sentencias, puede ser una sentencia vaca, una sentencia nica o un bloque de setencias que se repetirn. La condicin puede ser cualquier condicin vlida. El bucle itera mientras la condicin sea verdad. Cuando llega a ser falsa, el control del programa pasa a la lnea que sigue al bucle. Como en el bucle for, el bucle while comprueba la condicin en lo alto del bucle, lo que significa que el cdigo del mismo no se ejecutara siempre. Debido a que while realiza la prueba en lo alto, es bueno para situaciones donde no se quiera ejecutar el bucle. La posicin de la prueba elimina la necesidad de realizar una prueba condiciona separada antes del bucle. 2.3.3 El bucles do/while Al contrario del los buches for y while que comprueban la condicin en lo alto del bucle, el bucle do/while la examinan en la parte baja del mismo. Esta caracterstica provoca que un bucle do/while siempre se ejecutara al menos un vez. La forma general del bucle do/while es: do{ sentencias; } while(condicin); 2.4 Anidamiento de Bucles Cuando un bucle est dentro del otro, el bucle ms interno se dice que est anidado. El anidamiento de bucles permite resolver en forma compacta algunos problemas complejos.

POLITECNIC O

57

Lenguaje C para Microcontroladores PIC

2.5 Rompiendo Bucles La sentencia break tiene dos usos. El primer uso es terminar un case en la sentencia switch. El segundo es forzar la terminacin inmediata de un bucle, saltando la prueba condicional normal del bucle. Cuando se encuentra la sentencia break en un bucle, el programa termina inmediatamente el bucle y el control del programa va a la sentencia siguiente al bucle. Ej: for(t=0; t< 100; t++) { U = t + U; if( t == 5 ) break; } ; En este programa se obtiene solo la suma de los 5 primeros nmeros, ya que la sentencia break se ejecuta en la sexta iteracin y corta el bucle. 2.6 La sentencia continue La sentencia continue funciona de manera similar a la sentencia break. Sin embargo a diferencia de break que rompe el bucle, continue fuerza la siguiente iteracin y salta cualquier cdigo entre medias. Ej: for(x = 0; x