You are on page 1of 31

Maestra en ciencias con mencin en Telecomunicaciones

Proyectos de telecomunicaciones en hardware basado en el dsPIC

Fundamentos del lenguaje ANSI C


Profesor: Mag. Ing. Sergio Salas Arriarn

El lenguaje ANSI C
El lenguaje C fue diseado en el ao 1972 en los laboratorios Bell. La intencin

principal fue la de reescribir el sistema operativo Unix de una forma portable,


ya que el Unix fue escrito en lenguaje ensamblador y tena que ser completamente reescrito para cada nueva mquina. El lenguaje C fue basado en lenguajes previos como el B y BCPL, por lo cual la denominacin de C. El xito del C en pequeos procesadores se debe al hecho de no es un lenguaje de alto nivel, sino un macro ensamblador altamente portable, lo cual permite tener la misma flexibilidad que el lenguaje ensamblador ofreciendo casi el mismo nivel de eficiencia. Para un sistema embebido, la aplicacin en C no presenta archivos, sistema

operativo ni editor, en su lugar otra mquina tiene que ser usada para crear y
compilar la aplicacin. El resultado se enva a la mquina definitiva target para que lo ejecute. La mquina usada para compilar la aplicacin es llamada el sistema host y la mquina que ejecuta la aplicacin es conocida como sistema target.

Mag. Ing. Sergio Salas

Ventajas del uso del lenguaje ANSI C en sistemas embebidos


El lenguaje C es universal y por tanto es fcil portar un programa hecho

para un microcontrolador a otro modelo de microcontrolador.

El lenguaje C facilita el trabajo en equipo.


El lenguaje C permite la modularizacin o creacin de libreras especficas para el manejo de perifricos conocidos como el LCD, puerto RS232, Display 7 segmentos, etc. El lenguaje C permite el encapsulado (programas con entradas o argumentos y salidas especficas o retornos). El lenguaje C es una herramienta rpida de programacin. El lenguaje C permite la incorporacin de bloques de ensamblador.

El compilador utiliza todo el set de instrucciones, por lo tanto convierte el

cdigo en C a un programa eficiente en lenguaje ensamblador. Mag. Ing. Sergio Salas

Desventajas del uso del lenguaje C en sistemas embebidos


El lenguaje C ocupa mayor espacio en la memoria

FLASH y requiere un mayor consumo de memoria RAM. Los buenos compiladores tienen un precio, los ensambladores son gratuitos. Los compiladores son programas que pueden tener algunos inconvenientes. Los compiladores generan cdigo redundante e innecesario que muchas veces no es necesario ejecutar.
Mag. Ing. Sergio Salas

Estructura de un programa en C
#include "p30fxxxx.h //Macros para la configuracin de los fusibles _FOSC(CSW_FSCM_OFF & XT_PLL4); _FWDT(WDT_OFF); _FBORPOR(PBOR_OFF & PWRT_16 & MCLR_EN); _FGS(CODE_PROT_OFF); int main() { El programa principal se ingresa dentro de las llaves de la funcin primaria main(). }

Mag. Ing. Sergio Salas

Comentarios en ANSI C
Los comentarios pueden ser de dos tipos: 1. Comentarios de una sola lnea. Haciendo uso del operador // 2. Comentarios que abarcan varias lneas. Haciendo uso del operador /* (inicio del comentario) y */ (fin del comentario) Por ejemplo:
a = 5; //Esto es un comentario al lado de una instruccin. /*Esta es una forma de realizar un comentario compuesto por dos o ms lneas.*/

Mag. Ing. Sergio Salas

Fin de las sentencias en ANSI C


En el lenguaje C todas las sentencias deben finalizar con ; ya que de no hacerlo el compilador arrojar un error. Por ejemplo: a = 5; a=4 //Forma correcta //Error

As mismo, puede haber mas de una instruccin en una sola lnea: a = 4; b = 3; c++; De la misma manera, los espacios en blanco son ignorados por el compilador: a = 5 +2; // Forma correcta

a=5
+ 2; //Tambin es correcto, pero genera desorden en el programa.

Mag. Ing. Sergio Salas

Maysculas y minsuculas
En ANSI C las variables escritas con minsculas son diferentes de las escritas con Letras maysculas. Por ejemplo: Variable variable VARIABLE VARIable variablE Los nombres de las variables jams pueden comenzar con un dgito o llevar espacios en blanco. Por ejemplo:
int 7seg; // incorrecto char num entero; // incorrecto La forma adecuada sera: int sevenseg; char num_entero;

Mag. Ing. Sergio Sala

Tipos de variables
Tipo
bit signed char unsigned char int unsigned int short unsigned short signed long unsigned long float double

Tamao (bits)
1 8 8 16 16 16 16 32 32 32 32

Rango
0a1 -128 a 127 0 a 255 -32768 a 32767 0 a 65535 -32768 a 32767 0 a 65535 2 147 483 648 a +2 147 483 647 0 to 4 294 967 295 1.17549E-38 a 6.80565E38 1.17549E-38 a 6.80565E38

Mag. Ing. Sergio Salas

