Ucontrol-revista-0010

Embed Size (px)

Citation preview

  • // DESCARGA GRATUITA // "int ao = 3, nmero 10 / DICIEMBRE 2010

  • .staff

  • .staff nmero = 10 ao = 3

    Direccin, Redaccin y Correccin:uControl

    www.ucontrol.com.arDiseo y Diagramacin:

    Alejandro Casanova,Lucas M. Treser

    y [email protected]

    [email protected] Editorial:

    Ariel [email protected]

    David (Leon Pic)[email protected]

    Emiliano [email protected]

    [email protected]

    Gabriel [email protected]

    Hector [email protected]

    Mario [email protected] Martin [email protected] ngel Borrego Trujillo

    [email protected] A. Lopez O.

    [email protected] Flores Calle

    [email protected]

    Descarga Gratuita.Este contenido se rige por la licencia

    de Creative Commons Licencia Creative CommonsAtribucinNo ComercialSin Obras Derivadas 3.0

    Cmo desechar cloruro frrico 0x05Visualizando 3 display de 7segmentos 0x07Tips de programacin enassembler para PICs 0x10Receptor de mandos infrarrojos 0x14Control PID Nivel bsico 0x1CTutorial MPLAB C18 (ii) 0x26Tutorial ASM desde 0 (ii) 0x31Generar seal VGA con un PIC 0x41

    .indice

  • .editor

    ial Es la dcima vez que me siento a escribir un editorial paraque sirva de prlogo de la Revista uControl. Y al igual quelas otras nueve veces, no se por donde empezar.Afortunadamente, este dilema se debe a la abundancia debuenos temas que deberan ser resaltados en estas lineas, yno al bochornoso hecho de disponer solamente de materialde segunda que no me permitira escribir nada bueno sobreel contenido de estas pginas.Esta vez tarde, como ya es nuestra costumbre hemosarmado una seleccin de artculos que estamos seguros vana gustarte. Empezamos por una nota ecolgicamenteimpecable: Como debemos desechar el cloruro frrico queutilizamos para construir nuestros PCBs? Si haces tuspropias placas de circuito impreso, ese es tu artculo. Los quehan intentado realizar algn proyecto en el que se muestrendatos mediante displays LEDs de 7 segmentos habrnluchado con los problemas relacionados con su multiplexado.El artculo de Rodrigo Flores Calle les evitar dolores decabeza en el futuro. Y si programas tus microcontroladoresPIC en ASM, los tips propuestos por Hector Javier y lanueva entrega del tutorial de David te resultarn muy tiles.Pero hay mucho mas para leer: Miguel Angel BorregoTrujillo ha preparado un receptor de mandos infrarrojos,Miguel A. Lopez O. nos explica en que consiste un ControlP.I.D Bsico, y Alejandro Casanova nos trae la segunda partedel Tutorial MPLAB C18. El ltimo articulo incluido en estenmero permite dotar a nuestros proyectos de una salidadirecta a un monitor VGA, mostrando texto en 16 colores.Todo material de primera, sin una sola pgina de desperdicio.

    La calidad del contenido de esta precaria revista,construida mediante muchas horas de esfuerzodesinteresado de los integrantes del staff, no es casualidad.Las personas que participan de este proyecto no solo tienenlos conocimientos necesarios como para exponer temasrelacionados con la electrnica de forma simple y amena,sino que son excelentes personas con la que es unverdadero placer trabajar. A todos ellos, nuevamente, muchasgracias.Nos vemos en el nmero 11.

  • Cmo desecharcloruro frricoMucho se habla en internet sobre como desechar el cloruro frrico o como no hacerlo, sinembargo, casi ninguna de las voces explica idealmente como debe hacerse o por qu, es porello que nos pusimos a investigar para saber como desechar este compuesto adecuadamentetratando de causar el menor impacto posible al medio ambiente.// por: Maximiliano Martin Simonazzi //[email protected]

    ..sustancias qumicas

    / / pgina 0x05

    El cloruro de hierro (III) o tricloruro de hierro(comnmente llamado cloruro frrico o malllamado percloruro frrico o percloruro dehierro) es un compuesto qumico utilizadoindustrialmente en muchas aplicaciones. Enelectrnica se lo utiliza para la realizacin deplaquetas y generalmente se lo utiliza en suestado lquido o si no como un polvo diluidoen agua. Su color es rojo purpreo cuandotrasmite la luz y sus cristales tienen un colorverde oscuro cuando reflejan la luz.Es muy probable que toda persona que sehaya dedicado a la creacin de plaquetaselectrnicas haya tenido contacto o estusando este qumico para realizarlas. Luegode un tiempo de usarlo este lquido pierde suspropiedades y ya no puede ser usado para latarea que se usaba originalmente por lo cualdebe ser desechado, y es aqu cuando todosnos preguntamos Cul es el mtodoadecuado para desechar estos residuos?Es importante saber antes que nada comointeracta el Cloruro Frrico en presencia deotros compuestos. Por su carcter covalenteeste es soluble en disolventes orgnicos. Endisolucin alcohlica se lo conoce comotintura de hierro. Cuando se disuelve en agua,el cloruro frrico sufre hidrlisis y libera calor

    en una reaccin exotrmica. De ello resultauna solucin acida y corrosiva de colormarrn que se utiliza como coagulante en eltratamiento de aguas residuales, para lapotabilizacin del agua, y en la industriaelectrnica para el grabado qumico deplaquetas de circuito impreso. Al disolverse enagua, debera precipitar formando hidrxidode hierro (III), insoluble sin embargo, formauna disolucin coloidal de ese compuesto,que presenta el tpico color pardo de lasdisoluciones de sales de hierro (III). El clorurofrrico anhidro es un cido de Lewis bastantefuerte, y se emplea como catalizador ensntesis orgnicas.Visto lo anterior solo vamos a tomar elejemplo del cloruro frrico disuelto en aguaque es el que realmente nos interesa porquees el que se usa en electrnica.

    Precauciones:En este estado no es muy fuerte y noquema al contacto con la piel, aun as sucontacto prolongado puede irritar levementelas capas superiores de la piel. Al contactocon heridas o los ojos se siente un ardorintenso debido a las quemaduras queproduce, urgentemente hay que limpiar la

  • zona con abundante agua durante 10 minutoso ms. Una vez que la piel fue expuesta alcloruro frrico es muy probable que duranteun tiempo (1 semana aproximadamente) lamisma quede coloreada de un color marrnbien caracterstico, sobre todo en la parte dela unin de las uas con la piel. Es muyrecomendable el uso de guantes durante sumanipulacin.Hay que tener cuidado con la ropa ya que latie al instante y por ms que se la lave va aquedar la mancha en la tela.Es muy corrosivo para los metales ferrososy algunos metales no ferrosos como el cobrey sus aleaciones, es por ello que se debeevitar el contacto del mismo con cualquier tipode metal.Cuando lo hacemos reaccionar con el cobrede una plaqueta, este reacciona formandoCloruro Ferroso y Cloruro Cprico. Paraobtener mejores resultados, la solucin debeser calentada a 25 previamente osimultneamente en un bao calefactor. Si lasolucin se encuentra en buen estado laplaqueta debera flotar sobre la solucin.Tambin es recomendable usar una fuente deaire en el recipiente donde vaya la disolucinpara que de esta manera se oxigene y elataque sea ms efectivo.

    Luego de haber sido usado durante untiempo, veremos un precipitado en elrecipiente donde se alojaba el cloruro frrico,esto es cloruro cprico. Mientras ms clorurocprico haya en el recipiente menor ser el

    poder de ataque de la disolucin. Llegadocierto punto debe ser desechadoadecuadamente.Para no dar ms vueltas sobre el tema,fuimos directamente a contactar a unresponsable de una de las empresas msconocidas en Argentina que comercializa esteproducto, Electroqumica Delta. En estaocasin nos pusimos en contacto con el Ing.Leonardo Eidelson el cual nos explicdetalladamente como debe ser la disposicindel compuesto:"La explicacin es general, si bien cada distritoo provincia tiene su propia reglamentacin sobreel tratamiento de desechos tratndose de unproducto poco peligroso, le sugerimos losiguiente:El desecho del cloruro frrico usado puedehacerse por va de desage de lquidosdiluyndolo en gran cantidad de agua, no menor a50 litros, por litro de cloruro frrico.Si las cantidades son mayores, agregar alrecipiente con el producto usado, una pequeacantidad de hidrxido de calcio (cal) paraneutralizar el producto, con mucho cuidado y conguantes y gafas por si se generan salpicaduras.El agregado de la cal debe hacerse de a poco,ya que se eleva la temperatura y se debe esperarentre agregado y agregado, mezclando concuidado con varilla de plstico o madera.La cantidad que se debe aadir es hastaconseguir que el lquido se decolore. Cuandotermina el agregado se deja reposar hasta quedecante (se va a depositar un slido gelatinoso,mezcla de hidrxidos de hierro y cobre). El lquidose vierte en el sumidero haciendo circularabundante agua. El resto se desecha comoresiduo slido."Sin ms que decirles, esperamos que estanota les haya sido til a todos ustedes y queutilicen estos mtodos para cuidar un pocoms el lugar en el que vivimos.

    .cmo desechar cloruro frrico

    / / pgina 0x06

  • Visualizando 3 displays de 7segmentos mediante registrosde desplazamiento.Utilizar display de 7 segmentos para representar datos numricos de forma visual puede llegar aser algo imprescindible en nuestro proyecto. En esta nota presentamos una de las tantasformas de hacerlo, utilizando registro de desplazamiento y multiplexado, con el fin de ahorrarpines utilizados por el microcontrolador. Adems evaluamos entre 3 posibilidades de registros dedesplazamientos.// por:Rodrigo Flores Calle //[email protected]

    ..circuitos

    / / pgina 0x07

    Normalmente utilizamos un display de sietesegmentos para visualizar datos en forma denmeros, ya sea un display de nodo octodo comn (colocando el pin comn adonde corresponde) encendemos oapagamos los segmentos correspondientespara visualizar un nmero en particular.Podemos usar un decodificador de BCD a7segmentos tal como el 74LS47, 48 o unCMOS CD4511 y obtener el nmero quedeseemos en el display.Lo que en ste artculo pretendemos, esmostrar otra forma de poder visualizar variosdisplays de 7 segmentos, utilizando menospines del microcontrolador. Para este finrecurriremos a un registro de desplazamiento,existen muchos en el mercado, tales como el74LS164, CD4094, 74HC595, etc. Aqutrataremos principalmente el TPIC6595 deTexas Instruments y luego se comparar conotros, porque la mayora de los registros nopueden hacer circular la corriente necesariapara encender leds a 2025mA, que es lacorriente ptima para poder tener un buenbrillo en ellos. Algunos registros entoncesnecesitarn de una circuitera adicional parasuministrar a los leds la corriente ptima parael mejor brillo, tales como transistores oarreglos de transistores como los ULNxxxx.A la vez visualizaremos varios displays,

    sern 3 en realidad, para ello multiplexaremoslos datos de tal manera que podamos ver los3 displays encendidos, utilizando solamente 6pines de un microcontrolador. Vamos atrabajar con el PIC16F88, por ser uno de mispreferidos, en mi opinin, el mejor de los 16Fde 18pines.Para aquellos que no conozcan muy bien elefecto del multiplexado que buscamos ac, loexplicaremos brevemente:Multiplexar, para este nuestro caso,significar enviar por el mismo bus de datos,informacin para 2 o ms dispositivos,entonces tendremos un hardware como este:

    Lo que podemos interpretar de la imagen esque tenemos un bus de datos que sale delmicrocontrolador hacia los displays, y que esel mismo, para todos los displays. De lamisma manera tenemos un bus de control,que nos encender un display a la vez, a unavelocidad que el ojo humano no percibe/ / pgina 0x07

  • .tres displays 7 segmentos

    parpadeos y ve los tres displays encendidos ymostrando cualquier nmero o datoindependientemente del otro, por ejemplopara visualizar el nmero 1.37 hacemos:

    Mediante el bus de control o posicinactivamos el primer display de la derecha(posicin 1), por tanto los otros dos estndesactivados, enviamos los segmentos aencender por el bus de datos, estos datos losreciben todos los displays, pero solamenteuno lo mostrar.Hacemos lo mismo para el siguientenmero a mostrar, ser el display del medio(posicin 2), por el bus de control solo seactivar ste:

    Por ltimo el display de la izquierda(posicin 3), con el dato y la posicin en elbus de datos y control respectivamente.

    Este proceso el microcontrolador lo hace auna frecuencia dada que nos dar comoresultado visualmente en el ojo humano lostres displays encendidos, tambin tiene quever con un efecto en los leds, y es que notienen el suficiente tiempo para apagarse

    completamente.

    Nuestro propsito ahora es el ahorro depines, ya que, para un fin como este,podemos utilizar solamente elmicrocontrolador para las salidas del bus dedatos hacia los displays directamente, lo quenos lleva a usar un puerto completo de 8bits,porque un bit corresponder a un segmentodel display (8 por adicionar el punto decimal),y ms un bit por cada display existente, parael bus de control o posicin.Tenemos entonces, en nuestro caso, 8 + 3 =11 salidas necesarias de nuestromicrocontrolador, que si disponemos de unmicro con pocas salidas y que quizsadicionalmente se trabaje con algunos otroscomponentes, como pulsadores, sensores,etc. los pines ahorrados son muy valiosos.Para ello recurrimos a un registro dedesplazamiento, recibe los datos serialmentey los muestra en forma paralela, es por esoque usaremos el TPIC6595 de Texasmencionado anteriormente, pues este es unregistro de desplazamiento, con las salidascon MOSFETs que pueden entregar lacorriente necesaria para tener un brillo ptimoen los leds del display, ya que muchos de losregistros de desplazamiento no son capacesde suministrar la corriente necesaria, comodescribimos anteriormente.Es muy importante tener la hoja de datosdel TPIC6595 a mano, para poder observarsus caractersticas y funcionamiento.Podemos ver entonces, el principal diagramapara poder manipular el integrado.

    / / pgina 0x08

  • El Pin 9, de nombre G, es el Enable, seactivan las salidas del registro, con un estadobajo en este pin.El Pin 12, de nombre RCK, se encarga depasar los datos cargados serialmente enregistros anteriores, mediante un pulso a nivelalto.El Pin 8, SRCLR, es el Reset de losregistros donde se ha ingresado previamentelos datos serialmente y esperan a serpasados a las salidas mediante el pulso en elpin descrito anteriormente. SRCLR coloca acero todos estos datos previos (mediante unpulso a nivel bajo) antes de ser pasados a lassalidas.El Pin 3, SER IN, es la entrada de datosseriales.El Pin 13, SRCK, es el reloj para el ingresode datos por el pin 3, detecta los datos en elflanco de subida.Los Pines 4 a 7 y 14 a 17, DRAIN0 DRAIN7, son las salidas a drenador abiertode los mosfets correspondientes a cada salidaEl Pin 18, SER OUT, es el mismo valor delbit7 ingresado, que sirve para conectar en

    cascada varios registros de este u otro tipo.Por ltimo los pines de alimentacin y laparticularidad de los pines de tierra LGND yPGND (LogicGND y PowerGNDrespectivamente), y como su nombre dice,Logic se refiere a las tierras de los flipflop ycompuertas internas que tiene el registro, yPower a la tierra de las salidas de Mosfet. Sepuede trabajar entonces con 2 tierras distintaspara aislar elctricamente ambas etapas, estopuede ayudar a manipular quiz cargas querequieran algo extra de consumo de corriente,como Rels por ejemplo u otro dispositivo. Ose puede trabajar con una misma tierracuando no es indispensable, es decir lascargas de las salidas no son pesadas, comoen nuestro caso, entonces se realizan lospuentes respectivos entre estos pines LGNDy PGND.El lenguaje de programacin que usaremoses C de CCS Compiler. Una posible rutinaque podemos utilizar para enviar los datos deforma serial al registro de desplazamientopuede ser la siguiente:

    .tres displays 7 segmentos

    / / pgina 0x09

  • void cargar(int datob){int contadoroutput_low(srck)delay_cycles(2)output_low(rck)for(contador=0contador>=1output_high(srck)delay_cycles(1)output_low(srck)

    }output_high(rck)delay_cycles(1)output_low(rck)

    }

    En la cabecera de nuestro programa sedefinirn los pines correspondientes del micropara el bus de control hacia el TPIC6595.

    El hardware que usaremos es el siguiente:

    Se utilizar displays de nodo comn, conlas respectivas resistencias para proteccinde los Leds de los displays, y con transistoresen los nodos para encender cada display, yaque no se lo puede tratar directamente desdepines del microcontrolador, por la corrienteque ste debera suministrar. Un display queposee todos sus segmentos encendidosconsumir 25mAx8=200mA, y si loconectamos directamente al microcontroladordar fin a su vida. Entonces el transistor depropsito general PNP 2N3906 nosgarantizar la corriente adecuada para lossegmentos sin estropear el microcontrolador.La aplicacin que haremos es sencilla,consistir en un contador que desbordar eltimer0 a un preescaler de 256 y cada cuatroveces que ocurra tal desborde la cuenta irascendiendo. El contador entonces seincrementar aproximadamente cada262.144ms:256(timer0, de 8bits)x256(preescaler)x4(variablecount)x1us(Fosc) = 262.144ms

    .tres displays 7 segmentos

    / / pgina 0x0A

  • El cdigo definitivo ser:#include #fusesXT,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP,NOFCMEN,NOIESO,NODEBUG,NOPROTECT,#use delay(clock=4M)#use fast_io(a)#use fast_io(b)#define srck PIN_A1#define rck PIN_A2#define ser_in PIN_A0unsigned int const LED[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1F,0x01,0x09}int uni=0,dec=0,mil=0,count=0void cargar(int datob)void mostrar(void)#int_timer0void isr_timer0(void){count++if(count>3){uni++if(uni>9){uni=0dec++if(dec>9){dec=0mil++if(mil>9)mil=0

    }}count=0

    }}void main(void){setup_adc(adc_off)set_tris_a(0b111000)set_tris_b(0b11111000)output_a(0)output_b(0b00000111)setup_timer_0(rtcc_internal | rtcc_div_256)set_timer0(0)clear_interrupt(int_timer0)enable_interrupts(int_timer0)

    enable_interrupts(global)while(true){mostrar()

    }}void mostrar(void){cargar(LED[uni])output_low(pin_b2)delay_ms(1)output_high(pin_b2)delay_ms(1)cargar(LED[dec])output_low(pin_b1)delay_ms(1)output_high(pin_b1)delay_ms(1)cargar(LED[mil])output_low(pin_b0)delay_ms(1)output_high(pin_b0)delay_ms(1)

    }void cargar(int datob){int contadoroutput_low(srck)delay_cycles(2)output_low(rck)for(contador=0contador>=1output_high(srck)delay_cycles(1)output_low(srck)

    }output_high(rck)delay_cycles(1)output_low(rck)

    }Ahora explicaremos un poco sobre eldisplay, en particular sobre los datos deldisplay. Como ya sabemos, los displaysutilizados son de nodo comn. El nodo seconecta a Vcc o en nuestro caso a untransistor PNP con el emisor a Vcc y elcolector al nodo (+).Esto quiere decir que, para encender unsegmento debemos enviar un cero a ste

    .tres displays 7 segmentos

    / / pgina 0x0B

  • para que se establezca la polarizacin del leddel segmento correspondiente y de estamanera veamos el led de ese segmentoencendido. Pero hay que considerar que elTPIC posee salidas MOSFET a drenadorabierto y son de canal N, por tanto estassalidas las estaremos colocando con el led yresistencia de 220 Ohm correspondiente,como pullup a travs del PNP con el emisor aVcc. Y como al trabajar con mosfets de canalN en las salidas del TPIC, debemos invertir lalgica de entrada, como si trabajramos condisplays de ctodo comn.Ya que para obtener el cero quenecesitamos en la salida del TPIC, en estecircuito en particular, el transistor mosfetdeber recibir un 1 lgico en su gate.Por ejemplo, para ver un 8 en el display,todos los segmentos deben estar encendidos,entonces debemos mandar a las entradas delos Mosfet 1s lgicos. Los datos queguardaremos en el programa para el microsern como si fueran para displays de ctodocomn. Esta es la esquematizacin de lo quetendremos:

    Esto es lo que sucede si en la entrada delgate del mosfet de salida tenemos un 0 o un1 lgico, la entrada del gate se correspondedirectamente con el dato serial ingresado.

    Como bien sabemos un display de leds desiete segmentos nombra a cada led como a,b, c, d, e, f, g y DP o h al punto en caso deexistir.

    Tomaremos al segmento a como el mssignificativo, y nuestros datos para este casosern:

    Que lo tenemos definido como constante enel cdigo del programa para el micro:

    unsigned int const LED [10]={0xfc, 0x60,0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe,0xf6}

    .tres displays 7 segmentos

    / / pgina 0x0C

  • Y con eso ya tenemos losdatos para nuestros displaysde nodo comn listos paraser enviados y mostrados.Ahora una vez explicadotodo lo anterior nos faltadetallar un poco el programa,comprendiendo todas lasanteriores ideas, podemosresumir el funcionamiento delprograma para elmicrocontrolador como:1. Inicializacin del micro,puertos I/O, timer0,interrupciones.2. Cargamos valor de unidadesal registro (funcin cargar)3. Encendemos el display deunidades, mediante sutransistor4. Esperamos un tiempo paraque sea visible al ojo humano5. Apagamos el display deunidades, mediante sutransistor6. El transistor toma un tiempoen apagarse, entoncesaguardamos7. Repito pasos del 2 al 6 perocon decenas y su displaycorrespondiente8. Repito pasos del 2 al 6 perocon centenas y su displaycorrespondiente9. Vuelvo al paso 2Contino mostrndolesunas fotos del circuitoarmado y funcionando, y unacomparacin del mismocircuito armado condiferentes componentes:

    1. Primero nos vamos con el TPIC6595 de texas:

    2. Ahora cambiamos el TPIC por un registro CD4094

    3. Como puede verse los leds no tienen el brillo suficiente.Podemos solucionar esto agregando un ULN2803:

    4. Los registros 74HC595 se caracterizan por tener una mejorsalida de corriente en sus salidas, y eso lo demuestra lasiguiente imagen:

    5. Si se coloca un ULN2803 junto al 74HC595, se ve idnticoa la anterior imagen. Pero probablemente con un circuito sin elULN se exige un poco en corriente al chip y no dura mucho,

    .tres displays 7 segmentos

    / / pgina 0x0D

  • dado que la hoja de datos nos dice que nosoporta tanta corriente.Entonces entre estos 3 registrosanalizados, la diferencia es la cantidad decorriente que pueden entregar o recibir, elCD4094 siempre va a necesitar de un ULNpara darle ms brillo a los led's, en cambio el74HC595 puede no necesitar del ULN. ElTPIC puede que sea difcil de conseguir enlas tiendas de electrnica cerca de casa, hayque, o bien comprarlo de una web odirectamente del fabricante TexasInstruments. En mi caso lo obtuve mediantemuestras gratuitas que puede enviar elfabricante. Los TPIC si garantizan una buenacorriente que pueda circular por sus pines desalida.Debo aclarar que para los 3 registros seusa el mismo cdigo, solo que, cuando el4094 y el 595 estn sin ULN, se debe invertirla lgica de los datos que se mostrarn en losdisplays.

    .tres displays 7 segmentos

    / / pgina 0x0E

  • TIPS de programacin enASSEMBLER para PICEn el presente artculo, presentaremos una serie de Tips de programacin en lenguajeensamblador o assembler para los microprocesadores PIC de Microchip con palabras deinstruccin de 12 y 14 bits.// por: Hector Javier (HJ) //[email protected]

    ..programacin

    IntroduccinSon pequeos trucos que ayudan a realizaroperaciones no previstas originalmente dentrodel lenguaje como instrucciones,complementando de este modo lasinstrucciones y pseudoinstrucciones quereconoce el lenguaje ensamblador deMicrochip.Unas de las carencias a la hora deprogramar en assembler, es que noencontramos instrucciones para trabajardirectamente con W, siendo este registro elms utilizado, como por ejemplo incrementaro decrementar W.Algunos de estos Tips pueden serguardados como macros con un nombre msrepresentativo, lo que deriva en un cdigoms entendible. El nombre de dichas macrosse erigirn de tal forma que coincidan en elformato con la terminologa de utilizada porMicrochip. Empecemos!TIP#1Incrementar W: addlw 0x01 Definimos el nombre de la macro para incrementar Wincw macro

    addlw 0x01endm Fin de la macro

    En nuestro programa si necesitamosincrementar W, simplemente escribimos incwen lugar de addlw 0x01, lo que hace msentendible nuestro programa. Esto esaplicable al resto de los Tips.

    TIP#2Decrementar W: addlw 0xFF Definimos el nombre de la macro para decrementar Wdecw macro

    addlw 0xFFendm Fin de la macro

    TIP#3Invertir o complementar W: xorlw 0xFF Definimos el nombre de la macro para invertir Wcomw macro

    xorlw 0xFFendm Fin de la macro

    TIP#4Igualdad de W con un literal: Con esta rutinadeterminamos si el contenido de W es igual o

    / / pgina 0x10

  • .tips de programacin assembler

    distinto a un literal. Realizamos una ORExclusiva entre W y el literal, para luegocomparar el bit Z del registro STATUS.Definimos el nombre de la macrotstwkse macro

    xorlw kbtfss STATUS,Z Salta si son igualesendm Fin de la macro

    Test W=K skip Equals: Verificar si W=k,saltar si son igualesSi no deseamos utilizar una macro,podemos escribir el cdigo que mostramos acontinuacin:

    xorlw kbtfss STATUS,Zgoto rutina_distintosgoto rutina_iguales

    TIP#5Verificar si el contenido de W es 0x00: Estarutina nos permite determinar si el contenidode W es cero, sin necesidad de utilizar otroregistro. En primer lugar le adicionamos0x00 a W y luego verificamos si el bit Z delregistro STATUS est a 1Definimos el nombre de la macrotstwsz macro

    addlw 0x00btfss STATUS,ZSalta si W = "0x00"endm Fin de la macro

    test w skip zero: Verificar W, saltar si es ceroDefinimos el nombre de la macrotstwsnz macro

    addlw 0x00btfsc STATUS,Z Salta si W 0x00endm Fin de la macro

    test w skip no zero: Verificar W, saltar si esdistinto de ceroAquellos lectores que no deseen utilizar lamacro propuesta, pueden usar el siguientecdigo:

    addlw 0x00btfss STATUS,Zgoto w_distinto_a_cerogoto w_igual_a_cero

    TIP#6Poner a 1 algunos bits de W: Para poner a1 algunos bits determinados de W, se haceun iorlw con un literal que tenga a uno losbits a modificar y a cero los que debenpermanecer igual.Por ejemplo, si se desean poner a 1 el bit0 y el bit 4 del registro W, se debe realizarescribir:iorlw 0x11 ( o lo que es lo mismo: iorlwB00010001)Con lo que nos aseguramos que los bits 0 y4 de W tendrn un 1 sin afectar al resto delos bits.

    TIP#7Poner a 0 algunos bits de W: Para poner a0 algunos bits determinados de W, se haceun andlw con un literal que tenga a cero losbits a modificar y a uno los que debenpermanecer igual.Por ejemplo, si se desean poner a 0 laparte alta registro W sin afectar el contenidode la parte baja, se debe realizar escribir:andlw 0x0F ( que es equivalente a: andlwB00001111)

    TIP#8Hallar el complemento a 2 de W: En estecaso primero invertimos W y luego leadicionamos 1, logrando el complemento a 2de W. Definimos el nombre para complementar a 2W.com2w macro

    xorlw 0xFFaddlw 0x01endm Fin de la macro

    / / pgina 0x11

  • TIP#9Invertir un BIT: Algo que notamos al trabajarcon las instrucciones de BIT, es quesolamente tenemos las dos que nos permitenestablecer el valor del bit y las dos que nospermiten conocer su estado. Sin dudaextraamos una que nos permita invertir un bitdeterminado, sin importar el estado inicial ysin modificar el resto de los bits en el proceso.El invertir el estado de un bit es simple, esms complicado explicarlo que hacerlo, setestea si vale 1, de ser as se salta a unalnea de cdigo que lo pone en 0, casocontrario, se salta a una lnea de cdigo quelo pone a 1 Definimos el nombre de la macroinvb macro bit_a_invertir

    btfss bit_a_invertirgoto $+3bcf bit_a_invertirgoto $+2bsf bit_a_invertirendm Fin de la macro

    Para utilizar esta macro, debemos llamarladesde nuestro programa, con su nombreseguido del bit a invertir, por ejemplo sideseamos invertir el bit 3 del registroPORTB, debemos escribir:invb PORTB,3

    Conviene aclarar para los que no estnfamiliarizados con las MACROS, que estas nosuponen un ahorro en la memoria deprograma, solamente hacen ms legible elprograma, ya que al ser ensamblado, elnombre de la macro es reemplazado por sucontenido. Esto significa que en el ejemploanterior invb PORTB,3 ocupa 5 posicionesen la memoria de programa.Si no deseamos utilizar una macro,utilizando el mismo ejemplo, debemos escribirlo siguiente:btfss PORTB,3goto $+3bcf PORTB,3goto $+2bsf PORTB,3

    Para finalizar, incluimos la tabla de pseudoinstrucciones para Microcontroladores PICcon palabras de instruccin de 12 y 14 bits.

    .tips de programacin assembler

    / / pgina 0x12

  • http://www.ucontrol.com.ar/forosmf/tiendaucontrol/

  • Receptor de mandosinfrarrojosLa intencin del artculo es la de explicar cmo realizar un sistema receptor de infrarrojos, quesea capaz de descodificar un protocolo especfico de cualquier mando a distancia comn encualquier hogar. Tambin implementaremos un pequeo sistema por contrasea.// por: Miguel ngel Borrego Trujillo //correo autor

    ..proyectos

    Para realizar dicho receptor, utilizaremos unmicrocontrolador de la empresa Microchip,concretamente el PIC16F877. Podramoshaber utilizado cualquier otromicrocontrolador, pero escog estemicrocontrolador porque es el que tena adisposicin.Una vez determinado el protocolo yhabiendo estudiado las caractersticas delPIC, estableceremos qu elementos (pines,registros, interrupciones...) deberemos utilizary qu requerimientos de hardware adicionalnos harn falta para desarrollar las tareasrequeridas.

    Introduccin a la solucin:Sabiendo cul es el proyecto que debemosrealizar, tenemos que fijar unos objetivos parallevar a cabo el trabajo de una maneraorganizada.Los objetivos para el correcto del desarrollodel trabajo son:

    1. Concretar el protocolo de comunicacin.2. Estudio del protocolo de comunicacin.3. Definir el hardware y circuitera necesaria.4. Implementar el programa.5. Simulacin del circuito.

    6. Test del circuito en protoboard.7. Desarrollo final en una placa agujereada o pcb.Concretar el protocolo de comunicacin.El protocolo de comunicacin que usaremospara realizar a cabo la comunicacin entre elemisor y el receptor, es el cdigo SIRC, queha desarrollado la empresa SONY y es elmismo protocolo que encontramos en losmandos de infrarrojos que esta empresafabrica y distribuye.Estudio del protocolo de comunicacinSIRC 12bits:Podemos observar cmo est estructurado

    el cdigo SIRC, que es un cdigo quedistribuye los bits que enva en dos partes, elcomando y la direccin. Para empezar lacomunicacin se enva una seal de 'START'que consiste en un pulso en alto de 2400 us yun pulso en bajo de 600 us, seguidamente seenvan los datos. Para enviar un 1 se generauna seal en alto de 1200 us y uno en bajo de600 us, para enviar un 0 se genera una seal/ / pgina 0x14

  • .receptor de mandos infrarrojos

    en alto de 600 us y uno en bajo de 600 us.En la imagen anterior podemos observarcmo se envan los bits menos significativos(LSB) hacia los ms significativos (MSB) delcomando y la direccin. Utilizando la imagende ejemplo Adress = 00001 i Command =001001. ste protocolo es de 12 bits dedatos, 7 bits de comando y 5 bits de direccin.El comando nos indica la accin a realizar y ladireccin nos indica el dispositivo que deberecibir el comando.

    En la generacin del seal, ste se modulaa una frecuencia de 40 Khz segn la normadel protocolo y posteriormente se demodulacon el sensor de infrarojos como podemos veren la imagen.Definicin del Hardware y circuiteranecesaria.Para poder recibir correctamente los datosse necesita un sensor de infrarrojos, que nosacondicione la seal enviada por el emisor. Elsensor elegido para hacer este trabajo es elTSOP1740 aunque este podra ser sustituidopor cualquier otro sensor que recibainfrarojos. Los dos ltimos nmeros delnombre del sensor corresponden a lafrecuencia de demodulacin en la que trabajael sensor. Otro elemento importante es el PIC.En este caso decid utilizar el PIC16F877 yaque es el microcontrolador que tena. Paraacabar, el ltimo elemento importante delhardware sera el LCD ya que por stemostraremos los datos que enviaremos atravs del emisor.Otros elementos necesarios son lossiguientes: las pilas, el portapilas, los bornesde alimentacin, el cristal de cuarzo, loscondensadores, los botones, el potencimetropara el display y las resistencias de PULLUP.

    El siguiente paso despus de definir elhardware necesario corresponde a decidircmo conectaremos los diferentes elementosentre ellos. De los diferentes pines de entrada/ salida que tenemos, decidiremos qu pinesutilizaremos, ya que el 16F877 tiene 5puertos.El sensor TSOP1740 tiene 3 pines,alimentacin, masa y salida. Como quierodeterminar el tiempo de los diferentes pulsosque nos llegan del sensor, he decididoconectar la salida del sensor a la pata RB0del PORTB, ya que este pin nos genera unainterrupcin cada vez que nos llega un flancode subida o de bajada, segn el flancoconfigurado en el programa. Cabe destacarque el sensor TSOP1740 invierte la seal desalida, cuando recibe seal infrarroja nospone un 0 a la salida y cuando no recibe nospone un 1 (lo tendremos que tener en cuentaen el programa).El display LCD que disponemos, estconstituido por 16 pines que son alimentacin,masa, contraste, habilitacin, lectura /escritura, comando / direccin, 8 pines dedatos y 2 pines del backlight. De los 8 pinesde datos slo utilizaremos los 4 pines demayor peso y los conectaremos al PORTD,debido a que la librera que el programa CCSincorpora hace funcionar el LCD a 4 bits conel PORTD.De los 5 botones, 4 los utilizar para haceruna proteccin mediante contrasea

    / / pgina 0x15

  • conectados a los 4 bits altos del PORTB, yaque utilizar la interrupcin por cambio deestado que estos 4 pines me generan alhaber algn cambio en estos. El botn quequeda lo conectar al pin de reset (MCLR).Estos pulsadores estarn conectados a lospines correspondientes mediante resistenciasde PULLUP de 10k.El resto de conexiones son las conexionesbsicas del oscilador, los condensadores y lasalimentaciones de los diferentes elementos.

    Lista del hardware necesario:1 LCD 16x21 PIC16F8771 Cristal 4MHz5 Resistencias 10K ohm1 Condensador 100nf (Alimentacin)5 Pulsadores1 Resistencia 330 ohm1 Led rojo (On / Off)1 Receptor TSOP17401 Potencimetro (Contraste LCD)1 Portapilas

    Ejemplo de conexionado en Proteus:

    Configuracin para emulacin de cdigoSIRC en simulacin:

    .receptor de mandos infrarrojos

    / / pgina 0x16

  • Implementacin del programa.El programa lo deberemos de estructurarmuy bien para no perdernos durante laprogramacin y para posteriormente poderdetectar los errores de programacin msrpido y poder hacer los retoques oportunos.La estructura del programa est basada endiferentes funciones que ir explicando.1) Rutina de interrupcin por flanco.Lo que hacemos en esta rutina esconfigurar la interrupcin para que se activecon un flanco de bajada ( ya que el sensornos invierte el seal), si hemos recibido unflanco de bajada ponemos el TIMER0 a 0 yestablecemos una interrupcin para detectarun flanco de subida. Una vez se recibe elflanco de subida guardamos el tiempo entre

    los dos flancos en una variable llamadatiempo. Despus de esto detectamos si elvalor de la variable tiempo cumple losrequisitos de START dentro de un intervalo.Si cumple ponemos un flag llamado START a1. A partir de aqu ya podemos rellenar lapalabra de cdigo de 12 bits con unos y ceroscomparando los valores de la variable tiempo.Si obtenemos un valor de 600 us lecorresponde un 0, si obtenemos un tiempo de1200 us le corresponde un 1. Al TIMER0 se leha puesto un divisor de 16 para nosobrepasar su valor mximo de 255 cuandonos llegue el START (que es el pulso quems dura).

    #INT_EXTvoid ext_isr(){if(cambio){ // Hemos recibido flanco de subidatiempo=get_timer0() // Miramos de cuanto tiempo es el pulsoEXT_INT_EDGE(H_TO_L) //Configuramos para recibir flanco de bajadacambio=0

    }else { // Hemos recibido flanco de bajadaset_timer0(0) // Timer0 a 0tiempo=0 // Tiempo a 0EXT_INT_EDGE(L_TO_H) //Configurramos para recibir flanco de subidacambio=1}

    if (tiempo>140 && tiempo27 && tiempo65 && tiempo

  • 2) Rutinas de descodificacin de comandoy direccin.Una vez terminada la transmisin de datosse activa un flag de dato_recibido yseguidamente hacemos las modificacionesoportunas para separar el comando y la

    direccin. Para hacer esto lo que hacemos escoger la palabra de 12 bits y separar las 2partes, la direccin que es de 5 bits ycomando que es de 7 bits teniendo enconsideracin que en el protocolo se envanlos datos del bit menos significativo al bit mssignificativo (al revs).void take_adress(void){ // Separamos la direccin de la palabra

    i=longitud1adress=0for(j=0j

  • case 7: printf(lcd_putc,"\fCanal 8")breakcase 8: printf(lcd_putc,"\fCanal 9")breakcase 9: printf(lcd_putc,"\fCanal 0")breakcase 16: printf(lcd_putc,"\fCanal +")breakcase 17: printf(lcd_putc,"\fCanal ")breakcase 18: printf(lcd_putc,"\fVolumen +")breakcase 19: printf(lcd_putc,"\fVolumen ")breakcase 20: printf(lcd_putc,"\fSilencio")breakcase 47: printf(lcd_putc,"\fStandby")breakdefault: printf(lcd_putc,"\fCom:%3U Adr:%2U",command,adress)

    }ENABLE_INTERRUPTS(INT_EXT) // Habilitamos la interrupcin externa

    }

    4) Rutina de interrupcin por cambio deestadoLo que hago en esta rutina es leer el estadodel teclado al inicio del programa paraimplementar una pequea contrasea.Cuando llega la interrupcin quiere decir quehubo un cambio de estado en los 4 pines

    altos del PORTB, primero hago una mscarapara descartar el nibble bajo del PORTB, unavez he hecho esto comparo si los bits delnibble alto del PORTB estn a 1 (ningunatecla pulsada) o no lo estn (alguna teclapulsada), si no estn todos a 1 procedo ahacer la lectura del PORTB y retorno el valorde las teclas que he apretado.#INT_RBvoid rb_interrupt(){disable_interrupts(global) // Deshabilitamos las interrupcionesdelay_ms(100) // Esperamos 100 ms para no tener ruidolectura_portb=PORTB //lectura_portb&=0xF0 // Nos quedamos con los bits altosif(!(lectura_portb==0xF0)){ // Comprobamos si se ha pulsado una tecla

    tecla1=bit_test(lectura_portb,7) // guardamos estado tecla1tecla2=bit_test(lectura_portb,6) // guardamos estado tecla2tecla3=bit_test(lectura_portb,5) // guardamos estado tecla3tecla4=bit_test(lectura_portb,4) // guardamos estado tecla4tecla_pulsada=1 //flag de telca pulsada}enable_interrupts(global) // Volvemos a habilitar interrupciones

    }

    5) Trozo de cdigo de deteccin decontraseaEsta rutina sirve para detectar si lacontrasea introducida es vlida o no. Lo quehacemos para saber si la contrasea quehemos enviado es correcta, es habilitar lasinterrupciones del PORTB por cambio de

    estado y as poder obtener las teclaspulsadas. Una vez hemos obtenido las teclaspulsadas, determinamos qu tecla ha sidopulsada y seguidamente hacemos la accincorrespondiente, incrementar, decrementar,enviar y resetear la contrasearespectivamente Password = 3.

    .receptor de mandos infrarrojos

    / / pgina 0x19

  • while (!password_ok){ // Comprobamos passwordENABLE_INTERRUPTS(INT_RB) // Habilitamos interrupcion PORTBif(tecla_pulsada){ // Si se ha pulsado miramos que tecla esif(!tecla1) { // Si es la tecla1password++ // Aumentamos valor de password}else if(!tecla2){ // Si es tecla2password // Disminuimos valor de password}else if(!tecla3){ // Si es tecla3if(password==0x03){ // Comprobamos contrasenyapassword_ok = 1 // Password Okey !

    }}else if(!tecla4) { // Si es tecla4password=0 // Reseteamos el password}tecla_pulsada=0printf(lcd_putc,"\fIntroduce el \nPassword: %U",password) //Mostramos Lcd

    }if (password_ok)printf(lcd_putc,"\fPassword Correcto\nRecibiendo

    Datos")//Password correcto}

    APLICACIONESLa aplicacin ms importante que podemosimplementar en el receptor de infrarrojos es ladel control de dispositivos a distancia. Unavez hemos podido descifrar el cdigo que

    enva el emisor, podemos controlardispositivos como bombillas, motores, rels,ect.

    .receptor de mandos infrarrojos

    / / pgina 0x1A

  • Control P.I.D Nivel bsicoEn esta primer parte del artculo, se pretende dar a conocer los conceptos bsicos acerca de loscontroladores, y hacer un nfasis sobre los controladores PID. No se enfocar puntualmente laparte de aplicacin, pero si se realizar un ejemplo simple para que las personas que recincomenzamos con esto del control, tengamos algo de teora respecto al control y no solo a laaplicacin.// por: Miguel A. Lopez O. //[email protected]

    ..sistemas de control

    IntroduccinAl hombre lo mueve, casi siempre, el deseode conocer mas a fondo las cosas para poderpredecir el comportamiento de ellas(determinismo fsica clsica) es inevitablepasar a querer manipular, de alguna manera,este conocimiento aplicado para obtener unresultado ptimo, o acorde a lo quequeremos.El control es algo innato en el ser humano ylo aplicamos en un sinnmero de actividadescotidianas, por ejemplo: a la hora debaarnos, y seleccionar la temperaturaadecuada a la que sale el agua de la ducha, ala hora de cruzar una calle con trfico (paraaquellos temerarios) y definir la velocidad conla que cruzamos (o corremos), etc. nosconvertimos en un instrumento de control yaque juzgamos la marcha del proceso segnlas variables que rodean al mismo ydecidimos la mejor opcin para, de estamanera, obtener el mejor resultado paranosotros, ya sea, una temperatura agradableo pasar con xito la calle.El conocer y controlar un proceso, implicaun largo recorrido, si se hace por ensayo yerror para obtener el resultado que se quiere

    se adquiere experiencia, la cual nutre alinstrumento de control y hace que steobtenga un resultado cada vez mejor, pero seconvierte en un proceso intuitivo y noaplicable a unas nuevas condiciones. Alcrecer la demanda de productos, cualesquieraque sean, se corre el riesgo de afectar lacalidad por aumentar la productividad paramantener la calidad constante (buena calidad)se hace necesario desarrollar teoras paraexplicar el funcionamiento del proceso, paraque as, se puedan vislumbrar las variables deinters y de esta manera, se pueda controlarel proceso para nuestro beneficio.Caractersticas del procesoProceso es un sistema que ha sidodesarrollado para llevar a cabo una tareadeterminada. Los procesos siempre estarnsujetos a variables, que, como cuyo nombreindica, cambian su valor en el tiempo. Esfundamental entonces, el medir estasvariables para cuantificar el valor de esavariable y de esa manera saber en cuantoafecta a nuestro proceso en cuestin.Un bucle de control tpico, est conformadopor el proceso, el transmisor, el controlador yel elemento de control.

    / / pgina 0x1C

  • .control P.I.D. nivel bsico

    El controlador, permite al proceso cumplirsu objetivo y realiza dos funciones esenciales:Compara la variable medida con una variable dereferencia (o valor deseado Set Point) paradeterminar el error (lazo cerrado).Estabiliza el funcionamiento dinmico del buclereduciendo el errorComo ejemplo, supongamos a un operariocontrolando la salida de agua caliente. Eloperario sensa la salida del agua con la manoy acciona una vlvula de vapor para mantenerel agua caliente. Ante un cambio en el flujo deagua de entrada, como la apertura de lavlvula es la misma, el operario notar que elagua que sale esta mas fra que antes, por loque, luego de la comparacin mental entre latemperatura sensada y la que quiere, decideabrir mas la vlvula de vapor para lograrnuevamente la temperatura que desea o quese necesita. El cambio de la temperatura noes inmediato, si no que toma un tiempo.El conjunto de elementos en circuitocerrado que hacen posible este controlreciben el nombre de bucle de control.Los procesos presentan dos caractersticasimportantes que deben considerarse:1. Cambios en la variable controlada, a lo que seconoce como cambios de carga.2. Tiempo necesario para que la variable delproceso alcance un nuevo valor. Este tiempo esfuncin de propiedades como: capacitancia,resistencia y tiempo de transporte.

    Las operaciones bsicas que se realizan enel sistema de control son, entonces:Medicin: Se hace generalmente mediante lacombinacin de sensor y transmisor.Decisin: El controlador decide que hacer conbase a la medicin.Accin: Resultado de la decisin del controlador,generalmente realizada por el elemento final decontrol.Es evidente que si quisiramos quitar al

    operario humano y colocar en su lugar uncontrolador automtico, ste ltimo, deberaposeer toda la informacin correspondientepara que tome la decisin correcta en cuantoal nmero de vueltas que debe dar a lavlvula de vapor para lograr el valorseleccionado, es decir, debe conocer ladinmica del sistema, como se comporta sterespecto al tiempo ante cambios en lavariable de control.Sistemas TrmicosPara comenzar, vamos a tomar comoejemplo un sistema trmico. Tal como se dijoen la introduccin al tema, nos interesa elcomportamiento de la variable, en este casola temperatura, con respecto al tiempo. Comobase, tenemos que la transferencia de calorse realiza, generalmente, por tres mtodos:Conduccin: El intercambio de energa se realizapor el movimiento cintico o el impacto directo delas molculas.Conveccin: El intercambio de energa serelaciona con el movimiento relativo de un fluidorespecto a otro.Radiacin: El intercambio de energa se realizapor emisinAs, que en un proceso trmico, estarnpresentes, en mayor o menor magnitud, estastres formas de transferencia de calor.Como ejemplo prctico, supongamos quetenemos inmerso en un fluido un elemento(sensorial), el cual posee ciertascaractersticas como lo son: Un reasuperficial A, un calor especfico c y una masam. Al estar inmerso en el fluido, el sistemaest en equilibrio trmico, es decir, haalcanzado una temperatura uniforme y no haytransferencia de calor en ningn sentido. Eneste caso:

    Supongamos ahora que la temperatura delfluido TF aumenta (funcin paso):

    / / pgina 0x1D

  • Esta variacin, hace que el equilibrioanterior se rompa y por ende nos hacepensar en que pasa dentro del sistema. Parasimplificar las cosas, pensamos en lo masbsico que tiene un sistema trmico: el calor.De ah podemos deducir que una ecuacinque puede describir el equilibrio en el sistemaes:Calor de Entrada Calor de Salida = Gradode cambio calrico en el sensorSuponemos que el calor de salida delsistema es nulo, ya que es el sensor el queesta inmerso en el fluido, as que nos interesaconocer el intercambio calrico entre elsensor y el fluido.El calor de entrada, est definido como:

    En donde h es el coeficiente de transferenciade calor entre el fluido y el sensor.El aumento calrico del sensor estdeterminado por:

    Nos interesa es el cambio en el tiempo delaumento calrico del sensor, es decir la tasade aumento del contenido calrico del sensor,sto estar dado por:

    Definiendo:

    Tenemos, reemplazando en la ecuacin deequilibrio:

    O, lo que es mas ordenado:

    Que es una ecuacin diferencial de primerorden, de esas que son muy fciles deresolver.Recordemos que:

    es la variable que nos indica el cambio detemperatura del nuestro sensor inmerso enun fluido. Si resolvemos la ecuacindiferencial, obtendremos una funcin, a lacual se le da el nombre de funcin detransferencia y es con esta funcin con la quese puede predecir el comportamiento denuestra variable en funcin del tiempo y enrelacin a un cambio de temperatura, en estecaso:

    Para resolver la ecuacin diferencial,usamos la Transformada de Laplace, con lacual, se vuelve tan simple como lo esmultiplicar y dividir. Tenemos entonces:

    Recordemos, que en t=0', teniamos que latemperatura del elemento sensorial es igual ala temperatura del fluido, por lo tanto:

    Reemplazando, hallamos la funcin detransferencia, la cual relaciona la salida con laentrada de un sistema, en este caso nuestroelemento sensorial.

    .control P.I.D. nivel bsico

    / / pgina 0x1E

  • Si graficamos la funcin de solucin denuestra ecuacin:

    Vemos que el nmero:

    es muy importante, ya que justo cuando eltiempo lo iguala, el valor de la funcin es el63.2% del valor final. Tambin nos dainformacin acerca de lo confiable que es lamedida respecto al tiempo, ya que,idealmente el sistema se estabilizar en untiempo infinito, pero, como no podemospasarnos toda una vida midiendo, basta conpara estar en un 90% del valor de estadoestable.Lo ideal, sera que todos los sistemastrmicos se comportaran de igual manera,pero siempre hay otras variables que afectenal sistema. Sin embargo ste modelo esaplicable a sistemas como los hornos, ya quedescribe muy bien el comportamientodinmico de estos.

    Tiempo MuertoEn los sistemas reales, se tiene que loscambios dentro del mismo sistema, no soninmediatos, si no que toman cierto tiempo,debido a la inercia del mismo proceso. En elmomento de efectuarse el aumento detemperatura:

    hay un tiempo de espera hasta que elsistema comienza a reaccionar, es como unaclase de juego en la reaccin.El tiempo muerto es parte integral delproceso y se debe tomar en cuenta en lafuncin de transferencia de los procesos.Matemticamente modifica nuestra funcinde transferencia:

    Componentes de los sistemas de controlComo se mencion en la Introduccin, lasoperaciones bsicas de un sistema de controlson:MedicinDecisinAccinCon los sensores y transmisores, serealizan las operaciones de medicin en el

    .control P.I.D. nivel bsico

    / / pgina 0x1F

  • sistema de control. En la actualidad haymuchos tipos de sensores que nos permitentomar medidas muy confiables en precisin yexactitud, con muy buena resolucin yalgunos hasta ya vienen calibrados desdefbrica. La etapa de medicin es muyimportante, ya que la accin del controladorse calcula en funcin del error entre el valorde consigna (Set Point) y el valor medido enel proceso.La etapa de accin la realizan losactuadores, que pueden ser vlvulas,interruptores, TRIACs, etc. La seal de salidadel controlador debe estar relacionada dealguna manera con el actuador en la variablede control. Por ejemplo: para un horno, latemperatura que genera la resistenciaelctrica, est relacionada con la cantidad decorriente que fluye por ella, gracias a estarelacin se puede cuantificar que cantidad decalor se introduce al sistema en funcin de lacantidad de corriente que se permite circularpor la resistencia.En la etapa de la decisin, est involucradoel concepto propio del control, puede ser porel simple paso del valor de consigna o por unvalor de razn proporcional, etc.

    Tipos de controladores porretroalimentacinComo se ha venido mencionando, loscontroladores por retroalimentacin, toman ladecisin para mantener el punto de control oSet Point, segn el clculo de la salida conbase en la diferencia que hay entre la variablede salida que se est controlando y el puntode consigna, diferencia a la que se denominaerror.Control Proporcional: Es el tipo massimple de controlador y la decisin de controlhace gala a su nombre, es decir: produce unaaccin de control proporcional al error. Amayor valor de error, mayor sera la seal decorreccin, si el valor del error disminuye, laseal de correccin disminuir tambin:

    Si aplicamos Laplace para simplificar lascosas:

    La funcin de transferencia del controladorproporcional corresponde a una constante:

    Si aplicramos esta seal a nuestra planta,nos quedara un diagrama de bloques como elsiguiente:

    En donde:X(s) : Set PointY(s) : Valor de Salida, con el cual calculo elerror en funcin de X(s)E(s) : Valor del error, resultado de ladiferencia entre X(s) y Y(s)G(s) : Funcin de la planta o del procesoEn este tipo de control, siempre va a habererror en estado estable, es decir, cuando eltiempo tiende a infinito y se supone que elproceso se estabiliza para el valor de SetPoint fijado por nosotros. Esto es debido a lanaturaleza del controlador, ya que esprcticamente imposible que el elemento deaccin regrese al estado inicial, que fuejustamente cuando se inici el error.Matemticamente, el error en estadoestable se calcula con :

    Este valor interesa mucho, ya que sesupone que debera tender a cero (de hecho,eso es lo que se busca al implementar uncontrolador) cuando ha pasado el tiemposuficiente.

    .control P.I.D. nivel bsico

    / / pgina 0x20

  • En casos reales, la linealidad entre el error yla salida del controlador, solo existe en unrango determinado, al cual se le denominabanda proporcional.

    Para los valores por fuera de ese rango, elvalor de salida se saturar y no habr sealde control mayor, por ejemplo: en el caso dela apertura de una vlvula, si el valor ya esten el mximo, no hay forma de seguirabriendo mas la vlvula, o si un actuadornecesita mas voltaje del que suministra lafuente.Control Derivativo: En este tipo de control,el cambio de la salida del controladorrespecto al Set Point es proporcional a larapidez de cambio de la seal de error en eltiempo.

    En donde:Io : Valor de salida del controlador para elvalor de referencia, es decir, cuando el errores cero.Isal : Valor de salida cuando el error cambiaa una tasa d error(t)/dt .Siguiendo el mismo mtodo anterior,aplicamos transformada de Laplace parahallar la funcin de transferencia de un

    controlador derivativo:

    La funcin de transferencia del controladores derivativo, entonces: s.Kd.En esta parte, se puede apreciar la granventaja de trabajar con la transformada deLaplace, ya que la derivada de la funcinerror en el tiempo, pasa a ser un productoaplicando la transformada.Resulta lgico que este controlador no tieneefecto si el error permanece constante, por loque no es muy utilizado solo, si no encombinacin con el proporcional y el integral.Control Integral: En este tipo de control, latasa de cambio en la seal de salida delcontrolador respecto al tiempo esproporcional al error:

    Para hallar nuestra funcin de respuesta delcontrolador, integramos:

    a la cual, le aplicamos Laplace para variar:

    La funcin de transferencia del controlIntegral es, entonces 1/s .Ki:Este tipo de control es muy til para atacarel error de estado estable u OffSet, ya quepara valores constantes de error, la accin delcontrolador aumentar en el tiempo.Este tipo de controlador no se utiliza solo, sino en combinacin con los otros anteriores.

    .control P.I.D. nivel bsico

    / / pgina 0x21

  • Controlador P+I+D : Es la combinacin dela accin de los tres controladores anterioresen una sola funcin de transferencia. De estaforma obtenemos un controlador que no tienedesviacin en el error y que disminuye laprobabilidad a producir oscilaciones.

    Tenemos entonces:

    Como bien se aprecia en las ecuacionesanteriores, hay ciertas constantes deproporcin en las funciones de transferenciapara los diferentes tipos de controladores sihallamos los valores adecuados para esasconstantes, garantizaremos que la seal deaccin del controlador sea la adecuada, quese mantenga dentro de los lmites y por ende,el buen funcionamiento del proceso.

    Ajuste de controladores porretroalimentacinEl ajuste del controlador es elprocedimiento mediante el cual se adecuanlos parmetros del controlador para obteneruna respuesta especfica del circuito cerrado.En el caso de un controlador ProporcionalIntegral (PI) habra que ajustar los dos modosde control para obtener una respuesta ptimaen nuestra respuesta. En el caso de uncontrolador PID habra que ajustar los tresmodos, el Proporcional (la ganancia), elIntegral (tiempo de reajuste) y el Derivativo(tiempo de derivacin), es algo as comohallar el valor RGB ptimo para un colorespecfico.Lgicamente, el sistema tendr un tiempode respuesta ante los efectos del controlador,no es el caso del color RGB, que se tendruna respuesta inmediata. An con esademora en la reaccin (que puede ser dehoras segn el sistema) el ajuste porrealimentacin es muy utilizado.Para hallar estos ajustes vamos a recurrir aun mtodo llamado Mtodo de la curva dereaccin del proceso.

    .control P.I.D. nivel bsico

    / / pgina 0x22

  • Para aplicar este mtodo, lo que se hace esobtener la curva de reaccin de nuestrosistema a una entrada escaln y verificamosque el sistema sea de orden 1. Como bienvimos anteriormente, el sistema trmico, va apresentar una respuesta tpica de un sistemade orden 1 no todos los sistemas presentaneste tipo de respuesta o al menos se va aacercar bastante.Hay unas formulas que se aplican paracalcular los valores de las constantes:

    Donde R = M / TEstas frmulas son empricas y se lasdebemos a Ziegler y Nichols. Hayrestricciones para el uso de estas ecuacionesen relacin a la razn existente entre eltiempo muerto y la constante de tiempo delsistema. Si el valor de la razn entre estosdos valores est fuera de un rango de 0.10 y1.0, no se debe usar ste mtodo y es mejorpensar en otroPara construir un controlador basta con unamplificador operacional configurado de lasiguiente manera:

    En donde tendramos:

    Si queremos digitalizar nuestro controlador,hay que tener en cuenta que ya no se estaratrabajando en tiempo continuo, si no que hayde por medio un tiempo entre la toma de unamuestra y otra de nuestra variable, a estetiempo se le denomina Tiempo de Muestreo einfluye en el comportamiento de nuestrocontrolador.Su influencia radica en el concepto defrecuencia, ya que, si el tiempo con el quemuestreo la seal es muy prolongado, laseal que obtendr no ser la real, si no queestar modificada su frecuencia. Para saber aque tiempo se debe muestrear se usa unteorema denominado Teorema de Nyquist,que en s nos determina cuanto debe ser lafrecuencia mnima de muestreo en funcin dela frecuencia de nuestra seal a muestrear.Matemticamente se debe recurrir a unatransformada para que nos facilite mas lascosas a la hora de disear. Esa transformadaes la transformada Z. Esta transformada Z esen si, una transformada de Laplace de laseal muestreada mediante una funcinimpulso.

    Ya en la realidad, se tiene es una funcinescalonada, ya que el valor del ltimomuestreo se mantiene hasta el siguiente.Para trabajar en tiempo discreto, se debeentonces, discretizar la ecuacin delcontrolador. Una forma sencilla y rpida eshacer una aproximacin de las partesderivativa e integral. Para la parte derivativa,se aproxima a la diferencia de dos puntos ypara la parte integral, se aproxima a la sumatrapezoidal. Estas aproximaciones hacen quese sume un error a nuestro controlador.Tenemos entonces:

    .control P.I.D. nivel bsico

    / / pgina 0x23

  • .control P.I.D. nivel bsico

    en donde:T : Tiempo de muestreoTi : Tiempo integralTd : Tiempo derivativoK : Constante proporcionalk : 0,1,2,....e() : errorm() : salida del controladorPara simplificar toda esa ensalada, serecurre a la transformada Z, al aplicarla yoperar, se tiene:

    En esta ecuacin se hace mas clara lainfluencia del tiempo de muestreo en lasintonizacin del controlador.Se ha presentado una introduccin tericade qu implica un sistema de control,presentando conceptos bsicos de sistemastrmicos, controladores proporcionales,derivativos e integrales y las ecuaciones querigen en cada caso. En el prximo nmero elartculo concluir con la parte prctica deldesarrollo, realizando un sistema embebidoque implementa un PID para control de unhorno elctrico, entregando el circuitoelectrnico y el firmware del microcontrolador.

    / / pgina 0x24

  • TutorialMPLAB C18En esta segunda parte del tutorial de programacin utilizando el compilador C18, trataremoscomo son almacenados los datos en la memoria, arreglos de variables, declaracin y definicinde funciones, y como siempre algunos ejemplos. A trabajar!// por: Casanova Alejandro //[email protected]

    ..tutorial

    Cmo se guardan los datos en lamemoria?MPLAB C18 implementa el almacenamientode los datos littleendian. Cuando unavariable ocupa ms de un byte, el byte menossignificativo ocupa la posicin de memoriams baja. Entonces al definir una variable de32 bits:long k=0 x59359712 El resultado en la memoria de datos ser:

    Operaciones con variables de distintostipos.Cuando se evala una expresin donde lasvariables implicadas son de distinto tiposocurre una conversin, ya sea implcita oexplicita, para llevar ambos operando a untipo comn de datos con el que se puedaoperar.En la asignacin de una expresin de untipo dado a una variable de un tipo menor, laconversin se hace en forma automtica. Porejemplo:

    unsigned char k,float p =30.56k=p // k= 30, p = 30.56. Aqu tenemos miembros de diferentestamaos, por lo que habra un truncamientodel valor entero a la cantidad de bit que lopermita k. Si la parte entera excede el rangoestablecido por la variable k, el resultado notendra lgica aparente.Reglas de promocin automtica deexpresionesEstas reglas dicen que el compilador haraestrictamente las conversiones necesariaspara llevar todos los operandos al tipo delmayor. El resultado de evaluar una operacinaritmtica seria del tipo del mayor de susoperandos, en el sentido del tamao en bitsde cada objeto de datos. Por ejemplo:unsigned char kfloat pk =5p=k /2 // p = 2Por ms que indiquemos que el resultadoes float el truncamiento se produce en laevaluacin del miembro derecho de laasignacin.Para resolver este problema existen dos

    / / pgina 0x26

  • formas, una es escribir cualquiera de lascontantes en punto flotante o utilizar eloperador cast.p= k /2.0 // p = 2.5p =(( float )k /2) // p = 2.5No es til implementar el cast de lasiguiente forma:p= ( float )(k /2) // p = 2Dado que primero se realiza la operacin, yal resultado se aplica el cast, lo que nosoluciona el problema.

    Arreglos de VariablesNos permite trabajar con un conjunto devariables y acceder a cada una mediante unndice nico que lo idntifica. Todos losvalores que contienen deben ser del mismotipo. Los espacios de memoria que ocupanson contiguos y el primer elemento ocupa ladireccin ms baja. Algunos ejemplos dedeclaracin y asignacin de datos:Vector de 5 elementos:unsigned char Vector [5]Matriz de 3 x 3:unsigned char Matriz [3][3].// Cargamos vector y matriz :Vector [0]=156 // 0 es primer elementoMatriz [1][1]=85// Leemos vector y matriz :PORTB = Vector [4]PORTB = Matriz [0][0]Tambin tenemos la posibilidad de asignarsus valores al momento de declarar losarreglos, eso se hara, por ejemplo, de lasiguiente manera:unsigned char Vector [3]={1 ,0 x10 ,0b000101 }unsigned char Matriz [3][3]={1 ,2 ,3 ,4 ,5 ,6,7 ,8 ,9}

    FuncionesLa manera ms elegante de construirnuestro programa es dividir la tarea a ejecutaren varias tareas ms simples, de modo defacilitar el desarrollo y el entendimiento de laestructura del mismo. Otra ventaja queconlleva este proceder, es la reutilizacin deestos mdulos creados con anterioridad,adems de facilitar el trabajo en equipo.Declaracin y definicin de funcionesLa declaracin da a conocer la funcin alcompilador, a partir de su declaracin ya sepueden realizar invocaciones a las mismas.La declaracin de una funcin se conocetambin como prototipo de la funcin. En elprototipo de una funcin se tienen queespecificar los parmetros de la funcin, ascomo el tipo de dato que devuelve.La definicin estar en algn otro punto delprograma, aqu se especifican lasinstrucciones que forman parte de la misma yque se utilizan para llevar a cabo la tareaespecfica de la funcin.Tipo de retorno Nombre(Lista de parmetros)Tipo de retorno: Representa el tipo del valorque devuelve la funcin. Si no devuelveninguno de debe colocar void.Nombre: indica el nombre que se le da a lafuncin, se recomienda que est relacionadocon la tarea que llevara a cabo.Lista de parmetros: se enlista el tipo dedato y el nombre de cada parmetro. En casode no utilizar parmetros se deja el parntesisvaco o se incluye la palabra void

    ..mplab c18

    / / pgina 0x27

  • Ejemplo 1: Control de display 7 segmentosObjetivo: Utilizaremos dos pulsadores para incrementar, decrementar o resetear un conteode 0 a 9 que mostraremos en un display de 7 segmentos de ctodo comn. El reseteo ser a elcaso en el que se presiona los dos pulsadores a la vez./* ** Archivo con definicion de registros y bits del microcontrolador elegido */# include /* ** Include para realizacion de demoras ** */# include /* ** Configuracion de los Fuses del microcontrolador ** */# pragma config FOSC =XT_XT , FCMEN =OFF , IESO =OFF , CPUDIV = OSC1_PLL2# pragma config PWRT =ON , BOR =OFF , BORV =0, WDT =OFF , WDTPS =32768# pragma config MCLRE =ON , LPT1OSC =OFF , PBADEN =OFF , CCP2MX = OFF# pragma config STVREN =OFF , LVP =OFF , XINST =OFF , DEBUG = OFF# pragma config CP0 =OFF , CP1 =OFF , CP2 =OFF , CPB =OFF , CPD = OFF# pragma config WRT0 =OFF , WRT1 =OFF , WRT2 = OFF# pragma config WRTB =OFF , WRTC =OFF , WRTD = OFF# pragma config EBTR0 =OFF , EBTR1 =OFF , EBTR2 =OFF , EBTRB = OFFunsigned char i // Para controlar vizualizacion del Display .const rom unsigned char Display7Seg [10]={0 x3F , 0x06 , 0x5B , 0x4F , 0x66 ,

    0x6D , 0x7D , 0x07 , 0xFF , 0 x6F }void main ( void ){

    ADCON1 =0 x0F // Todos entrada / salida digitales .TRISA =0 xFF // Todos como entrada .TRISB =0 X00 // Todos como salida .LATB =0 x3F // Comienza en cero .i =0while (1){

    // Si se presionan los 2 a la vez se resetea .if( PORTAbits . RA0 ==0 & PORTAbits . RA1 ==0){

    i =0// Cargamos en puerto valor de la tabla indicado por i.LATB = Display7Seg [0]Delay10KTCYx (30)

    } else if( PORTAbits . RA0 ==0){ // Se incrementa cuenta .++i// Volvemos a 0. Directamente se puede hacer if (++i ==10)if(i ==10){ i =0}// Cargamos en puerto valor de la tabla indicado por i.LATB = Display7Seg [i]Delay10KTCYx (30)

    } else if( PORTAbits . RA1 ==0){ // Se decrementa cuenta .iif(i ==255){ i =9} // Volvemos a 9.// Cargamos en puerto valor de la tabla indicado por i.LATB = Display7Seg [i]Delay10KTCYx (30)

    }}

    }

    ..mplab c18

    / / pgina 0x28

  • Dos formas de incluir una funcin ennuestro cdigo:Realizando la declaracin en el encabezadoy despus la definicin en cualquier sector delprograma.// Declaracin de la funcinvoid Funcion ( void )char OtraFuncion (char , int )...void main ( void ){

    .

    .

    .// Llamo a la funcin .Funcion ()m= OtraFuncion (5 ,5430)

    }// Definicion de la funcion ..// ..( Puede estar en cualquier lugar delprograma )void Funcion ( void ){

    // Sentencias}char OtraFuncion ( char k,int p){

    // Sentencias}Otra forma es no realizar la declaracin dela funcin y realizar directamente ladefinicin, pero esta tiene que estar si o siantes de su invocacin.

    .

    .

    .// Definicin de la funcinvoid Funcion ( void ){

    // Sentencias}char OtraFuncion ( char k,int p){

    // Sentencias}void main ( void ){

    .

    .

    .// Llamo a la funcin .Funcion ()m= OtraFuncion (5 ,5430)

    }

    Hardware para ejemplo N 1.

    ..mplab c18

    / / pgina 0x29

  • Ejemplo 2: Control de varios display, multiplexin de la sealObjetivo: Controlar 3 display de 7 segmentos visualizando el conteo automtico de 0 a 999.Cdigo:/* ** Archivo con definicion de registros y bits del microcontrolador elegido */# include /* ** Include para realizacion de demoras ** */# include /* ** Configuracion de los Fuses del microcontrolador ** */# pragma config FOSC =XT_XT , FCMEN =OFF , IESO =OFF , CPUDIV = OSC1_PLL2# pragma config PWRT =ON , BOR =OFF , BORV =0, WDT =OFF , WDTPS =32768# pragma config MCLRE =ON , LPT1OSC =OFF , PBADEN =OFF , CCP2MX = OFF# pragma config STVREN =OFF , LVP =OFF , XINST =OFF , DEBUG = OFF# pragma config CP0 =OFF , CP1 =OFF , CP2 =OFF , CPB =OFF , CPD = OFF# pragma config WRT0 =OFF , WRT1 =OFF , WRT2 = OFF# pragma config WRTB =OFF , WRTC =OFF , WRTD = OFF# pragma config EBTR0 =OFF , EBTR1 =OFF , EBTR2 =OFF , EBTRB = OFF// Para controlar vizualizacion del Display .unsigned char i, Unidad , Decena , Centena const rom unsigned char Display7Seg [10]={0 x3F , 0x06 , 0x5B , 0x4F , 0x66 ,

    0x6D , 0x7D , 0x07 , 0xFF , 0 x6F }/* ** Declaracion de funcion a utilizar */void Visualizacion ( void )void main ( void ){

    ADCON1 =0 x0F // Todos entrada / salida digitales .TRISA =0 xF0 TRISB =0 x00 // Todos como salida .LATA =0 x00 // Comienza en 0Unidad =0Decena =0Centena =0while (1){

    // Llamamos funcion que actualiza displays .Visualizacion ()// Actualizamos cuenta .++ Unidad if( Unidad ==10){

    Unidad =0++ Decena if( Decena ==10){

    Decena =0++ Centena

    }}

    }}

    ..mplab c18

    / / pgina 0x2A

  • Preprocesador y Directivas delpreprocesadorEl preprocesador es el primer programa quese llama en la etapa de compilacin de unprograma. El preprocesador tiene su propiolenguaje y sus directivas inician con un #.Las ventajas que tiene usar elpreprocesador son:

    *los programas son ms fciles de desarrollar,*son ms fciles de leer,*son ms fciles de modificar*se pueden generalizar para varias arquitecturaso compiladores.

    Directivas#includeEsta directiva ya la hemos utilizado, seemplea para incluir archivos y suele darse alprincipio de los programas, porque en generalse desea que su efecto alcance a todo elarchivo fuente. Por esta razon los archivospreparados para ser incluidos se denominanheaders o archivos de cabecera. En ellos sedeclaran las funciones que se implementan ydefiniciones para su implementacion.#defineLa directiva define tiene dos tipos de uso,como si fuera un objecto o como si fuera una

    void Visualizacion ( void ){for (i =1i

  • funcion. Las que se asemejan a funcionestoman parametros mientras que las que seasemejan a objetos no.Su formato es el siguiente:# define # define (< lista deparametros>)Ejemplos:# define e 2.718258# define LED LATBbits . LATB5# define Suma_10 (x) {x +=10}# define Suma_Divide_10 (x) {(x +=10)( x/=10)}Nota: Se debe tener cuidado en laimplementacion de esta directiva. Las que seasemejan a funciones, pueden tomarparametros pero no se comportan como unafuncion, ya que el preprocesador reemplazaun texto por otro, lo cual conlleva al mayoruso de la memoria de programa.#ifdef, #ifndef, #else, #elif y #endifEstas directivas son utilizadas para realizarcompilaciones condicionadas, por ejemplopara hacer una libreria generalizada paravarias arquitecturas, para ser utilizada porvarios compiladores o simplemente paraseleccionar el nivel de uso de cierto proyecto.Ejemplos:#if defined ( __18CXX )

    # include # elif defined ( __dsPIC30F__ )

    # include # elif defined ( __dsPIC33F__ )

    # include # elif defined ( __PIC24H__ )

    # include # elif defined ( __PIC24F__ )

    # include # endif

    // Para no utilizar pin RW sacar comentario ala siguiente linea .//# define __LCD_DONT_WAIT# define LCD_PIN_E LATCbits . LATC4# define LCD_PIN_RS LATCbits . LATC2# ifndef __LCD_DONT_WAIT

    # define LCD_PIN_RW LATCbits . LATC3# endif// CCS#if defined ( __PCH__ )

    char Buffer [512]# endif// C18# ifdef __18CXX

    # pragma udata =0 x100unsigned char Buffer [512]# pragma udata

    # endif// C30 y C32#if defined ( __C30__ ) || defined (__PIC32MX__ )

    unsigned char __attribute__ (( aligned (4)))Buffer [512]# endif

    Control de LCDPara realizar el control de un LCDnecesitamos usar la librera xlcd.h ubicada enC:/MCC18/h.Esta librera es para un LCD concontrolador Hitachi HD44780 o compatible,utilizando 8 o 4 bits de ancho de bus paraenvo/recepcin de datos. El usuario debeproveer 3 delay para el correctofuncionamiento, DelayPORXLCD() de 15ms,DelayXLCD() de 5ms y DelayFor18TCY() de18 Tcy.En este caso no vamos a modificar lalibrera, eso lo vamos a dejar para msadelante, pues lo vamos a controlar con elpuerto B, configuracin por defecto, pero enel caso de que se modifique sugiero siemprerespaldarla con una copia de seguridad.

    ..mplab c18

    / / pgina 0x2C

  • Ejemplo N 3: Control de varios display, utilizando directivas de preprocesadorObjetivo: Se realiza el mismo ejemplo anterior pero utilizando directivas de preprocesador,definiendo el hardware a utilizar. Realizndolo de esta manera es mucho ms sencillo realizarcualquier modificacin en el cdigo del hardware utilizado.Cdigo/* ** Archivo con definicion de registros y bits del microcontrolador elegido */# include /* ** Include para realizacion de demoras ** */# include /* ** Configuracion de los Fuses del microcontrolador ** */# pragma config FOSC =XT_XT , FCMEN =OFF , IESO =OFF , CPUDIV = OSC1_PLL2# pragma config PWRT =ON , BOR =OFF , BORV =0, WDT =OFF , WDTPS =32768# pragma config MCLRE =ON , LPT1OSC =OFF , PBADEN =OFF , CCP2MX = OFF# pragma config STVREN =OFF , LVP =OFF , XINST =OFF , DEBUG = OFF# pragma config CP0 =OFF , CP1 =OFF , CP2 =OFF , CPB =OFF , CPD = OFF# pragma config WRT0 =OFF , WRT1 =OFF , WRT2 = OFF# pragma config WRTB =OFF , WRTC =OFF , WRTD = OFF# pragma config EBTR0 =OFF , EBTR1 =OFF , EBTR2 =OFF , EBTRB = OFF/* ** Definiciones para preprocesador ** */// Pin para control display visualizador de unidades .# define DISPLAY_PIN_U LATAbits . LATA0# define DISPLAY_PIN_D LATAbits . LATA1# define DISPLAY_PIN_C LATAbits . LATA2# define DISPLAY_TRIS_U TRISAbits . TRISA0 //# define DISPLAY_TRIS_D TRISAbits . TRISA1# define DISPLAY_TRIS_C TRISAbits . TRISA2// Puerto para enviar data a displays .# define DISPLAY_DATA LATB# define DISPLAY_TRIS_DATA TRISB/* ************************************** */// Para controlar vizualizacion del Display .unsigned char i, Unidad , Decena , Centena const rom unsigned char Display7Seg [10]={0 x3F , 0x06 , 0x5B , 0x4F , 0x66 ,

    0x6D , 0x7D , 0x07 , 0xFF , 0 x6F }/* ** Declaracion de funcion a utilizar */void Visualizacion ( void )void main ( void ){

    ADCON1 =0 x0F // Todos entrada / salida digitales .DISPLAY_TRIS_DATA =0 x00 :DISPLAY_TRIS_U =0DISPLAY_TRIS_D =0DISPLAY_TRIS_C =0DISPLAY_PIN_U =0DISPLAY_PIN_D =0DISPLAY_PIN_C =0Unidad =0Decena =0Centena =0

    ..mplab c18

    / / pgina 0x2D

  • Ejemplo N 4: Control de LCDObjetivo: Vamos a escribir un simple mensaje en un LCD. Se crearan 2 funciones adicionalespara un mejor el control, la primeria seria el envo de comandos, con una previa espera dedisponibilidad del LCD y la segunda es para controlar la posicin del cursor en el LCD.Cdigo:/* ** Archivo con definicion de registros y bits del microcontrolador elegido */# include /* ** Includes ** */# include # include /* ** Configuracion de los Fuses del microcontrolador ** */# pragma config FOSC =XT_XT , FCMEN =OFF , IESO =OFF , CPUDIV = OSC1_PLL2# pragma config PWRT =ON , BOR =OFF , BORV =0, WDT =OFF , WDTPS =32768# pragma config MCLRE =ON , LPT1OSC =OFF , PBADEN =OFF , CCP2MX = OFF# pragma config STVREN =OFF , LVP =OFF , XINST =OFF , DEBUG = OFF# pragma config CP0 =OFF , CP1 =OFF , CP2 =OFF , CPB =OFF , CPD = OFF

    while (1){// Llamamos funcion que actualiza displays .Visualizacion ()// Actualizamos cuenta .++ Unidad if( Unidad ==10){

    Unidad =0++ Decena if( Decena ==10){

    Decena =0++ Centena

    }}

    }}void Visualizacion ( void ){

    for (i =1i

  • # pragma config WRT0 =OFF , WRT1 =OFF , WRT2 = OFF# pragma config WRTB =OFF , WRTC =OFF , WRTD = OFF# pragma config EBTR0 =OFF , EBTR1 =OFF , EBTR2 =OFF , EBTRB = OFFvoid DelayFor18TCY ( void ){

    Delay10TCYx (2)}void DelayPORXLCD ( void ){

    Delay1KTCYx (15)}void DelayXLCD ( void ){

    Delay1KTCYx (2)}// Envia comando al LCDvoid comandXLCD ( unsigned char a){

    BusyXLCD ()WriteCmdXLCD (a)

    }// Ubica cursor en (x = Posicion en linea , y = N de linea )void gotoxyXLCD ( unsigned char x, unsigned char y){

    unsigned char direccion if(y != 1)

    direccion = 0 x40 else

    direccion =0direccion += x 1comandXLCD (0 x80 | direccion )

    }void main ( void ){

    OpenXLCD ( FOUR_BIT & LINES_5X7 ) // Iniciamos LCD .comandXLCD (0 x06 ) // Nos aseguramos incremento de direccion , display fijocomandXLCD (0 x0C ) // Encendemos LCD .putrsXLCD (" Probando LCD ")gotoxyXLCD (1 ,2) // Pasamos al oriden del Linea 2.putrsXLCD ("Por Suky ")while (1){ // Bucle infinito .}

    }

    Hardware para ejemplo N 4.

    ..mplab c18

    / / pgina 0x2F

  • Tutorial ASM...desde 0

    Todo programa consiste en una serie de instrucciones, que sirven para indicarle al dispositivoque es lo que debe hacer para lograr nuestro cometido. Los PIC de la gama media disponen deun repertorio de 35 instrucciones, que debemos conocer tan bien como la palma de nuestramano y a las que dedicamos esta segunda parte del Tutorial.// por: David (Leon Pic) //[email protected]

    ..programacin

    INSTRUCCIONES: Breve introduccinCada instruccin tiene un ancho de 14 Bits,es por eso que la memoria de programa tieneel mismo ancho. Justamente para poder alojarcada instruccin.Las instrucciones, estn divididas en tresgrupos. Los cuales son:ByteOriented operation (Orientada a Byte)BitOriented operation (Orientada a Bit) Literal and Control operation (Operacincon Literal y Control)

    Primer grupo: ByteOriented operationCada instruccin de este grupo estcompuesta por: OPCODE (Cdigo) DESTINATION (Destino) FILE REGISTER ADDRESS (Direccin delarchivo de registro)OPCODE o cdigo, es el cdigo de cadainstruccin y que es nica para cada instruccin. Est formada por los bits del 13 al 8.DESTINATION o destino, indica en dndese va a guardar el dato. Por ejemplo, sihacemos una suma, tenemos dos opcionesdnde guardarlo, una puede ser el registro W

    y la otra opcin puede ser otro registrocualquiera o una posicin de la RAM. Estformada por el sptimo bit.La constante que nos indica esto es la letrad. Si esta letra es 0, la operacin se guardaren el registro W. En cambio si vale 1, laoperacin se guardar en el registro oposicin de memoria que estemos trabajandoal momento de usar una instruccin.Hay instrucciones, como veremos msadelante, que no es necesario indicar dndequeremos guardar la operacin, ya que sehace en forma automtica y hay otrasinstrucciones que si no se indica el destino,nos puede dar un error o una advertencia alcompilar y el compilador elegir l el destinopudiendo ocasionar que nuestro programafalle.Y por ltimo, tenemos FILE REGISTERADDRESS que se carga con la direccin delregistro a ser guardado. Est formada por losbits 6 al 0. La constante que nos indica esto,es la letra f

    / / pgina 0x31

  • Segundo grupo: BitOriented operationCada instruccin de este grupo estcompuesta por: OPCODE (Cdigo) BIT ADDRESS (Bit de direccin) FILE REGISTER ADDRESS (Direccin delarchivo de registro)OPCODE es igual al primer grupo. Estformado por los bits 13 al 10.El BIT ADDRESS, se utiliza para direccionarla operacin. Est formado por los bits 9 al 7.Como pueden observar, se sacrific bit delopcode para drselo al bit address. Laconstante que nos indica esto es la letra bY por ltimo tenemos FILE REGISTERADDRESS, que es igual al primer grupo. Estformado por los bits 6 al 0. Igual que en elprimer grupo, la constante que nos indicaesto es la letra f.

    Tercer grupo: Literal and ControlCada instruccin de este grupo, estcompuesta por: OPCODE LITERALOPCODE es igual que en el primer grupo.Est compuesta por los bits 13 al 8. Exceptopara las instrucciones CALL y GOTO queest compuesta por los bits 13 al 11 (prestarmucha atencin a esto, cuando veamos estasdos instrucciones entendern la importancia).Y el LITERAL que puede ser un valor, porejemplo para sumar, para restar, para cargaral registro W, en fin, un nmero decimal,binario o hexadecimal. O puede ser un valorde direccin a dnde apuntar para lasinstrucciones CALL y GOTO.Est compuesta por los bits 7 al 0. Exceptopara las instrucciones CALL y GOTO queest compuesta por los bit 10 al 0 (prestarmucha atencin a esto, cuando veamos estasdos instrucciones entendern la importancia).

    En la pgina siguiente podemos ver unaimagen con las 35 instrucciones agrupadaspor los tres grupos. Se trata de la Table 132,con el Set de Instrucciones de la familiaPIC16F87XEn la tabla vemos 5 columnas. De izquierdaa derecha tenemos la primera columnallamada Mnemonic Operands que son lasinstrucciones con que se puede programardicho pic. Presten atencin que estndivididos por los tres grupos que vimos endetalle.En la segunda columna tenemos ladescripcin de cada instruccin, que dichosea de paso, lo veremos a continuacin.En la tercera columna vemos como estformada en cdigo binario cada instruccincon sus constantes descritas anteriormente.Vemos tambin la cantidad de ciclos demquina que consume cada instruccin paraser completado. Hay instrucciones queconsumen 1 o 2 ciclos para completar sutrabajo y otras que consumen 1 y 2 ciclos yque figura as 1(2). Estas instrucciones sonde salto incondicional cuando se cumplecierta lgica. Mientras no produzcan un salto,consumen un ciclo, pero en el momento deproducir un salto, consumen dos ciclos dereloj.En la cuarta columna vemos si afecta o noalgn bit del registro Status. En caso de queafecte, en la tabla nos muestra cuales bits seven afectados despus de ser ejecutado esainstruccin.Y en la quinta columna, hace referencia a lanota que est al fin de la tabla. Me imaginoque ya tiene un diccionario InglesEspaol enla mano verdad? Y sino es as, pues tendrnque esperar para ms adelante.

    .tutorial asm

    / / pgina 0x32

  • .tutorial asm

    / / pgina 0x33

  • Las instruccionesLes voy a arruinar el momento de alegra.Las instrucciones hay que estudiarlas dememoria. Si, leyeron bien, de memoria. Loque tienen que saber sobre las instrucciones,es como se escriben, que hace cadainstruccin y lo ms importante que bit delREGISTRO STATUS afecta.Vamos a ir vindolo por orden alfabtico ycon sencillos ejemplos. Y otra cosita ms,como es de esperarse, estn en INGLS oson abreviaturas pero en INGLS.Recordemos que: .123 o D'123' es endecimal 0x7B o 7Bh o H'7B' es enHexadecimal B'01111011' es en binario.

    ADDLWSuma un valor designado por elprogramador al registro WADDLW .128

    Si W tena cargado un valor = .5, despusde la instruccin W tiene cargado el valor.133Afecta a:Z Se pone a 1 si el resultado de la operacines 0DC Se pone a 1 si hubo un acarreo del bit 3al 4C Se pone a 1 si hubo desbordamiento, osea, cuando se supera H'FF'ADDWFSuma el valor del registro W con el valor deun registro cualquiera. El destino de estasuma, lo elige el programador.

    ADDWF TEMP,WSi W tena guardado .133 y la posicin de laRAM llamada TEMP tena el valor cargadocon .2, W vale .135 y TEMP contina valiendo.2

    Ahora si hubiera puesto as:ADDWF TEMP,F

    TEMP valdra .135 y W valdra .133NOTA: Para indicar la direccin de dnde seguarda, tambin se puede poner 0 o 1 en vezde W o F. 0 corresponde guardarlo en elregistro W y 1 en el registro TEMP (para estecaso).

    Afecta a:Z Se pone a 1 si el resultado de la operacines 0DC Se pone a 1 si hubo un acarreo del bit 3 al4C Se pone a 1 si hubo desbordamiento, osea, cuando se supera H'FF'ANDWFRealiza la operacin AND entre W y unregistro designado por el programador. Eldestino de esta operacin lo elije elprogramador.

    ANDWF TEMP,FSi antes de la instruccin W valeB'11100011' y TEMP vale B'00111010'Despus de la instruccin TEMP valeB'00100010' y W vale B'11100011'

    Afecta a:Z Se pone a 1 si el resultado de la operacines 0BCFPone a 0 el bit de un registro. El bit debe serindicado por el programador.

    BCF TEMP,2Antes de la instruccin TEMP valeB'11111111'. Despus de la instruccin TEMPvale B'11111011'Para recordar, Bit Clear es borrar File esarchivo o registroNo afecta a ningn bit del registro Status.

    .tutorial asm

    / / pgina 0x34

  • BSFPone a 1 el bit de un registro. El bit debeser indicado por el programador.BSF TEMP,0

    Antes de la instruccin TEMP valeB'01110110'. Despus de la instruccin TEMPvale B'01110111'Para recordar, Bit Set es poner a 1 FileArchivo o registroNo afecta a ningn Bit del registro Status.

    BTFSCSalta un lnea si el bit de un registro escero. El bit debe ser indicado por elprogramador.BTFSC TEMP,5BCF PORTA,0BSF PORTB,0

    Caso 1:TEMP vale B'00011110'. El CP analizarsolo el Bit 5 del registro TEMP, como es 0,salta la instruccin BCF PORTA,0 y ejecutala siguiente lnea que es BSF PORTB,0 ycontinua haciendo la instruccin.Caso 2:TEMP vale B'00111000'. El CP analizarsolo el Bit 5 del registro TEMP, como es 1 nosalta la instruccin y har la instruccin BCFPORTA,0 y luego continua con la instruccinBSF PORTB,0No afecta a ningn Bit del registro Status.

    BTFSSSalta una lnea si el bit de un registro es 1.El bit debe ser indicado por el programador.BTFSS TEMP,3ADDWF PORTCANDWF NODO

    Caso 1:TEMP vale B'01101100'. El CP analizarsolo el Bit 3 del registro TEMP, como es 1,salta la instruccin ADDWF PORTC y

    ejecuta la siguiente lnea que es ANDWFNODO y contina haciendo la instruccin.Caso 2:TEMP vale B'11110000'. El CP analizarsolo el Bit 3 del registro TEMP, como es 0 nosalta la instruccin y har la instruccinADDWF PORTC y luego contina con lainstruccin ANDWF NODO.No afecta a ningn Bit del registro Status.Normalmente, continuando las instrucciones BTFSS y/o BTFSC va un GOTO oCALL pero no la he puesto porque an no seexplicaron estas instrucciones.

    CALLSe dirige a una direccin de la memoria deprograma designado por el programador. Enotras palabras, se utiliza para dirigirse a unarutina o tarea. Su principal ventaja es que unavez que finaliz la tarea, vuelve al puntosiguiente desde dnde se llamo.CALL ESC_PORTB

    No afecta a ningn bit del registro Status.

    Hacemos una excepcin con respecto a verlas instrucciones por orden alfabtico yveremos ahora la instruccin GOTO.

    GOTOSe dirige a una direccin de la memoria deprograma designada por el programador. Enotras palabras, se utiliza para saltarinstrucciones que no queremos que seejecuten. A diferencia de la instruccin CALL,no hay forma de volver cuando se ejecuta lainstruccin.GOTO INICIO

    No afecta a ningn bit del registro Status.

    .tutorial asm

    / / pgina 0x35

    10101001010101010100101010101010101010101001010100101

    010100101010

  • Extendiendo la explicacinVamos a hablar del PC para entender biensobre estas instrucciones. La excelenteexplicacin que continua, por desgracia no esma (ojal fuera mi explicacin), son de laspersonas Maunix y BrunoF (del foro Todopic)En la siguiente imagen, vemos el diagramade bloques del PC o CP.

    El PC es de 13 bits en este caso (8kwords).14 son los bits de cada "word" o instruccinque se graban en cada posicin de la FLASH(memoria de programa).El PC se reparte en: sus 8 bits de menorpeso en el registro PCL, y los 5 restantes enel registro PCLATH.Los pics al tener un set de instruccionesreducido no pueden en una sola instruccinmeter todos los bits necesarios paradireccionar toda su memoria.El Program Counter son 2 registros, elPCHigh y PCLow . Cuando haces un CALL oun GOTO, solo se rellenan 11 bits (los 8 delPClow y 3 del PChigh) y los restantes 2 losrellena con el PCLATH (para completar los13bits).El STACK (pila) tiene toda la direccin, nosolo parcial. Si haces un CALL desde la

    pagina 0 a la pgina 3 y luego un RETURN elcdigo SI volver a la pgina 0, pero elPCLATH sigue apuntando a la pgina 3,entonces si usas otro GOTO o CALL, debestener en cuenta de modificar el PCLATH.Entonces, dijimos que:El PC = ProgramCounter o CP = Contadorde Programa, tiene 13 bits del 0 al 12.Al ejecutar un CALL o un GOTO, se copiandel 0 al 10, y los otros 2 bits se copian delregistro PCLATH. El PCLATH solo estar allpara esa situacin.En un RETURN o RETFIE la microelectronica del PIC, pega la direccin del PCque estaba guardada.

    Lo vemos con un ejemplo:1.

    STACK = vacoPC = 0x00A0PCLATH = 0b000011000Ejecutas un CALL 0x230

    2. El STACK tiene en su posicin 0 ladireccin 0x00A0.PC = 111000110000

    3. Se ejecuta la subrutina y en ese punto elPC ya qued enPC = 111000110111

    4. Viene un RETURN. La microelectrnica delPIC copiar el STACK tal cual en el ProgramCounter + 1Valor STACK 0x00A0 + 1 > PC = 0x00A15. El cdigo sigue ejecutndose en la pgina0 pero hay que tener en cuenta que elPCLATH apunta a la pgina 3 por ello sihars otro CALL o GOTO, debers cambiarde nuevo el PCLATH si la subrutina no esten la pgina 3.Para cerrar el temaVamos a entrar a todo detalle en el ProgramCounter (PC) para que se vayan todas lasdudas ya que es muy importante. Vayamos al

    .tutorial asm

    / / pgina 0x36

  • tema del PC, Computed Goto (lo que algunosllaman "tabla"), CALL, RETURN y GOTO.El Program Counter (PC) est conformadoen esta familia de uC (y refirindonos a lafamilia 16F, las otras poseen ms o menosbits implementados) por 13 bits repartidosentre dos registros: PCH y PCL.El PCL es legible/escribible directamente atravs del registro fsico PCL (valga laredundancia). En cambio, el PCH no esdirectamente accesible. No puede ser ledo, yslo puede se grabado mediante un bufferque contiene el valor temporalmente (oh! aquaparece nuestro famoso PCLATH). Entonces,recordar: El PCLATH es slo un buffertemporal que almacena los 5 bits de mayorpeso del PC para ser escritos cuando seejecute una instruccin que lo requiera.Ahora, hay dos situaciones posibles en lasque el PC debe ser cargado de maneradistinta: una es cuando queremos trabajarcon tablas y otra cuando realizamos un CALLo un GOTO que no est en el mismo banco.

    1era situacin: Tabla (Computed Goto)La tabla es una situacin de uso del PC enla que se afecta directamente al registro PCL.Cuando se afecte directamente al PCLmediante una instruccin, es necesarioque el usuario asegure que PCLATH tengasus 5 bits precargados adecuadamente.

    Hago un ejemplo:Mal:org 0x000movlw 0x01call tablaorg 0x300

    tablaaddwf PCL,Fretlw 0x03retlw 0x01retlw 0x0F.....

    Bien:org 0x000movlw 0x03movwf PCLATHmovlw 0x01call tablaorg 0x300