curso de programacion en c para microcontroladores pic.pdf

  • Upload
    oscar

  • View
    138

  • Download
    2

Embed Size (px)

Citation preview

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

    JULIO 200404FP27CF153

  • CONTENIDOSCONTENIDOS

    1.1. IDESIDES2.2. BOOTLOADERBOOTLOADER3.3. PLATAFORMAS DESARROLLO DEPLATAFORMAS DESARROLLO DE

    PROYECTOSPROYECTOS4.4. RECORDATORIO DE CRECORDATORIO DE C

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

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

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

    16F87XX16F87XX

    1. IDES1. IDES

  • MPLAB DE MICROCHIPMPLAB DE MICROCHIP

    Se integra de formaautomtica, al instalar elcompilador PCW.

    En versiones anterioresejecutando el comando:

    Cscs +setup.

  • PCWPCW

    Entorno propio de lacasa CCS, que nospermite la edicin y lacompilacin. Incorpora dentro de la

    barra de mens laopcin Tools.

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

    16F87XX16F87XX

    2 .BOOTLOADER2 .BOOTLOADER

  • INTRODUCCIINTRODUCCINN

    Se trata de la construccin de un sistema dedesarrollo de aplicaciones para el PIC16F876sencillo, barato, rpido y eficaz. Programacin del microcontrolador mediante

    el puerto serie, sin necesidad de sacar elmicrocontrolador de la placa de CI (programin circuit).

  • INTRODUCCIINTRODUCCINN

    Para que esto sea posible, deberemos programar eluC por primera y nica vez con un cdigo dearranque llamado BOOTLOADER Con la ayuda del software de comunicaciones

    PICDOWNLOADER, cargaremos los programas en elPIC a travs del puerto serie del PC.

  • Fuente de informacin

    www.microchipc.comwww.microchipc.com

  • www.microchipc.com

  • DESCOMPRIMIR BOOTLOADERDESCOMPRIMIR BOOTLOADER

    Descomprimir el archivoy nos crea una carpetaPIC bootloader con lossiguientes archivos

  • SELECCIONAR EL ADECUADOSELECCIONAR EL ADECUADO

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

  • UN EJEMPLOUN EJEMPLO

    Observemos uno de losObservemos uno de los ficherosficheros: se puede comprobarque adems de un nmero de referencia (63619), elnombre 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

  • PICdownloadePICdownloade

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

  • CARGA DEL fichero .CARGA DEL fichero .hexhex en el PICen el PIC

    Ejecutar desde windows elprograma PICdownloaderPICdownloader .

    El fichero que queremos transferirFILE:...hex,

    El puerto del PC donde hemoscolocado el cable serie decomunicacin

    Seleccionar la velocidad en baudios Pulsar write, el programa

    comenzar a busca el bootloader Resetear el PIC y el programa

    bootloader se activar transcurridos0.2 segundos despus del reset

    Cerrar el programa PICdownloader.

  • PICdownloaderPICdownloader & PCW& PCW

    Si hemos optado porutilizar como entorno dedesarrollo el programaPCW.EXE, es posibleconfigurar el programapara llamar alPICdownloader desdela opcin Tools-Program Chip.

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

    16F87XX16F87XX

    3.3. PLATAFORMAS DESARROLLOPLATAFORMAS DESARROLLODE PROYECTOSDE PROYECTOS

  • SISTEMAS DISPOIBLESSISTEMAS DISPOIBLES

    MicroPIC Trainer.Software de simulacin

    Isis de Proteus.PICKey.

  • MicroPICMicroPIC TrainerTrainer

  • ISIS DE PROTEUS

  • PICKey

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

    16F87XX16F87XX

    4.4. RECORDATORIO DE CRECORDATORIO DE C

  • #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 FUNCIONES

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

    }

    funcion_n(){}

  • #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 salidawhile(1){if(input(PIN_A0))

    rotate_left(&port_b,1);else

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

    }

  • EXPRESIONES DE ASIGNACIN

    Una expresin de asignacin tradicional es dela forma expr1 = expr1 operador expr2, esdecir, 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

  • OPERADORES DE ASIGNACIOPERADORES DE ASIGNACINN

    Operador 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

  • 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

  • OPERADORES RELACIONALESOPERADORES RELACIONALES

    Su misin es comparar dos operandos y darun resultado entero: 1 (verdadero); 0 (falso).

  • OPERADORES RELACIONALESOPERADORES RELACIONALES

    OperadorOperador DescripciDescripcinn< Menor que> Mayor que= Mayor o igual que== Igual a!= Distinto de

  • OPERADORES LOPERADORES LGICOSGICOS

    Al igual que los operadores relacionales, stosdevuelven 1 (verdadero), 0 (falso) tras laevaluacin de sus operandos.

  • OPERADORES LOPERADORES LGICOSGICOS

    Operador Descripcin! No lgico (NOT)&& Y lgico (AND)|| O lgico (OR)

  • OPERADORES DE MANEJO DE BITSOPERADORES DE MANEJO DE BITS

    Estos operadores permiten actuar sobre losoperandos a nivel de bits y slo pueden ser detipo entero (incluyendo el tipo char)

  • 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)

  • Operadores de incremento y decrementoOperadores de incremento y decremento

    Su comportamiento se asemeja a lasinstrucciones de incremento incf f,d delensamblador del controlador PIC 16f8XX oinc variable del Intel 8051.

  • Operadores de incremento y decrementoOperadores de incremento y decremento

    OPERADOR DESCRIPCIN++ Incremento-- Decremento

  • Operadores de desplazamiento de bitsOperadores de desplazamiento de bits

    Estos operadores utilizan dos operandosenteros (tipo int): el primero es el elemento adesplazar y el segundo, el nmero deposiciones de bits que se desplaza.

  • Operadores de desplazamiento de bitsOperadores de desplazamiento de bits

    OPERADOR DESCRIPCIN>> Desplazamiento a la derecha

  • Operadores de direccin & e indireccin *

    Los operadores & y * se utilizan para trabajarcon punteros . El lenguaje C est muyinfluenciado 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 otravariable. Los punteros permiten lamanipulacin indirecta de datos y cdigos

  • Operadores de direccin & e indireccin *

    OPERADOR DESCRIPCIN& De direccin* De indireccin

  • EXPRESIONESEXPRESIONES CONSTANTESCONSTANTES

  • IDENTIFICADORES

  • Expresiones en orden descendente de precedenciaExpresiones en orden descendente de precedencia

  • SINTAXIS DE DEFINICISINTAXIS DE DEFINICIN DE DATOSN DE DATOS

    La sintaxis utilizada para la definicin de losdatos y las funciones es la misma que laempleada en la programacin con ANSII C

  • TIPOS ESTANDAR EN Cunsigned define un nmero de 8 bits sin signounsigned int define un nmero de 8 bits sin signoint define un nmero de 8 bits sin signochar define un nmero de 8 bits sin signolong define un nmero de 16 bits sin signolong int define un nmero de 16 bits sin signosigned define un nmero de 8 bits con signosigned int define un nmero de 8 bits con signosigned long define un nmero de 16 bits con signofloat define un nmero de 32 bits en punto flotanteshort define un bitshort int define un bit

  • 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 ennuestros 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.

  • SENTENCIAS DE C.,

  • SENTENCIA SIMPLE

    expr;

    EJEMPLOi=1;

  • SENTENCIA COMPUESTA

    {SENTENCIA 1;SENTENCIA 2;....................SENTENCIA N;}

  • if else

    if (expr) stmt1;[else stmt2;]

    EJEMPLOif (x==25) x=1;else x=x+1;

    EXPR

    STMT1

    STTM2

    SI

    NO

  • while

    while (expr)stmt;

    EJEMPLOwhile (get_rtcc()!=0)

    putc('n');

    EXPR STMTSI

    NO

  • do while

    do stmt while (expr);

    EJEMPLOdo

    {putc(c=getc());

    } while (c!=0);

    EXPR

    STMT

    SI

    NO

  • forfor(expr1;expr2;expr3)

    stmt;

    EJEMPLOfor (i=1;i

  • 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

  • switch

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

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

    break;default: printf(comando no vlido");

    break;}

  • return

    return [expr];

    return (5);

  • goto

    goto label; goto loop;

    EJEMPLOlabel: stmt; loop: i++;

  • break

    break; El comando break se puede utilizar con los tres

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

    EJEMPLObreak;

  • continue

    continue; El comando continue se puede emplear con

    cualquiera de los tres bucles, pero no con switch. Aligual que antes el programa no ejecuta las sentenciasrestantes del bucle donde se encuentra. En bucles foro while se comienza a ejecutar el siguiente ciclo delbucle. En do While se comprueba la condicin desalida; si se cumple, se comienza el nuevo ciclo.

    EJEMPLOcontinue;

  • 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]

    }

  • DefiniciDefinicin de funcin de funcinn

    El calificador_tipo para una funcin puedenser: void o un especificador de tipo (vase la lista

    anterior de tipos)

  • 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.

    ENTRADA/SALIDA DIGITAL.ENTRADA/SALIDA DIGITAL.

  • EELL PUERTOAPUERTOA Es un puerto bidireccional de 6

    bits, cuyo registro deconfiguracin correspondiente esel TRISA, colocando a 1 el bitcorrespondiente configuramos elpin como salida y a 0 comoentrada. El pin RA4 es una entrada del tipo

    Trigger Schmitt y una salida enmodo colector abierto. El resto depines son todos compatibles conTTL

  • EELL PUERTOBPUERTOB Es un puerto bidireccional de 8 bits,

    cuyo registro de configuracincorresponde con el TRISB, y seconfigura de la misma forma que elpuerto A. Cada uno de los pins tiene la

    posibilidad de programarinternamente una resistencia de Pull-up. Cuatro de los pines del PORTB,

    RB7:RB4, tienen la propiedad deprovocar una interrupcin cuando sedetecta un cambio de nivel en algunade esos pines.

  • EELL PUERTOCPUERTOC

    Es un puerto bidireccional de 8bits, cuyo registro deconfiguracin corresponde conel TRISC, y se configura de lamisma forma que el puerto B. El puerto C esta multiplexado

    con una serie de funciones delos perifricos internos. Lospines de puerto C son del tipoTrigger Schmitt cuando seconfiguran como entrada.

  • DIRECTIVAS DELPREPROCESADOR

  • DIRECTIVAS DEL PREPROCESADORDIRECTIVAS DEL PREPROCESADOR

    Para comenzar describiremos las directivasdel preprocesador, que como sabemos sonordenes dirigidas al compilador y que noaadirn cdigo a nuestros programas. Por lo general facilitan la programacin y casi

    de forma obligatoria debern aparecer entodos nuestros cdigos fuentes

  • #include#include

    Esta directiva hace que el compilador incluya ennuestro 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

  • #byte#byte identificador=xidentificador=x#bit#bit identificador=x.yidentificador=x.y

    Estas directivas crearn identificadores que podremosutilizar 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 de

    memoria x e y su desplazamiento, x puede ser unaconstante u otro identificador.

    #byte puertob=6#bit alarma=5.0

  • #device chip options#device chip options

    Donde chip es el nombre del procesador(PIC16F876, PIC16F84,etc) y options sonmodificadores estndar del dispositivo. En todos los cdigos fuente deberemos

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

  • #define id texto#define id texto

    donde id es un identificador del preprocesadory texto es cualquier texto. Esta directiva seutiliza simplemente para reemplazar elidentificador id con el texto.

    #define rotar(x) (x

  • #fuses#fuses optionsoptions

    donde options vara dependiendo del dispositivo, deentre 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 noafecta a la compilacin, sin embargo, esta informacinse pone en el archivo de salida.

  • #org#org startstart,, endend

    Donde start es la primera y end la ltimadireccin ROM de un rea especfica de lamemoria donde queremos que se fije unafuncin o declaracin de constantes. En nuestro caso utilizaremos esta directiva en

    todos nuestros programas de la siguienteforma:

    #org 0x1FF00, 0x1FFF {}

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

    Donde speed es una constante que indica en herciosla frecuencia del reloj utilizado con el micro,opcionalmente podemos utilizar la funcin restart_wdtpara 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.

  • FUNCIONES DE LIBRERA DE C.,

    E/S DISCRETA, MANIPULACIN DEBIT/BYTES Y RETARDOS

  • E/S DISCRETAE/S DISCRETA

    funciones que manejan unmanejan un bitbit: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.

  • E/S DISCRETAE/S DISCRETA

    las que manejan 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 escribirbytes deberemos utilizar la directiva

    #byte PUERTO = dir. Puerto

  • E/S DISCRETAE/S DISCRETA

    Las que configuran los pines:port_b_pullups(value): activamos o desactivamos

    las Rpull-up del 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.

  • MANIPULACIMANIPULACIN DE BIT/BYTESN DE BIT/BYTES

    Para manipular un bit podemos encontrarnos con:

    bit_clear(var,bit):borra el dgito especificadode 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.

  • manipular unmanipular un bytebyte

    rotate_left(address,byte):rotar a la izquierda unbit de un array o una estructura. El bit MSBpasa a ser el LSB.

    rotate_right(address,byte): rotar a la derechaun bit de un array o una estructura. El bit LSBpasa a ser el MSB.

  • manipular unmanipular un bytebyte

    shift_left(addres,byte,value):desplaza hacia laizquierda 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.

  • Funciones para retardo softwareFunciones para retardo software

    delay_cycles(count): Realiza retardos deciclos 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 valor

    especificado en milcrosegundos (1..65535).Esta funcin no utiliza los timers internos peroes preciso utilizar la directiva #use delayespecificando la frecuencia del reloj.

  • Funciones para retardo softwareFunciones para retardo software

    delay_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

  • RotaciRotacin derecha/izquierda den derecha/izquierda dediodos LEDdiodos LED.

    Realizaremos nuestro primerprograma en C, queconsistir en rotar elencendido de un led atravs de una hilera de 8LEDs conectados al puerto Bdel PIC.Dependiendo de si el pinRA0 del puerto A est acero, la rotacin deencendido ser hacia laderecha , y si est a uno,hacia el sentido contrario, esdecir, hacia la izquierda

  • PROCEDIMIENTOPROCEDIMIENTO

    Llamamos al programa pcw. Editamos el fichero con el

    cdigo fuente y lo salvamoscomo inout.c Seleccionamos del men la

    opcin compile.compile. Si no hay ningn error

    tenemos listo el ficheroinout.hex para cargarlo en elpic.

  • 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

  • Comentemos el programa por partesComentemos el programa por partesmain(){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);

    }}

  • 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 7segmentos 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.

  • #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);

    }}

  • Kbd.c contiene 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 debeser llamada con cierta frecuencia si no queremosperder alguna pulsacin de tecla.

    LibrerLibreraa kbd.ckbd.c (teclados 3x4)(teclados 3x4)

  • Lcd.c contiene 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.

    LibrerLibreraa lcd.clcd.c

  • 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.

    COMUNICACIONES RS232.COMUNICACIONES RS232.

  • COMUNICACICOMUNICACIN SERIEN SERIE

    Esta vez abordaremos como comunicar el PICcon el exterior, a travs del protocolo decomunicaciones RS232. La comunicacin entre equipos se realiza bit a

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

  • TRAMA ENVIADATRAMA ENVIADA

  • TRAMA ENVIADATRAMA ENVIADA

    Bit 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 Paridad par. 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 Paridad impar. 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.o Sin paridad. No se utiliza el bit de paridad.

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

  • COMUNICACICOMUNICACIN SERIEN SERIE

    Trabajaremos con trasmisin serie yasncrona. Primer problema, los niveles de tensin que

    saca 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 CI MAX232

  • MAX232MAX232

    El conexionado delMAX232 al PIC es muysencilla. Sloutilizaremos un puertoserie de los dos que traeel chip. Es decir,emplearemos trespatillas (RX,TX yGROUND) adems dealgunos condensadores.

  • ESQUEMA TESQUEMA TPICO CONEXIONADOPICO CONEXIONADO

  • DIRECTIVAS DEL PREPROCESADORDIRECTIVAS DEL PREPROCESADOR

    La directiva del preprocesado #use RS232 sedebe colocar al principio del programa o enaquel lugar del mismo donde queramos utilizarel puerto serie

  • #use rs232#use rs232

    Un posible ejemplo de utilizacin sera elsiguiente:

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

  • PARPARMETROS USEMETROS USE RS232: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: =Xdonde 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)

  • 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.

  • FUNCIONES DE LIBRERFUNCIONES DE LIBRERAA

    Manejo de cadenas de caracteres: gets(), recoge un cadena de caracteres del puerto

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

    serie. printf(), similar a la funcin del ANSII C pero enva la

    cadena de caracteres por el puerto serie, es necesarioantes de usarla consultar el manual.

  • Ejemplo comunicaciEjemplo comunicacin con el PCn con el PC

    El programa espera a recibirun carcter por el puertoserie, en modo pulling, sinutilizar 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#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

  • EjemploEjemplo

    El 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 puertoserie la respuesta.

    comando accina leer puerto Ab leer puerto Bc leer puerto C

  • #include #use delay(clock=4000000)#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);}

  • 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.

    INTERRUPCIONESINTERRUPCIONES..

  • 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 PORTINT_TBE SCI SERIAL DATA TRANSMITTEDINT_RDA SCI SERIAL DATA RECEIVEDINT_COMP COMPARATOR INTERRUPT

  • FUNCIONES DE LIBRERA

    Por otro lado, mediante las funcionesENABLE_INTERRUPTS( )

    y DISABLE_INTERRUPTS(),tendremos control en el programa principal para permitir

    o no que se atienda la interrupcin. Lo que va dentrodel parntesis en cada una de ellas, es el tipo deinterrupcin que manejamos, permitiendoindividualmente habilitar o no, cada una de lasinterrupciones.

  • EJEMPLO APLICACIN

    Provocaremos una interrupcin externa a travs delpin RB0/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 interrupcin INT_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 alestado normal de reposo hasta que se produce unanueva interrupcin.

  • EJEMPLO APLICACIN

  • #include #use delay(clock=4000000, RESTART_WDT)#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 salidasenable_interrupts(INT_EXT); //hablita int. externaenable_interrupts(GLOBAL); // habilita int globales

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

  • 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.

    CONVERTIDOR A/DCONVERTIDOR A/D..

  • CONVERSIN A/D

    Estos microcontroladores poseen un convertidor A/Dde 10 bits de resolucin y 5 canales de entradamultiplexados El convertidor utilizado es del tipo de aproximaciones

    sucesivas. 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

  • DIRECTIVAS DELPREPROCESADOR

    Dentro de las opciones de configuracin que nosbrinda la directiva #device, configuracin deldispositivo, aparece una opcin que nos permiteespecificar 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)

  • Trabajando con los canales A/D

    1. setup_adc_ports(valor), esta funcinconfigura los pines del puerto A para quesean analgicos, digitales o algunacombinacin de ambos.

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

  • TRABAJANDO CON EL A/D

    3. Despus seleccionamos el canal quequeremos 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.

  • ejemplo

  • #include #device adc=10#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);

    }}

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

  • RECURSOS DEL COMPILADOR

    Nos 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.

  • Modulo CCP

    Modo Captura: Un par de registro CCPx capturanel valor del TMR1 al ocurrir un evento especial en elpin RC2/CCP1 (para el mdulo CCP1) o el pinRC1/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

  • 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.

  • 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 ). o Se utilizan eclusivamente para el modo PWM. En

    ambos 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 2setup_timer2().

  • #include #use delay(clock=4000000) // Frecuencia en Hz del cristal#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(;;);}

  • SEAL DE SALIDA OBTENIDA