Declaracin de variables
Las variables por defecto se almacenan en la memoria SRAM. Por esta razn, es recomendable no crear ms variables de las que realmente se necesitan para no malgastar los recursos de memoria.

unsigned char a = 5; //Variable global (puede ser usada en todo el programa float pi = 3.1415; //por las diferentes funciones. void main( ) { char b = -8; //Variable local (solo puede ser usada en el mbito de la // funcin main() unsigned int k = 12000; } void sumar( ) { unsigned char var; var = a +10; //Correcto. a es una variable global. var = b +90; //Error b no existe para esta funcin }

Mag. Ing. Sergio Salas

char b = -8; b = 1111 1000

El Complemento a 2

El nmero 8 en binario es: 0000 1000 Si lo invertimos obtenemos: 1111 0111 Si le sumamos 1 tenemos: 1111 1000 = -8 complemento a 2
De la misma manera si tenemos -8: 1111 1000 Y luego lo invertimos: 0000 0111 Y finalmente le sumamos 1: 0000 1000 Suponga que quiere sumar 5 8. Entonces: 0000 0101 -> 5 1111 1000 ->-8 -------------1111 1101 -> -3 Suponga que quiere sumar -8 y -3. Entonces: 1111 1000 -> -8 1111 1101 -> -3 ------------1111 0101 -> -11

Mag. Ing. Sergio Sala

Constantes
Muchas veces, es necesario crear variables cuyo contenido se mantenga esttico. Por ejemplo, puede recordar las tablas en lenguaje ensamblador en donde se fijaba un mensaje que se poda presentar en la pantalla LCD o el los Displays 7 segmentos. Dicho mensaje se almacenaba en la memoria FLASH. Las variables constantes se almacenan en FLASH y por tanto su contenido no se puede actualizar. Para declarar una variable constante se hace uso del operador const.

const unsigned char data = 10; const temp = 36.5; const char curso[ ] = {A,r,q,u,i,t,e,c,t,u,r,a}; void main () { TRISB = 0x00; TRISD = 0x00 PORTB = data; PORTD = curso[4]; }

Mag. Ing. Sergio Salas

El comando del preprocesador #define


El comando del pre procesador #define es una macro que define un valor constante que puede ser reemplazado por un Alias en todo el programa. El abuso de este tipo de comando no genera ningn gasto en memoria del sistema embebido. La ventaja del uso del #define es que permite mejorar la legibilidad del programa. Ejemplo: #define ES_PAR 0 #define ES_IMPAR 1 unsigned char residuo; void main( ) { TRISB = 0xFF; TRISD = 0x00; residuo = PORTB%2; if(residuo == 0) PORTD = ES_PAR; else PORTD = ES_IMPAR; }

//PORTD = 0 //PORTD = 1

Mag. Ing. Sergio Salas

Operadores aritmticos en C
Operador

+ * / % ++ --

Operacin Suma
Resta Multiplicacin Divisin

Residuo
Autoincremento Autodecremento

Mag. Ing. Sergio Salas

Ejemplo de operaciones aritmticas


char a=8, b=-3; char c; void main( ) { c = a + b; c = a b; c = a * b; c = a / b; b = 3; c = a / b; c = a % b; c++; c = a++; c = ++a; c = a- -; c = - -a; }

//c = 5 // c = 11 // c = -24 //c = -2 // c = 2 // c = 2 // c = 3 // c = 8, a = 9 // c = 10, a = 10 // c = 10, a = 9 // c = 8, a = 8

Mag. Ing. Sergio Salas

Operadores de campo de bit


Operador Operacin

& | ^ ~ <<
>>

AND
OR XOR NOT Corrimiento izquierda Corrimiento derecha

Mag. Ing. Sergio Sala

Ejemplo de operaciones binarias

