Está en la página 1de 35

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Diseo de sistemas microprocesados

Fundamentos del lenguaje ANSI C


Profesor: Mag. Ing. Sergio Salas Arriarn

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Objetivo general del curso

El alumno disea dispositivos electrnicos basados en sistemas embebidos ca resolver problemas de baja y mediana complejidad haciendo uso para esto de lenguaje ANSI C con suma destreza.

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Competencias esperadas en el curso

1. Diseo de hardware basado en el uso del lenguaje ANSI C. 2. Trabajo en equipo. 3. Responsabilidad en el cumplimiento de las tareas y evaluac 4. Honestidad. 5. Motivacin. Recomendaciones para cumplir con las competencias: 1. Asistir a clases puntualmente. NO FALTE, tome en cuenta q temas del curso carecen de bibliografa completa en la we 2. Estudiar constantemente del material de clases. Resolver ejercicios propuestos. 3. Use su placa de desarrollo en casa para practicar diferente No olvide llevarla a todas las clases. 4. Mostrar respeto a sus compaeros y al curso. 5. Participacin activa en clases, HAGA PREGUNTAS.

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Sistema de calificacin

PF = LB1+LB2+LB3+LB4+LB5+LB6+LB7+LB8 min(LB) 7

Donde PF = Promedio final del curso. LBx = Laboratorio calificado N x LB1 : Semana 4 (Evaluacin terica de programacin) LB2 : Semana 5 y 6 (Presentacin del mdulo de desarrollo-Trabajo prctico LC LB3 : Semana 7 (Trabajo prctico Teclado, LCD) LB4 : Semana 10 (Trabajo prctico TIMER 1) LB5 : Semana 12 (Trabajo prctico ADC) LB6 : Semana 14 (Trabajo prctico Puerto SERIE) LB7 : Semana 17 (Trabajo prctico PWM) LB8 : Semana 19 (Trabajo prctico Input Capture)

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Herramientas necesarias para el curso

1. Mdulo de desarrollo basado en el dsPIC30F3014. 2. Cable USB tipo A-B. 3. Software MPLAB IDE. 4. Compilador MPLAB C30. 5. Informacin del curso dada en clase.

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Tipos de variables
Tamao (bits)
1 8 8 16 16 16 16 32 32 32 32

Tipo
bit signed char unsigned char int unsigned int short unsigned short signed long unsigned long float double

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Operadores aritmticos en C
Operador

+ * / % ++ --

Operacin Suma
Resta Multiplicacin Divisin

Residuo
Autoincremento Autodecremento

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Operadores de campo de bit


Operador Operacin

& | ^ ~ <<
>>

AND
OR XOR NOT Corrimiento izquierda Corrimiento derecha

Mag. Ing. Sergio Sala

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Ejemplos de condicionales compuestos


//Si a es mayor que b y a es mayor que c

if ( (a>b) && (a >c) ) { } if ( (a != b) || (a !=c) ) { } if ( a == b) { }

//Si a es diferente de b o a es diferente de c

//Si a es igual a b

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Sentencias iterativas: bucle while()


while (condicin) { Instrucciones }

Ejemplo:

Bucle infinito: while ( 1 ) { Instrucciones }

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

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Sentencias iterativas: bucle do while()


do { Instrucciones }while(condicin); Ejemplo:

Aqu al menos las intrucciones se ejecutan una sola vez si es que la condicin dentro del while() es falsa desde un inicio.

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

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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

También podría gustarte