curso de programacion en c

Upload: miguelmolinac

Post on 18-Oct-2015

26 views

Category:

Documents


0 download

TRANSCRIPT

  • 5/28/2018 Curso de Programacion en C

    1/130

    CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN C PARAN EN C PARAMICROCONTROLADORES PIC 16F87XXMICROCONTROLADORES PIC 16F87XX

    JULIO 200404FP27CF153

  • 5/28/2018 Curso de Programacion en C

    2/130

    CONTENIDOSCONTENIDOS

    1.1. IDESIDES

    2.2. BOOTLOADERBOOTLOADER

    3.3. PLATAFORMAS DESARROLLO DEPLATAFORMAS DESARROLLO DEPROYECTOSPROYECTOS

    4.4. RECORDATORIO DE CRECORDATORIO DE C

    ........................

  • 5/28/2018 Curso de Programacion en C

    3/130

    CONTENIDOS

    5.5. PROGRAMACIPROGRAMACIN EN C DE LOSN EN C DE LOSMMDULOS DEL PIC16F8XX.DULOS DEL PIC16F8XX.

    ENTRADA/SALIDA DIGITAL.ENTRADA/SALIDA DIGITAL. COMUNICACIONES RS232.COMUNICACIONES RS232.

    INTERRUPCIONES.INTERRUPCIONES.

    CONVERTIDOR A/D.CONVERTIDOR A/D.

    CCP (PWM).CCP (PWM).

  • 5/28/2018 Curso de Programacion en C

    4/130

    CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC

    16F87XX16F87XX

    1. IDES1. IDES

  • 5/28/2018 Curso de Programacion en C

    5/130

    MPLAB DE MICROCHIPMPLAB DE MICROCHIP

    Se integra deformaautomtica, al instalar el

    compilador PCW.

    En versiones anterioresejecutando el comando:

    Cscs+setup.

  • 5/28/2018 Curso de Programacion en C

    6/130

    PCWPCW

    Entorno propio de lacasa CCS, que nos

    permite la edicin y lacompilacin.

    Incorpora dentro de labarra de mens laopcin Tools.

  • 5/28/2018 Curso de Programacion en C

    7/130

    CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC

    16F87XX16F87XX

    2 .BOOTLOADER2 .BOOTLOADER

  • 5/28/2018 Curso de Programacion en C

    8/130

    INTRODUCCIINTRODUCCINN

    Se trata de la construccin de un sistema dedesarrollo de aplicaciones para el PIC16F876

    sencillo, barato, rpido y eficaz. Programacin del microcontrolador mediante

    el puerto serie, sin necesidad de sacar elmicrocontrolador de la placa de CI (program

    in circuit).

  • 5/28/2018 Curso de Programacion en C

    9/130

    INTRODUCCIINTRODUCCINN

    Para que esto sea posible, deberemos programar el

    uCpor primera y nica vezcon un cdigo dearranque llamadoBOOTLOADER

    Con la ayuda del software de comunicacionesPICDOWNLOADER, cargaremos los programas en elPIC a travs del puerto serie del PC.

  • 5/28/2018 Curso de Programacion en C

    10/130

    Fuente de informacin

    www.microchipc.comwww.microchipc.com

  • 5/28/2018 Curso de Programacion en C

    11/130

    www.microchipc.com

  • 5/28/2018 Curso de Programacion en C

    12/130

    DESCOMPRIMIR BOOTLOADERDESCOMPRIMIR BOOTLOADER

    Descomprimir el archivoy nos crea una carpetaPIC bootloadercon lossiguientes archivos

  • 5/28/2018 Curso de Programacion en C

    13/130

    SELECCIONAR EL ADECUADOSELECCIONAR EL ADECUADO

    De todos los ficherosque nos aparecen en lacarpeta, cul de ellosdebo grabar en el PIC?.

  • 5/28/2018 Curso de Programacion en C

    14/130

    UN EJEMPLOUN EJEMPLO

    Observemos uno de losObservemos uno de los ficherosficheros: se puede comprobarque adems de un nmero de referencia (63619), el

    nombre del programa y la versin (bootldr-v25), aparecenel tipo de micro que utilizaremos (16F876-16F877), lafrecuencia del cristal de cuarzo (3.6864Mhz) y lavelocidad de comunicacin entre PC y micro (19200bps).

    63619-bootldr-v25-16F876-77-03.6864Mhz-19200bps.hex

  • 5/28/2018 Curso de Programacion en C

    15/130

    PICdownloadePICdownloade

    La aplicacin PICdownloader,

    que ser la encargada deestablecer la comunicacin entreel PC y la Tarjeta, transfiriendo losficheros .hex de nuestrasaplicaciones.

  • 5/28/2018 Curso de Programacion en C

    16/130

    CARGA DEL fichero .CARGA DEL fichero .hexhexen el PICen el PIC

    Ejecutar desde windows elprogramaPICdownloaderPICdownloader . El fichero que queremos transferir

    FILE:...hex, El puerto del PC donde hemos

    colocado el cable serie decomunicacin

    Seleccionar la velocidad en baudios Pulsar write, el programa

    comenzar a busca el bootloader

    Resetear el PIC y el programabootloader se activar transcurridos0.2 segundos despus del reset

    Cerrar el programa PICdownloader.

  • 5/28/2018 Curso de Programacion en C

    17/130

    PICdownloaderPICdownloader& PCW& PCW

    Si hemos optado por

    utilizar como entorno dedesarrollo el programaPCW.EXE, es posibleconfigurar el programapara llamar alPICdownloaderdesde

    la opcin Tools-Program Chip.

  • 5/28/2018 Curso de Programacion en C

    18/130

    CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC16F87XX16F87XX

    3.3.PLATAFORMAS DESARROLLOPLATAFORMAS DESARROLLODE PROYECTOSDE PROYECTOS

  • 5/28/2018 Curso de Programacion en C

    19/130

    SISTEMAS DISPOIBLESSISTEMAS DISPOIBLES

    MicroPIC Trainer.

    Software de simulacinIsis de Proteus.

    PICKey.

  • 5/28/2018 Curso de Programacion en C

    20/130

    MicroPICMicroPICTrainerTrainer

  • 5/28/2018 Curso de Programacion en C

    21/130

    ISIS DE PROTEUS

  • 5/28/2018 Curso de Programacion en C

    22/130

    PICKey

  • 5/28/2018 Curso de Programacion en C

    23/130

    CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC16F87XX16F87XX

    4.4.RECORDATORIO DE CRECORDATORIO DE C

  • 5/28/2018 Curso de Programacion en C

    24/130

    #DIRECTIVAS DEL PREPROCESADOR//DECLARACIN DE PROTOTIPOS DE FUNCIONES

    //DECLARACIN DE VARIABLES GLOBALES

    // PROGRAMA PRINCIPALmain(){

    variables locales;bloque de sentencias;llamadas a las funciones;

    }// DEFINICIN DE FUNCIONESfuncion_1(){variables locales a funcion_1;bloque de sentencias;llamada a otra/s funciones;

    }

    funcion_n(){}

  • 5/28/2018 Curso de Programacion en C

    25/130

    #include

    #use delay(clock=4000000,RESTART_WDT)

    #byte port_b=6

    #org 0x1F00, 0x1FFF {}//para proteger el cdigomain(){port_b=1;set_tris_b(0x00); // todo el puerto B como salida

    while(1){if(input(PIN_A0))

    rotate_left(&port_b,1);else

    rotate_right(&port_b,1);delay_ms(100);

    }}

  • 5/28/2018 Curso de Programacion en C

    26/130

    EXPRESIONES DE ASIGNACIN

    Una expresin de asignacin tradicional es dela forma expr1 = expr1 operador expr2, es

    decir, i = i + 5. Esta expresin se puederepresentar por otra forma ms corta:

    expr1 operador= expr2;expr1 operador= expr2;

    siguiendo con el mismo ejemplo i += 5

  • 5/28/2018 Curso de Programacion en C

    27/130

    OPERADORES DE ASIGNACIOPERADORES DE ASIGNACINNOperador Descripcin+= Asignacin de suma-= Asignacin de resta

    *= Asignacin de multiplicacin/= Asignacin de divisin%= Asignacin de resto de divisin= Asignacin de desplazamiento a la derecha&= Asignacin de AND de bits

    |= Asignacin de OR de bits^= Asignacin de OR exclusivo de bits~= Asignacin de negacin de bits

  • 5/28/2018 Curso de Programacion en C

    28/130

    OPERADORES ARITMETICOSOPERADORES ARITMETICOS

    OperadorOperador DescripciDescripcinn EjemplEjemploo

    + Suma (enteros o reales) resul = var1 + var2

    - Resta (enteros o reales) resul = var1 - var2

    * Multiplicacin (enteros o reales) resul = var1 * var2/ Divisin (enteros o reales) resul = var1 / var2

    - Cambio de signo en enteros o reales -var1

    % Mdulo; rango = n [A1]% 256

  • 5/28/2018 Curso de Programacion en C

    29/130

    OPERADORES RELACIONALESOPERADORES RELACIONALES

    Su misin es comparar dos operandos y dar

    un resultado entero: 1 (verdadero);

    0 (falso).

  • 5/28/2018 Curso de Programacion en C

    30/130

    OPERADORES RELACIONALESOPERADORES RELACIONALES

    OperadorOperador DescripciDescripcinn

    < Menor que

    > Mayor que= Mayor o igual que

    == Igual a

    != Distinto de

  • 5/28/2018 Curso de Programacion en C

    31/130

    OPERADORES LOPERADORES LGICOSGICOS

    Al igual que los operadores relacionales, stosdevuelven 1 (verdadero), 0 (falso) tras la

    evaluacin de sus operandos.

  • 5/28/2018 Curso de Programacion en C

    32/130

    OPERADORES LOPERADORES LGICOSGICOS

    Operador Descripcin

    ! No lgico (NOT)

    && Y lgico (AND)

    || O lgico (OR)

  • 5/28/2018 Curso de Programacion en C

    33/130

    OPERADORES DE MANEJO DE BITSOPERADORES DE MANEJO DE BITS

    Estos operadores permiten actuar sobre losoperandos a nivel de bits y slo pueden ser de

    tipo entero (incluyendo el tipo char)

  • 5/28/2018 Curso de Programacion en C

    34/130

    OPERADORES DE MANEJO DE BITSOPERADORES DE MANEJO DE BITS

    Operador Descripcin

    ~ Negacin de bits (complemento a 1)

    & Y de bits (AND)

    ^ O exclusivo de bits (EXOR)

    | O de bits (OR)

  • 5/28/2018 Curso de Programacion en C

    35/130

    Operadores de incremento y decrementoOperadores de incremento y decremento

    Su comportamiento se asemeja a lasinstrucciones de incremento incf f,d del

    ensamblador del controlador PIC 16f8XX oinc variable del Intel 8051.

  • 5/28/2018 Curso de Programacion en C

    36/130

    Operadores de incremento y decrementoOperadores de incremento y decremento

    OPERADOR DESCRIPCIN

    ++ Incremento

    -- Decremento

  • 5/28/2018 Curso de Programacion en C

    37/130

    Operadores de desplazamiento de bitsOperadores de desplazamiento de bits

    Estos operadores utilizan dos operandosenteros (tipo int): el primero es el elemento a

    desplazar y el segundo, el nmero deposiciones de bits que se desplaza.

  • 5/28/2018 Curso de Programacion en C

    38/130

    Operadores de desplazamiento de bitsOperadores de desplazamiento de bits

    OPERADOR DESCRIPCIN

    >> Desplazamiento a la derecha

  • 5/28/2018 Curso de Programacion en C

    39/130

    Operadores de direccin & e indireccin *

    Los operadores & y * se utilizan para trabajarcon punteros . El lenguaje C est muy

    influenciado por el uso de punteros. Unpuntero es una variable que contiene ladireccin de una variable o de una funcin, esdecir, es una variable que apunta a otra

    variable. Los punteros permiten lamanipulacin indirecta de datos y cdigos

  • 5/28/2018 Curso de Programacion en C

    40/130

    Operadores de direccin & e indireccin *

    OPERADOR DESCRIPCIN

    & De direccin

    * De indireccin

  • 5/28/2018 Curso de Programacion en C

    41/130

    EXPRESIONESEXPRESIONESCONSTANTESCONSTANTES

  • 5/28/2018 Curso de Programacion en C

    42/130

    IDENTIFICADORES

  • 5/28/2018 Curso de Programacion en C

    43/130

    Expresiones en orden descendente de precedenciaExpresiones en orden descendente de precedencia

  • 5/28/2018 Curso de Programacion en C

    44/130

    SINTAXIS DE DEFINICISINTAXIS DE DEFINICIN DE DATOSN DE DATOS

    La sintaxis utilizada para la definicin de losdatos y las funciones es la misma que la

    empleada en la programacin con ANSII C

  • 5/28/2018 Curso de Programacion en C

    45/130

    TIPOS ESTANDAR EN Cunsigneddefine un nmero de 8 bits sin signounsigned intdefine un nmero de 8 bits sin signointdefine un nmero de 8 bits sin signo

    chardefine un nmero de 8 bits sin signolongdefine un nmero de 16 bits sin signolong intdefine un nmero de 16 bits sin signosigneddefine un nmero de 8 bits con signosigned intdefine un nmero de 8 bits con signo

    signed longdefine un nmero de 16 bits con signofloatdefine un nmero de 32 bits en punto flotanteshortdefine un bitshort intdefine un bit

  • 5/28/2018 Curso de Programacion en C

    46/130

    DIFERENCIA DEL ANSII C

    La nica diferencia a la hora de declarar variables esla aparicin de variables de tipo BOLEAN, de un bit,cuando necesitamos utilizar este tipo de variables en

    nuestros programas deberemos utilizar un tipo noestandar que se denomina SHORT. Es un tipoespecial utilizado para generar cdigo muy eficientepara las operaciones de manejo de bit en I/O. No sepermiten las arrays de SHORT ni los punteros aSHORT. La siguiente tabla muestra la sintaxis para lasdeclaraciones de datos.

  • 5/28/2018 Curso de Programacion en C

    47/130

    SENTENCIAS DE C.,

  • 5/28/2018 Curso de Programacion en C

    48/130

    SENTENCIA SIMPLE

    expr;

    EJEMPLO

    i=1;

  • 5/28/2018 Curso de Programacion en C

    49/130

    SENTENCIA COMPUESTA

    {

    SENTENCIA 1;

    SENTENCIA 2;....................

    SENTENCIA N;

    }

  • 5/28/2018 Curso de Programacion en C

    50/130

    if elseif (expr) stmt1;

    [else stmt2;]

    EJEMPLO

    if (x==25) x=1;

    else x=x+1;

    EXPR

    STMT1

    STTM2

    SI

    NO

  • 5/28/2018 Curso de Programacion en C

    51/130

    whilewhile (expr)

    stmt;

    EJEMPLO

    while (get_rtcc()!=0)putc('n');

    EXPR STMTSI

    NO

  • 5/28/2018 Curso de Programacion en C

    52/130

    do whiledo stmt while (expr);

    EJEMPLO

    do

    {

    putc(c=getc());

    } while (c!=0);

    EXPR

    STMT

    SI

    NO

  • 5/28/2018 Curso de Programacion en C

    53/130

    forfor(expr1;expr2;expr3)

    stmt;

    EJEMPLO

    for (i=1;i

  • 5/28/2018 Curso de Programacion en C

    54/130

    switchswitch (expr)

    {

    case exp1: stmt1;

    case exp2:stmt2;

    case exp3:stm2; .

    .

    case cexpre:stmn;

    [default:stmt;]

    }

    expr

    stmt1 stmt2 stmt3 stmtn

    case exp1 case exp2 default

    stmt

    case expncase exp3

  • 5/28/2018 Curso de Programacion en C

    55/130

    switchswitch (cmd)

    { case 0: printf("cmd 0");

    break;case 1: printf("cmd 1");

    break;

    default: printf(comando no vlido");

    break;

    }

  • 5/28/2018 Curso de Programacion en C

    56/130

    returnreturn [expr];

    return (5);

  • 5/28/2018 Curso de Programacion en C

    57/130

    gotogoto label; goto loop;

    EJEMPLO

    label: stmt; loop: i++;

  • 5/28/2018 Curso de Programacion en C

    58/130

    breakbreak;

    El comandobreakse puede utilizar con los tres

    formatos de bucle yswitch. Cuando el programaalcanza unbreak, se deja sin ejecutar el resto delbucle y se transfiere el control a la sentenciainmediatamente posterior a dicho bucle.

    EJEMPLObreak;

  • 5/28/2018 Curso de Programacion en C

    59/130

    continuecontinue; El comandocontinuese puede emplear con

    cualquiera de los tres bucles, pero no conswitch. Aligual que antes el programa no ejecuta las sentenciasrestantes del bucle donde se encuentra. En buclesforo whilese comienza a ejecutar el siguiente ciclo delbucle. Endo Whilese comprueba la condicin desalida; si se cumple, se comienza el nuevo ciclo.

    EJEMPLOcontinue;

  • 5/28/2018 Curso de Programacion en C

    60/130

    DefiniciDefinicin de funcin de funcinn

    El formato de la definicin de una funcin es como sigue:

    [calificador_tipo] identificador ([especificador_tipo identificador]){

    [cuerpo de la funcin]

    }

  • 5/28/2018 Curso de Programacion en C

    61/130

    DefiniciDefinicin de funcin de funcinn

    El calificador_tipo para una funcin puedenser:

    void o unespecificador de tipo (vase la lista

    anterior de tipos)

  • 5/28/2018 Curso de Programacion en C

    62/130

    CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC16F87XX16F87XX

    5.5. PROGRAMACIPROGRAMACIN EN C DE LOSN EN C DE LOSMMDULOS DEL PIC16F8XX.DULOS DEL PIC16F8XX.

    ENTRADA/SALIDA DIGITAL.ENTRADA/SALIDA DIGITAL.

  • 5/28/2018 Curso de Programacion en C

    63/130

    EELLPUERTOAPUERTOA Es un puerto bidireccional de 6

    bits, cuyo registro deconfiguracin correspondiente esel TRISA, colocando a 1 el bit

    correspondiente configuramos elpin como salida y a 0 comoentrada.

    El pin RA4 es una entrada del tipoTrigger Schmitt y una salida enmodo colector abierto. El resto de

    pines son todos compatibles conTTL

  • 5/28/2018 Curso de Programacion en C

    64/130

    EELLPUERTOBPUERTOB Es un puerto bidireccional de 8 bits,

    cuyo registro de configuracincorresponde con el TRISB, y seconfigura de la misma forma que el

    puerto A. Cada uno de los pins tiene laposibilidad de programarinternamente una resistencia de Pull-up.

    Cuatro de los pines del PORTB,RB7:RB4, tienen la propiedad de

    provocar una interrupcin cuando sedetecta un cambio de nivel en algunade esos pines.

  • 5/28/2018 Curso de Programacion en C

    65/130

    EELLPUERTOCPUERTOC Es un puerto bidireccional de 8

    bits, cuyo registro deconfiguracin corresponde con

    el TRISC, y se configura de lamisma forma que el puerto B.

    El puerto C esta multiplexadocon una serie de funciones delos perifricos internos. Lospines de puerto C son del tipo

    Trigger Schmitt cuando seconfiguran como entrada.

  • 5/28/2018 Curso de Programacion en C

    66/130

    DIRECTIVAS DELPREPROCESADOR

  • 5/28/2018 Curso de Programacion en C

    67/130

  • 5/28/2018 Curso de Programacion en C

    68/130

    DIRECTIVAS DEL PREPROCESADORDIRECTIVAS DEL PREPROCESADOR

    Para comenzar describiremos lasdirectivasdel preprocesador,que como sabemos son

    ordenes dirigidas al compilador y que noaadirn cdigo a nuestros programas.

    Por lo general facilitan la programacin y caside forma obligatoria debern aparecer en

    todos nuestros cdigos fuentes

  • 5/28/2018 Curso de Programacion en C

    69/130

    #include#include Esta directiva hace que el compilador incluya en

    nuestro fichero fuente el texto que contiene el archivoespecificado en . Deberemos utilizarlasiempre que queramos incorporar los ficheros decabecera que contienen las definiciones de todos losregistros internos del microcontrolador que utilicemosen nuestro proyecto, como por ejemplo:

    #include

  • 5/28/2018 Curso de Programacion en C

    70/130

    #byte#byteidentificador=xidentificador=x

    #bit#bitidentificador=x.yidentificador=x.y Estas directivas crearn identificadores que podremos

    utilizar en nuestro cdigo fuente como cualquier enterode 8 bits (byte) o entero corto de 1 bit.

    El identificador referencia a un objeto en la posicin dememoria x e y su desplazamiento, x puede ser unaconstante u otro identificador.

    #byte puertob=6

    #bit alarma=5.0

  • 5/28/2018 Curso de Programacion en C

    71/130

    #device chip options#device chip options

    Donde chip es el nombre del procesador(PIC16F876, PIC16F84,etc) y options son

    modificadores estndar del dispositivo. En todos los cdigos fuente deberemos

    encontrar una directiva como sta indicandopara que microcontrolador es el cdigo.

  • 5/28/2018 Curso de Programacion en C

    72/130

    #define id texto#define id texto

    donde id es un identificador del preprocesadory texto es cualquier texto. Esta directiva se

    utiliza simplemente para reemplazar elidentificador id con el texto.

    #define rotar(x) (x

  • 5/28/2018 Curso de Programacion en C

    73/130

    #fuses#fusesoptionsoptions donde options vara dependiendo del dispositivo, de

    entre las opciones ms comunes podemos encontrar: LP,XT,HS,RC

    WDT,NOWDT PROTECTED, NOPROTECTED, etc...

    Esta Directiva define que fusibles deben activarse enel dispositivo cuando se programe. Esta directiva no

    afecta a la compilacin, sin embargo, esta informacinse pone en el archivo de salida.

  • 5/28/2018 Curso de Programacion en C

    74/130

    #org#orgstartstart,,endend Donde start es la primera y end la ltima

    direccin ROM de un rea especfica de lamemoria donde queremos que se fije unafuncin o declaracin de constantes.

    En nuestro caso utilizaremos esta directiva entodos nuestros programas de la siguienteforma:

    #org 0x1FF00, 0x1FFF {}

  • 5/28/2018 Curso de Programacion en C

    75/130

    #use#usedelay(clockdelay(clock=speed)=speed)

    #use delay (clock=#use delay (clock=speed,restart_wdtspeed,restart_wdt))

    Dondespeedes una constante que indica en herciosla frecuencia del reloj utilizado con el micro,opcionalmente podemos utilizar la funcin restart_wdt

    para que se refresque el WDT durante los procesos deretardo. Utilizaremos esta directiva siempre que queramos usar

    las funciones que incorpora la librera de C paragenerar retardos por software y siempre que debamosespecificar la frecuencia de reloj a la que trabajanuestro micro.

  • 5/28/2018 Curso de Programacion en C

    76/130

    FUNCIONES DE LIBRERA DE C.,

    E/S DISCRETA, MANIPULACIN DEBIT/BYTES Y RETARDOS

  • 5/28/2018 Curso de Programacion en C

    77/130

    E/S DISCRETAE/S DISCRETA

    funciones quemanejan unmanejan unbitbit:input(pin):retorna el valor 0 1 del pin indicado.

    output_bit(pin,valor):colocar el pin indicado a 0 1.output_high(pin): colocar el pin a estado alto 1.

    output_low(pin):colocar el pin a estado bajo 0.

  • 5/28/2018 Curso de Programacion en C

    78/130

    E/S DISCRETAE/S DISCRETAlas quemanejan un byte:

    input_x(): donde x es el nombre del puerto (A, B,...).retorna un int de 8 bits.

    output_x(valor):sacar el valor por el puerto X (A,B,....).

    Nota : estas funciones aparecen en el manual pero no sonreconocidas por el compilador, si queremos leer o escribir

    bytes deberemos utilizar la directiva#byte PUERTO = dir. Puerto

  • 5/28/2018 Curso de Programacion en C

    79/130

    E/S DISCRETAE/S DISCRETA

    Las que configuran los pines:

    port_b_pullups(value): activamos o desactivamos

    lasRpull-updel puerto B.set_tris_x(valor): permite configurar los puertos X (A,

    B,...) para que sus pines sean entradas o salidas. Un 1indica entrada y un 0 salida.

  • 5/28/2018 Curso de Programacion en C

    80/130

    MANIPULACIMANIPULACIN DE BIT/BYTESN DE BIT/BYTESParamanipular un bitpodemos encontrarnos con:

    bit_clear(var,bit):borra el dgito especificado

    de la variable. bit_set(var,bit): pone a uno el digito

    especificado de la variable.

    bit_test(var,bit): retorna el valor del bit de la

    variable indicada.

  • 5/28/2018 Curso de Programacion en C

    81/130

    manipular unmanipular unbytebyterotate_left(address,byte):rotar a la izquierda un

    bit de un array o una estructura. El bit MSB

    pasa a ser el LSB.rotate_right(address,byte): rotar a la derecha

    un bit de un array o una estructura. El bit LSBpasa a ser el MSB.

  • 5/28/2018 Curso de Programacion en C

    82/130

    manipular unmanipular unbytebyteshift_left(addres,byte,value):desplaza hacia la

    izquierda un bit de un array o una estructura. Adiferencia de rotate aqu debemos especificar el valor

    (value) con el que queremos que rellene los huecosdesplazados y byte indica el nmero de bytesimplicados.

    shift_right(addres,byte,value):desplaza hacia laderecha un bit de un array o una estructura.

    swap(value): Intercambia el nible bajo con el nible altodel byte dado. No retorna el resultado, lo deja envalue.

  • 5/28/2018 Curso de Programacion en C

    83/130

    Funciones para retardo softwareFunciones para retardo software delay_cycles(count): Realiza retardos de

    ciclos de instruccin segn el valor indicado encount (1..255). Un ciclo de instruccin es iguala cuatro perodos de reloj.

    delay_us(time): realiza retardos del valorespecificado en milcrosegundos (1..65535).Esta funcin no utiliza los timers internos pero

    es preciso utilizar la directiva #use delayespecificando la frecuencia del reloj.

  • 5/28/2018 Curso de Programacion en C

    84/130

    Funciones para retardo softwareFunciones para retardo softwaredelay_ms(time):realiza retardosespecificando el valor en milisegundos

    (1..65535). Esta funcin no utiliza los timersinternos pero es preciso utilizar la directiva#use delay especificando la frecuencia del reloj

  • 5/28/2018 Curso de Programacion en C

    85/130

    RotaciRotacin derecha/izquierda den derecha/izquierda de

    diodos LEDdiodos LED.Realizaremos nuestro primerprograma en C, queconsistir en rotar elencendido de un leda

    travs de una hilera de 8LEDs conectados al puerto Bdel PIC.Dependiendo de si elpinRA0 del puerto Aest acero, la rotacin de

    encendido ser hacia laderecha , y si est a uno,hacia el sentido contrario, esdecir, hacia la izquierda

  • 5/28/2018 Curso de Programacion en C

    86/130

    PROCEDIMIENTOPROCEDIMIENTO

    Llamamos al programapcw.

    Editamos el fichero con elcdigo fuente y lo salvamoscomoinout.c

    Seleccionamos del men laopcincompile.compile.

    Si no hay ningn errortenemos listo el fichero

    inout.hexpara cargarlo en elpic.

  • 5/28/2018 Curso de Programacion en C

    87/130

    Comentemos el programa por partesComentemos el programa por partes

    #include

    #use delay(clock=4000000,RESTART_WDT)

    #byte port_b=6#org 0x1F00, 0x1FFF {}//para proteger el cdigo

    //del cargador

  • 5/28/2018 Curso de Programacion en C

    88/130

    Comentemos el programa por partesComentemos el programa por partes

    main(){port_b=1;set_tris_b(0x00); // todo el puerto B como salidawhile(1)

    {if(input(PIN_A0))

    rotate_left(&port_b,1);else

    rotate_right(&port_b,1);delay_ms(100);

    }}

  • 5/28/2018 Curso de Programacion en C

    89/130

    MANEJO DE UN DISPLAY DE 7 SEGMENTOSMANEJO DE UN DISPLAY DE 7 SEGMENTOS

    En esta seccin se proponela realizacin de un sencillocontador de 0..9 visualizandola cuenta en un display de 7

    segmentos conectado a lapuerta B. Es decir, realizaremos un

    contador decimal continuo detal manera que vayamosvisualizando los nmeros atravs de dicho display. Paraello conectaremos el PICsegn se muestra en elesquema.

  • 5/28/2018 Curso de Programacion en C

    90/130

    #include #use delay(clock=4000000,RESTART_WDT)#byte port_b=6

    #org 0x1F00, 0x1FFF {}//para proteger el cdigo del cargadormain(){unsigned int const display[10]={0x3f,0x6,0x5,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f};int x=0;set_tris_b(0x00); // todo el puerto B como salidaport_b=0;for(;;)

    {x++;if(x>9) x=0;port_b=display[x];delay_ms(500);

    }}

  • 5/28/2018 Curso de Programacion en C

    91/130

    Kbd.ccontiene dos funciones:kbd_init(): que debe ser llamada antes de utilizar el tecladokbd_getc ( ): que retorna el valor de la tecla pulsada y 0 en

    caso de no pulsar ninguna tecla. Esta funcin debe

    ser llamada con cierta frecuencia si no queremosperder alguna pulsacin de tecla.

    LibrerLibreraakbd.ckbd.c(teclados 3x4)(teclados 3x4)

    LibLibrera l dlcd c

  • 5/28/2018 Curso de Programacion en C

    92/130

    Lcd.ccontiene cuatro funciones:lcd_init() :debe ser llamada antes que ninguna otra

    de las tres funciones.lcd_putc(c): Visualiza el carcter c en la siguiente

    posicin del LCD.Los siguientes caracteres tienen una funcin especial

    \f borrar display\n salto al comienzo de la segunda lnea

    \b mueve el cursor una posicin hacia detrs

    lcd_gotoxy(x,y): Situa el cursor para escribir en la posicin x, y.La posicin superior izquierda es la 1,1

    lcd_getc(x,y) Retorna el carcter que hay en el LCD en laposicin indicada por x, y.

    LibrerLibreraalcd.clcd.c

  • 5/28/2018 Curso de Programacion en C

    93/130

  • 5/28/2018 Curso de Programacion en C

    94/130

    CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC16F87XX16F87XX

    5.5. PROGRAMACIPROGRAMACIN EN C DE LOSN EN C DE LOSMMDULOS DEL PIC16F8XX.DULOS DEL PIC16F8XX.

    COMUNICACIONES RS232.COMUNICACIONES RS232.

  • 5/28/2018 Curso de Programacion en C

    95/130

    COMUNICACICOMUNICACIN SERIEN SERIE Esta vez abordaremos como comunicar el PIC

    con el exterior, a travs del protocolo de

    comunicaciones RS232. La comunicacin entre equipos se realiza bit a

    bit por un par de hilos, uno de ellos dereferencia.

  • 5/28/2018 Curso de Programacion en C

    96/130

    TRAMA ENVIADATRAMA ENVIADA

  • 5/28/2018 Curso de Programacion en C

    97/130

    TRAMA ENVIADATRAMA ENVIADABit de inicio.(start)Bits de datos(7/8).Bit de paridad. Este bit se utiliza para comprobar si los bits

    de datos han sido bien recibidos. Existen estas variantes:o Paridadpar. Si la suma de los bits de datos es par, el bit de

    paridad es 1,si es impar, el bit de paridad es 0.o Paridadimpar. Si la suma de los bits de datos es impar, el bit

    de paridad es 1, si es par, el bit de paridad es 0.oSin paridad. No se utiliza el bit de paridad.

    Bit de paro(stop). Pueden ser uno o dos bits.

  • 5/28/2018 Curso de Programacion en C

    98/130

    COMUNICACICOMUNICACIN SERIEN SERIE Trabajaremos con trasmisin serie y

    asncrona.

    Primer problema, los niveles de tensin quesaca el PIC son de 5 y 0 voltios mientras quela norma RS232 establece como uno lgico unrango posible entre +3 y +12 V y como cerolgico entre -3 y -12 Voltios.

    Solucin, utilizar el CIMAX232

  • 5/28/2018 Curso de Programacion en C

    99/130

    MAX232MAX232 El conexionado del

    MAX232 al PIC es muysencilla. Slo

    utilizaremos un puertoserie de los dos que traeel chip. Es decir,emplearemos trespatillas (RX,TX yGROUND) adems de

    algunos condensadores.

  • 5/28/2018 Curso de Programacion en C

    100/130

    ESQUEMA TESQUEMA TPICO CONEXIONADOPICO CONEXIONADO

  • 5/28/2018 Curso de Programacion en C

    101/130

    DIRECTIVAS DEL PREPROCESADORDIRECTIVAS DEL PREPROCESADOR

    La directiva del preprocesado #use RS232se

    debe colocar al principio del programa o enaquel lugar del mismo donde queramos utilizarel puerto serie

  • 5/28/2018 Curso de Programacion en C

    102/130

    #use rs232#use rs232

    Un posible ejemplo de utilizacin sera el

    siguiente:

    #use rs232(baud= 9600, xmit = PIN_A2, rcv = PIN_A3)

  • 5/28/2018 Curso de Programacion en C

    103/130

    PARPARMETROS USEMETROS USERS232:RS232:

    RESTART_WDT: Refrescar el "perro guardin" mientrasespera recibir un datoINVERT: Invierte la polaridad de los pines serie (No utilizada siempleamos el conversor MAX232)

    PARITY: =X donde X es N, E, o O.(control de paridad por sivamos a detectar errores en la trasmisin)BITS: =Xdonde X es 5-9 (nmero de bits que forman elpaquete a trasmitir; de 5 a 9 por paquete).ERRORS: Si la usamos hace que el compilador guarde en lavariable RS232_ERRORS los errores en la recepcin.

    ENABLE: = pin. El pin especificado estar a nivel alto durantela trasmisin (Empleado en la trasmisin RS485)

  • 5/28/2018 Curso de Programacion en C

    104/130

    FUNCIONES DE LA LIBRERFUNCIONES DE LA LIBRERAA Manejo de caracteres:

    getc(), recoge un carcter del puerto serie.

    putc(), enva un carcter por el puerto serie. kbhit(), nos indica si se ha recibido un carcter

    desde el puerto serie. Nos retorna 1 si se harecibido un carcter y 0 si no.

  • 5/28/2018 Curso de Programacion en C

    105/130

    FUNCIONES DE LIBRERFUNCIONES DE LIBRERAA Manejo de cadenas de caracteres:

    gets(), recoge un cadena de caracteres del puertoserie.

    puts(), enva una cadena de caracteres por el puertoserie.

    printf(),similar a la funcin del ANSII C pero enva lacadena de caracteres por el puerto serie, es necesario

    antes de usarla consultar el manual.

  • 5/28/2018 Curso de Programacion en C

    106/130

    Ejemplo comunicaciEjemplo comunicacin con el PCn con el PC El programa espera a recibir

    un carcter por el puertoserie, en modo pulling, sin

    utilizar las interrupciones.Cuando el carcter recibidoes un nmero (0..9) elnmero ser representado enun display de 7 segmentos.Cuando sea un carcter eldisplay se apagar

    #include #use delay(clock=4000000)#fuses XT NOWDT NOPROTECT

  • 5/28/2018 Curso de Programacion en C

    107/130

    #fuses XT,NOWDT,NOPROTECT#ORG 0x1F00,0x1FFF {} // Reservar Memoria para el Bootloader#byte port_b=6char caracter;unsigned int const display[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x7A};main() {set_tris_b(0);//puerto B como salidaport_b=0; //apaga el display#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)do{

    if(kbhit())//se ha recibido un caracter?{

    caracter=getc();//leer el caracterif(caracter>='0' && caracter

  • 5/28/2018 Curso de Programacion en C

    108/130

    EjemploEjemploEl programa espera a recibir un comando por el puertoserie, en modo pulling, sin utilizar las interrupciones.Alrecibir un comando lo interpreta y enva por el puerto

    serie la respuesta.comando accin

    a leer puerto A

    b leer puerto B

    c leer puerto C

    #include #use delay(clock=4000000)

  • 5/28/2018 Curso de Programacion en C

    109/130

    #fuses XT,NOWDT,NOPROTECT#ORG 0x1F00,0x1FFF {} // Reservar Memoria para el Bootloader#byte port_b=6char caracter;

    unsigned int constdisplay[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x7A};char estado=m;main(){

    set_tris_b(0);//puerto B como salidaport_b=0; //apaga el display#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)do{

    if(kbhit())//se ha recibido un caracter?{ //interpretar el comando

    } // si no seguir con nuestra tarea

    }while(1);}

  • 5/28/2018 Curso de Programacion en C

    110/130

    CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC16F87XX16F87XX

    5.5. PROGRAMACIPROGRAMACIN EN C DE LOSN EN C DE LOSMMDULOS DEL PIC16F8XX.DULOS DEL PIC16F8XX.

    INTERRUPCIONESINTERRUPCIONES..

  • 5/28/2018 Curso de Programacion en C

    111/130

    Directvas usadas.INT_EXT EXTERNAL INTERRUPTINT_RTCC TIMER0 (RTCC) OVERFLOWINT_RB CHANGE ON B4-B7 PININT_AD A/D CONVERTERINT_EEPROM EEPROM WRITE COMPLETEINT_TIMER1 TIMER1 OVERFLOWINT_TIMER2 TIMER2 OVERFLOWINT_CP1 CCP1 CAPTUREINT_CCP2 CCP2 CAPTUREINT_SSP SMART SERIAL PORT (SPI, I2C)INT_PSP PARALLEL PORT

    INT_TBE SCI SERIAL DATA TRANSMITTEDINT_RDA SCI SERIAL DATA RECEIVEDINT_COMP COMPARATOR INTERRUPT

  • 5/28/2018 Curso de Programacion en C

    112/130

    FUNCIONES DE LIBRERAPor otro lado, mediante las funciones

    ENABLE_INTERRUPTS( )

    y DISABLE_INTERRUPTS(),

    tendremos control en el programa principal para permitiro no que se atienda la interrupcin. Lo que va dentrodel parntesis en cada una de ellas, es el tipo deinterrupcin que manejamos, permitiendo

    individualmente habilitar o no, cada una de lasinterrupciones.

  • 5/28/2018 Curso de Programacion en C

    113/130

    EJEMPLO APLICACIN Provocaremos una interrupcin externa a travs del

    pinRB0/INT. Esta pin estara conectado a un pulsadorque en reposo valdra "uno" y al pulsarlo pasara a

    "cero" provocando un flanco descendente en RB0/INTy activando la interrupcinINT_EXT. Normalmente elPIC estar en estado de reposo (SLEEP) saliendo deste al activarse la interrupcin. Es entonces cuandoencender durante 1 segundo un diodo LED situadoen el pin 7 del puerto B. Tras ello el PIC vuelve al

    estado normal de reposo hasta que se produce unanueva interrupcin.

  • 5/28/2018 Curso de Programacion en C

    114/130

    EJEMPLO APLICACIN

    #include #use delay(clock=4000000, RESTART_WDT)#fuses XT,NOPROTECT

  • 5/28/2018 Curso de Programacion en C

    115/130

    #fuses XT,NOPROTECT#ORG 0x1F00,0x1FFF {} // Reservar Memoria para el Bootloader

    #byte port_b=6#bit LED=6.7

    #INT_EXTExt_Int_Handler() // funcin asociada a la interrupcin{LED=1;delay_ms(1000); // led encendido durante un segundoLED=0;

    while(!input(PIN_B0)); //no se sale de la rutina de interrupcin mientras no se suelte elpulsador}

    main(){port_b=0;

    set_tris_b(0x0f); //RB0-RB3 entradas, RB4-RB7 salidas

    enable_interrupts(INT_EXT); //hablita int. externaenable_interrupts(GLOBAL); // habilita int globales

    while(1)sleep(); // a dormir

  • 5/28/2018 Curso de Programacion en C

    116/130

    CURSO DE PROGRAMACICURSO DE PROGRAMACI

    N EN CN EN C

    PARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC16F87XX16F87XX

    5.5. PROGRAMACIPROGRAMACIN EN C DE LOSN EN C DE LOSMMDULOS DEL PIC16F8XX.DULOS DEL PIC16F8XX.

    CONVERTIDOR A/DCONVERTIDOR A/D..

  • 5/28/2018 Curso de Programacion en C

    117/130

    CONVERSIN A/D Estos microcontroladores poseen un convertidor A/D

    de 10 bits de resolucin y 5 canales de entradamultiplexados

    El convertidor utilizado es del tipo deaproximacionessucesivas.La seal analgica de entrada se aplica aun condensador de captura y mantenimiento ("Sampleand Hold") y luego se introduce al conversor A/D,proporcionando el resultado en un registro de 10 bits

  • 5/28/2018 Curso de Programacion en C

    118/130

    DIRECTIVAS DEL

    PREPROCESADORDentro de las opciones de configuracin que nosbrinda la directiva #device, configuracin deldispositivo, aparece una opcin que nos permite

    especificar el nmero de bits que la funcinread_adc() debe retornar. Como ejemplo si queremosque la lectura del convertidor AD nos retorne un valorde 8 bits, deberemos especificarlo en el programa conla siguiente directiva:

    #device (ADC=8)

  • 5/28/2018 Curso de Programacion en C

    119/130

    Trabajando con los canales A/D1. setup_adc_ports(valor),esta funcin

    configura los pines del puerto A para que

    sean analgicos, digitales o algunacombinacin de ambos.

    2. definimos la frecuencia de reloj empleada enla conversin. Podemos hacerlo a travs dela funcinsetup_adc(mode).

  • 5/28/2018 Curso de Programacion en C

    120/130

    TRABAJANDO CON EL A/D3. Despus seleccionamos el canal que

    queremos leer mediante la funcin:

    set_adc_chanel(numero)4. Por ltimo, efectuamos la lectura yconversin gracias a la funcin:read_adc( ).Esta funcin lee el valor digital del conversoranalgico digital.

  • 5/28/2018 Curso de Programacion en C

    121/130

    ejemplo

    #include #device adc=10#fuses HS NOPROTECT NOWDT

  • 5/28/2018 Curso de Programacion en C

    122/130

    #fuses HS,NOPROTECT,NOWDT#use delay(clock=4000000)#ORG 0x1F00,0x1FFF {} /* reserva de memoria para el bootloader*/

    #use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)unsigned long int valor;// programa principalmain(){setup_adc_ports(RA0_ANALOG);setup_adc(ADC_CLOCK_INTERNAL);set_adc_channel(0);valor=read_adc();while(1){

    valor=read_adc();delay_ms(10);

    printf("valor = %lu\r\n",valor);}

    }

  • 5/28/2018 Curso de Programacion en C

    123/130

    CURSO DE PROGRAMACICURSO DE PROGRAMACIN EN CN EN CPARA MICROCONTROLADORES PICPARA MICROCONTROLADORES PIC

    16F87XX16F87XX

    5.5. PROGRAMACIPROGRAMACIN EN C DE LOSN EN C DE LOSMMDULOS DEL PIC16F8XX.DULOS DEL PIC16F8XX.

    CCP (PWM)CCP (PWM)..

  • 5/28/2018 Curso de Programacion en C

    124/130

    RECURSOS DEL COMPILADORNos encontramos que en la librera existencuatro funciones, dos para cada mdulo CCP yuna tercera necesaria para el caso de utilizarel modo PWM, que sera la de configuracindel timer2.

  • 5/28/2018 Curso de Programacion en C

    125/130

    Modulo CCP Modo Captura: Un par de registro CCPx capturan

    el valor del TMR1 al ocurrir un evento especial en elpin RC2/CCP1 (para el mdulo CCP1) o el pin

    RC1/T1OSI/CCP2 (para el mdulo CCP2 Modo Comparacin: Es comparado el valor del

    TMR1 con el valor cargado en un par de registros (16bits), cuando ambos valores coinciden se provoca unevento en los pines RC2/CCP1 o RC1/T1OSI/CCP2.

    Modo Modulacin de Anchura de pulso PWM:Establece el ciclo de trabajo de una seal cuadrada,utiliza el TMR2

  • 5/28/2018 Curso de Programacion en C

    126/130

    Setup_timer2 (modo, periodo, posescale).o Modo permite habilitar el timer 2 y

    establecer el valor del prescaler(1, 4 16).Periodo es un nmero entero entre 0 y 255 yposescaler un nmero entre 1 y 16 quedetermina cuantos resets del timer sonnecesarios para que se provoque unainterrupcin.

  • 5/28/2018 Curso de Programacion en C

    127/130

    Setup_ccp1(mode ) y setup_ccp2( mode).o En ambos casos mode especifica el modo

    de funcionamiento de la unidad de CCP, modocaptura, modo comparacin o modo PWM.

    Set_pwm1_duty ( value) y set_pwm2_duty(value ).

  • 5/28/2018 Curso de Programacion en C

    128/130

    o Se utilizan eclusivamente para el modo PWM. Enambos casos establecemos con value el ciclo detrabajo de la seal de salida por el pincorrespondiente. Value se usa para establecer eltiempo que la seal d salida estar a nivel alto (T1), esun valor de 10 bits (0 a 1023).

    T1=value * (1/clock)*t2div

    Donde:.- clock es frecuencia del oscilador..- t2div: es el valor del prescaler del timer 2 que previamente

    hemos colocado en la funcin de configuracin del timer 2

    setup_timer2().

    #include #use delay(clock=4000000) // Frecuencia en Hz del cristal

  • 5/28/2018 Curso de Programacion en C

    129/130

    #fuses XT,NOWDT,NOPROTECT#ORG 0x1F00,0x1FFF {} //Reservamos mla memoria para el

    //bootloaderunsigned long int valor;main (void){set_tris_c(0);

    setup_timer_2(T2_DIV_BY_16, 124, 16);// El periodo de la//seal PWM de 2 ms.

    setup_ccp1(CCP_PWM); // Configura CCP1 en modo PWMvalor=125;set_pwm1_duty(valor);// La anchura del pulso de .5 ms. (CT=

    //25%)for(;;);}

  • 5/28/2018 Curso de Programacion en C

    130/130

    SEAL DE SALIDA OBTENIDA