1. Fundamentos Del Lenguaje ANSI C

download 1. Fundamentos Del Lenguaje ANSI C

of 35

Transcript of 1. Fundamentos Del Lenguaje ANSI C

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    1/35

    Profesor:

    Mag. Ing. Sergio Salas Arriarn

    Diseo de sistemas

    microprocesados

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Fundamentos del lenguaje ANSI C

    Mag. Ing. Sergio Sala

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    2/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Objetivo general del curso

    El alumno disea dispositivos electrnicos basados en sistemas embebidos c

    resolver problemas de baja y mediana complejidad haciendo uso para esto d

    lenguaje ANSI C con suma destreza.

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    3/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    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

    temas del curso carecen de bibliografa completa en la w

    2. Estudiar constantemente del material de clases. Resolver

    ejercicios propuestos.3. Use su placa de desarrollo en casa para practicar diferent

    No olvide llevarla a todas las clases.

    4. Mostrar respeto a sus compaeros y al curso.

    5. Participacin activa en clases, HAGA PREGUNTAS.

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    4/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    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 xLB1 : Semana 4 (Evaluacin terica de programacin)

    LB2 : Semana 5 y 6 (Presentacin del mdulo de desarrollo-Trabajo prctico L

    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)

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    5/35

    Herramientas

    necesarias para el cursoFacultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    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.

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    6/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera ElectrnicaEl 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 Sala

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    7/35

    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.

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    8/35

    Desventajas del uso del lenguaje Cen 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 teneralgunos inconvenientes.

    Los compiladores generan cdigo redundante e

    innecesario que muchas veces no es necesario

    ejecutar.

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Salas

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    9/35

    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().

    }

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    10/35

    Comentarios en ANSI C

    Mag. Ing. Sergio Sala

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    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.*/

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    11/35

    Fin de las sentencias en ANSI C

    Mag. Ing. Sergio Sala

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    En el lenguaje C todas las sentencias deben finalizar con ; ya que de no

    hacerlo el compilador arrojar un error. Por ejemplo:

    a = 5; //Forma correcta

    a = 4 //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.

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    12/35

    Maysculas y minsuculasEn 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; // incorrectochar num entero; // incorrecto

    La forma adecuada sera:

    int sevenseg;

    char num_entero;

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    13/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera ElectrnicaTipos de variables

    Mag. Ing. Sergio Sala

    Tipo Tamao (bits) Rango

    bit 1 0 a 1

    signed char 8 -128 a 127

    unsigned char 8 0 a 255

    int 16 -32768 a 32767

    unsigned int 16 0 a 65535short 16 -32768 a 32767

    unsigned short 16 0 a 65535

    signed long 32 2 147 483 648 a +2 147 483

    647

    unsigned long 32 0 to 4 294 967 295float 32 1.17549E-38 a

    6.80565E38

    double 32 1.17549E-38 a

    6.80565E38

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    14/35

    Declaracin de variablesLas variables por defecto se almacenan en la memoria SRAM. Por esta razn, esrecomendable 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

    }

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    15/35

    El Complemento a 2

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    char b = -8;b = 1111 1000

    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

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    16/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Constantes

    Mag. Ing. Sergio Sala

    Muchas veces, es necesario crear variables cuyo contenido se mantenga esttico. Porejemplo, 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 charcurso[ ] = {A,r,q,u,i,t,e,c,t,u,r,a};

    void main ()

    {TRISB = 0x00;

    TRISD = 0x00

    PORTB = data;

    PORTD = curso[4];

    }

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    17/35

    El comando del preprocesador

    #define

    Mag. Ing. Sergio Sala

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    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; //PORTD = 0

    else

    PORTD = ES_IMPAR; //PORTD = 1

    }

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    18/35

    Operadores aritmticos en C

    Mag. Ing. Sergio Sala

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Operador Operacin

    + Suma

    - Resta

    * Multiplicacin

    / Divisin

    %Residuo

    ++ Autoincremento

    -- Autodecremento

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    19/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Ejemplo de operaciones aritmticas

    Mag. Ing. Sergio Sala

    char a=8, b=-3;

    char c;

    void main( )

    {

    c = a + b; //c = 5c = a b; // c = 11

    c = a * b; // c = -24

    c = a / b; //c = -2

    b = 3;

    c = a / b; // c = 2

    c = a % b; // c = 2c++; // c = 3

    c = a++; // c = 8, a = 9

    c = ++a; // c = 10, a = 10

    c = a- -; // c = 10, a = 9

    c = - -a; // c = 8, a = 8

    }

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    20/35

    Operadores de campo de bit

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Operador Operacin

    & AND

    | OR

    ^ XOR

    ~ NOT

    > Corrimiento derecha

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    21/35

    Ejemplo de operaciones binarias

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    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 > 3; // c = 0001 0101

    }

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    22/35

    Operadores lgicos y relacionales

    Mag. Ing. Sergio Sala

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Operador Operacin

    == Igual a

    != Diferente de

    > Mayor que

    < Menor que

    >= Mayor o igual a

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    23/35

    Ejemplo de operaciones lgicas

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    char a= 15, b=15;

    char c;

    void main(void)

    {

    c = a == b; // c = 1 (Verdadero)c = a != b; // c = 0 (Falso)

    c = a > b; // c = 0 (Falso)

    c = a < b; // c = 0 (Falso)

    c = a >= b; // c = 1 (Verdadero)

    c = a

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    24/35

    Sentencias de seleccin if

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    if ( Expresin)

    Instruccin 1;

    else

    Instruccin 2;

    Condicin verdadera porque elargumento es mayor a 0.

    Caso contrario la condicin es falsa porqu

    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

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    25/35

    Ejemplos de condicionales

    compuestos

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    if ( (a>b) && (a >c) ) //Si a es mayor que b y a es mayor que c

    {

    }

    if ( (a != b) || (a !=c) ) //Si a es diferente de b o a es diferente de c

    {

    }

    if ( a == b) //Si a es igual a b

    {

    }

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    26/35

    Errores comunes con la sentencia

    if

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    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 verda

    por lo cual c = 10.

    No afecta el resultado ya que a>4 = 1 y b>6

    La operacin AND entre ambos valores da

    por tanto la condicin es considerada verda

    y c = 10. Sin embargo, es importante tener

    cuenta que se est realizando la operacin

    y no la operacin lgica.

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    27/35

    La evaluacin de varios estados

    con if

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    unsigned char k = 0;

    void main()

    {

    TRISB = 0xFF;

    while(1)

    { if(PORTB =10 && 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 condicione

    vlida. Una vez hallada la condicin vlida se sale de la sentencias if. Si existen mucha

    evaluar, el anidamiento if-else if puede resultar ineficiente.

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    28/35

    Sentencias de seleccin switch()

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Para resolver el problema de ineficiencia debido a mltiples condiciones posiblespara 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;

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    29/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    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;

    }

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    30/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Sentencias iterativas: bucle forfor (expresin in icial; con dicin de la exp resin, incremento de la expresin){

    Instrucciones

    }

    unsgined char i;

    for (i = 0; i

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    31/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Sentencias iterativas: bucle

    while()while (condicin)

    {

    Instrucciones

    }

    int p = 10;

    while (p

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    32/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Sentencias iterativas: bucle do

    while()Aqu al menos las intrucciones se ejecutan una sola vez si es que la condicin dentrodel 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

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    33/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Sentencias iterativas: goto

    Muy similar a la sentencia goto en lenguaje ensamblador. De la misma manera,

    etiquetas. Cierta literatura sobre el lenguaje ANSI C recomienda no abusar de e

    sentencia dado que podra ocasionar problemas al compilador. En el caso de A

    embebidos esto no aplica ya que la sentencia goto tiene relacin directa con la

    lenguaje ensamblador.

    Ejemplo:

    unsigned char p = 0;

    INICIO:p++;

    if(p

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    34/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    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

  • 7/29/2019 1. Fundamentos Del Lenguaje ANSI C

    35/35

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    M I S i S l

    La sentencia continue

    continue es una sentencia que se utiliza dentro de los bucles iterativos para controlar

    Esta instruccin normalmente se utiliza dentro de un condicional if para generar la sig

    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