char a=0b1111 0000, b=0b00110011; char c; void main( ) { c = a & b; // c = 00110000 (AND) c = a | b; // c = 11110011 (OR) c = a ^ b; // c = 11000011 (XOR) c = ~ b; // c = 11001100 (NOT) a = 0b10101100; c = a << 2; // c = 1011 0000 a = 0b10101100; c = a >> 3; // c = 0001 0101 } Mag. Ing. Sergio Sala

Operadores lgicos y relacionales


Operador Operacin
Igual a Diferente de Mayor que Menor que Mayor o igual a Menor o igual a Y

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

O
Negacin

Mag. Ing. Sergio Salas

Ejemplo de operaciones lgicas


char a= 15, b=15; char c; void main(void) { c = a == b; c = a != b; c = a > b; c = a < b; c = a >= b; c = a <= b; c = a && b; c = a || b; c = !a; a = 0; c = !a; }

// c = 1 (Verdadero) // c = 0 (Falso) // c = 0 (Falso) // c = 0 (Falso) // c = 1 (Verdadero) // c = 1 (Verdadero) // c = 1 (Verdadero) // c = 1 (Verdadero) // c = 0


// c = 1

Mag. Ing. Sergio Sala

Sentencias de seleccin if
if ( Expresin) Instruccin 1; else Instruccin 2; Condicin verdadera porque el argumento es mayor a 0.

Caso contrario la condicin es falsa porque el argumento es 0.

if (Expresin) { Instruccin 1; Instruccin 2; } else { Instruccin 3; Instruccin 4; }

Se utiliza la apertura y cierre de la llave cada vez que hay ms de una sentencia dentro del condicional

Mag. Ing. Sergio Salas

Ejemplos de condicionales compuestos


if ( (a>b) && (a >c) ) { } if ( (a != b) || (a !=c) ) { } if ( a == b) { } //Si a es igual a b //Si a es diferente de b o a es diferente de c //Si a es mayor que b y a es mayor que c

Mag. Ing. Sergio Salas

Errores comunes con la sentencia if


unsigned char a = 5, b = 7, c; void main() { if ( a = b) { c = 10; } while(1); } unsigned char a = 5, b=7,c; void main() { if( a > 4 & b > 6) { c = 10; } while(1); }

Error a = b, es decir a = 7 y como es una asignacin vlida el argumento de if es 1 y por tanto la condicin es considerada verdad por lo cual c = 10.

No afecta el resultado ya que a>4 = 1 y b>6 La operacin AND entre ambos valores da 1 por tanto la condicin es considerada verdad y c = 10. Sin embargo, es importante tener e cuenta que se est realizando la operacin A y no la operacin lgica. Mag. Ing. Sergio Salas

La evaluacin de varios estados con if


unsigned char k = 0; void main() { TRISB = 0xFF; while(1) { if(PORTB <10) k = 10; else if(PORTB >=10 && PORTB <=50) k = 50; else if(PORTB >50 && PORTB < 150) k = 100; else if(PORTB >=150 && PORTB < 200) k =150; else k = 200;
} }

El problema de este anidamiento if-else if es que se deben evaluar todas las condiciones vlida. Una vez hallada la condicin vlida se sale de la sentencias if. Si existen muchas evaluar, el anidamiento if-else if puede resultar ineficiente. Mag. Ing. Sergio Salas

Sentencias de seleccin switch()

Para resolver el problema de ineficiencia debido a mltiples condiciones posibles para una variable se puede hacer uso de la sentencia switch() que nicamente evala la opcin correcta y ejecuta las instrucciones especificadas para dicha condicin. La sentencia tiene la siguiente estructura: switch (condicin) { case condicin 1: Instrucciones; break; case condicin 2: Instrucciones; break; case condicin N: Instrucciones; break; default: Instrucciones; Mag. Ing. Sergio Salas

Ejemplo de uso del switch()


unsigned char resul; void main() { TRISB = 0xFF; switch(PORTB) { case 0: resul = 10; break; case 1: resul = 11; break; .. .. case 200: resul = 245; break; default: resul = 0; }

Mag. Ing. Sergio Salas

Sentencias iterativas: bucle for


for (expresin inicial; condicin de la expresin, incremento de la expresin) { Instrucciones } Ejemplos: unsgined char i; for (i = 0; i<10; i++) { k = i; } //k = 9, i = 10 Bucle infinito: for ( ; ; ) { Instrucciones } unsigned char i; for (i = 0; i<=10; i++) { k = i; } //k = 10, i = 11

Mag. Ing. Sergio Salas

Sentencias iterativas: bucle while()


while (condicin) { Instrucciones }

Ejemplo:

Bucle infinito: while ( 1 ) { Instrucciones }

int p = 10; while (p<20) { Instrucciones }

Mag. Ing. Sergio Salas

Sentencias iterativas: bucle do while()


Aqu al menos las intrucciones se ejecutan una sola vez si es que la condicin dentro del while() es falsa desde un inicio.
do { Instrucciones }while(condicin); Ejemplo:

unsgined char a=2,k=0; void main() { k = 5; do { a ++; }while(k<4); } //a = 3

Mag. Ing. Sergio Salas

Sentencias iterativas: goto

Muy similar a la sentencia goto en lenguaje ensamblador. De la misma manera, r etiquetas. Cierta literatura sobre el lenguaje ANSI C recomienda no abusar de es sentencia dado que podra ocasionar problemas al compilador. En el caso de AN embebidos esto no aplica ya que la sentencia goto tiene relacin directa con la m lenguaje ensamblador.

Ejemplo: unsigned char p = 0; INICIO: p++; if(p<100) goto INICIO; Instrucciones

Mag. Ing. Sergio Salas

La sentencia break

Esta sentencia se utiliza para finalizar la iteracin cuando ocurre cierta condici en su interior. Ejemplo: Calcular el factorial de 5. unsigned char fact = 1; void main() { for(i = 1; i<10; i++) { if(i<6) fact = fact*i; else break; } while(1); }

Mag. Ing. Sergio Salas

La sentencia continue

continue es una sentencia que se utiliza dentro de los bucles iterativos para controlar e Esta instruccin normalmente se utiliza dentro de un condicional if para generar la sigu

Ejemplo: Hacer un programa que sume los nmeros pares del 1 al 10.

unsigned char suma; void main() { unsigned char i = 0; for( i = 0; i<=10; i++) { if(i%2 != 0) continue; suma+ = i; } while(1); }

Mag. Ing. Sergio Salas

You might also like