Pic 16f84a

161
I PI 1 F84 • Pines y funcianes • Arquitectura • Caracteristicas especiales • EI PIC16C84 • Campatibilidad can atras familias

description

Circuitos y codigo ensamblado en PIC18F4550

Transcript of Pic 16f84a

Page 1: Pic 16f84a

I PI 1 F84

• Pines y funcianes• Arquitectura• Caracteristicas especiales• EI PIC16C84• Campatibilidad can atras familias

Page 2: Pic 16f84a

.. Capitulo 1. El PIC16F84

El PIC 16F84 es un microcontrolador con memoria de programa tipo FLASH, 10que representa gran facilidad en el desarrollo de prototipos y en su aprendizaje yaque no se requiere borrarlo con luz ultravioleta como las versiones EPROM sino,permite reprogramarlo nuevamente sin ser borrado con anterioridad. Por esta raz6n,10 usaremos en la mayoria de aplicaciones que se desarrollan a 10 largo del curso.

Pines y funciones

RA2

RA'3

... RA4/TOCKI

--+- MCLRNpp

--+- VSS

... RBO/INT

... RB1

... RB2

... RB3

RA1 ...

RAO ...

OSC1/CLKIN +­OSC2CLKOUT -+VDD +-RB? ...

RB6 ...

RB5 ...

RB4 ...

Figura 1.1. Diagrama de pines del PIC16F84

El PIC 16F84 es un microcontrolador de Microchip Technology fabricado en tee­nologfa CMOS, su consumo de potencia es muy bajo y ademas es completamenteestatico, esto quiere decir que el reloj puede detenerse y los datos de la memoria nose pierden.

El encapsulado mas cormin para el microcontrolador es el DIP (Dual In-linePin) de 18 pines, propio para usarlo en experimentaci6n. La referencia completaes 16F84-04/P, para el dispositivo que utiliza reloj de 4 MHz. Sin embargo, hayotros tipos de encapsulado que se pueden utilizar segtin el diseiio y la aplicaci6nque se quiere realizar. Por ejemplo, el encapsulado tipo surface mount (montajesuperficial) tiene un reducido tamaiio y bajo costo, que 10 hace propio para pro­ducciones en serie 0 para utilizarlo en lugares de espacio muy reducido, la figura1.2 muestra los tipos de empaque que puedetener el integrado.

Figura 1.2. Tipos de encapsulado

Puertos del mlcroccntrolador . .Los puertos son el puente entre el microcontrolador y el mundo exterior. Son lineasdigitales que trabajan entre cero y cinco voltios y se pueden configurar como entra­das 0 como salidas.

Page 3: Pic 16f84a

Capitulo 1. El PIC16F84to

El PIC16F84 tiene dos puertos. El puerto A con 5lfneas y el puerto B con 8lfneas,figura 1.3. Cada pin se puede configurar como entrada 0 como salida independienteprogramando un par de registros disefiados para tal fin. En ese registro un "0" configu­ra elpin del puerto correspondiente como salida y un "I" 10 configura como entrada.

RB?

RA4fTOCKIRB6

RA3 RB5Puerto

RA2 RB4 PuertoA RB3 BRA1

~~ORAO RB2

RB1

RBO/INT

Figura 1.3. Puertos del PIC16F84

El puerto B tiene internamente unas resistencias de pull-up conectadas a suspines (sirven para fijar el pin a un nivel de cinco voltios), su uso puede ser habilitadoo deshabilitado bajo control del programa. Todas las resistencias de pull-up se co­nectan 0 se desconectan a la vez, usando el bit llamado RBPU que se encuentra en elregistro (posicion de memoria RAM) llamado OPTION. La resistencia de pull-up esdesconectada automaticamente en unpin si este se programa como salida. El pinRBOIINT se puede configurar por software para que funcione como interrupion ex­terna, para configurarlo se utilizan unos bits de los registros INTCON y OPTION.

El pin RA4ffOCKI del puertoA puede ser configurado como un pin de entrada/salidao como entrada del temporizador/contador. Cuando este pin se programa como entradadigital, funciona como un disparador de Schmitt (Schmitt trigger), puede reconocer sefialesun poco distorsionadas y llevarlas a niveles logicos (cero y cinco voltios). Cuando se usacomo salida digital se comporta como colector abierto, por 10 tanto, se debe poner unaresistencia de pull-up (resistencia extema conectada a un nivel de cinco voltios). Comosalida, la logica es inversa: un "0" escrito al pin del puerto entrega en el pin un "1" logico.Ademas, como salida no puede manejar cargas como fuente, solo en el modo sumidero.

Como este dispositivo es de tecnologfa CMOS, todos los pines deben estar co­nectados a alguna parte, nunca dejarlos al aire porque se puede dafiar el integrado.Los pines que no se esten usando se deben conectar a la fuente de alimentacion de+5V, como se muestra en la figura 1.4.

+5V +5V

Pines noutilizados

Figura 1.4. Los puertos no utilizados se deben conectar a la fuente

Page 4: Pic 16f84a

Capitulo 1. El PIC16F84

La maxima capacidad de corriente de cada uno de los pines de los puertos enmodo sumidero (sink) es de 25 rnA yen modo fuente (source) es de 20 rnA, figura1.5. La maxima capacidad de corriente total de los puertos es:

Modo sumideroModo fuente

PUERTO A80 rnA50 rnA

PUERTOB150 rnA100 rnA

E1 consumo de corriente del microcontrolador para su funcionamiento dependedel voltaje de operaci6n, la frecuencia y de las cargas que tengan sus pines. Para unreloj de 4 MHz el consumo es de aproximadamente 2 rnA; aunque este se puedereducir a 40 microamperios cuando se esta en el modo sleep (en este modo el microse detiene y disminuye el consumo de potencia). Se sale de ese estado cuando seproduce alguna condici6n especial que veremos mas adelante.

Imax=20mA

PuertoA Imax=80mAPuerto B Imax=150mA

Puerto A Imax=50mAPuerto B Irnaxe1OOmA

Figura 1.5. Capacidad de corriente del PIC16F84

EI oscilador externoTodo microcontrolador requiere un circuito externo que Ie indique la veloci­dad a la que debe trabajar. Este circuito, que se conoce como oscilador 0 reloj,es muy simple pero de vital importancia para el buen funcionamiento del sis­tema. El PIC16F84 puede utilizar cuatro tipos de oscilador diferentes. Estostipos son:

•Re. Oscilador con resistencia y condensador.• XT. Cristal.• HS. Cristal de alta velocidad.• LP. Cristal para baja frecuencia y bajo consumo de potencia.

----*-

Page 5: Pic 16f84a

Capftulo 1. El PIC16F84..En el momento de programar 0 "quemar" el microcontrolador se debe especifi­

car que tipo de oscilador se usa. Esto se hace a traves de unos fusibles llamados"fusibles de configuracion",

El tipo de oscilador que se sugiere para las practicas es el cristal de 4 MHz,porque garantiza mayor precision y un buen arranque del microcontrolador. Inter­namente esta frecuencia es dividida por cuatro, 10 que hace que la frecuencia efec­tiva de trabajo sea de 1 MHz, por 10 que cada instruce ion se ejecuta en un micro­segundo. El cristal debe ir acompafiado de dos condensadores y se conecta comose muestra en la figura 1.6.

Figura 1.6. Conexi6n de un oscilador a cristal

Dependiendo de la aplicacion, se pueden utilizar cristales de otras frecuencias;por ejemplo se usa el cristal de 3.579545 MHz porque es muy economico, el de32.768 KHz cuando se necesita crear bases de tiempo de un segundo muy precisas.El limite de velocidad en estos microcontroladores es de 10 MHz.

Si no se requiere mucha precision en el oscilador y se quiere economizar dinero,se puede utilizar una resistencia y un condensador, como se muestra en la figura 1.7.

+5VDC

R

Fosc/4

Figura 1.7. Conexi6n de un oscilador RC

ResetEn los microcontroladores se requiere un pin de reset para reiniciar el funcionamientodel sistema cuando sea necesario, ya sea por una falla que se presente 0 porque asf sehalla disefiadoel sistema. El pin de reset en los PIC es llamado MCLR (master clear).El PIC 16F84 admite diferentes tipos de reset:

• AI encendido (Power On Reset)• Pulso en el pin MCLR durante operacion normal

Page 6: Pic 16f84a

...Capitulo 1. El PIC16F84

• Pulso en el pin MCLR durante el modo de bajo consumo (modo sleep)• El rebase del conteo del circuito de vigilancia (watchdog) durante operacion normal• El rebase del conteo del circuito de vigilancia (watchdog) durante el modo de

bajo consumo (sleep)

El reset alencendido se consigue gracias ados temporizadores. El primero de elloses el OST (Oscillator Start-Up Timer:Temporizadorde encendido del oscilador), orien­tado a mantener el microcontrolador en reset hasta que el oscilador del cristal es esta­ble. El segundo es el PWRT (Power-Up Timer: Temporizador de encendido), queprovee un retardo fijo de 72 ms (nominal) en el encendido unicamente, disefiado paramantener el dispositivo en reset mientras la fuente se estabiliza. Para utilizar estostemporizadores, solo basta con conectar el pin MCLR a la fuente de alimentaci6n,evitandose utilizar las tradicionales redes RC externas en el pin de reset.

EI reset por MCLR se consigue llevando momentaneamente este pin a un estadol6gico bajo, mientras que el watchdog WDT produce el reset cuando su temporizadorrebasa la cuenta, 0 sea que pasa de OFFh a OOh. Cuando se quiere tener control sobre elreset del sistema se puede conectar un bot6n como se muestra en la figura 1.8.

+5VDC

10K

Reset~

Figura 1.8. Conexi6n del boton de reset

Arquitectura

Este termino se refiere a los bloques funcionales internos que conforman el mi­crocontrolador y la forma en que estan conectados, por ejemplo la memoria FLASH(de programa), la memoria RAM (de datos), los puertos, la 16gica de control quepermite que todo el conjunto funcione, etc.

La figura 1.9 muestra la arquitectura general-del PIC16F84, en ella se puedenapreciar los diferentes bloques que 10componen y la forma en que se conectan. Semuestra la conexi6n de los puertos, las memorias de datos y de programa, los blo­ques especiales como elwatchdog, los temporizadores de arranque, el oscilador, etc.

Todos los elementos se conectan entre S1 por medic de buses. Un bus es un con­junto de lineas que transportan informaci6n entre dos 0 mas m6dulos. Vale la penadestacar que el PIC 16F84 tiene un bloque especial de memoria de datos de 64 bytesdel tipo EEPROM, ademas de los dos bloques de memoria principales que son el deprograma y el de datos 0 registros.

----~-

Page 7: Pic 16f84a

Capitulo 1. HIPIC16F84,

<»'--""""r'-_.....

TEMPORIZADORDE ENCENDIDO

TEMPORIZADOR DEARRANQUE DEL

OSCILADOR

CIRCUITODERESET

CIRCUITO DEVIGILANCIAWATCHDOG

MEMORIAEEPROM DE

DATOS

TEMPORIZADORlCONTADOR

PUERTOS I/O

PUERTOSA,S

Figura 1.9. Arquitectura interna del PIC16F84

El PIC16F84 se basa en la arquiteetura Harvard, en la eual el programa y losdatos se pueden trabajar desde memorias separadas, 10 que posibilita que las instruc­ciones y los datos posean longitudes diferentes. Esta misma estruetura es la quepermite la superposici6n de los ciclos de busqueda y ejeeuei6n de las instrueciones,10 eual se ve reflejado en una mayor veloeidad del mieroeontrolador.

Memoria de programaEs una memoria de 1 Kbyte de longitud con palabras de 14 bits. Como es del tipoFLASH se puede programar yborrar electricamente, 10 que facilita el desarrollo de losprogramas y la experimentaei6n. En ella se graba, 0 almaeena, el programa 0 e6digosque el mierocontrolador debe ejeeutar. Dado que el PIC16F84 tiene un eontador deprograma de 13 bits, tiene una eapacidad de direecionamiento de 8K x 14, pero sola­mente tiene implementado el primer lK x 14 (OOOOh hasta 03FFh). Si se direecionan,posiciones de memoria superiores a 3FFh se causaraun solapamiento con el espaciodel primer 1K. En la figura 1.10 se muestra el mapa de la memoria de programa.

Vector de reset. Cuando oeurre un reset al mieroeontrolador, el eontador de progra­rna se pone en eeros (OOOH). Por esta raz6n, en la primera direeci6n del programa sedebe eseribir todo 10 relacionado con la iniciaci6n del mismo.

Page 8: Pic 16f84a

.. Capitulo 1..El P1C16F84

PC <12:0>

CALLRETLWRETFIERETURN

13

Pila nivel1Pila nivel2

Pila nivel8

Vector de Reset OOOOh

MEMORIADE PROGRAMA

03FFh0400h

1FFFh

Figura 1.10. Mapa de la memoria de programa

Vector de interrupckin. Cuando el microcontrolador recibe una sefialde interrupcion,el contador de programa apunta a la direccion 04H de la memoria de programa, poreso,allf se debe escribir toda la programacion necesaria para atender dicha interrupciorr

Registros (Memoria RAM)El PIC16F84 puede direccionar 128 posiciones de memoria RAM, pero solo tieneimplementados fisicamente los primeros 80 (OAF en hexadecimal). De estos losprimeros 12 son registros que cumplen un proposito especial en el control del mi­crocontrolador y los 68 siguientes son registros de uso general que se pueden usarpara guardar los~~s temporales de la tarea que se esta ejecutand~ figura 1.11./

Los registros estan organizados como dos arreglos (paginas) de 128 posicionesde 8 bits cada una (128 x 8); todas las posiciones se pueden accesar directa 0 indirec­tamente (esta ultima a traves del registro selector FSR). Para seleccionar que paginade registros se trabaja en un momento determinado se utiliza el bitRPO del registroSTATUS. A continuacion haremos una descripcion de los registros.,

OOh 0 INDO: Registro para direccionamiento indirecto de datos. Este no es unregistro disponible fisicamente; utiliza el contenido del FSR y el bit RPOdel registroSTATUS para seleccionar indirectamente la memoria de datos 0 RAM del usuario;la instruccion determinara que se debe realizar con el registro sefialado.

Olh 0 TMRO. Temporizador/contador de 8 bits. Este se puede incrementar conuna sefial extema aplicada al pin RA4ITOCKI 0 de acuerdo a una sefial intemaproveniente del reloj de instrucciones del microcontrolador. La rata de incrementodel registro se puede determinar por medio de un preescalador, localizado en elregistro OPTION. Como una mejora con respecto a sus antecesores, se le ha agrega­do la generacion de interrupcion cuando se rebasa la cuenta (el paso de OFFh a OOh).

Page 9: Pic 16f84a

Capftul,p1. El PlC16F84

CFhDOh

FFh

4FhSOh

7Fh

OOh "Direc. Indirecto "Direc. Indirecto 80h01h TMRO OPTION 81h02h PCl PCl 82h03h STATUS STATUS 83h04h FSR FSR 84hOSh PORTA TRISA 8Sh06h PORTS TRISS 86h07h 87h08h 88h09h 89hOAh 8AhOSh 8Sh

OCh Mapeado en 8Chpaqina 0

Paqina 0 Pagina 1" No es un registro trsico

Posiciones no implementadas

Figura 1.11. Registros del PIC16F84

02h 0 PCL: Contador de programa. Se utiliza para direccionar las palabras de 14bits del prograrna del usuario que se encuentra almacenado en la memoria ROM; estecontador de prograrnas es de 13 bits de ancho, figura 1.12. Sobre el byte bajo, se puedeescribir 0 leer directarnente, rnientras que sabre el byte alto, no. El byte alto se manejamediante el registro PCLATH (OAh). A diferencia de los PIC de primera generaci6n,el l6F84 ante una condici6n de reset inicia el contador de prograrna con todos sus bitsen "cero". Durante la ejecuci6n normal del prograrna, y dado que todas las instruccio­nes ocupan s6lo una posici6n de memoria, el contador se incrementa en uno con cadainstrucci6n, a menos que se trate de alguna instrucci6n de salto.

Figura 1.12. Contador de programa (13 bits)

En una instrucci6n CALL 0 GOTO, los bits PC<::1O:0> se cargan desde el c6digode operaci6n de la instrucci6n, mientras que los bits PC<11:12> 10 hacen desde-elPCLATH<4:3>. Como solarnente el primer lK de memoria esta implementado, el

/

c6digo de operaci6n de la instrucci6n puede contener la direcci6n destino, eso quie-re decir que se pueden hacer saltos y llarnados a subrutinas sin necesidad de tener encuenta la paginaci6n de memoria de prograrna.

Page 10: Pic 16f84a

.. Capitulo 1. El PIC16F84

En otras instrucciones donde PCLes el destino, PC<12:8> se carga directamentedesde el PCLATH<4:0>, por ejemplo en el caso de la instruccion ADDWF. Esto sedebe tener en cuenta cuando se desea hacer lectura de tablas usando el comando:ADDWF PC,1 ,en este caso se debe tener en cuenta que la tabla debe estar -comprendida dentro de un solo bloque de 256 bytes (0-255, 256-511, etc.).

03h 0 STATUS: Registro de estados. Contiene el estado aritmetico de la&lJ, la causadel reset y los bits de preseleccion de pagina para la memoria de datos. La figura 1.13muestra los bits correspondientes a este registro. Los bits 5 Y6 (RPO YRP1) son los bitsde seleccion de pagina para el direccionamiento directo de la memoria de datos; sola­mente RPO se usa en los PICI6F84. RPI se puede utilizar como un bit de propositogeneralde lecturalescritura. Los bits TO YPD no se pueden modificar por un proceso deescritura; ellos muestran la condicion por la cual se ocasiono el Ultimo reset.

Figura 1.13. Registro de estados

04h 0 FSR: Registro selector de registros. En asocio con el registro INDO, seutiliza para seleccionar indirectamente los otros registros disponibles. Mientras quelos antecesores del PIC 16F84 solo posefan 5 bits activos, en este microcontroladorse poseen los 8 bits. Si en el programa no se utilizan llamadas indirectas,este regis­tro se puede utilizar como un registro de proposito general.

Para entender mejor el funcionamiento de este registro veamos un progra­rna simple que borra el contenido de la memoria RAM, empleando direcciona­miento indirecto.

Page 11: Pic 16f84a

CapftUlo 1. EI P1C16F84

MOVLW 20MOVWF FSR

NEXT CLRF INDO

INCFBTFSSGOTO

continua ......

FSR,RFSR,5NEXT

;inicializa el puntero en la memoria RAM;que se va a borrar;borra el registro indexado (es decir el que esta;siendo direccionado por el FSR);incrementa el puntero;pregunta si ya acab6 el banco de memoria;sigue borrando los registros que faltan

OSh 0 PORTA: Puerto de Entrada/Salida de 5 bits. Este puerto, al igual quetodos sus similares en los PIC, puede leerse 0 escribirse como si se tratara deun registro cualquiera. El registro que controla el sentido (entrada 0 salida) delos pines de este puerto esta localizado en la pagina 1, en la posici6n 85h y sellama TRISA.

06h 0 PORTB: Puerto de entrada/salida de 8 bits. Al igual que en todos los PIC,este puede leerse 0 escribirse como si se tratara de un registro cualquiera; algunos desus pines tienen funciones alternas en la generaci6n de interrupciones. El registro decontrol para la configuracion de la funci6n de sus pines se localiza en la pagina 1, enla direcci6n 86h y se llama TRISB.

08h 0 EEDATA: Registro de datos de la EEPROM. Este registro contiene el datoque se va a escribir en la memoria EEPROM de datos 0 el que se ley6 de esta,

09h 0 EEADR: Registro de dlreccion de la EEPROM. Aquf se mantiene la direc­ci6n de la EEPROM de datos que se va a trabajar, bien sea para una operaci6n delectura 0 para una de escritura.

OAh 0 PCLATH: Registro para la parte alta de la dlrecclon, Este contiene laparte alta del contador de programa y no se puede acceder directamente.

OBh 0 INTCON: Registro para el control de interrupciones. Es el encargado delmanejo de las interrupciones y contiene los bits que se muestran en la figura 1.14.

8Ih u OPTION: Registro de conflguraclon multiple. Posee varios bits paraconfigurar el preescalador, la interrupci6n externa, el timer y las caracteristicasdel puerto B. Los bits que contiene y las funciones que realiza este registro semuestran en la figura 1.15. El preescalador es compartido entre el MTRO y elWDT; su asignaci6n es mutuamente excluyente ya que solamente puede uno deellos ser preescalado a la vez.

85h 0 TRISA: Registro de conflgurackin del puerto A. Como ya se mencion6, esel registro de control para el puerto A. Un "cero" en el bit correspondiente al pin 10configura como salida, mientras que un "uno" 10 hace como entrada.

86h 0 TRISB: Registro de conflguracion del puerto B. Orientado hacia el controldel puerto B. Son validas las mismas consideraciones del registro anterior.

Page 12: Pic 16f84a

.. Capitulo 1. EI PIC16F84

Figura 1.14. Registro INTCON

88h 0 EECONl: Registro para el control de la memoria EEPROM de datos.Este es el registro de control de la memoria de datos y s610 destina cinco bits paraello, los mas bajos; los tres bits superiores permanecen sin implementar. En la figura1.16 se muestran las funciones de estos bits.

89h 0 EECON2: Registro auxiliar para control de la memoria EEPROM dedatos. Registro que no esta implementado ffsicamente en el microcontrolador, peroque es necesario en las operaciones de escritura en la EEPROM de datos; ante cual­quier intento de lectura se obtendran "ceros".

OCh a 4Fh: Registros de proposito general. Estas 68 posiciones estan implemen­tadas en la memoria RAM estatica, la cual conforma el area de trabajo del usuario; aelIas tambien se accede cuando en la pagina 1 se direccionan las posiciones 8Ch a

Page 13: Pic 16f84a

CapituJo 1. EI PIC16F84

Valor000001010011100101110111

TMRO1:21:41:81:161;321:641:1281:256

WDT1:11:21:41:81:161:321:64

1:128

Figura 1.15. Registro OPTION

CFh. Esto se ha disefiado as! para evitar un excesivo cambio de paginas en el manejode la RAM del usuario, agilizando los procesos que se esten llevando a cabo y des­complicando la labor del programador.

Registro de trabajo W. Este es el registro de trabajo principal, se comporta demanera similar al acumulador en los microprocesadores. Este registro participa enla mayorfa de las instrucciones.

Pila (Stack)Estos registros no forman parte de ningiin banco de memoria y no permiten elacceso por parte del usuario. Se usan para guardar el valor del contador de progra­rna cuando se hace un llamado a una subrutina 0 cuando se atiende una interrup­ci6n; luego, cuando el micro regresa a seguir ejecutando su tarea normal, el conta­dor de programa recupera su valor leyendolo nuevamente desde la pila. El PIC16F84tiene una pila de 8 niveles, esto significa que se pueden anidar 8 llamados a subru­tina sin tener problemas.

Page 14: Pic 16f84a

.. Capitulo 1. El PIC16F84

Figura 1.16. Registro EECON 1

Caracteristicas especiales

Algunos elementos que forman parte de los PIC no se encuentran en micro­controladores de otros fabricantes, 0 simplemente representan alguna ventaja 0

facilidad ala hora de hacer un diseiio. Veamos una breve descripci6n de las massignificativas:

Circuito de vigilancia (Watchdog Timer)Su funci6n es restablecer el programa cuando este se ha perdido por fallas en laprogramaci6n 0 por alguna raz6n extema. Es muy iitil cuando se trabaja en ambien­tes con mucha interferencia 0 ruido electromagnetico. Esta conformado por un osci­lador RC que se encuentra dentro del microcontrolador.

Este oscilador corre de manera independiente al oscilador principal. Cuando sehabilita su funcionamiento, dicho circuito hace que el microcontrolador sufra un resetcada determinado tiempo (que se puede programar entre 18 ms y 2 segundos). Estereset 10 puede evitar el usuario mediante una instrucci6n especial del microcontrola­dor (CLRWDT: borrar el conteo del watchdog), la cual se debe ejecutar antes de quetermine el periodo nominal de dicho temporizador. De esta manera, si el programa se

Page 15: Pic 16f84a

CapltuJ.o 1. El PIC16F84

ha salido de su flujo normal, por algiin ruido 0 interferencia externa, el sistema sereiniciara (cuando se acabe el tiempo programado y no se haya borrado el contador) yel programa puede restablecerse para continuar con su funcionamiento normal.

En las primeras practicas no se utiliza el circuito de vigilancia para facilitar eltrabajo; por eso, en el momenta de programar el microcontrolador se debe seleccio­nar en los fusibles de configuraci6n "watchdog timer OFF'. Mas adelante veremosalgunos ejemplos que ilustran su funcionamiento y la manera de utilizarlo.

Temporizador de encendido (Power-up Timel1Este proporciona un reset al microcontrolador en el momenta de conectar la fuente dealimentaci6n, 10 que garantiza un arranque correcto del sistema. En el momenta degrabar el micro se debe habilitar el fusible de configuraci6n "Power-up Timer', paraella se debe se1eccionar la opci6n "ON". Su tiempo de retardo es de 72 milisegundos.

Modo de bajo consumo (sleep)Esta caracterfstica permite que el microcontrolador entre en un estado pasivo dondeconsume muy poca potencia. Cuando se entra en este modo el oscilador principal sedetiene, perc el temporizador del circuito de vigilancia (watchdog) se reinicia y em­pieza su conteo nuevamente. Se entra en ese estado por la ejecuci6n de una instrucci6nespecial (llamada SLEEP) y se sale de el por alguna de las siguientes causas: cuandoel microcontrolador sufre un reset por un pulso en el pin MCLR, porque el watchdoghace que se reinicie el sistema 0 porque ocurre una interrupci6n al sistema.

InterrupcionesEste microcontrolador incluye e1 manejo de interrupciones, 10cual representa gran­des ventajas. El PIC 16F84 posee cuatro fuentes de interrupci6n a saber:

• Interrupci6n externa en el pin RBOIINT• Finalizaci6n del temporizador/contador TMRO• Finalizaci6n de escritura en la EEPROM de datos• Cambio de nivel en los pines RB4 a RB7

El registro OBh 0 INTCON contiene las banderas de las interrupciones INT,cambio en el puerto B y finalizaci6n del conteo del TMRO, al igual que el controlpara habilitar 0 deshabilitar cada una de las fuentes de interrupci6n, incluida la deescritura en memoria EEPROM. S610 la bandera de finalizaci6n de la escritura resi­de en el registro 88h (EECONl<4».

Si el bit GIE (Global Interrupt Enable) se coloca en 0, deshabilita todas lasinterrupciones. Cuando una interrupci6n es atendida, el bit GIE se coloca en 0 auto­maticamente para evitar interferencias con otras interrupciones que se pudieran pre­sentar, la direcci6n de retorno se coloca en la pila y el PC se carga con la direcci6n04h. Una vez en la rutina de servicio, la fuente de la interrupci6n se puede determi­nar examinando las banderas de interrupci6n. La bandera respectiva se debe colo­car, por software, en cero antes de regresar de la interrupci6n, para evitar que sevuelva a detectar nuevamente la misma interrupci6n.

Page 16: Pic 16f84a

.. Capitulo 1. El PlC16F84

La instrucci6n RETFIE permite al usuario retornar de la interrupci6n, a la vezque habilita de nuevo las interrupciones, al colocar el bit GIE en uno. Debe tenersepresente que solamente el contador de programa es puesto en la pila al atenderse lainterrupci6n; por 10 tanto, es conveniente que el programador tenga cuidado con elregistro de estados y el de trabajo, ya que se pueden producir resultados inesperadossi dentro de ella se modifican.

Interrupckin externa. Acnia sobre el pin RBOIINT y se puede configurar para acti­varse con el flanco de subida 0 el de bajada, de acuerdo al bit INTEDG (OPTION<6».Cuando se presenta un flanco valido en el pin INT, la bandera INTF (INTCON<l» secoloca en uno. La interrupci6n se puede deshabilitar colocando el bit de control INTE(INTCON<4» en cero. Cuando se atiende la interrupci6n, a traves de la rutina deservicio, INTF se debe colocar en cero antes de regresar al programa principal. Lainterrupci6n puede reactivar al microcontrolador despues de hi instrucci6n SLEEP, sipreviamente el bit INTE fue habilitado.

Interrupcion por flnallzaclon de la temporizaclon. La superaci6n del conteo maxi­mo (OFFh) en el TMRO colocara el bit TOIF en uno (INTCON<2». El bit de controlrespectivo es TOlE (INTCON<5».

Interrupclon por cambio en el puerto RB. Un cambio en los pines del puerto B<7:4> colocara en uno el bit RBIF (INTCON<O». El bit de control respectivo esRBIE (INTCON<3».

Interrupcion por flnalizaelon de la escritura. Cuando la escritura de un dato en laEEPROM finaliza, se coloca en 1 el bit EEIF (EECONl<4». El bit de control res­pectivo es EEIE (INTCON<6»

Memoria de datos EEPROMEl PIC16F84 tiene una memoria EEPROM de datos de 64 posiciones (Oha 3Fh), de8 bits cada una. Este bloque de memoria no se encuentra mapeado en ningun banco,el acceso a esas posiciones se consigue a traves de dos registros de la RAM:- el registro EEADR (posici6n 09), que debe contener la direcci6n de la posici6n de

la EEPROM a ser accesada- el registro EEDATA (posici6n 08), que contiene el dato de 8 bits que se va a escri­

bir 0 el que se obtuvo de la ultima lectura.

Adicionalmente, existen dos registros de control: el EECON1 (88h), que poseecinco bits que manejan las operaciones de lecturalescritura y el EECON2 (89h), queaunque no es un registro ffsico, es necesario para realizar las operaciones de escritura.

La lectura toma un cicIo del reloj de instrucciones, mientras que la escritura, porser controlada por un temporizador incorporado, tiene un tiempo nominal de 10milisegundos, este tiempo puede variar con la temperatura y el voltaje. Cuando seva a realizar una operaci6n de escritura, automaticamente se hace primero la opera­ci6n de borrado. El mimero tipico de cicIos de borrado/escritura de la EEPROM dedatos es de 1.000.000.

Page 17: Pic 16f84a

Capitulo 1. El PICI6F84..Fusibles de configuraci6nEl PIC 16F84 posee cinco fusibles, cada uno de los cuales es un bit. Estos fusibles sepueden programar para seleccionar varias configuraciones del dispositivo: tipo deoscilador, protecci6n de codigo, habilitaci6n del circuito de vigilancia y el tempori­zador al encendido. Los bits se localizan en la posici6n de memoria 2007h, posici6na la cual el usuario s610 tiene acceso durante la programaci6n del microcontrolador.Cuando se programa la protecci6n de c6digo, e1 contenido de cada posici6n de lamemoria no se puede leer completamente, de tal manera que el c6digo del programano se puede reconstruir. Adicionalmente, todas las posiciones de memoria del pro­grama se protegen contra la reprogramaci6n.

Una vez protegido el c6digo, el fusible de protecci6n s610 puede ser borrado(puesto a 1) si se borra toda la memoria del programa y la de datos.

Las pull-ups internasCada uno de los pines del puerto B tiene un debil elemento pull-up intemo (250 JlAtipico); este elemento es automaticamente desconectado cuando el pin se configuracomo salida. Adicionalmente, el bit RBPU (OPTION<7» controla todos estos ele­mentos, los cuales estan deshabilitados ante una condici6n de reset. Estos elementospull-up son especialmente utiles cuando el microcontrolador va a colocarse en elmodo de bajo consumo, ya que ayudan a no tener las entradas flotantes, significandouna reducci6n en el consumo de corriente.

EI conjunto de instruccionesEstas se clasifican en orientadas a registros, orientadas al bit Yoperaciones literales y decontrol. Cada instrucci6n es una palabra de 14 bits, dividida en un c6digo de operaci6n(el cual especifica la orden a ejecutar) y uno 0 mas operandos sobre los que se acnia, Enel apendice A se encuentra la lista completa de instrucciones, la cual incluye ejemplos yexplicaciones. Como se puede observar alli, en total son 35, las cuales tardan un cicIo demaquina, a excepci6n de los saltos, que toman dos cicIos.

EI PIC16C84

El PIC 16C84 es un microcontrolador de la familia Microchip, totalmentecompatible con el PIC 16F84. Su principal caracteristica es que posee memoria"EEPROM" en lugar de memoria Flash, pero su manejo es igual. Con respectoal PICI6F84, este microcontrolador presenta dos diferencias:

• La memoria de datos tiene menor tamafio, aquf se tienen 32 registros de prop6sitogeneral (el mapa de memoria de datos llega hasta 2FH).

• En e1 momenta de programar el microcontrolador, el fusible de selecci6n del temporiza­dor de arranque (Power Up Timer) trabaja de forma inversa, es decir, si en el PIC 16F84se seleccionala opci6n "Low" para activarlo, en el PIC 16C84 se debe seleccionar "High" .

Este microcontrolador ha sido reemplazado de forma gradual por el PIC16F84,por 10tanto, los disefios que 10 utilicen como elemento de control deben ser actuali­zados. Aunque, como se ve, es un proceso casi transparente.

Page 18: Pic 16f84a

Capitulo 1. EI PIC16F84

Compatibilidad con otras fami/ias

Quienes estan familiarizados con los PIC16C5X encontraran basicamente lassiguientes modificaciones:

• La longitud de las instrucciones se incremento a 14 bits.• Se puede omitir la paginacion de la memoria de programa.• La paginacion de la memoria de datos se ha redefinido ligeramente, de tal manera

que se elimina la necesidad de los bits PA2, PAl YPAO en el registro de estados.• Se cuenta con cuatro nuevas instrucciones: RETURN, RETFIE, ADDLW YSUBLW.• La manera en que se configuraban los puertos (con la instruccion TRIS) y se asig­

naba el preescalador (con la instruccion OPTION) ha sido modificada, de tal for­ma que los registros OPTION y TRIS ahora son direccionables; aiin asi, se conser­van dichas instrucciones para mantener la compatibilidad con los PIC 16C5X.

• Se agregaron capacidades de interrupcion, El vector de interrupcion es 0004h.• El tamafio de la pila se incremento a 8 niveles.• El vector de reset se modified a OOOOh.• Reactivacion despues de la instruccion SLEEP a traves de interrupciones.• El pin de entrada RTCC es ahora un pin del puerto A, llamado RA4rrOCK1• El ancho del registro FSR se aumento a 8 bits.• La posicion 07 no esta implementada.• Programacion serial del microcontrolador.

Page 19: Pic 16f84a

Capftulo 1. El PIC16F84

'"

Page 20: Pic 16f84a

..

Pro"..1 PI 1

08 loon•'...• ',' '.,.· A.

~"::':'~',, ~

• conexion de LED y dipswiteh• Manejo de un display de siete segmentos• Multiplexaje de teelados y displays• Conexion de memorias seriales al PIC• Manejo de un modulo LCD• comunicecion serial RS-232• Caraeteristicas especiales de los PIC

- Interrupciones- Watchdog timer- EEPROM de datos del PIC16F84

• Control de un motor paso a paso

Page 21: Pic 16f84a

.. Capftulo 2. Proyectos con el PIC16F84

Proyecto N° 1: Conexi6n de LED y dipswitch

Como un ejercicio practice que nos introduzca de manera rapida y sencilla en elmanejo de los microcontroladores PIC, vamos a realizar un montaje simple, el cualconsiste en conectar cuatro interruptores (dipswitch) como entradas del microcon­trolador y cuatro LED como salidas. El programa que se escriba se debe encargar deverificar el estado de los dipswitch y de acuerdo a este, encender los LED. Esteejemplo aunque es muy simple, pero es fundamental para ejercitar el manejo de lospuertos. La figura 2.1 muestra el diagrama esquematico del circuito.

+5V

10K1000 .l...RESET

L...I\/'v"v--+---o ~

Interruptores 1K

~

Figura 2.1. Conexi6n de los LED y dipswitch.

Debe notarse que los interruptores tienen resistencias conectadas a la fuente dealimentaci6n, estas sirven para fijar un nivel alto cuando el dipswitch no esta ha­ciendo contacto. En este caso, cuando no se encuentra cerrado ningiin interruptor elmicrocontrolador lee "unos" y cuando alguno se encuentre cerrado se leera un "cero".Por otra parte, para encender los LED se utiliza un circuito integrado ULN2803, elcual tiene un conjunto de transistores que invierten el pulso y amplifican la corrien­teo Por 10 tanto, el pulso para encender un LED debe ser positivo.

Dado 10 anterior, cuando se lee el estado de los dipswitch se debe invertir elvalor Iefdo, para asegurarse que el interruptor que este cerrado se convierta enuna sefial positiva para encender el LED correspondiente. En la figura 2.2 semuestra el diagrama de flujo correspondiente al ejercicio y en la figura 2.3 elprograma respectivo.

Page 22: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84,

Figura 2.2. Diagrama de flujo para la conexi6n de los LED y dipswitch

O'lS': significa numero decimalB'00010101': significa numero binarioiSH: significa numero hexadecimalnumeracion hexadecimal

la RAMla RAM

;el puerto A esta en la direccion 0S ~e

;el puerto B esta en la direccion 06 de;registro de configuracibn del puerto A;registro de configuracibn del puerto B;indica que el resultado se guarda en W

;Este programa lee el estado de 4 interruptores y de acuerdo a ella enciende 0

;no 4 LEO;En caso de que un numero se escriba;En caso de que el numero se escriba;En caso de que un numero se escriba;5i no se especifica nada, se supone;definicion de registrospc ., equ 02hstatus' equ 03hptoa. equ 0Shptob equ 06htrisa equ 8Shtrisb, equ 86hw equ 00h.

reset orggoto

otntetc

;el vector de reset es la direccion 00;se salta al inicio del programa

org S ;el programa empieza en la direccion de memoria S

i rric'io bsfmovlwmovwfmovlwmovwfbcf

statu,~"a, (;se ubtca en el segundo banco de RAM0f0t1\,,\Q()Il~ ;se carga el registro Wcon 0ftr\sa ;se programan los pines del puerto A como salidas0ffho\,\\\\\\;se carga el registro Wcon fftrisb ;se programan los pines del puerto B como entradasstatus,S ;se ubica en el primer banco de memoria RAM

ciclo movfxorlw

movwfgoto

end

ptob,w ;el valor de puerto B 10 pasa al registro W0ffh 1111\ Ill; con una operccton xor se invierte el valor

;del dato leldo del puerto Bptoa ;pasa el valor de Wal puerto Aci cl.o

;=====================================================================-=======Fusibles de programacionOsc XTWatchdog OFFCode protect OFFPower-Up-Timer ONMicro. PIC16F84

;======================================================================

Figura 2.3. Programa de la conexi6n de LED y dipswitch

Page 23: Pic 16f84a

.. Capitulo 2. Proyectos con el PIC16F84

Proyecto N° 2: Manejo de un display de siete segmentos

Los displays de siete segmentos son un elemento muy uti! en el disefio de apara­tos electr6nicos, por ejemplo, cuando se requiere visualizar el dato proveniente deun conteo, de una temporizaci6n, el estado de una maquina, etc. El ejercicio quevamos a realizar consiste en hacer un contador decimal (de 0 a 9), el cuallleva elconteo del numero de veces que se oprime una tecla (pulsador). Para manejar eldisplay utilizaremos un decodificador 9368, que es compatible con el tradicional7448, pero decodifica de binario a hexadecimal, es decir que puede mostrar loscaracteres de A hasta F. En el ejercicio el microcontrolador debe encargarse de veri­ficar cuando el conteo llega a 9 para empezar nuevamente en o.

+5V +5V

Clitodo comen

I-',-,+5V -.

Pulsador

-L.r-o-

10K...LRESET

-

~- -

Figura 2.4. Manejo de un display de siete segmentos

El display utilizado es de catodo cormin, para aumentar su visibilidad se conectaun transistor NPN que le entrega una buena corriente. En la figura 2.4 se muestra eldiagrama correspondiente, en la figura 2.5 el diagrama de flujo yen la figura 2.6 elprograma que realiza el control de las funciones.

Nota: Si se usa el decodificador 7448 en lugar del 9368,el pin 3 se debe dejar al aire

Page 24: Pic 16f84a

0'15': significa numero decimalB'00010101': significa numero binarioiSH: significa numero hexadecimalnumeracibn hexadecimal

;registro de estados;el puerto A esta en la direccibn 05 de la RAM;el puerto B esta en la direccibn 06 de la RAM;lleva el conteo de pulsaciones;utilizado en retardos (milisegundos);utilizado en retardos;registro de configuracibn del puerto A;registro de configuracibn del puerto B;bandera de cero del registro de estados;el vector de reset es la direccibn 00;se salta al inicio del programa

Capitulo 2. Proyectos con el PIC16F84,

TProgramar

puertos

Figura 2.5. Diagrama de flujo del contador decimal

;Este programa hace un contador decimal en;un display de 7 segmentos.;En caso de que un numero se escriba;En caso de que el numero se escriba;En caso de que un numero se escriba;Si no se especifica nada, se supone;definicibn de registrosstatusequ 03hptoa equ 05hptob equ 06hconta equ 0ch~

loops equ 0dhloops2 equ 0ehtrisa equ 8Shtrisb equ 86hz equ 02h ..reset org 0

goto inicio

org 5 ;el programa empieza en la direccibn de memoria 5retardo ;subrutina de retardo de 100 milisegundos

movlw 0'100' ;el registro loops contiene el numeromovwf loops~~~ ;de milisegundos del retardo

top2 movlw 0'110' ;movwf loops2-~I~;

top nop Inop'bnop-=.,nop V.nop-enop \Jdecfsz~~ loops2 ;pregunta si terminb 1 msgotoD.; \j topdecfsz loops ;pregunta si termina el retardogoto top2retlw 0

Page 25: Pic 16f84a

..trri cto

ciclo

pulsa

bsfmovlwmovwfmovlwmovwfbcfclrfmovfmovwfcall

btfscgotocallbtfscgotoincfmovfxorlwbtfscgotogotoend

status,S0f0htriSa0ffh

. trisbstatus,Sconta ~

contll,wptoaretardo

ptob,0pul sc.retardoptob~0

pulsacontaconta,w0ahstatus,z'i rricio,ciclo .

Capftulo 2. Proyectos con el PIC16F84

;se ubica en el segundo banco de RAMjse carga el registro Wcon 0fjse programa el puerto A como salidasjse carga el registro Wcon ff .;seprograma el puerto B como entradasjse ubica en el primer banco ~e memoria RAMjinicia contador en cero;el valor del contador pasa al registro W;pasa el valor de Wal puerto A (display)jretardo esperando que suelten la tecla

jpregunta si el pulsador esta oprimidojsi no 10 esta continua revisandolo;si esta oprimido retarda 100 milisegundosjpara comprobar;si no 10 esta vuelve a revisar;si 10 confirma incrementa el contadorjcarga el registro Wcon el valor del conteojhace operacion xor para versi es igual a 0ahjprueba si el contador llego a 0ah (diez)jsi es igual el contador se pone en ceros;si no llego a diez incrementa normalmentejY actualizael display

;===================================================================--==Fusibles de programacionOsc XTWatchdog OFFCode protect OFFPower-Up-Timer . ONMicro. PIC16F84

j======--===============================================================

Figura 2.6. Programa del contador decimal

Page 26: Pic 16f84a

0'15': significa numero decimalB'00010101': significa numero binario15H: significa numero hexadecimalnumeracibn hexadecimal

;registro de estados;el puerto A esta en la direccibn 05 de la RAM;el puerto B esta en la direccibn 06 de la RAM;contador de rotaciones para identificar la tecla;utilizado en retardos (milisegundos);utilizado en retardos;registro que se rota para encontrar la tecla;registro de configuracibn del puerto A;registro de configuracibn del puerto B;bandera de cero del registro de estados;banderq de carry del registro de estados;indica que el resultado se guarda en W

.. Capitulo 2. Proyectos con el PIC16F84

En la figura 2.8 se muestra el diagrama de flujo para la lectura de un teclado de estanaturaleza; observe como el proceso se queda enclavado mientras no detecta teclapresionada. En la figura 2.9 se muestra el programa respectivo, el cual asigna un valornumerico, comprendido entre 0 y 7, a la tecla presionada. EI valor obtenido se lleva aun display de siete segmentos para comprobar que el programa funciona correctamen­teo Ellector podra determinar que pasa cuando dos 0 mas teclas se presionan "simulta­neamente", la prioridad que existe entre ellas y como puede modificarse esta,

Figura 2.8. Diagrama de flujo para la lectura de un teclado sencillo

;Este programa lee un teclado sencillo compuesto por 8 interruptores y maneja;un display de 7 segmentos.;En caso de que un numero se escriba;En caso de que el numero se escriba;En caso de que un numero 'se escriba;5i no se especifica nada, se supone;definicibn de registrosstatus equ 03hptoa equ 05hptob equ 06hconta equ 0ch .loops equ 0dh \100ps2 equ 0eh'rota equ 0fh'trisa equ 85htrisb equ 86hz equ 02hc equ 00hw equ 00h-

reset orggotoorg

oi rricio5 .

;el vector de reset es la direccibn 00;se salta al inicio del programa;el programa empieza en la direccibn de memoria 5

retardo ;subrutina de retardo de 100 milisegundosmovlw 0'100' ;el registro loops contiene el numero

Page 27: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84'\

top2

top

inicio

.ctcl.o

leer

sigue

salir

movwfmovlwmovwfnopnopnopnopnopnop

!< decfszgoto

·"~decfsz

gotoretlw

bsfmovlwmovwfmovlwmovwfbcf

movlwmovwfmovfmovwfcall

movfxorlwbtfscgoto

movwfclrfrrf

btfscgoto

incf

goto

goto

end

loopsD'i10'100ps2

100ps2toploopstop2ostatus,S0f0htrisa0ffh.trisbstatus,S

0ffhcontaconta,wptoaretardo

ptob,w0ffh :'"status,ztrri cto

rotaconta .rota'

status,csalir

conta

sigue

ciclo

;de milisegundos del retardo

;pregunta si termino 1 ms

;pregunta si termina el retardo

;se ubica en el segundo banco de RAM.; se cargo el registro Wcon 0f ./!

;se programan los pines del puerto A como salidas;se cargo el registro Wcon ff;se programan los pines del puerto B como entradas;se ubica en el primer banco de memoria RAM

I

;si no hay tecla oprimida se muestra una F;en el display;el valor del contador paso 01 registro W;pasa el valor de W01 puerto A (display);retardo

;lee el puerto de los interruptores;invierte el dato'le\do.;pregunta si el resultado de 10 inversion dio cero;si no hay tecla oprimida borra display y;vuelve a leer;lleva va16r de tecla oprimida a registro rota;inicializa el contador de rotaciones-;se rota el dato para buscar en que posicion;se encuentra el interruptor activado;pregunta si el carry es 1 luego de 10 rotacion;si es uno esa es 10 tecla oprimida y va a. indicar;en el display cual es su valQr;si el carry estabo en 0 luego de;rotar el registro;se vuel~e a rotor y se vuelve a probar

;el valor de 10 tecla queda en el registro conta;y se paso a Wpara mostrarlo en el display

;======================================================================Fusibles de programacionOsc XTWatchdog OFFCode protect OFFPower-Up-Timer ONMicro. PIC16F84

;======================================================================

Figura 2.9. Programa para la lectura de un teclado sencillo

Cuando el mimero de lfneas I/O es suficiente, la configuraci6n anterior simplificael programa y podemos quedar satisfechos; pero cuando las lfneas de entrada/salidaempiezan a escasear, debemos pensar en redisefiar este teclado, optimizandolo. Lafigura 2.10 muestra una altemativa para este teclado, observe que para las mismas 8teclas se tienen s610 6lfneas de entrada/salida (nos hemos ahorrado 2lfneas, las cualespueden ser aprovechadas para otros prop6sitos igualmente importantes); en la figura

Page 28: Pic 16f84a

.. Capitulo 2. Pr~yectos con el PIC16F84

2.11 se muestraun tecladode 16elementos,precisandos6lo 8 lineas sJe entrada/salida(necesitariamos 8 lineas mas si hubiesemos seguido el principio de disefio inicial).Estos dos ultimos tecladostienen algo en cormin, estan organizados matricialmente ypara manejarlos se requiereel multiplexaje.

+5V +5Vto ..> :>4.7K> >

r------, ? oc~4t ~4t ~4t ~4t

PIC16F84

RAO 1--------'

RA1 t---------'

RA2!---------....I

RA31-------------I

Figura 2.10. Teclado matricial de 2 filas x 4 columnas

Consideremos la figura 2.11, que muestra el teclado matricial de 4 filas por 4columnas.En este caso, las lineasdel microcontrolador correspondientes a las filas sehan configuradocomo salidasy las correspondientes a las columnas como entradas.

Catodo comont--'1fV'.r--'-

I-'I-'

- • "'-'0.1\"".,.-.-

Figura 2.11. Teclado matricial de 4 filas x 4 columnas

+5\1

Page 29: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84,Como se puede observar, normalmente, las lfneas de entrada permanecen en un

nivel logico alto, gracias a los elementos pull-up (resistencias de 2.7K). La clavepara manejar este tipo de teclados consiste en enviar por las lfneas de salida solo uncero por vez; por ejemplo si enviamos un cero por la lfneaRAl, cuando oprimimosuna tecla de la segunda fila (eI4, 5, 6 0 7), un nivel logico bajo se reflejara en el pincorrespondiente de las lfneas de entrada (RBO, RBI, RB2 0 RB3 respectivamente);aSI, si se encuentra un nivel logico bajo en la lfnea RB3 podemos concluir que latecla presionada fue el digito 7.

Figura 2.12. Secuencia para la lectura de un teclado matricial

Si queremos explorar todo este teclado, bastara con rotar el cero circularmente, detal manera que solamente un cero se encuentre en las filas del teclado, cuando serealiza las lecturas de las lfneas de entrada (las columnas) como se muestra en la figura2.12. Cuando el cero llegue a la fila mas significativa del teclado, debe reingresar en laproxima ocasion por la menos significativa, reiniciando la exploracion del teclado. Undiagrama de flujo para este proceso, en donde el microcontrolador queda enclavadoleyendo el teclado hasta que se detecta la presion de uno de sus elementos, se muestraen la figura 2.13; en la figura 2.14 se tiene el programa respectivo. Como resultado delprograma, un valor comprendido entre 0 y 15 queda almacenado en un registro, dichovalor se muestra en un display de 7 segmentos que se ha conectado a los pines RB4 aRB7, para comprobar el funcionamiento del sistema.

El proceso se realiza a una gran velocidad, por 10 que se tiene la sensacion quetodo el teclado se esta sensando permanentemente. En el programa realizado, porejemplo, la exploracion total del teclado tarda menos de 60 us, si consideramos queel oscilador es de 4 MHz.

Otro aspecto que no se puede olvidar, son los rebotes causados por la pulsacionde una tecla. Cuando una tecla se oprime, sus contactos acnian como resortes, y launion electrica no es estable; se generan una serie de uniones y desuniones mecani­cas durante un intervalo significativo de tiempo. Estos rebotes pueden dar lugar aque, en una aplicacion real, el programa los interprete como si se hubieran generadomuchas pulsaciones, si es que no se toman los correctivos del caso. Para ella existen

Page 30: Pic 16f84a

;contador de programa;registro de estados;el puerto A esta en la direccibn 05 de la RAM;el puerto B esta en la direccibn 06 de la RAM;contienen el valor de la tecla oprimida;utilizado en retardos (milisegundos);utilizado en retardos;registro que rota para enviar unos a las filas;contiene el numero de la fila a probar

..

...Capitulo 2. Proyectos con el PIC16~4

Colocar cero enla primera fila

Desplazarcero en filas

81

Leer columnas

Rutina detratamiento de

tecla

( TERMINAR )

Figura 2.13. Diagrama de flujo para la lectura de un teclado matricial

soluciones de hardware y software, consideramos mas interesantes las segundas yaque simplifican el diseiio. Alli, la soluci6n mas obvia es que despues de la detecci6nde la tec1apulsada se genere un retardo en la lectura del tec1ado, de tal manera que seignoren los contactos subsiguientes debidos a los rebotes.

Experimentalmente, se encuentra que un retardo aceptable tiene un valor com­prendido entre los 100 a 125 ms; tiempos mas pequeiios pueden todavfa interpretarlos rebotes y tiempos mas largos pueden tornar demasiado lento un tec1ado. En oca­siones, conviene tambien pensar en el tipo de usuarios de un sistema, ya que hayalgunos de ellos que tienen la tendencia a mantener oprimida una tec1a un tiempomas largo del cormin de las personas, 10 que mal controlado en el programa puededar lugar a un funcionamiento incorrecto del sistema.

;Este programa lee un teclado matricial de 4x4 y muestra la tecla;oprimida en el display de 7 segmentos.;definicibn de registrospc equ 02hstatus equ 03hptoa equ 05hptob equ 06htecla equ 0chloops equ 0dhloops2 equ 0ehrota equ 0fhfilas equ 10h

Page 31: Pic 16f84a

Capftulo 2. Proyectos con el PIC16F84,trisatrisbzcw

reset

equequequequequ

orggotoorg

8Sh86h02h00h00h

oinici.oS

jregistro de configuracion del puerto A;registro de configuracion del puerto Bjbandera de cero del registro de estadosjbandera de carry del registro de estadosjindica que el resultado se guarda en W

jel vector de reset es la direccion 00jse salta al inicio del programajel programa empieza en la direccion S

) --

retardo jsubrutina de ,retardo de 100 milisegundosmovlw 0'100' jel registro loops contiene el numeromovwf loops jde milisegundos del retardo

top2 movlw 0'110 r

movwf 10ops2top nop

nopnopnopnopnopdecfsz 100ps2 jpregunta si termino 1 msgoto topdecfsz loops jpregunta si termina el retardogoto top2retlw 0

tabla

tntetc

ci.elo

escan

probar

leer

sali.r

addwfnopretlwretlwnopretlwnopnopnopretlw

bsfmovlwmovwfmovlwmovwfbcfmovlwmovwfswapfmovwfcallelrfmovlwmovwfmovfmovwfnopmovfandlwxorlwbtfssgotobtfssgotobsfrlfmovlwaddwfgotocalladdwf

pc

o1

2

3

status,S0f0htrisa0fhtrisbstatus,S00h "­teelateela,wptobretardofilasb'1110'rotarota,wptoa

ptob,w0fh0fhstatus,zsali.r 'rota,3escanstatus,crota4filas,lprobartablafilas,w

jsumar Wal PC

jprimera columnajsegunda columna

;tercera columna

;cuarta columna

;se ubica en el segundo banco de RAM;se carga el registro Wcon 0f0h;se programa el puerto A como salidas;se carga el registro'W con 0fh;se programa el puerto B como entradas y salidas;se ubica en el primer banco de memoria RAM;para empezar se muestra un 0 en el display,;intercambia 4 bits altos y bajos y quedan en W;pasa el valor de Wal puerto B (display);retardo

;se prepara para enviar ceros a las filas

;envia el dato a las filas

;tiempo para estabilidad de las lineas;leer las columnas conectadas al puerto B;elimina 1a parte alta del byte leido;invierte el dato para ver si hay a1gun cero;pregunta si el resultado es cero (alguna tecla);si hay tecla, mostrar en display;consulta si ya van 4 rotaciones;si termino, vue1ve a empezar el escan de teclado;coloca bit de carry en 1;para rotar el 0 que va a ir hacia las filas;carga Wcon 4 para sumarlo al valor de filas

;va a hacer la proxima prueba con el 0 rotado;para obtener valor de la columna;sumar columna y filas para obtener el dato real

Page 32: Pic 16f84a

movwfgotoend

teclacicl,o

Capftulo 2. Proyectos con el PIC16F84

;muestra el dato en display

;================================================----====================Fusibles de programacionOsc XlWatchdog OFFCode protect OFFPower-Up-limer ONMicro. PIC16F84

;======================================================================

Figura 2.14. Programa para la lectura de un teclado matricial

Multiplexaje de displays de siete segmentosConsideremos la estructura de la figura 2.15. Allf se tienen cuatro displays de sietesegmentos, con punto decimal; un puerto de 4 bits (0 la mitad de uno de 8) controlacuatro transistores NPN, que finalmente alimentan los catodos de cada uno de losdisplays, en donde el bit menos significativo controla el display de menor peso. Unpuerto de 8 bits maneja cada uno de los segmentos de los displays, en donde el bitmenos significativo del puerto controla el segmento a, el siguiente el b, y as! sucesi­vamente, hasta llegar al mas significativo, que controla el punto decimal del display.Las resistencias tienen como objeto limitar la corriente que fluye a traves de lossegmentos y que ingresa a los pines del microcontrolador.

Por la configuraci6n, es facil deducir que cuando se tiene un nivel l6gicobajo en la base del transistor este se comporta como un interruptor abierto y nose presenta corriente entre emisor y colector; se necesita tener un uno l6gico en

+5V

Displays de catodo comun

"-vvv----tQ "L{ "L{ "Q2N3904

Figura 2.15. Configuraci6n para manejo de displays de 7 segmentos

Page 33: Pic 16f84a

Capftul~ 2. Proyectos con el PIC16F84

las bases de estes para que el transistor se comporte como un interruptor cerradoy se presente dicha corriente. Pero aiin cuando los transistores se comportencomo interruptores cerrados, no se encendera ningtin display si la salida delpuerto que maneja los segmentos tiene niveles Iogicos bajos (ceros); para en­cenderlo, es necesario colocar un nivel16gico alto en el pin de salida correspon­diente a cada segmento.

Asf porejemplo, si queremos mostrar un tres en el segundo display menos signi­ficativo debemos establecer basicamente los siguientes pasos:

• Colocar el mimero binario 0010 en el puerto que controla los transistores• Enviar el mimero binario 01001111 por el puerto que controla los segmentos

Un buen observador encontrara que aunque los anteriores pasos consiguen elobjetivo propuesto (mostrar en la pantalla el-3-, en donde la lfnea quiere decirespacios en blanco), este proceso puede conllevar efectos indeseados. Aquf, porejemplo, si el puerto que controla los segmentos tenfa un valor diferente delbinario 00000000 0 de 01001111, entre la ejecuci6n de los dos pasos dados semostrara en el display un mimero 0 un simbolo que es diferente del valor desea­do. Por ello, es conveniente apagar momentaneamente los segmentos, de talmanera que nos permita seleccionar adecuadamente el display en cuesti6n y pos­terior a esto, enviar el dato correcto a los segmentos; por 10 tanto, un paso 0 quese debe agregar a este proceso es colocar el mimero binario 00000000 en elpuerto que controla los segmentos.

Otra opci6n que permite obtener el mismo resultado, con un proceso diferente,serfa la siguiente:

O. Colocar el mimero binario 0000 en el puerto que controla los transistores1. Enviar el mimero binario 01001111 por el puerto que controla los segmentos2. Colocar el mimero binario 0010 en el puerto que controla los transistores

Ambos procesos conllevan al mismo objetivo propuesto, eliminando la posibili­dad de los efectos indeseados.

Ahora, si pretendemos visualizar no uno sino los cuatro displays de siete seg­mentos, es necesario empezar a controlar los transistores secuencialmente ala vezque se envfa por el puerto que controla los segmentos los datos correspondientesal display en cuesti6n, realizando este proceso a una velocidad tal que de nuevoparezca que el proceso se esta realizando simultaneamente sobre todos los dis­plays. El tiempo en que necesitamos sostener el dato en cada display puede variarsignificativamente, dependiendo fundamentalmente del valor de las resistenciaslimitadoras, del mimero de dfgitos que se tengan por mostrar y de las caracterfsti­cas propias del display; experimentalmente se encuentra que mostrar cada dfgitodurante 3 milisegundos, cuando se tienen resistencias limitadoras de 100 ohm,proporcionan un brillo aceptable de un display "estandar" y una buena visualiza­cion a una distancia prudente.

Page 34: Pic 16f84a

.. Capitulo 2. Proyectos con el PIC16F84

El diagrama de flujo de la figura 2.16 muestra el proceso necesario para mostrarcuatro dfgitos en un display y la figura 2.17 muestra el respective programa, el cualacude a tablas para consultar los segmentos que se deben encender en cada caso. Lautilizaci6n de estas tablas permiten que se pueda alambrar de manera diferente lassalidas del microcontrolador y las entradas de los segmentos del display; por ejem­plo, se puede reorganizar la configuraci6n de pines de tal manera que se simplifiqueel disefio del circuito impreso, bastando con reorganizar los valores de la tabla. Lautilizaci6n de las tablas tambien nos permiten la generaci6n de caracteres y signosespeciales, ya que podemos controlar el encendido de todos y cada uno de los sietesegmentos y el punta decimal.

Visualizaci6nen DISPLAY

Apuntar alprimer digito

Colocar uno entransistor que

habilita el displaymenos significativo

r-----++Leer dato

sefialado porpuntero

Incrementarpuntero

Enviar datoa segmentos

Retardo paravisualizaci6n

Rotar unoen

transistores

Enviar ceros alos segmentos

NO

Figura 2.16. Diagrama de flujo para manejo de 4 displays sin decodificador

Page 35: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84..

;registro de direccionamiento indirecto;contador de programa;registro de estados;registro selector;el puerto A esta en la direccibn 0S de la RAM;el puerto B esta en la direccibn 06 de la RAM;utilizado en retardos (milisegundos);utilizado en retardos;rota el uno para habilitar displays;primer dlgito a mostrar;segundo dlgito a mostrar;tercer dlgito a mostrar;cuarto dlgito a mostrar;registro de configuracibn del puerto A;registro de configuracibn del puerto B;bandera de cero del registro de estados;banderq de carry del registro de estados;indica que el resultado se guarda en W

;Este programa maneja 4 displays;en forma multiplexada.;definicibn de registrosindo equ 00hpc equ 02hstatus equ 03hfsr equ 04hpt6a equ 0Shptob equ 06hloops equ 0dhloops2 equ 0ehrota equ 0fhdig1 equ 10hdig2 equ 11hdig3 equ 12hdig4 equ 13htrisa equ 8Shtrisb equ 86hz equ 02hc equ 00hw equ 00h

de 7 segmentos

reset orggoto

org

o .inicio

S

;el vector de reset es la direccibn 00;se salta al inicio del programa

;el programa empieza en la direccibn de memoria S

retardo ;subrutina de retardo de 3 milisegundosmovlw 03h ;el registro loops contiene el numeromovwf loops ;de milisegundos del retardo

top2 movlw 0'110'movwf loops2

top nopnopnopnopnopnopdecfsz 10ops2 ;pregunta si termino 1 msgoto topdecfsz loops ;pregunta si termina el retardogoto top2retlw 0

inicio bsf status,S ;se ubica en el segundo banco de RAMmovlw 00h ;se carga el registro Wcon 0f0hmovwf trisa ;se programan los pines del puerto A como salidasmovlw 00h ;se carga el registro Wcon 00hmovwf trisb ;se programa el puerto B como entradas y salidasbcf status,S ;se ubica en el primer banco de memoria RAM

movlw 01 ;datos que se muestran en los displaysmovwf dig1movlw 02

Page 36: Pic 16f84a

.. Capitulo Z. Proyectos con el PICI6F84

movwf dig2movlw 03movwf dig3movlw 04movwf dig4

;iniciar un 1 en el registro de rotacibn

;envia ceros a los transistores para apagorlos

empe

disp

movlw 00movwf ptoamovlw 08hmovwf rota.movlw digl. ;con el registro selector (fsr) se apuntamovwf fsr ;al primer dato que se va a mostrarmovlw 00h ;colocar en cero el dato del displaymovwf ptob ;para apagarlosmovf rota,w ;pasa rotacibn dell al registro Wmovwf ptoamovf indo, w ;le~~l.cl(]t0cl~!registr()(]PLJl1t(]cl() e()~~l .fsr·!;iili~i~i~11Ii\\liH i~lllilll,\i jmllllll~i.ll,l~ill~ll_l~I~I.illllll.'lilllll.~~iI~(fi\li§{:!liI~~I'a~~amovwf ptob ;envia dato leido al displaycall retardo ;retardo de 3 milisegundos para visualizacionbtfsc rota,0 ;pregunta si terminaron las 4 rotacionesgoto empe ;si ya rota ron todos, vuelve a empezarbcf status,c ;pone el carry en 0 para que no afecte rotacionesrrf rota ;rota el 1 habilitador de displaysincf fsr ;apunta al proximo digito a mostrargoto disp

end

;============================~=========================================

Fusibles de programacionOscWatchdogCode protectPower-Up-TimerMicro.

XTOFFOFFONPIC16F84

;======================================================== =============~

Figura 2.17. Programa para manejo de 4 displays sin decodificador

Una variante para este sistema consistirfa en utilizar un decodificador 9368 paramanejar los displays de 7 segmentos, en este caso no se requiere la lectura de tablasy el dato correspondiente se puede llevar al puerto directamente. Debe recordarseque con este sistema se pueden mostrar mimeros hexadecimales (entre 0 y F). Eldiagrama de conexion se muestra en la figura 2.18. El programa es el mismo de lafigura 2.17, solo se debe omitir la subrutina llamada TABLA y el sitio donde se haceel llamado (call TABLA), esto debido a que el dato se puede mostrar directamente.

Manejo slmultaneo de teclados y displaysUna estructura mas completa es la que se muestra en la figura 2.19. Observe comose utilizan doce lfneas para implementar un teclado y la visualizacion en siete seg­mentos. Aqui, se esta utilizando el decodificador 7447; de esta manera se ahorran almenos cuatro lfneas (solo tres si utilizamos una adicional para manejar el puntadecimal); un puerto de 8 bits se comporta totalmente como salida, controlando si­multaneamente los datos que se mostraran por los displays, los que saldran por lasfilas y las bases de los transistores, mientras que un puerto de cuatro bits se compor­ta como entrada, para leer las columnas del teclado. En este caso se utilizan displaysde anodo cormin y transistores PNP, por 10 tanto, el cero que se rota para leer elteclado matricial sirve tambien para encender los displays.

Page 37: Pic 16f84a

Capitulo 2. Proyectos con el PICI6F84,+SV

+SV

100n

. Displays de catodo comun

2N3904

Figura 2.18. Conexi6n para el manejo de 4 displays con decodificador

+SV

RBO

RB1

RB2

RB3

RAO

RA1

RA2

RA3

a a

RB4 Ab bc c

RBS B 7447 d dRB6 C e eRB7 D f f

9 9

Figura 2.19. Multiplexaje de teclado y display al mismo tiempo

Page 38: Pic 16f84a

.. Capitulo 2. Proyectos con el PIC16F84

Aquf se resumen los anteriores ejemplos para crear uno solo. El disparo del tran­sistor es simultaneo con la salida del dato para activar cada segmento dentro deldisplay, asfque no es necesario preocuparse con apagar previamente los LED, antesde rotar el cero en las bases de los transistores.

Aqui dejamos al experimentador el desarrollo de los programas necesarios paraleer el teclado y visualizar de manera "simultanea" la informacion en el display;puede tomar los programas anteriores como base. Con la practica encontrara quepuede mejorar estas rutinas y configuraciones, logrando minimizar el disefio y loscostos, y maximizar el rendimiento.

Page 39: Pic 16f84a

Capilflo 2. Proyectos con el PlC16F84

Proyecto N° 4: Conexi6n de memorias seriales al PIC

Las tecnicas para almacenar infonnaci6n en medios electr6nicos se perfeccio­nan mas cada dia. A diario vemos ejemplos de su utilizaci6n en nuestros hogares yoficinas, pot ejemplo, en receptores de televisi6n, reproductores de compact disc,sistemas de control remoto, impresoras, fotocopiadoras, telefonos celulares, etc. Unade estas tecnologias corresponde a las llamadas memorias EEPROM seriales, lascuales tienen grandes ventajas si se comparan con otras posibilidades. Entre susprincipales caracteristicas se cuentan:

- Se pueden conectar facilmente con microprocesadores 0 microcontroladores, in­clusive algunos de ellos tienen pines dedicados para esta labor.

- Transferencia de datos de manera serial, 10 que permite ahorrar pines del micropara dedicarlos a otras funciones.

- Ocupan la decima parte del espacio de las memorias que trabajan en paralelo, estopermite ahorrar dinero debido al menor tamafio del circuito impreso.

- El consumo de corriente es mucho menor que en las memorias que trabajan enparalelo, esto las hace ideales para sistemas portatiles que funcionan con baterias.

El objetivo de esta practica es mostrar los aspectos mas importantes de su tecno­logia y ensefiar conceptos basicos para su utilizaci6n en circuitos reales, se basa enlas memorias que tienen comunicaci6n a 2 hilos empleando la interface PC, cuyasreferencias mas conocidas son 24LCOl/02/04/16. La velocidad de transferencia deinfonnaci6n para estos dispositivos es de 100 6400 kHz (aunque ellfmite 10 imponeel protocolo PC mas no la tecnologfa del dispositivo). Como caracteristica impor­tante de este elemento se tiene la inmunidad al ruido, dado que este integrado tienefiltros en los pines de comunicaci6n.

Memorias 24XX

* En la 24LC01 el pin WP no realiza ninguna funci6n

24XX

1,2,34567

8

AO,A1,A2VssSDASCLwp*

Vee

Direcci6n del dispositivo en el busTierraDatos y direeeiones seriales I/ORelojProtecci6n de escritura. Si estaen 0 habilitaescritura, en 1 la deshabilita+5V

Figura 2.20. Configuraci6n de pines de la memoria 24LCXX

Estas memorias utilizan el bus de 2 hilos para comunicarse con otros dispositivos.Dado que cumplen con el protocolo PC, tiene un pin llamado SCL que recibe lospulsos generados por el dispositivo maestro (0 sea el microcontrolador) y otro lla­mado SDA que maneja el flujo de datos de forma bidireccional (entrada/salida). Enla figura 2.20 se muestra el diagrama de pines correspondiente a estas memorias.

Page 40: Pic 16f84a

.. Capitulo 2. Proyectoscon el PICl~F84

Este dispositivo no requiere de un pin habilitador 0 chip select, ya que en este esquemala transferencia de informaci6n solo se puede iniciar cuando el bus este libre. En este caso,como cada dispositivo tiene su direcci6n determinada mediante los pines AO, Al YA2;solamente responders la memoria cuya direcci6n coincida con la direcci6n que va encabe­zando la trama de informaci6n. En la figura 2.21 se muestra la capacidad de almacena­miento de estos dispositivos y las posibilidades de direccionamiento que tienen.

24LC01B, 24C01 1 1 1 6 0 1 6 0 1 6 0 824LC02B, 24C02 2 1 1 6 0 1 6 0 1 6 0 824LC04B, 24C04 4 2 X 1 6 0 1 6 0 424LC08B 8 4 X X 1 6 0 224LC16B 16 8 X X X 1

Figura 2.21. Capacidad de memoria y direccionamientode las memorias 24LCXX

Transferencia de la informacion. Cuando el rnicrocontrolador desea entablar co­municaci6n con la memoria, debe enviarle una serie de bits que llevan la siguienteinformaci6n:

1. Se envia el bit de arranque 0 start bit2. El c6digo 1010 (propio de estas memorias)3. La direcci6n del dispositivo (A2, AI, AO)4. Un bit que indica que se desea escribir CO'") en la memoria

Luego de esto,la memoria debe enviar un reconocirniento para informarle alrnicrocontrolador que recibio la informacion. Dicho asentirniento, llamado ACK,consiste en poner el bus en un nivel bajo (10 hace la memoria). Despues el rnicrocon­trolador debe enviar los bits que corresponden a la posicion de memoria que sequiere leer 0 escribir; nuevamente la memoria envia un reconocirniento. El pasosiguiente depende de la operacion que se vaya a ejecutar.

Si se trata de un proceso de escritura, el rnicrocontrolador solo debe enviar eldato a ser almacenado y esperar el asentirniento por parte de la memoria para confir­mar que llego correctamente. Si se trata de una lectura, nuevamente se debe repetirlos primeros cuatro pasos, solo que en lugar de un "0" que indica escritura, se debeenviar un "I" que indica lectura. Despues se espera el asentirniento y acto seguidose puede leer el byte con el dato que estaba en la posicion de memoria que se indicoanteriormente. Cuando se terrnina la operacion, el microcontrolador debe enviaruna serial de parada 0 stop bit. En la figura 2.22 se muestra el diagrama de tiemposcorrespondiente a todo el proceso descrito anteriormente.

Ejemplo de aplicaci6nEl ejercicio consiste en hacer un contador de 0 a 9 con un interruptor pulsador y undisplay de siete segmentos, similar a! ejercicio de la figura 2.4. La diferencia radicaen que el mimero que se muestra en el display se va a almacenar simultaneamente enuna memoria 24LCOI (LC quiere decir que puede trabajar desde 2 voltios). Se va autilizar un rnicrocontrolador PIC I6F84 (aunque se puede utilizar un I6C6I 0 I6C7I).

Page 41: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84

'"

A. Forma de direccionar la memoria 24XX

B. I;scritura de byte

C. Lectura de byte

Figura 2.22. Diagrama de tiempos para la lectura y la escrituraen una memoria 24LCXX

En la figura 2.23 se muestra el diagrama esquematico del circuito. En este casolos pines de direcci6n de la memoria se conectaron a tierra, al igual que el pin WP.La resistencia de 4.7 kohm conectada al pin SDA es necesaria dado que dicho pintiene salida de colector abierto (open collector). El display se conecta al puerto Ayel pulsador al pin RBO.

El programa que se escribe en el microcontrolador se muestra en la figura 2.24,su funci6n principal es llevar el control del conteo decimal y almacenar en la memo­ria el mismo dato que se envia al display.

En e1 programa, la subrutina WAIT produce un retardo en milisegundos, la canti­dad de milisegundos deseada debe escribirse en el registro loops antes de hacer elllamado correspondiente. Se utiliza principalmente para hacer un retardo de 10 mi-

Page 42: Pic 16f84a

.. Capitulo 2. Proyectos con el PIC16F84

+5V

READtWRITE

+5V

+5V

10K...LRESET

'--'V'I/'\r---''''''--Oi-

Figura 2.23. Diagrama esquematico del contador conPIC y memoria 24LC01

;registro de estados

,;bit de entrada desde eeprom;bit de salida para eeprom;linea de datos seriales (pin RB6);reloj serial (pin RB7);lleva el conteo de pulsaciones

;registro de configuracibn del puerto A;registro de configuracibn del puerto B;bandera de cero del registro de estados;indica que el resultado se guarda en W;bandera de carry

;posicibn de memoria que se lee 0 escribe;registro para escribir datos en la memoria;direccibn del dispositivo en el bus I2C (1010xxx0);buffer de transmision;contador de bits;buffer de bits;buffer de recepcibn;se utilizan en retardos

;Este programa realiza un contador decimal con un pulsador y un display de 7;segmentos , el valor del conteo se guarda en la memoria serial 24LC01;definicibn de bitsstatus equ 3hptoa equ Shptob equ 6haddr equ 0dhdatao equ 0ehslave equ 0fhtxbuf equ 10hcount equ llheeprom equ 12hrxbuf equ 13hloops equ lShloops2 equ 16hdi equ 7do equ 6sdata equ 6sclk equ 7conta equ 17hconta2 equ 18htrisa equ 8Shtrisb equ 86hz equ 02hw equ 00hc equ 00h

org 00h ;Vector de resetgoto INICIOorg 03h

WAITtop2

top

movlwmovwfnopnop

.110loops2

;subrutina de retardo en milisegundos;el numero de milisegundos llega;cargado en el registro loops

Page 43: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84,nopnopnopnopdecfszgotodecfszgotoretlw

retardo movlwmovwfcallretlw

100ps2toploopstop2o.100loopsWAITo

;pregunta si termino 1 ms

;pregunta si termina el retardo

;retardo de 100 milisegundos

BSTART

BSTOP

;Estamovlwtrisbcfbsfnopbsfnopnopnopnapnopbcfnopnopnopnapnopbcfnopnopretlw

~sta

movlwtrisbcfnapnopnopbsfnopnapnopbsfnopnapbcfnopnopnopretlw

rutina generab '00111111 'ptobptob,sclkptob,sdata

ptob,sclk

ptob,sdata

ptob,sclk

o

rutina generab '00111111 ,ptobptob,sdata

ptob,sclk

ptob,sdata

ptob,sclk

o

el start bit para 10 comunicacion serial

;programar datos y reloj coma salidas;linea de reloj en nivel bajo;se asegura linea de datos en alto

;linea de reloj en alto

;ajuste ~e,tiempo"

;se baja 10 linea de datos;mientras el reloj esta alto

;ajuste de tiempo

;se baja 10 linea de reloj;para terminar el pulso

el stop bit para 10 comunicacibn serial,;programa reloj y datos como salidas;asegura linea de datos en bajo

;linea de reloj en nivel alto

;10 Hnea de datos paso a nivelalto;mientras el reloj esta alto

;10 linea de reloj baja nuevamente;para completar el pulso

BITOUT

clkout

;Estamovlwtrisbsfbtfssbcfnopnopbsfnopnap

rutina toma elb' 00111111 'ptobptob,sdataeeprom,doptob,sdata

ptob,sclk

bit que se debe transmitir y 10 saca 01 puerto;ademas genera el pulso de reloj;programa reloj y datos como salidas;asume que el bit es alto;pregunta estado del bit a transmitir;si el bit es bajo pone 10 salida en bajo

;sube el nivel de la linea de reloj;para formar el pulso

Page 44: Pic 16f84a

.. Capitulo 2. Proyectos con el PICI6F84

nopnopbcfretlw

ptob,sclko

;termina pulso de reloj

BHIN ;Estabsfmovlwtrisbsfnopnopnopnopnopnopnopnopbtfssbcfbcfretlw

rutina lee uneeprom,dib' 01111111 'ptobptob,sclk

ptob,sdataeeprom,diptob,sclko

bit de la memoria y 10 pone en un registro;asume q~e el bit es de nivel alto;programa pin de datos como entrada

;sube la linea del reloj

;pregunta por el estado del pin de datos;si es bajo 10 pone en ese nivel;si es alto 10 deja como se asumib antes

;el numero de bits es 8;asume que el bit a enviar es bajo;consulta el estado real del bit;si era alto 10 deja con dicho nivel;saca el bit por el puerto;rota el byte que se esta transmitiendo;pregunta si ya pasaron los 8 bits;si no ha terminado sigue transmitiendo;espera el reconocimiento enviado por la;memoria (ACK)

rutina se encarga de transmitir un byte hacia la memoria.8counteeprom,dotxbuf,7eeprom,doBHOUTtxbuf,lcountTXLPBHINo

;Estamovlwmovwfbcfbtfscbsfcallrlfdecfszgotocallretlw

TXLP

TX

;Estaclrfmovlwmovwfbcfrlfcallbtfscbsfdecfszgotobsfcallretlw

RX

RXLP

rutina reciberxbuf.8countstatus,0rxbuf, FBHINeeprom,dirxbuf,0countRXLPeeprom,doBHOUTo

un byte y 10 entrega en el registro rxbuf;borra el buffer de entrada;indica que recibe 8 bits

;Borra el carry;rota a la izquierda;lee un bit

;si es necesario pone el bit en uno;pregunta si completo 8 bits;sino, recibe otro bit;envia el ACK de asentimiento;para terminar

LEER ;Esta rutina recibe la direccibn que se;desea LEER y devuelve el dato que tiene grabadocall BSTART ;genera el start bitnopnop ;bcf slave,0 ;selecciona la memoriamovf slave,w ;y selecciona modo de escrituramovwf txbuf ;call TX ;envl.a esos datos a la memoriamovf addr,wmovwf txbuf ;envl.a la posicion de memoria a ser leidacall TX ;nop ;ahora se selecciona nuevamente la memorianop ;y se le indica modo de lecturacall BSTART ; genera start bitnopnopbsf slave,0 ; indica que se va a LEER

Page 45: Pic 16f84a

Capftulo 2. Proyectos con el PIC16F84,movfmovwfcallnopcallbsfcallcallretlw

slave,wtxbufTX

RXeeprom,doBITOUTBSTOPo

;selecciona el dispositivo,;envia esa informacion a la memoria

;la memoria entrega el byte de esa direccion;envia el ACK de reconocimiento

;se envia el stop bit para finalizar comunicacion

addr

;retardo de 10 ms al escribir;cada dato

;toma el dato que va a ser grabado;y 10 envia

,;envia esos datos a la memoria

,;selecciona la memoria;y selecciona modo de escritura

,;envia la posicion de memoria a ser grabada;ahora se selecciona nuevamente la memoria;y se le indica modo de lectura

datao,wtxbufTXBSTOP.10loopsWAITo

slave,0slave,wtxbufTXaddr,wtxbufTX

;Esta rutina escribe un dato en la POS1Cl0n;de memoria que se le indique en el registrocall BSTART ;genera el start bitnopnopbcfmovfmovwfcallmovfmovwfcallnopnopmovfmovwfcallcallmovlwmovwfcallretlw

ESCRIB

INIGO

'irri Z

cic'lo

pulsa

bsfmovlwmovwfmovlwmovwfbcfmovlwmovwfclrfcallmovlwsubwfbtfssgotoclrfclrfcallcallmovfmovwfmovwfcallbtfscgotocallbtfscgotoincfmovfmovwfcallmovfxorlwbtfssgotogoto

status,S0f0htrisa07fhtrisbstatus,S

b'10100000'slave

addrLEER0ahrxbuf,wstatus,cci clocontadatco :ESCRIB­LEER ­rxbuf,wcontaptoaretardoptob,0pulsaretardoptob,0pulsacontaconta,wdataoESCRIBconta,w0ahstatus,zct cl,oini2

;se ubica en el segundo banco de RAM;se carga el registro Wcon 0f;se programo el puerto A como salidas;se carga el registro Wcon 00;se programa el puerto B como entradas;se ubica en el primer banco de memoria RAM;La direccion A0, Ai, Y A2 de la memoria;en el bus I2C es 000

;cuando se enciende el sistema se veri fica que;el dato guardado en memoria este entre 0 y 9;la prueba se hace porque la primera vez que;se encienda el sistema se puede tener un;numero fuera del rango;para las ocasiones posteriores no importa;inicia contador en cero

;inicia dato de memoria en 0;LEER memoria, devuelve dato en W;pasa el valor de Wal puerto A (display)

;retardo esperando que suelten la tecla;pregunta si el pulsador esta oprimido;si no 10 esta continua revisandolo;si esta oprimido retarda 100 milisegundos;para comprobar;si no 10 esta vuelve a revisar;si 10 confirma incrementa el contador;carga el registro Wcon el valor del conteo;el dato del conteo 10 guarda en memoria;para recuperarlo en caso de un apagon

;hace operacion xor para ver si es igual a 0ah;prueba si el contador llego a 0ah (diez);si no es igual se incrementa normalmente

Page 46: Pic 16f84a

.. Capftulo 2. Proyectos con el PIC16F84

end;======================================================================

Fusibles de programaci6nOsc XTWatchdog OFFCode protect OFFPower-Up-Timer ONMicro. PIC16F84

;===========================================--==============z===========

Figura 2.24. Programa del contador con PIC y memoria 24LC01

lisegundos luego de escribir un dato en la memoria. Se debe tener en cuenta que losretardos estan calculados para un oscilador de 4 MHz en el microcontrolador.

La subrutina BSTARTgenera el bit de inicio de la comunicacion, con la temporiza­ci6n y estado de los pines adecuados. Por su parte, la subrutina BSTOP hace 10 mismocon el bit de parada 0 de fin de la comunicaci6n. La subrutina BITOUT toma el bit dedato que se debe transmitir y 10 envia hacia la memoria, se encarga de programar el pindel microcontrolador como salida y de generar el pulso de reloj necesario para la sin­cronizaci6n. La rutina BITIN hace su parte cuando se esta leyendo un bit enviado porla memoria, genera el pulso de reloj y pasa el bit lefdo al registro 0 buffer de entrada.Las rutinas TX y RX se encargan de transmitir y recibir un byte completo de datos, cadauna hace 8 llamados seguidos a las rutinas BITOUT y BITIN respectivamente.

La rutina LEER recibe en el registro addr la posici6n de memoria que se debeleer y genera todas las sefiales necesarias (incluyendo el start y el stop bit) para ­obtener el dato que en ella se encuentra grabado, al final devuelve el dato querecibi6 de la memoria en el registro rxbuf. La rutina ESCRIB toma el dato conteni­do en el registro datao y 10 escribe en la posici6n de la memoria que esta direccio­nada en el registro addr.

Cada vez que se enciende el sistema el microcontrolador lee el dato que se en­cuentra en la primera posici6n de memoria y 10 pasa al display. Cuando el pulsadorsea oprimido se debe incrementar dicho dato y se actualiza el display al tiempo quese vuelve a almacenar ese mimero en la memoria. Un caso especial ocurre cuando seenciende el sistema por primera vez, como el dato que se encuentra grabado en lamemoria es desconocido y podrfa ser superior a 9, este se debe probar y si se encuen­tra que es mayor, se borra y se empieza el conteo en O.

Las rutin as que perrniten leer y escribir en la memoria 24LCOlse pueden utilizarcomo parte de cualquier programa sin que se tengan contratiempos, s6lo se debetener en cuenta que las temporizaciones estan calculadas para un oscilador de 4MHz. Con las rutinas LEER y ESCRIB se tiene una velocidad de transferencia deinformaci6n de aproximadamente 60 kHz.

Una prueba que es muy interesante consiste en cambiar de posici6n el interruptorque selecciona la protecci6n de escritura, cuando esta en la posici6n READ/WRITE sepuede incrementar el contador normalmente, cuando se encuentra en la posici6n READel contador no se incrementa debido a que la memoria esta protegida contra escritura.

Page 47: Pic 16f84a

Capftulo 2. Proyectos con el PIC16F84

"Proyecto N° 5: Manejo de un modulo LCD

Cuando se trabaja en disefio de circuitos electr6nicos es frecuente encontrarsecon la necesidad de visualizar un mensaje, que tiene que ver con el estado de lamaquina a controlar, con instrucciones para el operario, 0 si es un instrumento demedida, mostrar el valor registrado. En la mayoria de los casos, recurrimos a losdisplays de siete segmentos, pero estos ademas de no mostrar caracteres alfanume­ricos ni ASCII, tienen un elevado consumo de corriente y son un poco dispendiososde manejar, cuando se requiere hacer multiplexaje.

Los m6dulos de cristal lfquido 0 LCD, solucionan estos inconvenientes y pre­sentan algunas ventajas, como un menor consumo de corriente, no hay que preocu­parse por hacer multiplexaje, no hay que hacer tablas especiales con los caracteresque se desea mostrar, se pueden conectar facilmente con microprocesadores 0 mi­crocontroladores y ademas, los proyectos adquieren una 6ptima presentaci6n y fun­cionalidad. En principio, vamos a conocer las caracterfsticas mas importantes de losm6dulos, luego se muestra la forma de conectarlos con el microcontrolador y sehacen programas simples para escribir mensajes en la pantalla.

M6dulos de cristal Ifquido 0 LCDAntes de mostrar la forma de conectar estos m6dulos con el microcontrolador,haremos un pequefio recuento de las principales caracterfsticas que ellos tienen,las cuales nos serviran para en tender mejor los programas y los diagramas quese muestran mas adelante:

• Los m6dulos LCD se encuentran en diferentes presentaciones, por ejemplo (2 If­neas por 16 caracteres), 2x20, 4x20, 4x40, etc. La forma de utilizarlos y sus inter­faces son similares, por eso, los conceptos vistos aquf se pueden emplear en cual­quiera de ellos. En nuestro caso, trabajaremos con un display de 2x16, ya que es debajo costo, se consigue facilmente en el comercio y tiene un tamafio suficientepara la mayoria de las aplicaciones.

• La figura 2.25 muestra dos tipos de configuraci6n de pines que se encuentran co­rminmente, aunque cambian su ubicaci6n, estos conservan las mismas funciones.Algunos m6dulos LCD tienen luz posterior 0 "backlight", para mejorar su visualiza-

Figura 2.25. Configuraci6n de pines de los m6dulos LCD

Page 48: Pic 16f84a

.. Capitulo 2. Proyectos con el PIC16F84

cion, esta se maneja a traves de dos pines que nonnalmente se conectan a +SV y atierra. Para evitar que se presenten altas temperaturas, debido ala luz posterior, estospines se deben manejar de manera pulsante (encendiendo y apagando), con una fre­cuencia de aproximadamente 60 Hz, Otra opci6n mucho mas sencilla es utilizar unaresistencia de 10 ohmios (a 1I2W) para alimentar el positivo del backlight.

• Los pines de conexi6n de estos m6dulos incluyen un bus de datos de 8 bits, un pinde habilitaci6n (E), un pin de selecci6n, que indica que el dato es una instrucci6no un caracter del mensaje (RS) y un pin que indica si se va a escribir 0 leer en elm6dulo LCD (RIW). La figura 2.26 describe la funci6n de cada uno de ellos.

'-'-~"'iIIIiiiiiiiiiii

1 Vss Tierra,OV J -,

2 Vdd Alimentaci6n +5V3 Vo Ajuste de Voltaje de contraste4 RS Selecci6n Dato/Control5 RIW Lecturalescritura en LCD6 E Habilitaci6n7 DO DO Bit menos significativo8 D1 D19 D2 D210 D3 D311 D4 D412 D5 D513 D6 D614 D7 D7 Bit mas significativo

Figura 2.26. Funclon de los pines del modulo LCD

a) lnstruccionde control

x VAllDO

b) Dato

VAllDO__----'-x\.....-,_---.-lC'Figura 2.27. Diagrama de tiempo del modulo LCD

Page 49: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84~

• Segtin la operacion que se desee realizar sobre el modulo de cristal lfquido, lospines de control E, RS YRIW deben tener un estado determinado. Ademas, debetener en el bus de datos un codigo que indique un caracter para mostrar en lapantalla 0 una instruccion de control. En la figura 2.27.se muestra el diagrama detiempos que se debe cumplir para manejar el modulo.

• El modulo LCD responde a un conjunto especial de instrucciones, estas deben serenviadas por el microcontrolador 0 sistema de control al display, segiin la opera­cion que se requiera. Estas instrucciones se emplean en los ejemplos que realizare­mos mas adelante, en ellos se explica la forma de utilizarlas. En la figura 2.28 semuestran las instrucciones del modulo.

• La interface entre el microcontrolador y el display de cristal lfquido se puedehacer con el bus de datos trabajando a 4 u 8 bits. Las sefiales de control traba­jan de la misma forma en cualquiera de los dos casos, la diferencia se estable­ce en el momento de iniciar el sistema, ya que existe una instruccion que per­mite establecer dicha configuracion. Estas conexiones se explican mas adelan­te en forma detallada.

Cursor a casa

Seleccionarmodo

Encender/apagar pantalla

DeepezerCUl'SOflPantal1a

Acticar funcl6n

CGRAM

DO RAM

Banderade ocupado

Escr~ura CG RAMIDDRAM

LECTURACG RAMIDDRAM 1 1

Esertturad.Oato

Lecturade Dato

BIcriblldBlOl<ln IIIRAM DDoiln IIIRAMCG.

L«IUI'll~datoalkidollaRAMDDo IaRAMCO

~....::iiiiiiiiiiiiiiiiii:_~I?'\I:~I~>·.'0_=C~I·~II •..l~i%%9WAb~...it'L:~t.:..:ilt..: ':~~::IfI

I/O = 1 Incrementa= 0 Decrementa

S = 1 Desplaza el mensaje en la pantalla= 0 Mensaje fijo en la pantalla

o = 1 Encender (activar) la pantalla= 0 Apagar la pantalla (desactivar),

c = 1 Activar cursor= oDesactivar cursor

B = 1 Parpadea caracter sefialado por el cursor= oNo parpadea el caracter

SIC = 1 Desplaza pantalla= oMueve cursor

RL = 1 Desplazamiento a la derecha

Figura 2.28. Conjunto de = oDesplazamiento a izquierda

instrucciones de losDL = 1 Datos de ocho bits

= oDatos de cuatro bitsm6dulos LCD BF = 1 Durante operaclon interna del modulo

= oFinalizada la operacion interna

Page 50: Pic 16f84a

Codigos ASCII correspondientesa los caracteres del mensaje

.. Capitulo 2. Proyectos con el PIC16F84

• Los caracteres que se envfan al display se almacenan en la memoria RAM delm6dulo. Existen posiciones de memoria RAM, cuyos datos son visibles en la pan­tall a y otras que no son visibles, estas ultimas se pueden utilizar para guardarcaracteres que luego se desplazan hacia la parte visible. En la figura 2.29 se mues­tran las direcciones de memoria visibles y no visibles, que conforman las dos If­neas de caracteres del m6dulo.

Posicion de memoria de la primera Ifnea

AREA VISIBLE----------------------------

Posicion de memoria de la segunda Ifnea

Figura 2.29. Mapa de memoria del m6dulo LCD

• Es importante anotar que s610se pueden mostrar caracteres ASCII de 7 bits, por 10tanto algunos caracteres especiales no se pueden ver (se debe tener a la mana unatabla de los caracteres ASCII para conocer los datos que son prohibidos) . Por otraparte, se tiene la opci6n de crear caracteres especiales (creados por el programa­dor), y almacenarlos en la memoria RAM que posee el m6dulo.

Interface con microcontrolador a 8 bitsEl proyecto consiste en conectar el m6dulo de cristal Iiquido a un microcontroladorPIC 16F84, utilizando el bus de datos a 8 bits. En este caso se emplea el PIC 16F84,aunque se puede implementar con otros microcontroladores que sean compatibles.En la figura 2.30 se muestra el diagrama de conexiones para este caso.

Para estos ejercicios en particular, s610 nos interesa escribir datos en la pantalla(no hacer lectura); por 10 tanto el pin de selecci6n de lecturaJescritura (RIW) en eldisplay, se conecta a tierra. El puerto B del microcontrolador se utiliza como bus dedatos, y el puerto A se encarga de generar las sefiales de control.

En el oscilador del PIC16F84 se emplea un cristal de 4 MHz, por 10tanto tenemosciclos de instrucci6n de un microsegundo. Para el m6dulo LCD, se emplea un potenci6­metro de SKohm, conectado entre +SV y tierta, para controlar el contraste de la pantalla.

En la figura 2.31 se muestra ellistado del programa. Para este caso, el ejemploconsiste en hacer circular un mensaje en la lfnea superior de la pantalla. La explica­ci6n de los pasos contenidos en el es la siguiente:

1. Se programan los puertos segtin las conexiones que se tienen en el circuito.2. Se debe inicializar el m6dulo LCD. El primer dato que se envfa (30H) le dice al

m6dulo que la comunicaci6n es a 8 bits y que se empleara solo una Ifnea de carac-

Page 51: Pic 16f84a

Capfl.plo 2. Proyectos con el PIC16F84

teres. El dato se puede deducir con la lista de las instrucciones que se muestra en lafigura 3. La rutina llamada CONTROL, se encarga de generar las sefialesy lostiempos necesarios para que exista una correcta comunicaci6n. "

3. El segundo dato (07H), le dice al m6dulo que el mensaje se va a desplazar en lapantalla.

4'. El tercer dato (OCH), hace que se encienda el display.5. El siguiente paso es entrar en un cicIo que hace una lectura de la tabla donde se

encuentra el mensaje y 10lleva a la memoria del m6dulo LCD. Cuando se terminade enviar todos los caracteres, se inicia el cicIo nuevamente.

Las rutinas CONTROL y DATO emplean las mismas instrucciones. L~ iinicadiferencia es que cada una le da el nivel16gico adecuado al pin RS, que indica si eldato enviado es un caracter del mensaje (un dato) 0 una instrucci6n de control.

En el modo que desplaza el mensaje en la pantalla se tiene un tiempo de espera,un poco largo antes de que aparezcan los caracteres en la pantalla, esto se debe a queprimero se llena 0 se carga la memoria de datos de la parte no visible.

+5V +5V

10K

RESET -Lr~~

Figura 2.30. Diagrama esquematico de la conexion a 8 bitsentre el microcontrolador y el modulo LCD

;Este programa hace que un mensaje circule en la pantalla;de un modulo lcd ; p=16f84, osc= xt, wdt = offindf equ 0h ;para direccionamiento indirectotmro equ lh ;contador de tiempo realpc equ 2h ;contador de programastatus equ 3h ;registro de estados y bits de controlfsr equ 4h ;selecccibn de bancos de memoria y registrosptoa equ Sh ;puertosptob equ 6hr0c equ 0chr0d equ 0dh

Page 52: Pic 16f84a

r13 equ 13hz equ 2hc equ 0hw equ 0h~ equ lhe equ lhrs equ 0h

org 00goto inicioorg 05h

retardo movlw 0ffhmovwf r13

decre decfsz r13,rgoto decreretlw 0

control bcf ptoa,rsgoto dato2

dato bsf ptoa,rsdato2 bsf ptoa,e

movwf ptobcall retardobcf ptoa,ecall retardoretlw 0

tabla2 addwf pc,rretlw "e"retlw "U"retlw "R"retlw "S"retlw 110"retlw " "retlw "0"retlw "E"retlw " "retlw "M"retlw "I"

• retlw "c"retlw "Rn

retlw. "0"retlw "("

retlw "0"retlw liN"retlw "T"retlw "R"retlw "0"retlw ilL"retlw "Anretlw "0"retlw "a"retlw "Rn

retlw "Ellretlw "S"retlw " "retlw "P"retlw "I"retlw "("

retlw " "retlw "("

retlw "E"retlw "K"retlw "I"retlw "I"retlw " "retlwretlw

Capitulo 2. Proyectos con el PIC16F84

,;bandera de cero;bandera de carry;para almacenar en w;para almacenar en el mismo registro

;vector de reset

/

esta rutina genera las senales de controly entrega el dato correspondiente al moduloutiliza interface a 8 bits

;mensaje a ser rotado

Nota: Las comillas que]posee cada letra Ie indi-'can al ensamblador queel dato requerido es el

valor ASCII del caracter

Page 53: Pic 16f84a

CapftJllo 2. Proyectos con el PIC16F84

retlw n It

retlw n ..

retlw 0

inicio movlw 0fchtris ptoamovlw 00htris ptob

begin movlw 30hcall controlmovlw 07hcall controlmovlw 0chcall control

muestra movlw 0movwf r0c

cic'lo movf r0c,wcall tabla2call datomovlw 09fhmovwf r0d

retal call retardocall retardodecfsz r0d,rgate retalincf r0c,rmovlw 28hxorwf r0c,wbtfss status,zgoto ctctogoto muestraend

;programacibn de puertos;segun el circuito

;inicia display a 8 bits y 1 linea

;selecciona el modo de desplazamiento

;activa display

;inicia el envio de caracteres;al mbdulo;hace barrido de la tabla

;retardo entre caracteres

;sigue con el prbximo caracter del mensaje

;pregunta si terminb el mensaje para volver;a empezar

Figura 2.31. Programa para la conexi6n a 8 bits

Interface con microcontrolador a 4 bitsLa conexion entre el PIC y el m6dulo LCD se hara empleando un bus de datos de 4bits, en este caso, se utilizaran los 4 pines de mayor peso del puerto B (RB4-RB7)del microcontrolador. Las sefiales de control (RS y E), se generaran con los dospines de menor peso del puerto B (RBOYRB 1). Con esto, se libera todo el puerto Ay los pines RB2 y RB3 del microcontrolador, los cuales se podrfan emplear en otrasfunciones, figura 2.32.

El software que se implementara en el microcontrolador, se encarga de mostrarun mensaje en el display. Dicho mensaje ocupa las dos lfneas de la pantalla y perma­nece fijo, a diferencia del ejemplo anterior, en el cual el mensaje se desplazaba.

En la figura 2.33 se muestra ellistado del programa que realiza la tarea descritaanteriormente, este sufre unas modificaciones respecto al ejemplo anterior. Los pa­sos mas importantes son:

I. Se programan los puertos segun el circuito.2. Se debe inicializar el m6dulo LCD. El primer dato que se envia (02H) le dice al

modulo que la comunicacion se va a realizar a 4 bits.3. El segundo dato (28H) ratifica que la comunicaci6n es a 4 bits y que se emplearan

las dos lineas de caracteres del display. El dato se puede deducir con la lista de lasinstrucciones que se muestra en la figura 3. La rutina Hamada CONTROL, se

Page 54: Pic 16f84a

.. Capitulo 2. Proyectos con el PIC16F84

+5V +5V

10K

RESET ..l...r o--............~......;;t.

+5V

Figura 2.32. Diagrama esquernatlco de la conexi6n a 4 bits entre elmicrocontrolador y el m6dulo LCD

mismo registro

,;bandera de cero;bandera de carry;para almacenar en w;para almacenar en el

;este programa hace que un mensaje se repita indefinidamente;en un modulo led de 2 lineas con 16 caracteresindf equ 0h ;para direccionamiento indirectotmro equ 1h ;contador de tiempo realpc equ 2h ;contador de programastatus equ 3h ;registro de estados y bits de controlfsr equ 4h ;selecccion de bancos de memoria y registrosptoa equ 5h ;puertosptob equ 6hr0c equ 0chr0d equ 0dhr0e equ 0ehr13 equ 13hz equ 2hc equ 0hw equ 0hr equ 1he equ 1hrs equ 0h

org 00goto tni ctoorg 05h

retardo movlw 0ffhmovwf r13

deere decfsz r13,rgoto deereretlw 0

li.mpia clrf r0climpi movlw

call datoincf r0c,rmovlw 50hxorwf r0c,w

;vector de reset;va a iniciar programa principal

Page 55: Pic 16f84a

Cap£tldo 2. Proyectos con el PlC16F84

btfss status,zgoto limpiretlw 0

control bcf ptob,rs ;esta rutina genera las se~ales de controlgoto dato2 ;para escribir en el modulo lcd y

dato bsf ptob,rs ;entrega el dato a ser mostrado en 10 pantalladato2 bsf ptob,e, ;utiliza 10 interface a 4 bits

movwf r0emovlw 0fhandwf ptob,rmovf r0e,wandlw 0f0hiorwf ptob,rcall retardobcf ptob,ecall retardobsf ptob,emovlw 0fhandwf ptob,rswapf r0e,wandlw 0f0hiorwf ptob,rcall retardobcf ptob,ecall retardoretlw 0

tabla addwf pC,r ;mensaje que se muestraretlw " It

retlw It "

retlw "R"retlw "E"retlw ltv"retlw I1IItretlw "S"retlw IITIt

retlw "A"retlw .. It

retlw "E"retlw n&"retlw "("retlw II "

retlw II II

retlw " ..retlw II II ;mensaje de 10 segundo linearetlw "e"retlw "E"retlw "K"retlw "I"retlw "T"retlw " "retlw "_"

retlw .. II

retlw "p"retlw liE"retlw fiR"retlw "Enretlw "I"retlw fiR"retlw ItAn

retlw 11 "

retlw 0

inicio movlw 0ffh ;programacibn de puertostris ptoa ;segun el circuitomovlw 0chtris ptob

begin movlw 02h ;inicia display a 4 bits

Page 56: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84..call controlmovlw 28h -call controlmovlw 0chcall controlmovlw 06hcall control

blank call limpiamuestra elrf r0ccielo movf r0c,w

call tablacall datomovlw 0ffhmovwf r0d,

retal call retardodecfsz r0d,r·goto r~tal

incf r0c,rmovlw llhsubwf r0c,wbtfss status,cgoto cielomovlw llhxorwf r0c,wbHss status,zgoto line2

linea2 movlw 0c0hcall control

line2 movlw 21h,xorwf r0c,wbtfss status,z

mensajegoto cielomovlw 080hcall controlgoto blankend

;display a 4 bits y 2 lineas

;activa display

;hace que el mensaje permanezca fijo

;borra display;inicia contador de caracteres;hace barrido de la tabla

;retardo entre caracteres

;sigue con la tabla

;pregunta si esta mostrando el mensaje de la;segunda 1t nea .,;pregunta si es la primera vez que entra;a la segunda linea para ir a iniciar;el puntero de la ram del modulo lcd

;ubica puntero de la ram del modulo lcd;en la segundo linea;pregunta si termino la segunda linea;para ir a iniciar de nuevo el mensaje 0;para continuar en la segunda parte del

,;ubica puntero de ram en la primera fila

;va a reiniciar el mensaje en blank

************************

pic16F84wdt = offosc = xtcp • off

****************************

Figura 2.33. Programa para la conexi6n a 4 bits

encargade generarlas sefiales y los tiempos necesarios paraqueexistaunacorrec­ta comunicaci6n. Debe notarse que esta rutina ha cambiado respecto al primerejemplo.

4. El tercer dato (OCH), haceque se enciendael display.5. El cuarto dato (06H), le indicaal m6dulo LCD que el mensaje debe permanecer

fijoen la pantalla. Recuerde queen el ejemplo anterior, para desplazarlo se us6eldato 07H.

6. EI siguiente paso,es entraren un cicIoque haceun borrado de la pantalla (conlasubrutina BLANK) yluegouna lecturade la tabladondese encuentra el mensaje,para llevarloa la memoria del m6dulo LCD.Esta lecturaincluyeuna verificaci6ndel momento en que se llenala primera lfneade caracteres, con el fin de ubicarelpunterode la RAMdel m6dulo LCD,en la segundalmea de caracteres. Paraestoseenvfael comando COH aldisplay (estedatose puedededucirobservando la listade instrucciones de la fizura 3).

Page 57: Pic 16f84a

~ft.ulA 2._&<l'!,'l.dllHQu.d PlCl6F84

Cusndo se esta escribiendo en la segunda linea de caracteres, se verifica en quemomento se llenoel area visible del display (se compara el puntero de la tabla con2IH), en ese momento el programa vuelve a iniciar el cicIo de borrar el display yescribir el mensaje en la pantalla.

Las rutinas CONTROL y DATO han cambiado de madera sustancial, como eneste caso la interface es a cuatro bits, se debe enviar primero el nibble alto (4 bits demayor peso) del dato y luego el nibble bajo (4 bits de menor peso). En el momentode enviar cada uno de los datos de 4 bits, las sefiales de control deben comportarsede la misma forma como si fuera un dato completo. Por eso en la rutina se ve que lasefial RS conserva el nivel16gico adecuado y la serial E genera los dos pulsos que serequieren (el primero para el nibble alto y el segundo para el bajo).

Los m6dulos LCD tienen una instrucci6n especial para borrar la pantalla (co­mando OIH), pero en las pruebas que se realizaron en diferentes tipos de m6dulo seencontr6 que algunos no la aceptaban y otros requerfan retardos diferentes. Por 10tanto, se opt6 por hacer el borrado con una subrutina Hamada LIMPIA, la eual seencarga de mandar el dato correspondiente a un espacio en blanco (20H) a cadaposici6n de memoria del m6dulo.

Page 58: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84

Proyecto N° 6: Comunicacion serial RS-232

Interface serial RS-232El puerto serial de las computadoras, conocido tambien como puerto RS-232, es muytitil ya que permite la comunicacion no solo con otras computadoras, sino tambien conotros dispositivos tales como el mouse, impresoras y por supuesto, microcontroladores.

Existen dos formas de intercambiar informacion binaria: la paralela y la serial.La comunicacion paralela transmite todos los bits de un dato de manera simultaneay tiene la ventaja que la transferencia es rapida, pero la desventaja de necesitar una .gran cantidad de hilos 0 lfneas, situacion que encarece los costos y se agrava cuandolas distancias que separan los equipos entre los cuales se hace el intercambio es muygrande, debido a las capacitancias entre los conductores, la cual limita el correctointercambio de datos a unos pocos metros.

La comunicacion serial por su parte, transmite un bit a la vez, por 10 cual esmucho mas lenta, pero posee la ventaja de necesitar un menor mimero de lfneas parala transferencia de la informacion y las distancias a las cuales se puede realizar elintercambio es mayor; a esto se suma que mediante dispositivos como los modem,la comunicacion se pueda extender practicamente a cualquier lugar del planeta.

Existen dos formas de comunicaci6n serial: la sincronica y la asincronica. Enla comunicacion sincr6nica, ademas de una linea sobre la que transfieren los datos,se necesita otra que contenga pulsos de reloj que indiquen cuando un dato es valido;la duracion del bit esta determinada por la duracion del pulso de sincronismo. En lacomunicacion asincronica, los pulsos de reloj no son necesarios y se acude a otrosmecanismos para realizar la lectura/escritura de los datos; la duracion de cada bitesta determinada por la velocidad con la cual se realiza la transferencia de datos. Enesta practica solo trataremos la comunicacion asincronica 0 asfncrona.

Bits de datosI I0 0 0 0 0

+SVIdle

men::E

OV5 6 7 8

I

Orden de los Bits

Figura 2.34. Estructura de un caracter que se transmite serialmente

La figura 2.34 muestra la estructura de un caracter que se transmite de formaasfncrona. Normalmente, cuando no se realiza ninguna transferencia de datos, lalinea del transmisor es pasiva (idle) y permanece en un estado alto. Para empezar atransmitir datos, el transmisor coloca esta linea en bajo durante el tiempo de un bit,10cual se conoce como bit de arranque (start bit) y a continuacion, empieza a trans­mitir con el mismo intervalo de tiempo los bits correspondientes al dato (que puedenser 7 u 8 bits), empezando por el menos significativo (LSB), y terminando con el

Page 59: Pic 16f84a

Cap~lo 2. Proyectos con el PIC16F84

mas significativo (MSB). AI finalizar se agrega el bit de paridad (Parity), si es queesta activada esta opci6n, y los bits de parada (Stop) que pueden ser 1 62, en loscuales la lfnea regresa a un estado alto. Al concluir esta operaci6n el transmisorestara preparado para transmitir el siguiente dato.

El receptor no esta sincronizado con el transmisor y desconoce cuando va arecibir datos. La transici6n de alto a bajo de la lfnea del transmisor activa al receptor yeste genera un conteo de tiempo de tal manera que realiza una lectura de la lfnea mediobit despues del evento; si la lectura realizada es un estado alto, asume que la transici6nocurrida fue ocasionada por ruido en la lfnea; si por el contrario, la lectura es un estadobajo, considera como valida la transici6n y empieza a realizar lecturas secuenciales aintervalos de un bit hasta conformar el dato transmitido. El receptor puede tomar el bitde paridad para determinar la existencia 0 no de errores y realizar las acciones corres­pondientes, al igual que los bits de parada para situaciones similares. L6gicamente,tanto el transmisor como el receptor deberan tener los mismos parametres de veloci­dad, paridad, mimero de bits del dato transmitido yde bits de parada.

Dentro de los microcontroladores hay algunos que poseen funciones y registrosespeciales para las comunicaciones seriales, tales como la familia PIC 16C63 0PIC16C73de Microchip, los cuales se encargan de manejar todos los aspectos relacio­nados con las comunicaciones asfncronas, si previamente se han definido todos susparametres. Aiin si el microcontrolador 0 microprocesador no posee la opci6n de lascomunicaciones seriales, esta se puede implementar siempre y cuando se tenga pre­sente la duraci6n de cada uno de los bits en la lfnea.El elemento clave es detectar el bitde arranque, bien sea a traves de interrupciones, 0 bien a traves de la lectura frecuentede la linea que contiene los datos. En ambos casos, 10 recomendable es que despues dedetectado el bit de arranque, la lectura de los bits restantes se realice en la mitad del bit,con un error permitido en cada uno de ellos del 3% del tiempo (aunque se podrfaextender hasta el 4%), sin que se presenten errores de lectura.

En los circuitos digitales, cuyas distancias son relativamente cortas, se puedenmanejar transmisiones en niveles 16gicosTTL (0 - 5V), pero cuando las distanciasaumentan, estas sefiales tienden a degradarse debido al efecto capacitivo de los con­ductores y su resistencia electrica. El efecto se incrementa a medida que se incre­menta la velocidad de la transmisi6n. Todo esto origina que los datos recibidos nosean iguales a los transmitidos, 10 que no se puede permitir en una transferencia dedatos. Una de las soluciones mas inmediatas en este tipo de situaciones es aumentarlos margenes de voltaje con que se transmiten los datos, de tal manera que las pertur­baciones causadas se puedan minimizar e incluso ignorar.

Ante la gran variedadde equipos,sistemasy protocolos que existensurgi6la nece­sidaddeun acuerdoquepermitieraquelosequiposdevariosfabricantes pudierancomuni­carseentre sf. A principios de los aiios sesentase desarrollaron variasnormasque preten­dianhacercompatibles los equipos,pero en 1962se public61aque se convirti6en la maspopular: la normaRS-232.Esta normadefmela interface mecanica, las caracterfsticas, lospines, las sefiales y los protocolos que debfa cumplirla comunicaci6n serial. La norma hasufrido algunas revisiones, como la RS-232Cen 1969y la la EIAfTIA-232E en 1991.

Page 60: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84

15 V 1--------o

5V

OV

-5V

-15 V 1--------

Figura 2.35. Niveles de voltaje RS-232

De todas maneras, todas las normas RS-232 cumplen basicamente con los mis­mos nive1es de voltaje, como se puede observar en la figura 2.35:

- Un uno Iogico es un voltaje comprendido entre -5V y -15V en el transmisor y entre-3V y -25V en el receptor...

- Un cero logico es un voltaje comprendido entre 5Vy 15V en el transmisor y entre3V·y 25V en el receptor.

Por 10 tanto, deben existir dispositivos que permitan convertir niveles TTL aniveles RS-232 y viceversa. Los primeros dispositivos utilizados fueron los driversMC1488 y los receivers MC1489 de Motorola, de los que se desarrollaron versionesmejoradas como los SN75188, SN75189 de Texas Instruments y algunos similaresde otros fabricantes. Todos los dispositivos nombrados anteriormente necesitan tresvoltajes diferentes para su operaci6n cuando el equipo acnia como transmisor yreceptor, 10 cual no representa ningiin problema en computadores tipo PC, ya que sedisponen de estos voltajes en la fuente. Pero cuando se trata de sistemas de micro­controladores, en las cuales el espacio es importante y no se puede disponer devoltajes diferentes a 5 voltios, estos circuitos integrados no se pueden utilizar. Paraesto se han desarrollado alternativas muy titiles, como el integrado lMAX23~ quedescribiremos mas adelante.

Se debe tener presente que la norma RS-232 fue desarrollada hace mas de30 afios, epoca en la cuallos requirimientos y las capacidades de los equipos erandiferentes. En la actualidad esta norma es un poco limitada, tanto para la distanciaa la cual se puede transmitir, como para la velocidad y mimero de transmisores yreceptores que pueden estar simultaneamente conectados. Existen otras normaspara la comunicaci6n serial, en la cual se incrementa el mimero de trasmisores 0

receptores, la velocidad de transmisi6n, la distancia, etc. Pero a pesar de esto, losprincipios rectores siguen siendo los mismos de la comunicaci6n asincr6nica y dela interface RS-232.

Aspectos praetlcos de una comunicaci6n serialEl envfo de niveles logicos (bits) a traves de cables 0 lfneas de transmision nece­sita la conversion a voltajes apropiados. En un circuito logico 0 con microproce­sador se trabaja con niveles de voltaje inferiores a 0.8 para representar el valor

Page 61: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84,logico 0 y voltajes mayores a 2,.0 para representar el valor logico 1. Por 10 general,cuando se trabaja con familias TTL y CMOS se asume que un "0" es igual a cerovoltios y un "1" a +5 V.

:~1-1_:. --------

TRANSMITE

TIERRA

1 =-v, 0'7 +V

RECIBE

I TRANSMITE RECIBE

Cuando la comunicacion que se pretende hacer es muy corta, se pueden conectardirectamente el transmisor y el receptor para hacer la transferencia de bits usandolos mismos niveles logicos tradicionales de 0 y 5 V. Pero cuando la distancia esmayor a los dos metros, la informacion digital se afecta notablemente por accion dela atenuacion en el cable, el ancho de banda del mismo y la velocidad con que setransmita. La interface RS-232C es una de las diferentes soluciones que hay paraesta situacion, Basicamente consiste en cambiar los niveles logicos de la salida 0

envfo de 0 y 5V ados niveles de voltaje de magnitud mayor: uno positivo (+V) pararepresentar el cero Iogico y uno negativo (-V) para representar el uno. En el equiporeceptor de la informacion se realiza el proceso contrario, los niveles positivos ynegativos que lleguen se convierten a los niveles logicos tradicionales de 0 y 5V,figura 2.36. Los niveles de voltaje son simetricos con respecto a tierra y son almenos de +3V para el "0" binario y -3V para el "1". En la figura 2.37 se muestra unejemplo de la transmision de un caracter sobre una linea RS-232, incluyendo susrespectivos niveles de voltaje.

EQUIPO 1. EQUIPO 2-------------~ -------------+v

Figura 2.36. Representaci6n de la interface RS-232

Bits de datosI I0 0 0 0 0

+5V

OV

-5V

Bit de 2 3 4 5 6 7arranque

Orden de los Bits

Figura 2.37. Serial presente sobre una linea RS-232

Page 62: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84

En la practica, los niveles de voltaje los determinan las fuentes de alimentaci6nque se apliquen a los circuitos de la interface; los niveles mas comunes son desde±12V hasta ±ISV: Una interface RS-232 esta compuesta por el circuito transmisorque convierte la seiial de bajo voltaje del equipo logico a los niveles de voltaje alto quese necesitan en la lfnea de transmisi6n y un receptor que realiza la funci6n inversa. Enlos manuales de circuitos integrados se llama line drivers y line receivers, respectiva­mente, a los circuitos que ejecutan esta conversi6n de niveles de voltaje.

Por 10 general, se utiliza con las interfaces RS-232 cable multipar 0 cable ribboncon un solo conductor como referencia de tierra. El ruido que se capta a traves de lalfnea aiin puede originar problemas. Para reducir el efecto se suele conectar un con­densador en paralelo con la salida del circuito transmisor. Segiin las reglamentaci6n,los estandares de la interface RS-232 permiten una separaci6n maxima de 15 metrosa una velocidad de transmisi6n no mayor a 9.6 kbps (kilo bits por segundo). Sinembargo, se realizan conexiones a distancias mayores sin problema alguno. En lafigura 2.38 se muestran los conectores de la interface RS-232.

••

1 Tierra sistema, blindaje (GND)

2 Transmisi6nDatos (TxD)

3 Recepci6n Datos (RxD)

4 Solicitudde envfo (RrS)

5 Listo para envfo (CTS)

6 Datos listos para envfo (DSR)7 Tierra16gica (SIG)

8 Detecci6n de Portadora (CD)

9 Reservado

10 Reservado

11 No usado

12 Detecci6n de Portadora secundario (SCD)13 Solicitud de envfo secundaria (SCTS)

•••••• •••

Transmisi6nde datos secundaria (STxD) 14

Transmisi6ndedatos TxD) 15Recepci6n de Datos secundario (SRxD) 16

Reloj de Recepci6n 17

No usado 18

Solicitudde envfo secundaria(SRI'S) 19

Datos listos en terminal (DTR) 20

Detecci6n de calidad de sefial 21Detecci6n de tono (RI) 22

Selecci6n de rata de datos (DRS) 23

Reloj de Transmisi6n 24

No usado 25

Nombre de Ia sefial

It]:-·• •5 9

123456789

Detector de portadora (CD)Recepci6n de Datos (RxD)Transmisi6nde Datos(TxD)Datos listos en terminal (DTR)Tierra (GND)Datos listos para enviar (DSR)Solicitudde envfo (RrS)

Listo para envfo (CTS)Detector de tono (RI)

Figura 2.38. Conectores RS-232 con sus respectivos pines

EI MAX232Este circuito integrado soluciona los problemas de niveles de voltaje cuando serequiere enviar seiiales digitales sobre una linea RS-232. El MAX232 se usa enaquellas aplicaciones donde no se dispone de fuentes dobles de ±12 voltios; por

Page 63: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84,ejemplo, en aplicaciones alimentadas con baterfas de una sola polaridad. ElMAX232 necesita solamente una fuente de +5V para su operaci6n; un elevador devoltaje interno convierte el voltaje de +5V al de doble polaridad de ±12V.

Como la mayorfa de las aplicaciones de RS-232 necesitan de un receptor y unemisor, el MAX232 incluye en un solo empaque 2 parejas completas de drivery recei­ver, comolo ilustra la estructura interna del integrado que se muestra en la figura 2.39.El MAX232 tiene un doblador de voltaje de +5V a +10 voltios y un inversor de voltajepara obtener la polaridad de -10V. El primer convertidor utiliza el condensador C1para doblar los +5V de entrada a +1OVsobre el condensador C3 en la salida positivaV+. El segundo convertidor usa el condensador C2 para invertir +1OV a -10V en elcondensador C4 de la salida V-.El valor minima de estos condensadores los sugiere elfabricante en el recuadro de la misma figura, aunque en la practica casi siempre seutilizan condensadores de Tantalio de 10 flF. En la tabla de la figura 2.40 se presentanalgunas caracterfsticas de funcionamiento de este circuito integrado.

ENTRADASRS-232

V-

V+

+

R11N 13}

5K

-= R21N 8

sK

T10UTH}SALIDAS

T20UT 7 RS-232Xjl------+•

DOBLADOR DEVOLTAJE

+SV A+10V

INVERSOR DEVOLTAJE

+10V A-10V

+5V400K

C5~

VCC 16

C1+

3 C1-

4 C2+

C2·

+

+C2

C1

SALIDAS {TTUCMOS 9 R20UT

{

11 T11

ENTRADASTTUCMOS 10 T21.....t-----4....-.,

DIP/SO

C1­

C2+

C2-

v-

..., <;-'-V::;}'~';;;/ __;""':""':~'i> ".'-,,_oOv._ '" , , j,:,:::::,:,:::",i::.:,~' ." '~ ,"~,,' ~o_,:::.•~:':';:'~:":::"':~:;0"'··: <":. ii""'N,.,,::;-:, ;-,:

DISPOSITIVO C1 C2 C3 C4 CS

MAX220 4.7 4.7 10 10 4.7

MAX232 1.0 1.0 1.0 1.0 1.0

MAX232A 0.1 0.1 0.1 0.1 0.1

Figura 2.39. Diagrama de pines y estructura interna del MAX232

Una aplicaci6n clasica consiste en conectar las salidas para trasmisi6n serial TXy RX de un microcontrolador a una interface RS-232 con el fin de intercambiarinformaci6n con una computadora. La mayorfa de los sistemas concentradores de da- .tos estan compuestos por sensores conectados a microcontroladores que, a su vez, viaRS-232Ie comunican los datos recolectados a un computador central. El MAX232implementa la interface con la misma fuente de alimentaci6n de +5 voltios. En lafigura 2.41 se ilustra la conexi6n serial de un microcontrolador a traves del MAX232.

Page 64: Pic 16f84a

.. Capitulo 2. Proyectos con elPIC16F84

Figura2.40. Caracterfsticas del MAX232

+10 ~F

"-"---""--' +5V~+10~F

RS-232.------.':;""'__--1." IN I

• I.L.----i... OUT :

+ I__~~~J

- 10 ~F

Figura 2.41. Aplicaci6n tfpica del MAX232

. Envio de datos seriales desde el microcontrolador hacia la computadoraElejercicio quevamos a realizar tiene porobjeto practicar lacomunicacion serial y enten­der los principios basicos que la rigen. Consiste en hacerun contador decimal (0 a 9), elcualse incrementa cadavezqueseoprime un pulsador y muestra el datodelconteo en undisplay de 7 segmentos, ala vezque10 envfa hacialacomputadora paraqueseamostradoen la pantalla La comunicacion entreel microcontrolador y la coinputadora se da en unsolosentido (delprimero haciael segundo), por10 tanto seutiliza solounalineadedatos yel cablede tierra. En la figura 2.42se muestra el diagrama esquematico delcircuito.

Page 65: Pic 16f84a

Cap~lo 2. Proyectos con el PIC16F84

+5V

.l.RESETL....JV\irv---+---o ~

MAX232

~ 5

~8 : - Hacer estos7 puentes en el6 2~ conector

1 Conector DB9hembra

Conectar alcomputador

Figura 2.42. Diagrama del contador decimal que envia losdatos serial mente hacia la computadora

El microcontrolador se encarga de enviar los datos serialmente con una veloci­dad de 1200 bps (bits por segundo), datos 8 bits, sin paridad y con un stop bit, estaconfiguraci6n se representa como"1200,8, N, 1". El integrado MAX232 se encargade convertir los datos a niveles de voltaje adecuados para la linea RS-232. Debenotarse que el pin de salida del MAX232 llamado T20UT va a conectarse al pin derecepci6n del puerto serial de la computadora (comparar con la figura 2.38).

Dadoquelaconexionhacialacomputadora serealiza conunconector de9 pines, estasepuedehacerdirectamenteal puertoCOMl (de9 pines), donde normalmente seconectael mouse. Sisedeseaqueeste permanezca en su sitio, serequiere unadaptador RS-232 de9 a 25 pines paraquese puedahacerla conexi6n al COM2(de25 pines).

Programa del microcontrolador. En la figura 2.43 se muestra ellistado completodel programa, es muy similar al del segundo ejercicio (contador decimal) que seencuentra en la figura 2.6, la diferencia radica en que se han agregado dos rutinas.

La primera de ellas, llamada ENVIAR, se encarga de tomarel datodel registro W ytransmitirlo serialmente porel pinRB7delmicrocontrolador. La rutina llamada DELAY1seencarga de hacerel retardo de tiempo necesariopara sostenercadabit transmitido en lalinea; eseretardo estacalculado paraunoscilador de4 MHz. EIcalculo es muysencillo: sise transmiten I200 bitsen il!1 segund~ el tiempo decadabites de833~ (l11200=833J1S);comola rutina de retardotiene un cicIo quetomacincoperfodos del reloj (5 us), sedivide

)

833/5 Yseobtiene la constante de retardo 166. Uncasoespecial es la rutina quetransmiteun bit y mediopara leer el primerbit, incIuyendo el retardo del start bit, en este caso laconstante es 1.5 veces la de unbit,es decir249. Las otras partes delprograrna seencargandellevarelconteo delmimero devecesqueseoptimaelpulsadory deactualizareldisplay.

Page 66: Pic 16f84a

CapUuIo 2. Proyectos con el PIC16F84

; este programa envia; velocidad = 1200 ,indf equ 0htmro equ lhpc equ 2hstatus equ 3hfsr equ 4hptoa equ Shptob equ 6htrisa equ 8Shtrisb equ 86htrans equ 0chr0d equ 0dhr0e equ 0ehunidad equ 10hdecena equ llhcentena equ 12hr14 equ 14hr1b equ lbhloops equ 13hloops2 equ 14hconta equ iShz equ 2rp0 equ Shz equ 2hc~ equ 0hw equ 0hr equ 1htx equ 7h

datos al computador via rs-232datos de 8 bits, sin paridad , un stop bit

;para direccionamiento indirecto;contador de tiempo real;contador de programa;registro de estados y bits de control

4t ;selecccion de bancos de memoria y registros;puertos

;programacibn de los registros

;seleccibn de paglna;bandera de cero;bandera de carry;para almacenar en w;para almacenar en el mismo registro

;pregunta si termina el retardo

;pregunta si terminb 1 ms

dato;llevar el contenido de w a transmisibn;cargar con numero de bits;el contador;colocar Itnea de transmisibn en bajo;para generar bit de arranque;colocar Itnea de transmisibn en bajo;1impiar car.r.y;rotar regfstro de transmisibn;preguntar por el carry;si es uno, colocar Hnea en alto'­;llamar retardo de 1 bit~

;carga para 833 ~s aproximadamente;llevar valor de carga al retardo;limpiar circuito de vigilancia

;vector de reset;va a iniciar programa principal

10ops2toploopstop2o

para enviartrans8r0dptob,txdelaylptob,txstatus,ctransstatus,'ptob,txdelayl

00inicio0Sh.166r0e

xmrt

top

orggotoorg

delayl movlwstartup movwfredo nop

nopdecfsz r0e ;decrementar retardo, saltar si cerogoto redo ;repetir hasta terminarretlw 0 ;retornar

retardo ;subrutina de retardo de 100 milisegundos'movlw d'100' ;el registro loops contiene el n£meromovwf loops ;de milisegundos del retardomovlw d'110'movwf 100ps2nopnopnopnopnopnopdecfszgotodecfszgotoretlw

enviar ;rutinamovwfmovlwmovwfbcfcall

~t bet'befrFfbtfscbsf~all

top2

Page 67: Pic 16f84a

cap(tulo 2. Proyectos co,. el PIC16F84,;decrementar contador, saltar si cero;repetir hasta transmitir· todo el data;colocar linea de transmisibn en alto;llamar retardo 1 bit -bit de parada­;retornar

;inicia contador en cero;el valor del contador paso 01 registro w

;retardo esperando que suelten 10 tecla;pregunta si el pulsador est oprimido;si no 10 esta continua revisandolo;si esta oprimido retarda 100 milisegundos;para comprobar;si no 10 esta vuelve a revisor;si 10 confirma incrementa el contador;carga el registro w con el valor del conteo;hace operacibn xor para ver si es igual a 0ah;prueba si el contador llegb a 0ah (diez);si es igual el contador se pone en ceros;si no llegb a diez incrementa normalmente;y actualiza el display

****************************

r0d·xnextptob,txdelay1ostatus,rp000htrisa07fhtrisbstatus,rp0ptob,tx

contoconta,wptoa.30h ­enviarretardoptob,0pulsaretardoptob,0pulsacontaconta,w0ahstatus,ztrri ctoctclo"

pic16f84wdt = offosc = xt

cp = on

decfszgoto

~bsfcallretlw

inicio bsfmovlwmovwfmovlwmovwfbcfbsfclrf

ciclo movfmovwfaddlwcallcall

pulsa btfscgotocallbtfscgotoincfmovfxorlwbtfscgotogotoend

************************

Figura 2.43. Programa que contiene la transmisi6n serialhacia la computadora

Una caracterfstica bien importante del programa es que al dato que se envfahacia la computadora se Ie ha sumado la constante 30h (48 en decimal), esto sehace para convertir el dato decimal en su caracter ASCII equivalente. Se hace laconversi6n porque en transmisiones seriales es mas cormin trabajar con caracteresde este tipo, ademas cuando la computadora 10 reciba, se puede pasar directamen­te a la pantalla.

Programa de la computadora. En la computadora se requiere un programa que seencargue de configurar el puerto con los valores adecuados (1200, 8, N, 1) Yderecibir el dato para pasarlo a la pantalla. En este caso utilizamos un programa enlenguaje C, debido a que es el mas utilizado en aplicaciones electr6nicas y permiteconfigurar facilmente los puertos.

En lenguaje C, existe una instrucci6n especial para manejar las comunicacionesseriales. Esta instrucci6n posee la siguiente sintaxis:

bioscom(cmd, char abyte, int port);

En realidad, esta instrucci6n acude ala interrupci6n 14H para permitir la comu­nicaci6n serial sobre un puerto. Para este caso, cada uno de los parametres tiene el

Page 68: Pic 16f84a

.. Capitulo 2. Proyectos con el PIC16F84

siguiente significado:cmd Especifica la operacion a realizarabyte Es un caracter que se envia 0 recibe por el puerto serialport Es la identificacion del puerto serial (desde 0 para COMI

hasta 3 para COM4)

El parametro cmd puede tener los siguientes valores y significados:

.,

o123

Inicializa el puerto port con los valores dados por abyteEnvfa el caracter abyte por el puerto portLee el caracter recibido por el puerto portRetoma el estado del puerto port

Para la inicializacion del puerto, el caracter abyte toma los siguientes valores ylos suma para obtener el dato correspondiente:

Ox02Ox03

OxOOOx04

OxOOOx08Ox18

OxOOOx20Ox40Ox60Ox80OxAOOxCOOxEO.

7 bits de datos8 bits de datos

1 bit de parada2 bits de parada

Sin paridadParidad imparParidad par

110 bps150 bps300 bpss600 bps1200 bps2400 bps4800 bps9600 baudios

(Oxes la notacion en lenguaje C para los numeros hexadecimales)

Para configurar el puerto con algunos parametres, bastara con realizar una ope­racion OR con los deseados, por ejemplo, para el mismo ejemplo anterior, bastaracon seleccionar la palabra dada por:

abyte =Ox80 I OxOO I OxOO I Ox03

o 10 que es equivalente,abyte = Ox83

Page 69: Pic 16f84a

Capftulo 2. Proyectos con el PIC16F84

Para configurar el puerto COMI con los parametres del ejemplo dado ante­riormente, bastara con la instrucci6n:

bioscom(O,Ox83,O); /* (inicializar, parametres, COMI) */

}void main(void){

COM1=0;COM2=1;puerto=COM1;clrscrO;config=0x83;

,Los prograr¢ls en lenguaje C tienen su programa fuente con extensi6n .C, en este

caso el pr~a que recibe los datos del microcontrolador por el puerto COMI sellam~REdBE I.e. El programa que puede ejecutar el usuario se llama RECffiEI.EXEYse puede correr desde el sistema operativo DOS. Ellistado completo se muestra en

··lajigura 2.:14. Si se desea recibir los datos por el COM2 se debe usar la versi6n delprogramaIlamada RECffiE2.C y RECIBE2.EXE que tambien van en el disquete queacompana~l curso. En la figura 2.45 se muestra un pantallazo del programa.

/* LA COMPUTAD6RA-·~CIBE LOS DATOS SERIALES ENVIADOS POR ELPIC */#include <conio.h>#include <stdio.h>#include <dos.h>#include <math.h>#include <bios.h>

int puerto,COM1,COM2;int k,j,dato; /*definicion de variables*/int config;int COM1,COM2;char lectura[l];char dato1[2];

char leerO{

do{dato=bioscom(2,0x83,puerto); /*leer dato recibido*/

} while (((dato<31)I(dato>127))&(!kbhit()));return(dato);

/* definir cual puerto se utiliza *//*limpiar pantalla*/

/*configurar puerto: 1200 baudios,dato de 8 bits,no paridad, 1 bit de parada*/

bioscom(0,config,puerto); /*configuracion de los puertos*/gotoxy(14,4);printf("Curso de Microcontroladores PIC - CEKIT");gotoxy(8,6);printf("La computadora recibe los datos enviados por el micro - COM1");gotoxy(29,8);printf("Escape = Salir");gotoxy(23,10);printf("El dato del contador es:");

do{if(!kbhit()) dato1[0J=leer();H(! kbhi to){

gotoxy(40,12);printf("%ls",dato1);

}}while(!kbhit());

clrscrO;printf("Elaborado por: Edison Duque");

}

Figura 2.44. Programa en lenguaje C que recibe los datosenviados par el PIC (recibe 1.C)

Page 70: Pic 16f84a

;programacibn de los registros

;seleccibn de pagina;bandera de cero;bandera de carry

.. Capitulo 2. Proyectos con el PlC16F84

Figura2.45. Pantallazo del programa RECIBE1

Envlo de datos seriales desde la computadora hacia el microcontroladorEste ejercicio es similar al anterior, solo que en esta ocasion el conteo decimal selleva a cabo en la computadora (se incrementa el contador cada ses: ~'&'e se ~prime

una teela), mostrando en la pantalla el valor del conteo. A su vez, mCbo aato esenviado serialmente hacia el microcontrolador PIC, el ~«.&.~<3~<:'~~~~~-«integrado MAX232 adecua los niveles de voltaje. El mimero tambien es mostrado .en un display de siete segmentos. El circuito es el mismo de la figura 2.42.

Programa del microcontrolador. En este caso el pin RB6 del microcontrolador sedebe programar como entrada para leer los datos seriales. El principal cambio res­pecto al ejercicio anterior consiste en que la rutina ENVIAR se ha cambiado por larutina RECIBIR, la cual tiene las temporizaciones y el orden exacto para recibir eldato serial. N6tese que los datos salen del computador por el pin de transmisi6n y sereciben en el pin R2IN del MAX232, el cual a su vez los entrega al PIC.

Aquf son validas todas las consideraciones que se hicieron en el ejemplo ante­rior, por 10tanto dejamos allector la tarea de estudiar el programa. En la figura 2.46semuestra ellistado completo con sus respectivoscomentarios, Se debe notar que aldato recibido se Ie resta el valor 30b (48 decimal) porque se supone que la computa­dora envfa es el caracter ASCII del mimero.

;este programa recibe datos enviados por la computadora via rs-232;velocidad = 1200, datos de 8 bits, sin paridad , un stop bitindf equ 0h ;para direccionamiento indirectotmro equ 1h ;contador de tiempo realpc equ 2h ;contador de programastatus equ 3h ;registro de estados y bits de controlfsr equ 4h ;selecccion de bancos de memoria y registrosptoa equ Sh ;puertosptob equ 6htrisa equ 8Shtrisb equ 86hr0d equ 0dhr0e equ 0ehconta equ 10hrecep equ 11hz equ 2c equ 0rp0 equ Shz equ 2hc equ 0h

Page 71: Pic 16f84a

Capftulo 2. Proyectos con el PIC16F84..wrrx

equequequorggotoorg

0h1h6h00trncto05h

;para almacenar en w;para almacenar en el mismo registro

;vector de reset;va a iniciar programa principal

; rutina para.249startup.166r0e

unoymediomovlwgoto

delay1 movlwstartup movwf,redo nop

nopdecfsz

-gotoretlw

r0e,redoo

retardar bit y medio con un cristal de 4.00 mhz.;carga para 1250 ~seg. aproximadamente;ir a ejecutar el tiempo;carga para 833 ~s aproximadamente;llevar valor de carga al retardo;limpiar circuito de vigilancia

;decrementar retardo, saltar si cero;repetir hasta terminar;retornar

recibir nop ~

clrf recep ;limpiar registro de recepClonbtfsc ptob,rx ;ljnea de recepci6n est eR bajo?goth recibir ;si no 10 est , volver a leercall unoymedio ;llamar rutina uno y medio bits

rcvr movlw 8 ~ ; cargar contador con,movwf contc.s ;eInumero de bits \

rnext bcf status, c ' ; limpiQr carry 0btf~~ ptob,rx ;preguntar por el estado de la Ijnea~bsf _status,c ;acttvar carry si esta en altorr-f. "recep ; rotor registrode recepet6ncall delay1 ;llamar rutina de u~ bit'decfsZ (conta' ;decrementar contador, saltar si cerogoto rrext ;repetir hasta completar datoretlw_ 0\ ;retornar

i ni cto bsfmovlwmovwfmovlwmovwfbcfclrfclrf

ciclo callmovlwsubwfmovwf­gotoend

status,rp000htrisa0ffhtrisbstatus,rp0recepptoarectbir­30hrecep,wptOQ .~

~ic~9 '-

Figura 2.46. Programa que recibe los datos serialesenviados por la computadora

Programa de la computadora. En este caso el programa se encarga de realizar elconteo del mimero de veces que se pulsa una tecla y de mostrar ese mimero en lapantalla, a la vez que 10 envfa por el puerto serial hacia el microcontrolador. En lafigura 2.47 se muestra el listado completo del programa. En este caso tambien setienen dos versiones, una Hamada ENVIAl para trabajar por el COMl y otra Hama­da ENVIA2 para trabajar con el COM2. En la figura 2.48 se muestra un pantallazodel mismo.

En la instrucci6n que envfa el dato del conteo se suma el valor 30h (48 decimal),para convertir el mimero del contador en su equivalente ASCII.

Page 72: Pic 16f84a

.. Capftulo 2. Proyectos con el PIC16F84

/* LA COMPUTADORA ENVIA DATOS SERIALES AL PIC */

#include <conio.h>#include <stdio.h>#include <bios.h>

int COM1,COM2,Puerto; /*definicibn de variables*/int j,envio,configuracion;int contador;char tecla;

void main(void){

clrscrO;COM1=0;COM2=1;Puerto=COM1;

/*limpiar pantalla*//*constantes de los puertos del PC*/

/*Indicar si es COM1 0 COM2*/

configuracion=0x83; /*conf.puerto: 1200,8,N,1*/bioscom(0,configuracion,Puerto); /*inicializa el COM del PC*/

gotoxy(20,2);printf(<< Curso de Microcontroladores PIC «);

gotoxy(8,5);printf("Envio de datos seriales hacia el microcontrolador - COM1");

gotoxy(10,7);·printf("Enter = Incremento ~l contador

gotoxy(24,10);printf("El dato del contador es:");contador=0;

Escape = Salir");

do{ /*ciclo de lectura de medida*/tecla=getchO;contador++;if(contador==10) contador=0;gotoxy(34,12);printf("%d",contador); /*Obtiene tecla oprimida*/envio=bioscom(l, contador+0x30, Puerto); /*envla caracter al micro*/

}while(tecla!=27); /*Hasta que se oprima ESC*/

while(!kbhit());clrscrO;printf("Elaborado por: Edison Duque");

}

Figura 2.47. Programa en lenguaje C para enviar datos seriales al PIC(envfa1.C)

Figura 2.48. Pantallazo del programa ENVIA

Page 73: Pic 16f84a

Cap~lo 2. Proyectos con el PIC16F84

Proyecto N° 7: Caracteristicas especiales de los PIC

Los microcontroladores poseen muchas herramientas especiales, tales como tem­porizadores, convertidores NO, interrupciones, comunicaciones seriales, etc. Peroen la mayoria de las ocasiones no se utilizan porque el disefiador desconoce la formade emplearlos 0 porque el tiempo de desarrollo es corto y no hay tiempo de estudiar­las 0 practicar con ellas. En estos casos recurrimos a soluciones de software y hard­ware que nos sean familiares y de facil uso para resolver el problema, aunque estoimplique sacrificar el caracter optimo que deben llevar los disefios,

La familia de microcontroladores PIC no es la excepcion, ellos poseen muchascualidades que la mayoria de las personas no utilizan. En esta practica vamos aexplicar algunas de ellas, de una manera clara y simple, para que ellector las puedautilizar en sus propios disefios, Para esto vamos a tomar como base el circuito sim­ple que se muestra en la figura 2.49, el cual consta de un microcontrolador PIC16F84(se puede uilizar un 16C61 0 un 16C71), un decodificador y un display, con ellos sepretende construir un contador de decada (de 0 a 9) que nos permitira estudiar todoslos casos que veremos.

~+5V

-L~.r

+5V +5V

+5V

10K100n -L RESET

1-

Figura 2.49. Circuito del contador decimal que se utiliza en los ejercicios

Uso de las interrupcionesEstos microcontroladores poseen varias fuentes de interrupcion: interrupcion exter­na, finalizacion del temporizador/contador, cambio en las lfneas RB4 a RB7 y fina­lizacion de escritura en la EEPROM de datos. El registro OBh 0 INTCON contienelos bits que corresponden a las banderas de estado de las interrupciones y los bits dehabilitacion para cada una de ellas, figura 1.14. Solo la bandera de finalizacion de laescritura reside en el registro 88h 0 EECONl.

Page 74: Pic 16f84a

.. Capitulo 2. Proyectos con el PIC16F84

Si el bit GIE (Global Interrupt Enable) se coloca en 0 deshabilita todas las inte­rrupciones. Cuando una interrupcion es atendida el bit GIE se coloca en 0 automati­camente para deshabilitar otras interrupciones que se puedan presentar, la direccionactual del PC se carga en la pila 0 stack y el PC se carga con el valor 04h, por 10

tanto, la parte del programa que atiende las interrupciones se debe esribir a partir dedicha direccion. Una vez en la rutina de servicio, la fuente de interrupcion se puededeterminar examinando las banderas. Como la bandera que indica la causa se en­cuentra en "1", el programa debe encargarse de ponerla en "0" nuevamente antes desalir de la rutina que atiende las interrupciones, esto es para evitar que se vuelva aatender la misma interrupcion en repetidas veces.

La instruccion RETFIE permite al usuario retomar de la interrupcion, a la vez quehabilita de nuevo las interrupciones, ya que pone el bit GIE en "1" automaticamente. Acontinuacion veremos ejemplos de como trabajan algunas de las interrupciones:

Interrupci6n externa. Acnia en el pin RBO/INT y puede ser configurada para acti­varse con el flanco de subida 0 el de bajada, de acuerdo al bit INTEDG del registroOPTION, figura 1.15. Cuando se presenta un flanco valido en el pin INT, la banderaINTF (INTCON,1) se coloca en "1" Yel contador de programa 0 PC salta a la direc­cion 04h. En ese momento se puede hacer la verificacion de la causa de la interrup­cion consultando el estado de la bandera, si es del caso tambien se debe probar elestado de alguno de los pines del microcontrolador para confirmar. La interrupcionse puede habilitar 0 deshabilitar utilizando el bit de control INTE (INTCON,4) en"0". Cuando se atiende la interrupcion en la rutina de servicio, el programa debeponer la bandera INTF en "0", antes de regresar al programa principal.

El ejercicio que se ha tornado como ejemplo consiste en un contador decimal (0a 9), el cual se incrementa cada vez que se presenta una interrupcion a traves del pinINT, provocada por un pulsador extemo conectado a dicho pin y que tiene una resis­tencia de 1 kohm conectada a la fuente de alimentacion para fijar un nivel logicoalto en estado de reposo, en la figura 2.49 se tiene un recuadro con el pulsador que seha conectado al pin RBO/INT.

El programa que se graba en el microcontrolador se muestra en la figura 2.50 ytiene las siguientes caracteristicas:

- Una subrutina de retardo de 100 milisegundos que sirve para comprobar que elpulsador si fue oprimido y descartar los pulsos de rebote.

- Al inicio se programan los puertos en los registros TRISA y TRISB, al igual que sehabilita la interrupcion externa con los bits respectivos en registro INTCON yOPTION.

- El cicIo en que se queda encIavado el programa principal no hace nada, solamenteesperar a que se presente la interrupcion para atenderla.

- La rutina que atiende la interrupcion comprueba que el pulsador este oprimido,ademas de probar que se haya activado la bandera correspondiente a la interrup­cion externa. Si las condiciones son favorables, se incrementa el contador y por 10

tanto el mimero que se muestra en el display.

Page 75: Pic 16f84a

Capft4iJo 2. Proyectos conel PlC16F84

;Este programa hace un contador decimal en;un display de 7 segmentos, se incrementa cada vez que el;microcontrolador tienen una interrupcion por el pin RB0/INTstatus equ 03h ;registro de estadosptoa equ 0Sh ;el puerto A esta en la direccion 0S de la RAMptob equ 06h ;el puerto B esta en la direccion 06 de la RAMintcon equ 0bh ;registro de control y banderas de interrupcionconta equ 0ch ;lleva el conteo de pulsacionesloops equ 0dh ;utilizado en retardos (milisegundos)100ps2 equ 0eh ;utilizado en retardosopcion equ 81h ;configuracion del flanco de interrupciontrisa equ 8Sh ;registro de configuracion del puerto Atrisb equ 86h ;registro de configuracion del puerto Bz equ 02h ;bandera de cero del registro de estadosw equ 00h ;indica que el resultado se guarda en W

;retardo para confirmar pulsador;pregunta por el pin RB0;si no esta oprimido regresa;confirma si la interrupcion fue por el pin INT;si no 10 es sale;incrementa el contador;carga el registro Wcon el valor del conteo;hace operacion xor para ver si es igual a 0ah;prueba si el contador llego a 0ah (diez);si llego a diez pasa el conteo a 0;pasa el dato al display

;el vector de reset es la direccion 00;se salta al inicio del programa;aqul se atiende 10 interrupcion

org 0goto inicioorg 4

call retardobtfsc ptob,0goto salebtfss intcon,lgoto saleincf contamovf cohta,wxorlw 0ahbtfsc status,zclrf contamovf conta,wmovwf ptoacall retardobcf intcon,l

retfie

reset

sale

,;retardo de 100 milisegundos;la bandera de la interrupcion se debe;poner en 0 antes de regresar (INTF);regresa al programa principal y habilita otra vez;la interrupcion al poner el bit GIE en 1

retardo ;subrutina de retardo de 100 milisegundosmovlw 0'100' ;el registro loops contiene el numeromovwf loops ide milisegundos del retardo

top2 movlw 0'110'movwf 100ps2

top nopnopnopnopnopnopdecfsz 100ps2 ;pregunta si termino 1 msgoto topdecfsz loops ;pregunta si termina el retardogoto top2retlw 0

inicio bsfmovlwmovwfmovlwmovwfmovlwmovwfbcfmovlwmovwf

status,S0f0htrisa0ffhtrisb80hopcionstatus,S90hintcon

;se ubica en el segundo banco de RAM;se carga el registro Wcon 0f0;se programan los pines del puerto A como salidas;se carga el registro Wcon ff;se programan los pines del puerto B como entradas;en el registro OPTION solo se programa;el flanco de bajada para el pin INT;se ubica en el primer banco de memoria RAM;en el registro INTCON se habilita 10;interrupcion por el pin INT

clrfmovfmovwf

contaconta,wptoa

;inicia contador en cero;el valor del contador pasa al registro W;pasa el valor de W01 puerto A (display)

Page 76: Pic 16f84a

..

ci clo nopnopgotoend

ci.clo

Capftulo 2. Proyectos con el PIC16F84

;espera que se presente una interrupcion

;======================================================================Fusibles de programacionOsc XTWatchdog OFFCode protect OFFPower-Up-Timer ONMicro. PIC16F84

;======================================================================

Figura 2.50. Programa para probar la interrupclon externa

Interrupci6n por cambio en el puerto B. EI funcionamiento de esta interrupciones muy particular, se presenta cuando ocurre un cambio de nivel en alguno de lospines RB4 a RB7 del microcontrolador. En este caso la bandera RBIF (INTCON,O)se colocara en "1". EI bit de control respectivo es RBlE (INTCON,3). EI funciona­miento es similar al que se explico para la interrupcion extema, solamente que sedeben cambiar los bits del registro INTCON que se utilizan.

EI ejemplo que se utiliza emplea nuevamente el contador decimal, la diferencia esque en lugar del pulsador conectado al pin RBOIINT se emplean' cuatro interruptores(dipswitch) conectados a los pines RB4 a RB7, como los que se muestran en el recuadrode la figura 2.49. Como se puede ver en estado normal los pines del microcontroladortienen un estado Iogico alto determinado por las resistencias de 1 kohm conectadas a losdipswitch, si el sistema se enciende en estas condiciones no ocurre nada especial, pero siluego de encendido se cambia la posicion de alguno de los interruptores, el microcontro­lador sufrira una interrupcion y al atenderla hara que el contador decimal se incrementecomo en el ejercicio anterior. Si el interruptor se deja en ese estado, el microcontroladortendra repetidas interrupciones, hasta el momento en que se regrese a su estado inicial.

EI programa que se escribe en el microcontroaldor se muestra en la figura 2.51,es muy similar al del primer ejercicio. La diferencia esta en los bits que habilitan lasinterrupciones y que se grab an en el registro INTCON.

Interrupci6n por fmalizaci6n de la temporizaci6n. EI temporizador/contador esuna de las herramientas mas valiosas que se tienen en el microcontrolador, se encuen­tra en la posicion de memoria Olh. Su conteo se puede incrementar con una sefialextema aplicada al pin RA4ITOCKI 0 con la sefial del reloj intemo delmicrocontrola­dor (en este caso cada microsegundo). Su rata de incremento se puede afectar (prolon­gar) mediante una preescala 0 divisor de frecuencia que se programa en el registroOPTION. Allf tambien se selecciona si "el incremento es con flanco de subida 0 debajada y sila fuente de plllsos es extema (pin RA4ITOCKI) 0 intema (oscilador).

Cuando el conteo del temporizador llega a \OFFh y pasa a OOh se genera unainterrupcion (siempre y cuando este habilitada), el bit TOIF (INTCON,2) se pondraen "1". EI bit de control respectivo es TOlE (INTCON,5).

Page 77: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84,;Este programa hace un contador decimal en;un display de 7 segmentos, se incrementa cada vez que el;microcontrolador tienen una interrupcibn por cambio en los pines RB4 a RB7status equ 03h ;registro de estadosptoa equ 0Sh ;el puerto A esta en la direccibn 0S de 10 RAMptob equ 06h ;el puerto B esta en la direccibn 06 de 10 RAMintcon equ 0bh ;registro de control y banderas de interrupcibnconta equ 0ch ;lleva el conteo de pulsacionesloops equ 0dh ;utilizado en retardos (milisegundos)100ps2 equ 0eh ;utilizado en retardostrisa equ 8Sh ;registro de configuracibn del puerto Atrisb equ 86h ;registro de configuracibn del puerto Bz equ 02h ;bandera de cero del registro de estadosw equ 00h ;indica que el resultado se guarda en W

reset orggotoorg

oinicio4

;el vector de reset es la direccibn 00;se salta 01 inicio del programa;aqui se atiende la interrupcibn

;retardo;confirma interrupcibn por cambio en RB<7:4>;si no 10 es sale;incrementa elcontador;carga el registro Wcon el valor del conteo;hace operacibn xor para ver si es igual a 0ah;prueba si el contador llegb a 0ah (diez);si llegb a diez pasa el conteo a 0;pasa el dato 01 display

retardointcon,0salecontaconta,w0ahstatus,zcontaconta,wptoaretardointcon,0

retfie

callbtfssgotoincfmovfxorlwbtfscclrfmovfmovwfcallbcfsale

,;retardo de 100 miltsegundos;la bandera de la interrupcibn se debe;poner en 0 antes de regresar (RBIF);regresa al programa principal y habilita otra;vez la interrupcibn al poner el bit GIE en 1

retardo ;subrutina de retardo de 100 milisegundosmovlw 0'100' ;el registro loops contiene el numeromovwf loops ;de milisegundos del retardo

top2 movlw 0'110'movwf 100ps2

top nopnopnopnopnopnopdecfsz 100ps2 ;pregunta si termino 1 msgoto topdecfsz loops ;pregunta si termina el retardogoto top2retlw 0

trri cio

ciclo

bsfmovlwmovwfmovlwmovwfbcfmovlwmovwfclrfmovfmovwfnopnopgotoend

status,S0f0htrisa0ffhtrisbstatus,S88hintconcontaconta,wptoa

ciclo

;se ubica en el segundo banco de RAM;se carga el registro Wcon 0f0;se programa el puerto A como salidas;se carga el registro Wcon ff;se programa el puerto B como entradas;se ubica en el primer banco de memoria RAM;en el registro INTCON se habilita la;interrupcibn cambio en los pines RB4 a RB7;inicia contador en cero;el valor del contador pasa al registro W;pasa el valor de Wal puerto A (display);espera que se presente una interrupcibn

Figura 2.51. Prueba de la lnterrupclon por cambio en puerto 8

Page 78: Pic 16f84a

.. Capitulo 2. Proyectos con el PIC16F84

El ejercicio que realizamos para esta prueba consiste en el incremento del tem­porizador por medio del reloj intemo del microcontrolador, dicho conteo esta afec­tado por la maxima preescala que se puede seleccionar (division por 256). Como eloscilador es un cristal de 4 MHz se tiene un ciclo de instruccion.de 1 microsegundo,por 10 tanto, dado que el registro TMRO es de 8 bits y que la preescala es de 256 , eltiempo que se tarda en contar hasta OFFh es de 256x256 microsegundos, es decir65.536 microsegundos.

El tiempo logrado es muy pequefio para ser percibido , por 10 que recurrimos aestablecer un contador dentro de la rutina que atiende las interrupciones, este seincrementa cada vez que el programa pase por ese sitio, es decir cada 65,5 milise­gundos. Cuando llegue a 10 hara que se incremente el contador decimal qu~ se havenido tratando en losotros ejercicios. De esta manera el experimentador vera queel display se incrementa cada 0.65 segundos aproximadamente.

En el programa que se muestra en la figura 2.52 se explica cada uno de los pasosque se llevan a cabo. Los valores con que al inicio se programan el registro INT­CON Yel registro OPTION, se pueden comparar con las tablas que se muestran enlas figuras 1.14 y 1.15 para entender mejor la funcion de cada uno de ellos.

Consideraciones especiales. Se debe tener en cuenta que el registro de trabajo W yel registro de estados no se guardan cuando seatiende una interrupcion, por 10 tantose recomienda almacenar su contenido en algiin registro temporal ya que estos pue­den sufrir cambios en la rutina que atiende dichas interrupciones, 10que puede cau­sar errores cuando se regresa al programa principal.

Uso del circuito de vigilancia 0 watchdog timerEl watchdog es una herramienta que se utiliza para restablecer el programa del mi­crocontrolador cuando este se ha salido de su flujo normal 0 se ha perdido por unruido 0 interferencia electromagnetica. Su funcionamiento se habilita por medio deun fusible de configuracion que se selecciona (ON/OFF) cada vez que se graba elmicrocontrolador.

Funciona como un oscilador intemo, independiente del oscilador principal delmicro, con un perfodo nominal de 18 milisegundos. Cada vez que se cumple eltiempo del watchdog el microcontrolador sufre un reset, por 10 tanto, se debe usaruna instruccion especial que reinicie dicho conteo antes de que se termine. Esa ins­truccion es CLRWDT. El perfodo de 18 milisegundos se puede ampliar hasta casi2.3 segundos utilizando la preescala del registro OPTION, en el cual existe tambienun bit que permite seleccionar si la preescala se asigna al watchdog 0 al temporiza­dor/contador. El uso de la preescala se permite solo para uno de los dos a la vez.

En el programa que se muestra en la figura 2.53 se tiene un ejemplo muy sencilloque ilustra el funcionamiento del watchdog. Consiste en hacer que el microcontrola­dor sufra reset continuamente, esto se logra habilitando el circuito de vigilancia enel momento de grabar el microcontrolador (seleccionando watchdog timer ON).Cada vez que el programa se reinicia hace que se conmute el dato que se muestra en

Page 79: Pic 16f84a

Capattlo 2. Proyectos con el PIC16F84

;Este programa hace un contador decimal en;un display de 7 segmentos, se incrementa cada vez que el;microcontrolador tiene una interrupcibn por el tmer TMR0status equ 03h ;registro de estadosptoa equ 0Sh ;el puerto A esta en la direccibn 0S de la RAMptob equ 06h ;el puerto B esta en la direccibn 06 de la RAMintcon equ 0bh ;registro de control y banderas de interrupcibnconta equ 0ch ;lleva el conteo de pulsacionesconta2 equ 0fh ;cuenta 10 interrupciones de TMR0opcion equ 81h ;configuracibn del temporizador TMR0trisa equ 8Sh ;registro de configuracibn del puerto Atrisb equ 86h ;registro de configuracibn del puerto Bz equ 02h ;bandera de cero del registro de estadosw equ 00h ;indica que el resultado se guarda en W

reset orggoto

otnicto

;el vector de reset es la direccibn 00;se salta al inicio del programa

org 4 ;aqul se atiende la interrupcibn

ci c'lo

;inicia contador en cero;el valor del contador pasa al registro W;pasa el valor de Wal puerto A (display);espera que se presente una interrupcibn

;confirma si la interrupcibn fue por el TMR0;si no 10 es sale;incrementa el contador de diez interrupciones;carga el registro Wcon el valor del conteo;hace operacibn xor para ver si es igual a 0ah;prueba si el contador llegb a 0ah (diez)

;si llegb a diez pasa e1 conteo a 0;incrementa el contador;carga el registro Wcon el valor del conteo;hace operacibn xor para ver si es igual a 0ah;prueba si el contador llegb a 0ah (diez);si llegb a diez pasa el conteo a 0;pasa el dato al display,;la bandera de la interrupcibn se debe;poner en 0 antes de regresar (TOIF);regresa al programa principal;la interrupcibn al poner el bit GIE en 1

status,S ;se ubica en el segundo banco de RAM0f0h ;se carga el registro Wcon 0f0trisa ;se programan los pines del puerto A como salidas0ffh ;se carga el registro Wcon fftrisb ;se programan los pines del puerto B como entradasb'11000111' ;en e1 registro OPTION sblo se programaopcion ;el f1anco de bajada para el pin INTstatus,S ;se ubica en el primer banco de memoria RAMb'10100000' ;en el registro INTCON se habilita laintcon ;interrupcibn por el TMR0conta2contaconta,wptoa

intcon,2saleconta2conta2,w0ahstatus,zsaleconta2corrtcconta,w0ahstatus,zcontaconta,wptoaintcon,2

bsfmovlwmovwfmovlwmovwfmovlwmovwfbcfmovlwmovwfclrfelrfmovfmovwfnopnopgotoend

retfie

btfssgotoincfmovfxorlwbtfssgotoelrfincfmovfxorlwbtfscclrfmovfmovwfbcf

trri cto

cic'lo

sale

;======================================================================Fusibles de programacibnOscWatchdogCode protectPower-Up-TimerMicro.

XTOFFOFFONPIC16F84

;======================================================================

Figura 2.52. Programa para comprobar la interrupci6n porfin de la temporizaci6n

Page 80: Pic 16f84a

.. CapUulo 2. Proyectos con el PIC16F84

;Este programa hace que el microcontrolador sufra un reset;cada 2 segundos aproximadamente, cada vez que se resetea cambia;el dato del display, el reset 10 causa el watchdog timerstatus equ 03h ;registro de estadosptoa equ 0Sh ;el puerto A esta en la direccion 0S de la RAMptob equ 06h ;el puerto B esta en la direccion 06 de la RAMcambia equ 0fh ;registro con el bit que hace cambiar el displayopcion equ 81h ;configuracion del flanco de interrupciontrisa equ 8Sh ;registro de configuracion del puerto Atrisb equ 86h ;registro de configuracion del puerto B

status,S ;se ubica en el segundo banco de RAM0f0h ;se carga el registro Wcon 0ftrisa ;se programa el puerto A como salidas0ffh ;se carga el registro Wcon 00trisb ;se programa el puerto B como entradasb'11001111' ;en el registro OPTION se programaopcion ;la preescala del watchdog (en este caso 128)status,S ;se ubica en el primer banco de memoria RAMcambia,0 ;pregunta el estado de la bandera de pruebauno

reset orggoto

trri cio bsfmovlwmovwfmovlwmovwfmovlwmovwfbcfbtfssgoto

cero

oinicio

;el vector de reset es la direccion 00;se salta al inicio del programa

uno movlwmovwfbsf;clrwdtgotoend

01 ;dato para el displayptoacambia,0 ;conmuta la bandera de prueba

;borrar el conteo del watchdog timeruno ;se queda en este ciclo esperando el reset

;======================================================================Fusibles de programacionOsc XTWatchdog ONCode protect OFFPower-Up-Timer ONMicro. PIC16F84

;======================================================================

Figura 2.53. Programa del ejercicio con el watchdog timer

el display de siete segmentos (1 0 0), dado que se ha programado el registro op­TION para que se asigne la maxima preescala al temporizador del watchdog, eldisplay cambia cada 2.3 segundos aproximadamente.

De esta manera comprobamos que el micro se esta reseteando cada vez quetermina el conteo del watchdog y no se utiliza la instruccion CLRWDT para reini­ciarlo. Luego de esta prueba quitamos el punto y coma ( ;) que precede a la instruc­cion CLRWDT con el objeto de habilitarla. En este caso el display no cambia deestado, 10 que nos demuestra que el microcontrolador no esta sufriendo reset comoen el caso anterior.

Cuando se va a utilizar el watchdog en un programa complejo debemos asegu­rarnos que el flujo del programa permita ubicar una 0 varias instrucciones CLRWDTen sitios especfficos, por los cuales se pase antes de que secumpla el perfodo deltemporizador, con el objeto de hacer que el programa se reinicie en caso de que el

Page 81: Pic 16f84a

Cap£tulo2. Proyectos con el PIC16F84..programa se quede encIavado en un cicIo en el que no debfa quedarse. Se debe tenercIaridad en que por tratarse de un oscilador del tipo RC, su perfodo de tiempo puedevariar un poco con las condiciones de voltaje y temperatura, por 10 que se recomien­da tener unos buenos niveles de tolerancia en los tiempos que se manejan.

Uso de la memoria de datos EEPROM en el PIC16F84La memoria de datos EEPROM es una de las herramientas mas valiosas que tiene elPIC16F84, se puede emplear para almacenar los datos de calibraci6n en un instru­mento, un c6digo 0 clave de seguridad en una alarma, la hora en un sistema detiempo real, etc. Este microcontrolador posee 64 bytes de memoria EEPROM, elacceso a estas posiciones se consigue a traves de dos registros de memoria RAM:

- El registro EEADR (posici6n 09h), que debe contener la direcci6n 0 posici6n de lamemoria EEPROM de datos que se va a leer 0 escribir.

- El registro EEDATA (posici6n 08h), que contiene el dato de 8 bits que se va aescribir 0 el que se ley6.

Adicionalmente existen dos registros de control, el EECONI (posici6n 88h) queposee cinco bits que controlan las operacionesde lectura y escritura y el EECON2(posici6n 89h), que aunque no esta implementado ffsicamente, es necesario para lasoperaciones de escritura. En la figura 1.16 se muestra el registro EECON1, debeponerse especial atenci6n a la funci6n de sus bits para comparalos con los valoresque toman en el programa que se utiliza como ejemplo.

La lectura toma un cicIo del reloj de instrucciones (en este caso un microsegun­do), mientras que la escritura, por ser controlada por un temporizador incorporado yrequerir una operaci6n previa de borrado de la posici6n de interes, tiene un tiemponominal de 10 milisegundos; este tiempo puede variar con la temperatura y el volta­je. Segun el fabricante, el mimero tfpico de cicIos de borrado/escritura de la EE­PROM de datos es de 1'000.000 (un mi1l6n).

El programa que se muestra en la figura 2.54 es un simple ejemplo de un conta­dor decimal que se incrementa con un pulsador conectado al pin RBO y muestra eldato en un display de siete segmentos, 10 interesante es que el mimero del conteo seguarda en la posici6n 00 de la memoria EEPROM de datos, por 10 tanto, si se retirala alimentaci6n del sistema, esta puede recuperar el valor que tenia una vez que serestablezca el voltaje. Las rutinas LEER y ESCRIB se encargan de recuperar el datoguardado en la memoria y de almacenarlo nuevamente cuando se ha incrementado,respectivamente.

Como funci6n especial se ha dispuesto al inicio del programa una verificaci6nque permite establecer si el mimero que se lee de la memoria de datos esta entre 0 y9, esto se hace con el fin de garantizar que la primera vez que se conecte la alimen­taci6n al sistema, el dato que se muestre en el display sea menor 0 igual a 9. Sesupone que para las ocasiones siguientes en que se conecte la fuente, el dato yaestara entre los valores adecuados, por 10 tanto en esas ocasiones esa verificaci6nsera transparente.

Page 82: Pic 16f84a

;registro de configuracion del puerto A;registro de configuracion del puerto B;registro de control de la memoria EEPROM;registro de control de la memoria EEPROM;bandera de cero del registro de estados;indica que el resultado se guarda en W;bandera de carryeecon1

.. Capitulo 2. Proyectos con el PIC16F84

;Este programa hace un contador decimal en;un display de 7 segmentos. el numero que lleva el conteo;se guarda en la EEPROM de datos del microstatus equ 03h ;registro de estadosptoa equ 0Sh ;el puerto A esta en la direccion 0S de la RAMptob equ 06h ;el puerto B esta en la direccion 06 de la RAMeedata equ 08h ;registro de datos de la memoria EEPROMeeadr equ 09h ;registro de direcciones de la memoria EEPROMconta equ 0ch ;lleva el conteo de pulsacionesloops equ 0dh 1101 ; uti lizado en retardos (mil isegundos)loops2 equ 0eh~I\O ;utilizado en retardosconta2 equ 0fh'11 4trisa equ 8Shtrisb equ 86heecon1 equ 88heecon2 equ 89hz equ 02hw equ 00hc equ 00h;bits especiales del registroeei f equ 04hwrerr equ 03hwren equ 02hwr equ 01hrd equ 00h

reset orggoto

org

otrricto

S

;el vector de reset es la direccion 00;se salta al inicio del programa

;el programa empieza en la direccion S

loops2 ;pregunta si termino 1 mstoploops ;pregunta si termina el retardotop20

retardo ;subrutina de retardo de 100 milisegundosmovlw 0'100' ;el registro loops contiene el numeromovwf loops ;de milisegundos del retardo

top2 movlw 0'110'movwf loops2

top nopnopnopnopnopnopdecfszgotodecfszgotoretlw

leer bsfbsfbcfmovfmovwfmovwfreturn

status,Seecon1,rdstatus,Seedata,wconta2conta

;se ubica en segundo banco de RAM;pone el bit que inicia la lectura;vuelve al primer banco de memoria;el dato letdo se pasa al registro W;se guarda el dato en conta2

escrib bsfbsfbcf

status,S ;se ubica en el segundo banco de RAMeecon1,wren ;habilita escritura en memoria EEPROMeecon1,eeif ;se asegura que la bandera este en cero

movlwmovwfmovlwmovwf

0SSheecon20aaheecon2

;esta secuencia es obligatoria;para escribir en la memoria de datos EEPROM

bsf eecon1,wr ;orden de escribir el dato que se cargo;previamente en el registro eedata en la;posicion de memoria direccionada por eeadr

Page 83: Pic 16f84a

Cap~o 2. Proyectos con el PIC16F84

espera btfssgotobcfbcfbcfretlw

eecon1,eeif ;pregunta si terminb laescrituraespera ;si no, espera a que termineeecon1,eeif ;borra la bandera de fin de escrituraeecon1,wren ;deshabilita la escritura en memoria EEPROMstatus,S ;se ubica en el primer banco de RAMo

inicio

ini2

ctclo

pulsa

bsfmovlwmovwfmovlwmovwfbcfclrfcallmovlwsubwfbtfssgoto

elrfclrfcall

callmovwfcall

btfscgotocallbtfscgotoincfmovfmovwfcallmovfxorlwbtfssgoto

status,S0f0htrisa0ffhtrisbstatus,Seeadrleer0ahconta2,wstatus,cctcto

contaeedataescrib

leerptoaretardo

ptob,0pulsaretardoptob,0pulsacontaconta,weedataescribconta,w0ahstatus,zcicl,o

;se ubica en el segundo banco de RAM;se carga el registro Wcon 0f0;se programan los pines del puerto A como salidas;se carga el registro Wcon ff;se programan los pines del puerto B como entradas;se ubica en el primer banco de memoria RAM;cuando se enciende el sistema se verifica;que el dato guardado en memoria este entre 0 y 9;la prueba se hace porque la primera vez que;se encienda el sistema se puede tener un numero;fuera del rango, para las ocasiones; posteriores el proceso es invisible

;inicia contador en cero

;inicia dato de memoria en 0

;leer memoria, devuelve dato en W;pasa el valor de Wal puerto A (display);retardo esperando que suelten la tecla

;pregunta si el pulsador esta oprimido;si no 10 esta continua revisandolo;si esta oprimido retarda 100 milisegundos;para comprobar;si no 10 esta vuelve a revisar;si 10 confirma incrementa el contador;carga el registro Wcon el valor del conteo;el dato del conteo 10 guarda en memoria;para recuperarlo en caso de un apagbn

;hace operacibn xor para ver si es igual a 0ah;prueba si el contador llegb a 0ah (diez);si no es igual se incrementa normalmente

goto ini2end

;======================================================================Fusibles de programacibnOsc XTWatchdog OFFCode protect OFFPower-Up-Timer ONMicro. PIC16F84

;======================================================================

Figura 2.54. Programa que utiliza la memoria EEPROM de datos

Page 84: Pic 16f84a

.. CapUuIo 2. Proyectos con el PIC16F84

Proyecto N°B: Control de un motorpaso a paso

Por sus caracterfsticas y precisi6n de movimientos, los motores de paso se cons­tituyen en un elemento muy valioso a la hora de disefiar un sistema de control 0 unamaquina especializada. Ademas, dado que las sefiales necesarias para controlar estaclase de motores son de naturaleza digital, estes se pueden conectar facilmente asistemas de ese tipo.

En este proyecto emplearemos un microcontrolador PIC como elemento prin­cipal para guiar la posici6n de un motor de esta clase. El proyecto se ha divididoen varias partes. Primero, se hace una breve descripcion del tipo de motor que seutilizara, luego se muestra la forma de conectarlo al microcontrolador para conse­guir movimientos de paso completo y por ultimo se hace un ejercicio con movi­mientos de medio paso.

Motores paso a pasoPara el ejercicio se utiliza un motor de 4 bobinas. Este tipo de motores se identificaporque tienen 5, 6 u 8 cables. En el primer caso existe un cable que es cormin a todoslos demas, para el de 6 cables se tiene un cormin para cada pareja de bobinas y en elde 8 cables cada bobina es independiente, Para el proyecto empleamos uno de 8cables. En la figura 2.55 se muestra su estructura, incluyendo los colores de loscables (que son estandares). .

Negros -::+-f~+----+~

+vcc

Gris Gris

Amarillo

Amarillo

Figura 2.55. Conexi6n de los transistores que manejan el motor

Page 85: Pic 16f84a

Capltfflo 2. Proyectos con el PIC16F84

Este tipo de motores tiene la ventaja de operar con una sola fuente, mientras quelos motores de dos bobinas requieren polaridad positiva y negativa, haciendosenecesario utilizar circuitos en puente. En la figura 2.55 tambien se muestra la formade conectar el motor de 8 cables. Debe notarse que los cables rojos y negros se unenpara conectarlos a la fuente positiva. De aquf se puede deducir como serfa la co­nexi6n para 6 y 5 cables. El transistor que se utiliza para activar las bobinas es eltfpico TIP122, que es un Darlington con protecci6n para el manejode cargas indue­tivas (diodo interno). N6tese que se ha invertido el orden de las bobinas de lostransistores Q2 y Q3.

El movimiento del motor se consigue energizando las bobinas en un orden de­terminado. Esto se puede hacer de dos formas: La primera consiste en activar unasola bobina a la vez (manejo por ola), la segunda es el manejo de dos fases 0 bobi­nas al mismo tiempo. Con este ultimo metoda se puede conseguir mayor torque,por eso es el metodo que empleamos en estosejemplos. La figura 2.56 muestra losdiagramas de tiempo de los dos metodos anteriores. De ahora en adelante se supon­dra que el motor se ha conectado de la forma que se muestra en la figura 2.55; estose hace con el fin de no repetir la misma grafica en cada ejercicio.

01

02

03

04

(a)

01

02

03

04

(b)

Figura 2.56. Secuencias para manejar las bobinas del motor de paso.a)unafase,b)dosfases

Control del motor a pasos completosEl motor que se escogi6 para el ejercicio tiene un paso de 7.5°, es decir que en uncirculo completo (360°) tiene 48 posiciones de reposo. Cada uno de los pasos se logracuando se encienden las bobinas correspondientes segiin la secuencia. Tambien sedebe aclarar que el punto cormin de las bobinas del motor se debe conectar a +5V, yaque este es el dato suministrado por el fabricante en la placa de datos del mismo.

Page 86: Pic 16f84a

.. Capftulo 2. Proyectos con el PIC16F84

Para controlar el motor se utiliza el microcontrolador PIC16F84, el cual estaempleando un crista! de 4 MHz y utiliza los cuatro pines bajos del puerto A (RAO­RA3) como salidas, para activar 0 desactivar los transistores de potenciaTIP122 quemanejan cada una de las bobinas. En la figura 2.57 se muestra el diagrama esquema­tico correspondiente, el cual incIuye una tabla con la secuencia que se debe seguirpara conseguir que el motor gire. .

Conectar lostransistores a lasbobinas del motor

+5V

Figura 2.57. Diagrama del circuito para mover el motor a paso completo

Como se habia mencionado anteriormente, el control del motor se hara condos bobinas energizadas al mismo tiempo. Viendo la tabla de la secuencia sepuede deducir que con simples rotaciones de un registro se puede conseguir elobjetivo (notese que la tabla tiene cuatro valores diferentes). Cada vez que seencienden las dos bobinas correspondientes a un valor de la tabla, este se mue­ve un paso. Por 10 tanto, dado que el motor es de 48 pasos por vuelta, se deberepetir los valores de la tabla 12 veces para conseguir que el eje del motor deun giro completo.

Si se desea que el motor gire en sentido contrario al que se logro con la secuenciaanterior, solo se debe invertir la secuencia, es decir, leer la tabla en sentido inverso(de abajo hacia arriba). Cuando el motor no esta en movimiento se debe garantizarque todas las bobinas esten desenergizadas. Esto se hace con el fin de evitar posiblesdafios del motor.

El primer ejercicio que vamos a implementar consiste en hacer que el motorde un giro completo en un sentido, permanezca quieto un momento y luego gireen sentido contrario, para repetir el mismo cicIo. Dado que la secuencia es sim­ple, el programa del microcontrolador tambien 10 es. La figura 2.58 muestra ellistado completo.

Page 87: Pic 16f84a

Capltflo 2. Proyectos con el PlC16F84

;BANDERA DE CERO;BANDERA DE CARRY;PARA ALMACENAR EN W;PARA ALMACENAR EN EL REGISTRO

;CONTADOR DE ,TIEMPO REAL;CONTADOR DE PROGRAMA;REGISTRO DE ESTADOS;PUERTOS

;ESTE PROGRAMA PERMITE CONTROLAR EL GIRO DE UN MOTOR DE;PASO, A PASOS COMPLETOS

****** PIC16F84 ********WDT = OFF, OSC = XT ******

EQU 1HEQU 2HEQU 3HEQU SHEQU 6HEQU 0DHEQU 10HEQU llHEQU 2HEQU 0HEQU 0HEQU 1H

,. ******,TMROPCSTATUSPTOAPTOBR0DR10RllZCWR

RETARDO

RETAR1

RETARD2

DECR2

ORG 00GOTO INICIOORG 0SHCLRF TMRONOP

-'- BTFSS TMRO,7GOTO RETAR1RETLW 0

MOVLW 38H,MOVWF R0DCALL RETARDOCALL RETARDO'DECFSZ R0D,RGOTO DECR2RETLW 0

BCF STATUS,CRRF R10,RBTFSC STATUS,CBSF R10,3MOVF R10,WMOVWF PTOACALL RETARDOCLRF PTOARETLW 0

BCF STATUS,CRLF R10,RBTFSC R10,4BSF R10,0MOVF R10,WMOVWF PTOACALL RETARDOCLRF PTOARETLW 0

;Vector de reset;Inicia programa principal

;Retardo de 8.192 ms;empleando el TMRO

;Retardo auxiliar;del giro del motor

*********** PROGRAMA PRINCIPAL *******

INICIO

BEGIN

MOVLW 00H ;Los puertos se programan deTRIS PTOA ;acuerdo al circuitoMOVLW 0FFHTRIS PTOBMOVLW 0CSH ;se programa el TMRO conOPTION ;preescala de 64CLRF PTOACLRF R10BSF R10,2 ;Estos son los unos que rotanBSF R10,1 ;en el registro R10

MOVLW D'48' ;En este ciclo el motor hace unMOVWF Rll ;giro completo

Page 88: Pic 16f84a

..VUEL

VUEL2

CALLDECFSZGOTOCALLCALLMOVLWMOVWFCALLDECFSZGOTOCALLCALLGOTOEND

PASOADRll,RVUELRETARD2RETARD20'48'RllPASOATRll,RVUEL2RETARD2RETARD2BEGIN

Capitulo 2. Proyectos con el PIC16F84

;se llama 48 veces 10 rutind;que hace mover el motor 1 paso

;se llama 48 veces 10 rutina;que 10 mueve un paso en;sentido contrario

Figura 2.58. Programa para controlar el motor a pasos completos

Las rutinas llamadas PASOAD y PASOAT se encargan de hacer la rotacion delas sefiales que controlan la activacion y desactivacion de las bobinas del motor. EIestado de las rotaciones se conserva en el registro de memoria RAM RIO Yse pasaal puerto A cada vez que se desea mover el motor un paso. En el bloque principal delprograma solamente se requiere cargar un contador con el mimero de pasos deseado(en este caso 48) para llamarla rutina correspondiente igual mimero de veces. Larutina de retardo esta basada en el temporizador interno del microcontrolador paragarantizar su precision.

Control del motor a 1/2 pasoEn el primer ejercicio se hizo girar el motor avanzando en pasos completos. Ahorala idea es hacerlo girar avanzando medio paso cada vez que se desee. Con estopodremos conseguir que en una vuelta completa del eje del motor, se tengan 96intervalos diferentes, 0 sea que el eje se desplaza 3.75° en cada paso. Esta clase demovimientos de precision hacen del motor de paso un elemento muy util.

Conectarlostransistoresa las

bobinasdel montor

+5V

+5V

Figura 2.59. Circuito para controlar el motor a 1/2 paso

Page 89: Pic 16f84a

Cap~lo 2. Proyectos con el PIC16F84

Para este ejercicio la idea es hacer que el motor gire en el sentido que se Ie indiqueoprimiendo uno de los dos pulsadores dispuestos para tal fin. El motor debe moversetanto tiempo como este oprimido el interruptor correspondiente. Para este ejercicioempleamos el mismo circuito del ejemplo anterior, pero con unas pequefias variacio­nes. En la figura 2.59 se muestra el diagrama esquematico del circuito de control.

En los pines RB7 y RB6 del microcontrolador se han dispuesto los interruptorespulsadores que se encargan de controlar el sentido y la duraci6n del movimiento.Ademas, en la grafica se incluye la tabla con la secuencia que se requiere para que elmotor pueda moverse a 1/2 paso. Como se ve, ahora la tabla tiene ocho valoresdiferentes. El microcontrolador se debe encargar de hacer la lectura de dichos valo­res en orden ascendente 0 descendente para obtener el valor que debe entregar por elpuerto A para manejar las bobinas del motor.

El software que se graba en el microcontrolador aparece en la figura 2.60. Paraeste ejemplo se han modificado las rutinas debido a que la secuencia no es unasimple rotaci6n de las bobinas. Los valores que debe entregar el microcontroladorse han escrito en una tabla, para que la estructura del programa sea la misma en elmomento que se desee trabajar a 1/4 de paso e inclusive a 1/8 de paso. En estos dosiiltimos casos s610 se debe cambiar los valores de la tabla y el limite maximo delcontador que se encarga de leerla. Como ejercicio ellector puede deducir la secuen-

. cia que se emplearfa en movimientos a 1/4 y 1/8 de paso.

;ESTE PROGRAMA PERMITE CONTROLAR EL GIRO DE UN MOTOR DE PASO, A 1/2 PASO; •••••• PIC16F84 ••••••••; •••••• WDT = OFF, OSC = XT, CP = OFF .*.*••

TMROPCSTATUSPTOAPTOBR0DR10ZCWRADEATRA

EQUEQUEQUEQUEQUEQUEQUEQUEQUEQUEQUEQUEQU

1H2H3HSH6H0DH10H2H0H0H1H76

jCONTADOR DE TIEMPO REALjCONTADOR DE PROGRAMAjREGISTRO DE ESTADOSjPUERTOS

;BANDERA DE CEROjBANDERA DE CARRYjPARA ALMACENAR EN W;PARA ALMACENAR EN EL REGISTRO;BITS DEL PTOB

••••••••• PROGRAMA PRINCIPAL •••••••••

ORGGOTOORG

RETARDO CLRFNOP

RETAR1 BTFSSGOTORETLW

PASOAD INCFMOVFCALLMOVWF

00INICIO0SH

TMRO

TMRO,SRETAR1o

R10,RR10,WSECUENPTOA

;Vector de resetjVa a iniciar programo principal

;Retardo de 2.048 ms;usando el TMRO

;Esta rutina mueve el motor;medio paso en un sentidojesta basada en una tabla;que contiene el estado de

Page 90: Pic 16f84a

Capitulo 2. Proyectos con el PIC16F84..CAll RETARDO jactivacion de los transistoresClRF PTOAMOVlW 07H jcuando se termine la ultimaXORWF R10,W jposicion de la tabla seBTFSS STATUS,Z jempieza nuevamenteGOTO SALIRMOVlW 0FFHMOVWF R10

SAlIR RETlW 0

PASOAT DECF R10,R jesta rutina mueve el motor enMOVF R10,W jsentido contrario al anteriorCAll SECUEN jesta basada en la misma tablaMOVWF PTOA jque controla las salidasCAll RETARDOClRF PTOAMOVlW 0FFH jcuando se termina la tablaANDWF R10,W jvuelve a empezar nuevamenteBTFSS STATUS,ZGOTO SALEMOVLW 08HMOVWF R10

SALE RETLW 0

SECUEN ADDWF PC,R jEsta tabla contiene elRETlW B'00000100' jestado de las salidasRETlW B'00000110'RETlW B'00000010' jSi se desea trabajarRETlW B'00000011 ' ja 1/4 de paso solo se debeRETlW B'00000001 , jcambiar la tablaRETlW B'00001001'RETLW B'00001000'RETlW B'00001100'RETlW 0

INIGO MOVlW 00H jprogramacibn de puertosTRIS PTOA jsegun el circuitoMOVlW 0FFHTRIS PTOBMOVLW 0C5H jse programa preescala en 64OPTION jpara el TMROCLRF PTOAMOVlW 03H jse inicializa la secuenciaMOVWF R10 jen algun estado

PRUE1 BTFSC PTOB,ADE ;si se oprime uno de losGOTO PRUE2 jpulsadores se llama la rutinaCALL PASOAD jque mueve el motor medio pasoClRF PTOAGOTO PRUE1

PRUE2 BTFSC PTOB,ATRA jsi se oprime el otro pulsadorGOTO PRUEl jel motor gira en sentidoCALL PASOAT jopuestoClRF PTOAGOTO PRUE2

END

Figura 2.60. Programa de control del motor a 1/2 paso

Las rutinas PASOAD y PASOAT se encargan de incrementar 0 decrementar elcontador que sirve como puntero de la tabla. Ademas, segun el sentido en que estegirando el motor, las rutinas hacen la verificaci6n correspondiente cuando llega alfinal de la tabla, para volver a iniciar la lectura de la misma. La rutina SECUEN

Page 91: Pic 16f84a

CapUVlo 2. Proyectos con el P1C16F84

contiene los valores que se deben entregar por el puerto del microcontrolador paraenergizar las bobinas correspondientes. Esta tabla es la que se debe modificar paraconseguir movimiento a 1/4 0 1/8 de paso.

Como parte del ejercicio, el estudiante podrfa insertar un retardo entre cada mo­vimiento (llamando una subrutina con un retardo largo), para ver en detalle como semueve el motor y comprobar que en un cfrculo completo se tienen 96 escalas 0

posiciones de reposo.

Page 92: Pic 16f84a

..

.1 I t t

• Arquitectura• Caracteristicas especiales• EI PIC16C710n11n15

Page 93: Pic 16f84a

.. Capitulo 3. EI PIC16f71

Las personas que se mueven entre los mundos analogo y digital encontraran eneste microcontrolador la solucion a muchos de sus problemas de disefio. Como serecordara, la mas sencilla de las.lecturas de cantidades analogas a traves de sistemasdigitales se convertfa en toda una pesadilla: la necesidad de fuentes duales en losconvertidores (anteriormente se trabajaba hasta con tres voltajes de alimentaciondiferentes), el alambrado y conexion de buses de datos, direcciones y control, entreotras razones, aumentaban las dificultades. Este microcontrolador promete resolvercon ventaja estas situaciones, ya que posee un convertidor analogo a digital intemobastante interesante:

• Cuatro canales de entrada• Tiempo de conversion minima de 20 Jls• Voltaje de referencia intemo 0 extemo• Resolucion de 8 bits con precision de ±1 LSB• Rango de entrada analoga desde Vss hasta Vref

Pines y funciones

...-. RA2lAIN2 RA1/AIN1 ...-.

...-.RA3/AIN3NREF RAO/AINO ...-.

...-. RA4fTOCKI OSC1/CLKIN ~

---+ MCLRNPP OSC2ICLKOUT ---+---+ VSS VDD ~

...-. RBO/INT RB? ...-.

...-.RB1 RB6 ...-.

...-. RB2 RB5 ...-.

...-. RB3 RB4 ...-.

Figura 3.1. Diagrama de pines del'PIC16C71

El PIC 16C71 es un microcontrolador de Microchip Technology fabricado entecnologfa CMOS, su consumo de potencia es muy bajo y ademas es completa­mente estatico (esto quiere decir que el reloj puede detenerse y los datos de lamemoria no se pierden).

El encapsulado mas cormin para el microcontrolador es el DIP (Dual In-line Pin)de 18pines, propio para usarlo en experimentacion. La referencia completa es 16C71­041P, para el dispositivo que utiliza reloj de 4 MHz. Sin embargo, hay otros tipos deencapsulado que se pueden utilizar segun el disefio y la aplicacion que se quiererealizar. Por ejemplo, el encapsulado tipo surface mount (montaje superficial) tieneun reducido tamafio y bajo costo, que 10 hace propio para producciones en serie 0

para utilizarlo en lugares de espacio muy reducido, la figura 3.2 muestra los tipos deempaque que puede tener el integrado.

Page 94: Pic 16f84a

Capfqflo 3. EI P/C16C71

Figura 3.2. Tipos de encapsulado

Puertos del microcontroladorLos puertos son el puente entre el microcontrolador y el mundo exterior. Son lineasque se pueden configurar como entradas 0 salidas digitales y algunas de elIas sepueden configurar como entradas analogas, las cuales aceptan voltajes continuosque pueden variar entre cero y cinco voltios. Estas iiltimas son las que toma el con­vertidor analogo a digital para realizar su trabajo.

El PIC16C71 tiene dos puertos. El puerto A con 5 lfneas y el puerto B con 8 lfneas,figura 3.3. Cada pin se puede configurar como entrada 0 como salida independiente,programando un par de registros disefiadospara tal fin. En ese registro un "0" configurael pin del puerto correspondiente como salida y un "1" 10 configura como entrada.

PuertoA

RMfTOCKIRA3/AN3NREF

RA2/AN2

RA1/AN1

RAO/ANO

RB?

RB6

RBS'VL.--RB4

RB3

~t--"RB2

RB1

RBO/INT

PuertoB

Figura 3.3. Puertos del PIC16C71

El puerto B tiene intemamente unas resistencias de pull-up conectadas a suspines (sirven para fijar el pin a un nivel de cinco voltios), su uso puede ser habilitadoo deshabilitado bajo control del programa. Todas las resistencias de pull-up se co­nectan 0 se desconectan ala vez, usando el bit llamado RBPU que se encuentra en elregistro (posici6n de memoria RAM) llamado OPTION. La resistencia de pull-up esdesconectada automaticamente en un pin si este se programa como salida. Cuandoocurre un reset se deshabilitan todas las resistencias de pull-up, por 10 tanto, si seestan usando deben ser habilitadas nuevamente por control del programa. El pinRBO/INT puede ser configurado por software para que funcione como interrupci6nextema, para ello se utilizan algunos bits de los registros INTCON y OPTION.

El pin RA4ffOCKl del puerto A puede ser configurado como un pin de entrada!salida 0 como entrada del temporizador/contador. Cuando este pin se programa comoentrada digital, funciona como un disparador de Schmitt (Schmitt trigger), puedereconocer sefiales un poco distorsionadas y llevarlas a niveles 16gicos (cero y cinco

Page 95: Pic 16f84a

..Capitulo 3. El PIC16C71

voltios). Cuando se usa como salida digital se comporta como colector abierto (opencollectors; por 10 tanto se debe poner una resistencia de pull-up (resistencia extemaconectada a un nivel de cinco voltios). Como salida, la l6gica es inversa: un "0"escrito al pin del puerto entrega a la salida un "1" l6gico. Este pin como salida nopuede manejar cargas en modo fuente, s6lo en el modo sumidero.

Como este dispositivo es de tecnologfa CMOS, todos los pines deben estar co­nectados a alguna parte, nunca dejarlos al aire porque se puede dafiar el integrado.Los pines que no se esten usando se deben conectar a la fuente de alimentaci6n de+5V, como se muestra en la figura 3.4.

+5V +5V

Pines noutilizados

Figura 3.4. Los puertos no utilizados se deben coneetar a la fuente

La maxima capacidad de corriente de cada uno de los pines de los puertos enmodo sumidero (sink) es de 25 rnA yen modo fuente (source) es de 20 rnA, figura3.5. La maxima capacidad de corriente total de los puertos es:

Modo sumideroModo fuente

PUERTO A80 rnA50 rnA

PUERTOB150 rnA100 rnA

PuertoA Imax=80mAPuerto B Imax=150mA

Imax=20mA

PuertoA Imax=50mAPuerto B Imax=100mA

Figura 3.5. Capacidad de corriente del PIC16C71

___ _ _ _-1_

Page 96: Pic 16f84a

Capftulo 3. EI PIC16C71..EI consumo de corriente del microcontrolador para su funcionamiento depende

del voltaje de operacion, la frecuencia y las cargas que tengan sus pines. Para unreloj de 4 MHz el consumo es de aproximadamente 2 rnA; aunque este se puedereducir a 40 microamperios cuando se entra en e1 modo sleep (en este modo el microse detiene y disminuye el consumo de potencia), se sale de ese estado cuando seproduce alguna condicion especial que veremos mas ade1ante.

EI oscilador externoTodo microcontrolador requiere un circuito extemo que Ie indique la velocidad a laque debe trabajar. Este circuito, que se conoce como oscilador 0 reloj, es muy sim­ple pero de vital importancia para el buen funcionamiento del sistema. EI PIC 16C71puede utilizar cuatro tipos de reloj diferentes. Estos tipos son:

• Re. Oscilador con resistencia y condensador.• XT. Crista!.• US. Crista! de alta velocidad.• LP. Cristal para baja frecuencia y bajo consumo de potencia.

En el momenta de programar 0 "quemar" el microcontrolador se debe especifi­car que tipo de oscilador se usa. Esto se hace a traves de unos fusib1es llamados«fusibles de configuracion».

EI tipo de oscilador que se sugiere para las practicas es el cristal de 4 MHz,porque garantiza mayor precision y un buen arranque del microcontro1ador. Inter­namente esta frecuencia es dividida por cuatro, 10que hace que 1afrecuencia efec­tiva de trabajo sea de 1 MHz, por 10 que cada instruccion se ejecuta en un micro­segundo. EI cristal debe ir acompafiado de dos condensadores y se conecta comose muestra en la figura 3.6.

Figura 3.6. Conexi6n de un oscilador a cristal

Dependiendo de la aplicacion, se pueden utilizar crista1es de otras frecuencias;por ejemplo, se usa el cristal de 3.579545 MHz porque es muy economico, e1 de32.768 KHz cuando se necesita crear bases de tiempo de un segundo muy precisas.Ellfmite de velocidad en estos microcontro1adores es de 20 MHz.

Si no se requiere mucha precision en e1 oscilador y se quiere economizardinero, se puede utilizar una resistencia y un condensador, como se muestra enla figura 3.7.

___ _ _ _ -L-

Page 97: Pic 16f84a

"Capitulo 3. El PIC16C71

+5VDC

R

Fosc/4

Figura 3.7. Conexi6n de un oscilador RC

ResetEn los microcontroladores se requiere un pin de reset para reiniciar el funcionamientodel sistema cuando sea necesario, ya sea por una falla que se presente 0 porque as! sehalla disefiado el sistema. El pin de reset en los PIC es llamado MCLR (master clear).

El PIC16C71 admite diferentes tipos de reset:• AI encendido (Power On Reset)• Pulso en el pin MCLR durante la operaci6n normal• Pulso en el pin MCLR durante el modo de bajo consumo• El rebase del conteo del circuito de vigilancia (watchdog) durante la operaci6n normal• El rebase del conteo del circuito de vigilancia (watchdog) durante el modo de bajo

consumo (sleep)

El reset al encendido se consigue gracias ados temporizadores. El primero deellos es el OST (Oscillator Start-Up Timer: Temporizador de encendido del oscila­dor), orientado a mantener el microcontrolador en reset hasta que el oscilador delcristal es estable. El segundo es el PWRT (Power-Up Timer: Temporizador al en­cendido), que provee un retardo fijo de 72 ms en el encendido iinicamente, disefiadopara mantener el dispositivo en reset mientras la fuente se estabiliza. Para utilizarestos temporizadores s6lo se requiere conectar el pin MCLR a la fuente de alimenta­ci6n, evitandose utilizar las tradicionales redes RC extemas en el pin de reset.

El reset por MCLR se consigue llevando momentaneamente este pin a un estadol6gico bajo, mientras que el WDT produce el reset cuando el temporizador rebasa sucuenta, 0 sea que pasa de OFFh a OOh. Cuando se quiere tener control sobre el resetdel sistema se puede conectar un bot6n como se muestra en la figura 3.8.

+5VDC

Figura 3.8. Conexi6n delbot6n de reset

Page 98: Pic 16f84a

Capftu/~ 3. EI PlC16C71

Arquitectura

Este termino se refiere a los bloques funcionales internos que conforman el mi­crocontrolador y la forma en que estanconectados, por ejemplo la memoria FLASH(de programa), la memoria RAM (de datos), los puertos, la logica de control quepermite que todo el conjunto funcione, etc.

TEMPORIZADORDE ENCENDIDO

TEMPORIZADOR DEARRANQUE DEL

OSCILADOR

CIRCUITODERESET

CIRCUITODEVIGILANCIAWATCHDOG

CONVERTIDORANALOGOA

DIGITAL

TEMPORIZADORICONTADOR

PUERTOS 1/0

PUERTOSA,S

Figura3.9. Arquitectura intema del PIC16C71

La figura 3.9 muestra la arquitectura general del PIC16C71, en ella se puedenapreciar los diferentes bloques que 10 componen y la forma en que se conectan. Semuestra la conexion de los puertos, las memorias de datos y de programa, los blo­ques especiales como el watchdog, los temporizadores de arranque, el oscilador, etc.

Todos los elementos se conectan entre sf por medio de buses. Un bus es unconjunto de lineas que transportan informacion entre dos 0 mas modules. Vale lapena destacar que el PIC16C71 tiene un bloque especial conformado por el con­vertidor analogo a digital.

Page 99: Pic 16f84a

.. Capftulo 3. El PIC16C71

El PIC16C71 se basa en la arquitectura Harvard, en la cual el programa y losdatos se pueden trabajar desde memorias separadas, 10 que posibilita que las instruc­ciones y los datos posean longitudes diferentes. Esta misma estructura es la quepermite la superposici6n de los ciclos de biisqueda y ejecuci6n de las instrucciones,10 cual se ve reflejado en una mayor velocidad del microcontrolador.

Memoria de programaEsuna memoria de 1 Kbyte de longitud con palabras de 14 bits. En ella se graba, 0 alma­cena, el programa 0 c6digos queel microcontroladordebe ejecutar.Dado que el PIC16C71tiene un contador deprograma de 13 bits, tiene una capacidad dedireccionamiento de8Kx 14, pero solamente tiene implementado el primer 1K x 14 (OOOOh hasta 03FFh). Si sedireccionan posiciones de memoria superiores a 3FFh se causara un solapamiento con elespacio del primer 1K.En la figura 3.10 se muestra el mapa dela memoria de programa.

PC <12:0>

CALLRETLWRETFIERETURN

Pila nivel1Pila nivel2

Pina nivelS

Vector de Reset OOOOh

MEMORIADEPROGRAMA

03FFh0400h

1FFFh

Figura 3.10. Mapa de la memoria de programa

Este microcontrolador se consigue en dos presentaciones, el de memoria tipoEPROM (posee ventana para borrado) que se utiliza para experimentar y elllamadoOTP (One Time Programable: Programable una sola vez) que se emplea en produc­ci6n, cuando se esta segura que el programa funciona correctamente.

Vector de reset. Cuando ocurre un reset al microcontrolador, el contador de progra­rna se pone en ceros (OOOH). Por esta raz6n, en la primera direcci6n del programa sedebe escribir todo 10 relacionado con la iniciaci6n del mismo.

Vector de Interrupckm. Cuando el microcontrolador recibe una sefial de interrup­ci6n, el contador de programa apunta a la direcci6n 04H de la memoria, por eso, alIise deben escribir todas las instrucciones necesarias para atender dicha interrupci6n.

Page 100: Pic 16f84a

Capitulo 3. EI PIC16C71..Registros (Memoria RAM)El PIC16C71 puede direccionar 128 posiciones de memoria RAM, pero solo tieneimplementados ffsicamente los primeros 48 (O-2F en hexadecimal). De estos, losprimeros 12 son registros que cumplen un prop6sito especial en el control del mi­crocontrolador y los 36 siguientes son registros de uso general que se pueden usarpara guardar los datos temporales de la tarea que se esta ejecutando, figura 3.11.

OOh "Dirac. Indirecto "Direc. Indirecto 80h01h RTCC OPTION 81 h02h PCl PCl 82h03h STATUS STATUS 83h04h FSR FSR 84hOSh PORTA TRISA 8Sh06h PORTB TRISB 86h07h 87h08h ADCONO ADCON1 88h09h ADRES ADRES 89hOAh PCLATH PCLATH 8AhOBh INTCON INTCON 8BhOCh 8Ch

36 Registros Mapeadode prop6sito en

general pagina02Fh30h

7F Pagina 0 Pagina1

No es un registrotrsico• Posiciones no implementadas

AFhBOh

FF

Figura 3.11. Registros del PIC16C71

Los registros estan organizados como dos arreglos (paginas) de 128 posicionesde 8 bits cada una (128 x 8); todas las posiciones se pueden acceder directa 0 indi­rectamente (a traves del registro selector FSR). Para seleccionar que pagina de me­moria RAM se trabaja en un momento determinado, se utiliza el bit RPO del registroSTATUS. A continuaci6n se hace una descripci6n de cada uno de los registros:

OOh 0 INDO: Registro para direccionamiento indirecto de datos. Este no es unregistro disponible ffsicamente; utiliza el contenido del FSR y el bit RPO del registroSTATUS para seleccionar indirectamente la memoria de datos 0 RAM del usuario;la instrucci6n determinara que se debe realizar con el registro sefialado.

Olh 0 TMRO: Temporizador/contador de 8 bits. Este se puede incrementarcon una sefial externa aplicada al pin RA4/TOCKI 0 de acuerdo a una sefialinterna proveniente del reloj de instrucciones del microcontrolador. La rata deincremento del registro se puede determinar por medio de un preescalador, loca-

Page 101: Pic 16f84a

..Capftulo 3. El PIC16C71

lizado en el registro OPTION. Como una mejora con respecto a sus antecesores,se le ha agregado la generacion de interrupcion cuando se rebasa la cuenta (elpaso de OFFh a OOh).

02h 0 PCL: Contador de programa. Se utiliza para direccionar las palabras de14bits del programa del usuario que se encuentra almacenado en la memoria ROM;este contador de programas es de 13 bits de ancho, figura 1.12. Sobre el byte bajo,PCL se puede escribir 0 leer directamente, mientras que sobre el byte alto, no. Elbyte alto se maneja a traves del registro PCLATH (OAh). A diferencia de los PICde primera generacion, el 16C71 ante una condicion de reset inicia el contador deprograma con todos sus bits en "cero". Durante la ejecucion normal del programa,y dado que todas las instrucciones ocupan solo una posicion de memoria, el conta­dor se incrementa en uno con cada instruccion, a menos que se trate de algunainstruccion especial.

Incluido en la instrucci6n,suficienteparadireccionar tOdalarn9rnotia.del ••PIC16C71

Figura 3.12. Contador de programa (13 bits)

En una instruccion CALL 0 GOTO, los bits PC<1O:0> se cargan desde el codigode operacion de la instruccion, mientras que los bits PC<I1:12> 10 hacen desde elPCLATH<4:3>. Como solamente el primer 1K de memoria esta implementado, elcodigo de operacion de la instruccion puede contener la direccion destino, eso quie­re decir que se pueden hacer saltos y llamados a subrutinas sin necesidad de tener encuenta la paginacion de memoria de programa.

En otras instrucciones donde PCL es el destino, PC<12:8> se carga directamentedesde el PCLATH<4:0>, por ejemplo en el caso de la instruccion ADDWF. Esto sedebe tener en cuenta cuando se desea hacer lectura de tablas usando el comando:ADDWF PC,l ,en este caso se debe tener en cuenta que la tabla debe estarcomprendida dentro de un solo bloque de 256 bytes (0-255, 256-511, etc.).

03h 0 STATUS: Registro de estados. Contiene el estado aritmetico de la ALD, lacausa del reset y los bits de preseleccion de pagina para la memoria de datos. Lafigura 3.13 muestra los bits correspondientes a este registro. Los bits 5 y 6 (RPO YRP1) son los bits de seleccion de pagina para el direccionamiento directo de la me­moria de datos; solamente RPO se usa en los PIC16C71. RP 1 se puede utilizar comoun bit de proposito general de lecturalescritura. Los bits TO Y PD no se puedenmodificar por un proceso de escritura; ellos muestran la condicion por la cual seocasiono el ultimo reset.

Page 102: Pic 16f84a

Capitulo 3. El PIC16C71..

Figura 3.13. Registro de estados

04h 0 FSR: Registro selector de registros, En asocio con el registro INDO, seutiliza para seleccionar indirectamente los otros registros disponibles. Mientras quelos antecesores poseian solo 5 bits activos, en este microcontrolador se poseen los 8bits. Si en el programa no se utilizan llamadas indirectas, este registro se puedeutilizar como un registro de proposito general.

Para entender mejor el funcionamiento de este registro veamos un programa simpleque borra el contenido de la memoria RAM, empleando direccionamiento indirecto.

NEXT

continua

MOVLWMOVWFCLRF

INCFBTFSSGOTO

20FSRINDO

FSR,RFSR,4NEXT

;inicializa el puntero en la memoria RAM;que se va a borrar;borra el registro indexado (es decir el que.esta siendo direccionado por el FSR);incrementa el puntero;pregunta si ya acabo el banco de memo;sigue borrando los registros que faltan

Page 103: Pic 16f84a

.. Capitulo 3. EI PIC16C71

5h 0 PORTA: Puerto de Entrada/Salida de 5 bits. Este puerto, al igual que todossus similares en los PIC, puede leerse 0 escribirse como si se tratara de un registrocualquiera. Los pines de este puerto, ademas de comportarse como entradas y sali­das digitales, tienen funciones altemas, las cuales se muestran en la figura 3.14.

Pin Funcion alterna

RAO/ AINO Entrada Analoga Canal 0

RA1 / AIN1 Entrada Analoga Canal 1

RA2/AIN2 Entrada Analoqa Canal 2

RA3 / AIN3 / Vref Entrada Analoga Canal 3 0

Voltaje de referencia (Vref)

RA4ITOCK1 Entrada Externa de relojpara contador TMRO

Figura 3.14. Funciones alternas de los pines del puerto A

Dos bits en el registro ADCONI (registro 88h) configuran los cuatro pines me­nos significativos como E/S digitales 0 entradas analogas. Bajo la condicion de re­set, estos pines se configuran como entradas analogas. El registro de control de estepuerto (TRISA) esta localizado en la pagina 1, en la posicion 85h.

06h 0 PORTB: Puerto de Entrada/Salida de 8 bits. Al igual que en todos los PIC,este puede leerse 0 escribirse como si se tratara de un registro cualquiera; algunos desus pines tienen funciones altemas en la generacion de interrupciones. El registro decontrol para la configuracion de la funcion de sus pines se localiza en la pagina 1,enla direccion 86h y se llama TRISB.

08h 0 ADCONO: Registro de control del convertidor. Este registro, junto conADCONI se dedica al control del convertidor analogo a digital. Los bits que estecontiene y la funcion que cumplen se muestran en la figura 3.15.

09h 0 ADRES: Registro para el resultado de la conversion. En esta posicion sealmacena el resultado digital de la conversion del valor analogo.

OAh 0 PCLATH: Registro para la parte alta de la dlreccion. Este contiene laparte alta del contador de programa y no se puede acceder directamente.

OBh 0 INTCON: Registro para el control de interrupciones. Es el encargado delmanejo de las interrupciones y contiene los bits que se muestran en la figura 3.16.

8Ih u OPTION: Registro de conflguraclon multiple. Posee varios bits para con­figurar el preescalador, la interrupcion externa, el timer y las caracterfsticas del puertoB. Los bits que contiene y sus funciones se muestran en la figura 3.17. El preescala­dor es compartido entre el RTCC y el WDT, su asignacion es mutuamente excluyen­te ya que solamente puede uno de ellos ser preescalado a la vez.

Page 104: Pic 16f84a

Capitulo 3. El PIC16C71..

Figura 3.15. Registro ADCONO

85h 0 TRISA: Registro de conflguracion del puerto A. Como ya se habfa mencio­nado, es el registro de control para el puerto A, cuando este se trabaja digitalmente.Un «cero» en el bit correspondiente al pin 10 configura como salida, mientras que un«uno» 10 hace como entrada.

86h 0 TRISB: Registro de conflguraclon del puerto B. Orientado hacia el controldel puerto B. Son validas las mismas consideraciones del registro anterior.

88h 0 ADCONl: Registro auxiliar para control del convertidor. Se dedica a laconfiguraci6n de las entradas analogas y solo destina dos bits para ello; el resto de bitspermanece sin implementar. En la figura 3.18 se muestran las funciones de estos bits.

Page 105: Pic 16f84a

Capftulo 3. El PIC16C71

Figura 3.16. Registro INTCON

OCh a 2Fh: Registros de proposito general. Estas 36 posiciones estan implemen­tadas en la memoria RAM estatica, la cual conforma el area de trabajo del usuario; aellas tambien se accede cuando en la pagina 1 se direccionan las posiciones 8Ch aAFh. Esto se ha disefiado asfpara evitar un excesivo cambio de paginas en el mane­jo de la RAM del usuario, agilizando los procesos que se esten llevando a cabo ydescomplicando la labor del programador.

Registro de trabajo W. Este es el registro de trabajo principal, se comporta demanera similar al acumulador en los microprocesadores. Este registro participa enla mayorfa de las instrucciones.

Page 106: Pic 16f84a

Capitulo 3. EI PIC16C71..

Figura 3.17. Registro OPTION

Pila (Stack)Estos registros no forman parte de ningiin banco de memoria y no permiten el acce­so por parte del usuario. Se usan para guardar el valor del contador de programacuando se hace un llamado a una subrutina 0 cuando se atiende una interrupci6n;luego, cuando el micro regresa a seguir ejecutando su tarea normal, el contador deprograma recupera su valor leyendolo nuevamente desde la pila. EI PIC16C71 tieneuna pila de 8 niveles, esto significa que se pueden anidar 8 llamados a subrutina sintener problemas.

Page 107: Pic 16f84a

.. Capitulo 3. El PIC16C71

Figura 3.18. RegistroADCON1

PCFG1,0 RAO,RA1 RA2 RA3 Vref00 E. analoqas E. analoqa E. analoqa Vdd01 E. analoqas E. analogaReferenoia RA310 E. analoqas E/S digital E/S digital Vdd11 E/S digitales E/S digital E/S digital Vdd

Caracteristicas especiales

Algunos elementos que forman parte de los PIC no se encuentran en microcontro­ladores de otros fabricantes, 0 simplemente representan alguna ventaja 0 facilidad a lahora de hacer un disefio.Veamos una breve descripcion de las mas significativas:

Convertidor Amilogo a DigitalEl modulo del convertidor posee cuatro entradas analogas multiplexadas a un solocircuito de muestreo y sostenimiento y a un convertidor. El voltaje de referencia delconvertidor se puede configurar por software para que sea el voltaje de alimentaciondel microcontrolador (VDD) 0 un voltaje extemo aplicado al pin RA3, en este caso,el valor mfnimo que puede tomar e1 voltaje de referencia es de 3 voltios. Este con­vertidor es del tipo de aproximaciones sucesivas y el tiempo de conversion esta enfuncion del cielo del oscilador, considerandose un tiempo mfnimo de 20 J.lS.

La conversion se inicia colocando el bit de control GOIDONE (ADCONO<2»en «uno», previa seleccion del canal deseado y de configurar el registro ADCONI,el cual define los modos en los cuales trabaja el convertidor. Al final de la conver­sion, el bit GOIDONE se coloca en "cero" y la bandera de interrupcion ADIF delconvertidor (ADCONO<I» en "uno", almacenandose el resultado de la conversionen el registro ADRES. Estas caracterfsticas permiten que el resultado de la conver­sion se pueda leer por medio de interrupciones 0 sin ellas.

Esquema del reloj del convertidor. El convertidor funciona con su propio reloj,derivado del reloj de entrada OSCI 0 de su propio oscilador RC incorporado. Eltiempo de conversion para cada bit es tad y el tiempo de conversion total es IOx tad.La seleccion del reloj, a traves de los bits ADCI,O del registro ADCONO, se debehacer de tal manera que tad sea al menos de 2 J.lS. Al seleccionar el tipo de osciladordebe tenerse presente que la frecuencia varia con el voltaje, la temperatura y otrosparametres propios del proceso de fabricacion del microcontrolador.

Page 108: Pic 16f84a

----------------------------------------------

Capitulo 3. El PIC16C71..Circuito de vigilancia (Watchdog Timet}Su funci6n es restablecer el programa cuando este se ha perdido por fallas en laprogramaci6n 0 por alguna raz6n extema. Es muy util cuando se trabaja en ambien­tes con mucha interferencia 0 ruido electromagnetico, Esta conformado por un osci­lador RC que se encuentra dentro del microcontrolador.

Este oscilador corre de manera independiente al oscilador principal. Cuandose habilita su funcionamiento, dicho circuito hace que el microcontrolador sufraun reset cada determinado tiempo (que se puede programar entre 18 ms y 2 segun­dos). Este reset 10 puede evitar el usuario mediante una instrucci6n especial delmicrocontrolador (CLRWDT: borrar el conteo del watchdog), la cual se debeejecutar antes de que termine el perfodo nominal de dicho temporizador. De estamanera, si el programa se ha salido de su flujo normal, por algun ruido 0 interfe­rencia extema, el sistema se reiniciara (cuando se acabe el tiempo programado yno se haya borrado el contador) y el programa puede restablecerse para continuarcon su funcionamiento normal.

En las primeras practicas no se utiliza el circuito de vigilancia para facili­tar el trabajo; por eso, en el momenta de programar el microcontrolador sedebe seleccionar en los fusibles de configuraci6n «watchdog timer OFF». Masadelante veremos algunos ejemplos que ilustran su funcionamiento y la mane­ra de utilizarlo.

Temporizador de encendido (Power-up Timet}Este proporciona un reset al microcontrolador en el momenta de conectar la fuente dealimentaci6n, 10 que garantiza un arranque correcto del sistema. En el momenta degrabar el micro se debe habilitar el fusible de configuraci6n "Power-up Timer", paraella se debe seleccionar la opci6n "ON'. Su tiempo de retardo es de 72 milisegundos.

Modo de bajo consumo (sleep)Esta caracterfstica permite que el microcontrolador entre en un estado pasivo don­de consume muy poca potencia. Cuando se entra en este modo el oscilador princi­pal se detiene, pero el temporizador del circuito de vigilancia (watchdog) se reini­cia y empieza su conteo nuevamente. Se entra en ese estado por la ejecuci6n deuna instrucci6n especial (llamada SLEEP) y se sale de el por alguna de las si­guientes causas: cuando el microcontrolador sufre un reset por un pulso en el pinMCLR, porque el watchdog hace que se reinicie el sistema 0 porque ocurre unainterrupci6n al sistema.

InterrupcionesEste microcontrolador incluye el manejo de interrupciones, 10 cual representa gran­des ventajas. El PIC16C71 posee cuatro fuentes de interrupci6n a saber:

• Interrupci6n extema en el pin RBO/INT• Finalizaci6n del temporizador/contador• Finalizaci6n de la conversi6n AID• Cambio de nivel en los pines RB4 a RB7

Page 109: Pic 16f84a

.. Capftulo 3. El PIC16C71

El registro OBh 0 INTCON contiene las banderas de las interrupciones INT,cambio en el puerto B y finalizacion del conteo del TMRO, al igual que el controlpara habilitar 0 deshabilitar cada una de las fuentes de interrupcion, incluida la defin de conversion analogo a digital. Solo la bandera de fin de conversion (bit ADIF)reside en el registro 08h 0 ADCONO.

Si el bit OlE (Global Interrupt Enable) se coloca en 0, deshabilita todas lasinterrupciones. Cuando una interrupcion es atendida, el bit OlE se coloca en 0 auto­maticamente para evitar interferencias con otras interrupciones que se pudieran pre­sentar, la direccion de retorno se coloca en la pila y el PC se carga con la direccion .04h. Una vez en la rutina de servicio, la fuente de la interrupcion se puede determi­nar examinando las banderas de interrupcion. La bandera respectiva se debe colo­car, por software, en cero antes de regresar de la interrupcion, para evitar que sevuelva a detectar nuevamente la misma interrupcion.

La instruccion RETFIE permite al usuario retornar de la interrupcion, a la vezque habilita de nuevo las interrupciones, al colocar el bit OlE en uno. Debe tenersepresente que solamente el contador de programa es puesto en la pila al atenderse lainterrupcion; por 10 tanto, es conveniente que el programador tenga cuidado con elregistro de estados y el de trabajo, ya que se pueden producir resultados inesperadossi dentro de ella se modifican.

Interrupci6n externa.Acnia sobre el pin RBOIINTy se puede configurar para acti­varse con el flanco de subida 0 el de bajada, de acuerdo al bit INTEDO (OPTION<6».Cuando se presenta un flanco valido en el pin INT, la bandera INTF (INTCON<l»se coloca en uno. La interrupcion se puede deshabilitar colocando el bit de controlINTE (INTCON<4» en cero; cuando se atiende la interrupcion, a traves de la rutinade servicio, INTF se debe colocar en cero por software, antes de rehabilitar la inte­rrupcion. La interrupcion puede reactivar al microcontrolador despues de la instruc­cion SLEEP, si previamente el bit INTE fue habilitado. El estado del bit OlE decidesi el procesador salta 0 no al vector de interrupcion despues de haberse reactivado.

Interrupci6n por finalizaci6n de la temporizaci6n. La superacion del conteo maxi­mo (OFFh) en el TMROcolocara el bit TOIF en uno (INTCON<2». El bit de controlrespectivo es TOlE (INTCON<S».

Interrupci6n por cambio en el puerto RD. Un cambio en los pines del puerto B<7:4> colocara en uno el bit RBIF (INTCON<O». El bit de control respectivo esRBIE (INTCON<3».

Interrupci6n por conversion AID. El convertidor AID coloca en uno el bit ADIF(lNTCON<l» al finalizar una conversion. El bit de control respectivo es ADIE(INTCON<6>).

Fusibles de configuraci6nEl PIC16C71 posee cinco fusibles, cada uno de los cuales es un bit. Estos fusibles sepueden programar para seleccionar varias configuraciones del dispositivo: tipo de

Page 110: Pic 16f84a

Capitulo 3. El PIC16C71..oscilador, protecci6n de codigo, habilitaci6n del circuito de vigilancia y el tempori­zador al encendido. Los bits se localizan en la posicion de memoria 2007h, posiciona la cual el usuario s610 tiene acceso durante la programaci6n del rnicrocontrolador.Cuando se programa la protecci6n de codigo, el contenido de cada posicion de lamemoria no se puede leer completamente, de tal manera que el c6digo del programano se puede reconstruir. Adicionalmente, todas las posiciones de memoria del pro­grama se protegen contra la reprogramaci6n.

Una vez protegido el codigo, el fusible de protecci6n s610 puede ser borrado(puesto a 1) si se borra toda la memoria del programa y la de datos.

Las pull-ups internasCada uno de los pines del puerto B tiene un debil elemento pull-up interno (250 flAtfpico); este elemento es automaticamente desconectado cuando el pin se configuracomo salida. Adicionalmente, el bit RBPU (OPTION<7» controla todos estos ele­mentos, los cuales estan deshabilitados ante una condicion de reset. Estos elementospull-up son especialmente titiles cuando el rnicrocontrolador va a colocarse en elmodo de bajo consumo, ya que ayudan a no tener las entradas flotantes, significandouna reducci6n en el consumo de corriente.

EI conjunto de lnstrucclonesEstas se elasifican en orientadas a registros, orientadas al bit y operaciones literalesy de control. Cada instrucci6n es una palabra de 14 bits, dividida en un c6digo deoperacion, el cual especifica la orden a ejecutar y uno 0 mas operandos sobre los quese aetna. En el apendice A se encuentra la lista completa de instrucciones, la cualineluye ejemplos y explicaciones. Como se puede observar, en total son 35, las cua­les tardan un cielo de maquina a excepci6n de los saltos, que toman dos cielos.

EI PIC16C710n11n15

Los PIC16C71017111715 son totalmente compatibles con el PICI6C71, por serde reciente introducci6n al mercado no son tan populares. La diferencia radica en 10siguiente:

PIC16C710. Posee circuito de Brown-Out, esto quiere decir que el pin de reset(MCLR) se puede conectar directamente ala fuente de alimentacion, ya que el siste­ma interno detecta cuando el voltaje esta por debajo de 4 voltios y hace que el rni­crocontrolador se reinicie. La memoria de programa de este rnicrocontrolador s610tiene 512 bytes (0,5 Kbytes).

PIC16C711. Posee ademas del Brown-Out, 32 posiciones de memoria RAM adi­cionales. Por 10tanto, el mapa de memoria llega hasta la direcci6n 4Fh. La memoriade programa es de lkbyte (igual al PIC 16C71).

PIC16C715. Posee circuito de Brown-Out, 84 posiciones adicionales de memoriaRAM y memoria de programa de 2 kbytes.

Page 111: Pic 16f84a

..

riG ectos, conel IC:16iC 1

• Termometro digital con modulo LCD• Adquisicion de datos via RS-232

Page 112: Pic 16f84a

.. Capitulo 4. Proyectos con el PlC16C71

Proyecto N° 1: Termometro digital con modulo LCD

Como ejemplo de la utilizacion del convertidor AID del PIC 16C71, vamos aimplementar un termometro que muestra la temperatura medida, en grados centigra- ,dos, en la pantalla de un display 0 modulo LCD.

Para medir la temperatura emplearemos un LM35. Este sensor tiene tres pines:Alimentacion, tierra y la salida analoga. Este dispositivo presenta en su salida unavariacion de 10mVPC, por 10 tanto, el valor de la temperatura se puede obtenerdirectamente, sin necesidad de hacer modificaciones al dato obtenido.

El LM35 puede trabajar en un rango de temperatura entre -55 y 150°C, la fuentede alimentacion positiva puede estar entre 4 y 30 Voltios.Ademas, su precision es de0.5°c. Este elemento viene en un encapsulado plastico TO-92 y tiene la misma apa­riencia de un transistor.

El modulo de cristal lfquido se conecta al microcontrolador utilizando interfacede 4 bits. En este ejercicio, conectamos la entrada analoga al pin RA2/AN2 delmicrocontrolador y el voltaje de referencia del convertidor analogo a digital, se con­figura para que sea el voltaje de alimentacion del PIC (VDD). En la figura 4.1 semuestra el diagrama esquematico del termometro digital.

+5V

LM35

+5V +5V

+5V

Ajuste decontraste

Figura 4.1. Diagrama esquernatico del term6metro digital con PIC

La maxima lectura del convertidor analogo a digital (OFFH) se obtiene cuando laentrada analoga sea superior a 5 voltios. De tal manera, que si hacemos la division de5 Voltios entre 255 (FFH), obtenemos una relacion de aproximadamente 20 mV porunidad. Por ejemplo, si la entrada analoga esta en 160 mV (es decir 16°C), el valor

Page 113: Pic 16f84a

Capitulo 4. Proyectos con el PIC16C71..digital que entrega el convertidor es 8 (160/20). Dado 10 anterior, el valor que entregael convertidor se debe duplicar para compensar la diferencia (variaci6n de 10mVrc yresoluci6n de lectura de 20mV). Aunque esto hace que la lectura siempre sea un mi­mere par, se puede aceptar en vista de que se trata de ejercicios netamente didacticos.

Para solucionar el problema de tener que duplicar el valor leido y garantizar queel resultado de la conversi6n corresponda a la temperatura real, se puede utilizar unamplificador operacional para amplificar la sefial entregada por el sensor LM35,dicho operacional se debe configurar como amplificador no inversor de ganancia 2.De esta forma, con el valor analogo adecuado en la entrada del convertidor y con lafuente de alimentaci6n como voltaje de referencia, se puede obtener una lecturaprecisa y directa. En la figura 4.2 se muestra el diagrama del circuito que utiliza elamplificador operacional, si se utiliza este montaje se puede obviar la parte del pro­grama que duplica el valor lefdo (la parte sombreada en ellistado).

LM35

10~F +16VIPotenci6metrode 10KQ para

ajustar laganancia

Salida de voltajeequivalente al doble delvalor entregado por el

sensor LM35

Figura 4.2. Circuito para acople del sensor LM35

En la figura 4.3 se muestra ellistado del programa, este incluye todo el progra­rna de la interface a 4 bits con el display de cristal lfquido, una secci6n que se encar­ga de leer el convertidor analogo a digital, y una secci6n que convierte el dato hexa­decimal obtenido luego de la conversi6n, a su equivalente en decimal, para ser mos­trado en la pantalla.

Pasos a seguir para hacer una conversion AID1. Configure los pines del puerto A, los que vayan a trabajar como entradas analo­

gas deben ser configurados como entradas en el registro TRISA.2. Configure las entradas analogas y el voltaje de referencia (interno 0 externo) en

el registro ADCON 1.3. Seleccione el canal de entrada en el registro ADCONO.4. Seleccione el reloj de la conversi6n en ADCONO.5. Encienda el convertidor (bit ADON del registro ADCONO) para que se tome la

muestra de la sefial analoga.6. Si se va a utilizar la interrupci6n se debe borrar el bitADIF del registro ADCONO

y poner en "1" el bitADIE y el bit GIE del registro INTCON.7. Luego de iniciar el convertidor se hace un pequefio retardo (para el muestreo).8. Se debe iniciar la conversi6n mediante el bit GOIDONE del registro ADCONO.

Page 114: Pic 16f84a

.. Capitulo 4. Proyectos con el PIC16C71

9. Esperar a que se tennine la conversion probando el estado del bit GOIDONE 0esperar el cambio en la bandera de interrupcion, es decir probando el bit ADIFdel registro ADCONO.

10. El resultado se debe leer en el registro ADRES.11. Borrar el bit ADIF.

Para el caso del termometro digital los pasos seguidos fueron los siguientes:

• En el primer bloque del programa principal (INICIO), ademas de configurar lospuertos, se programa el pin RA2/AN2 como una entrada analoga. El bloque queinicia con la etiqueta BEGIN se encarga de ubicar en la pantalla el mensaje delmedidor de temperatura, utilizando la interface a 4 bits como se via en el capitulo 2.

• La parte del programa que inicia con la etiqueta MillE se encarga de configurar lavelocidad del convertidor analogo a digital, de poner el bit ADIF en "0" y de ponerel bit ADON del registro ADCONO en "1" antes de empezar la conversion, luego sehace un retardo. El trabajo del convertidor se inicia cuando el bit ADCONO,GO sepone en «1», nuevamente se hace un pequefio retardo. Para saber si el convertidor hatenninado se prueba el estado del bit llamado ADCONO,ADIF.

• Una vez que se esta seguro de tener el dato digital que resulta de la conversion, estese puede leer del registro ADRES y se debe duplicar antes de enviarlo a la panta­lla. Como este mimero se encuentra en hexadecimal, se debe utilizar una rutinaque se encargue de convertirlo a su equivalente en decimal. Esto se hace con larutina llamada DECIMAL, la cual devuelve el valor obtenido en los registros CEN­TENA, DECENAy UNIDAD. A estos datos se les suma el valor 30h para conver­tirlos en su equivalente ASCII antes de enviarlos a la pantalla.

Esta practica se puede realizar con cualquier tipo de sensor cuya salida esteentre °y 5 voltios, de 10 contrario se debera utilizar algun medio para acondicio­nar su sefial a los rangos permitidos por el microcontrolador, por ejemplo un am­plificador operacional. En el momento de grabar el microcontrolador se debe te­ner cuidado de seleccionar el tipo correcto, ya que se ha venido trabajando con el16F84 y esto nos puede hacer equivocar.

;programacibn de los registros

;registros del convertidor aid

equequequequequequequequequequequ

este programa toma el valor entregado por el sensor detemperatura y 10 muestra en la pantalla del modulo led

****** pic16c71 ************** wdt = off ************* osc = xt *******

******* definiciones ********0h ;para direccionamiento indirectolh ;contador de tiempo real .2h ;contador de programa3h ;registro de estados y bits de control4h ;selecccibn de bancos de memoriaSh ;puertos6h8h88h9h8Sh

,indftmropcstatusfsrptoaptobadcon0adconladrestrisa

Page 115: Pic 16f84a

Capitulo 4. Proyectos con el PIC16C71..trisbr0cr0dr0eunidaddecenacentenarl4rlbrp0zc

)II

rpcfg0pcfgladifgoers

retardo

decre

retar2

decr2

decimal

otra

sum

repite

suml

control

dato

dat02

equequequequequequequequequequequequequequequequequequequequ

orggotoorgmovlwmovwfdecfszgotoretlwmovlwmovwfcallcalldecfszgotoretlw

clrfclrfmovlwsubwfbtfssgotoincfgotoaddwfmovlwsubwfbtfssgotoincfgotoaddwfretlw

bcfgotobsf

bsfmovwfmovlwandwfmovfandlwiorwf

86h0ch0dh0ehl0hllh12hl4h1bhSh2h0h0h1ho11h2h1h0h

•••••••••••00inicio0Sh0ffhr1br1b,rdecreo0ffhr14retardoretardor14,rdecr2o

decenacentenad'100'unidad,rstatus,csumcentenaotraunidadd'10'unidadstatus,csum1decenarepiteunidado

ptob,rsdat02ptob,rs

ptob,er0e0fhptob,rr0e,w0f0hptob,r

,;seleccion de pagina;bandera de cero;bandera de carry;para almacenar en w;para almacenar en el mismo registro;bits del registro adcon1

;bits del registro adcon0

programa principal············;vector de reset;va a iniciar programa principal

;rutina que convierte binario en bcd;borrar registros de trabajo

;restar 100 al valor inicial;verifica el carry;si es cero deja de restar 100;si es 1 incrementa centena;volver a restar;sumarle 100

;restar 10 al valor;verifica el carry;si es 0 deja de restar;si es 1 incrementa decena

;sumarle 10 al valor;el valor de la conversion binario a;decimal;se devuelve en los registros centena,;decena y unidad;esta rutina genera las senales de control;para escribir en el modulo lcd y;entrega el dato a ser mostrado en la;pantalla;utiliza la interface a 4 bits

Page 116: Pic 16f84a

CapUuIo 4. Proyectos con el PIC16C71..call retardobcf ptob,ecall retardobsf ptob,emovlw 0fhandwf ptob,rswapf r0e,wandlw 0f0hiorwf ptob,rcall retardobcf ptob,ecall retardoretlw 0

tabla addwf pc,r ;mensaje que se muestraretlw 11 "

retlw "L"retlw "Anretlw " II

retlw "T"retlw i'E"

retlw "Milretlw lip"retlw "E"retlw uRnretlw "A"retlw "Tilretlw "U"retlw uRnretlw "A"retlw ;mensaje de la segunda linearetlw " 11

retlw IIAn

retlw "("

retlw liT"retlw nunretlw IIA"retlw "l"retlw II II

retlw "E"retlw "S"retlwretlwretlwretlwretlwretlw "C"retlw " II

retlw 0i ni cto bsf status,rp0 ;seleccionar pagina 1

movlw 0ffh ;configura ptoa como entradasmovwf trisa ;bcf adconl,pcfgl ;configura ra3 como voltaje de referenciabcf adconl,pcfg0 ;y ra0-ra2 como entradas analogasmovlw 0ch ; configura ptobmovwf trisb ;bcf status,rp0 ;vuelve a pagina 0

begin movlw 02h ;inicia display a 4 bitscall controlmovlw 28h ;displaya 4 bits y 2 lineascall controlmovlw 0ch ;activa display y desactiva cursorcall controlmovlw 06h ;selecciona el modo de desplazamientocall control

blank movlw 01h ;borra display y cursor a casacall control

muestra movlw 0 ; i nt ci c contador de caracteresmovwf r0c

cic'lo movf r0c,w ;hace barrido de la tablal

Page 117: Pic 16f84a

CapftuJo 4. Proyectos con el PIC16C71

callcallmovlwmovwf

retai calldecfszgotoincfmovlwsubwfbtfssgotomovlwxorwfbtfssgoto

1inea2 movlwcall

line2 movlwxorwfbtfssgoto

midemovlwmovwf

bsfmovlwmovwf

dec decfszgotobsfmovlwmovwf

de2 decfszgoto

consu nopbtfssgotobcfbcfmovf

callmovlwcallmovfaddlwcallmovlwcallmovfaddlwcallmovlwcallmovfaddlwcallcallclrfgotoend

tabladato0Sfhr0dretardor0d,rretair0c,ri0hr0c,wstatus,ccicloi0hr0c,wstatus,zline20c0hcontrol20hr0c,wstatus,zciclo

b'0i0i0000,adcon0

adcon0,00fhribrib,rdecadcon0,go0fhribrib,rde2

adcon0,adifconsuadcon0,0adcon0,adifadres

0cbhcontrolcentena,w30hdato0cchcontroldecena,w30hdato0cdhcontrolunidad,w30hdatoretar2adresmide

;retardo entre caracteres

;sigue con la tabla

;pregunta si esta mostrando el mensaje dela;segunda linea,;pregunta si es la primera vez que entra;a la segunda linea para ir a iniciar;el puntero de la ram del modulo led,;ubica puntero de la ram del modulo led;en la segunda linea;pregunta si termino la segunda linea;para ir a iniciar de nuevo el mensaje 0;para continuar en la segunda linea

;se hace laconversion anologo a digital;configura el conver., selecciona canal,;velocidad de conyer. y 10 activa;adif=0 antes de empezar la conversion

;empezar la conversion

,;pregunta fin de conversion;si no ha terminado sigue esperando

;apaga el convertidor;si termino de convertir debe pasar

;convertir el dato binario a decimal;ubico puntero de ram donde va el numero

;primer digito = centenas

;ubica puntero de ram donde va el numero

;segundo digito = decenas

;ubico puntero de ram donde va el numero

;segundo digito = unidades

;termina

Figura 4.3. Programa completo del term6metro digital

Page 118: Pic 16f84a

.. Capitulo 4. Proyectos con el PIC16C71

Proyecto N° 2: Adquisici6n de datos via RS-232

Esta practicaconsisteen leeruna sefial analogacon un microcontroladorPIC16C71Yenviar a una computadora el data digital equivalente; esta ultima se encargara demostrar en la pantalla (de forma grafica) la manera en que la sefialvaria con el tiempo.

Como fuentede sefialse puede usar un potenci6metrode 5 kohm, el cual se conec­ta directamente a un pin del microcontrolador que se ha configurado como entradaanaloga. La forma de enviar los datos serialmente se vi6 en el capitulo 2, utilizandocomo interface un integrado MAX232. Tambien se muestra el dato lefdo en una pan­talla de cristal lfquido, con el fin de comprobar que todo funciona correctamente, esdecir que se debe mostrar el mismo dato que en la computadora. Por su parte, lacomputadora tiene un programa en lenguaje C que se encarga de leer el dato serial yde mostrarlo en la pantalla. En la figura 4.4 se muestra el diagrama del circuito.

+5V +5V

13

12

11

10+5V

+] fsKO5Kn -

Seilal 7 I 6 Ajuste decontraste

analoqa _6 4

Conectar alcomputador

+5VConector DB9hembra +5V

Hacer estos Lpuentes en el

conector ~ 5 r-+-+----=-

-, ~+----,, 1

Figura 4.4 Diagrama esquernatlco del circuito de adquisici6n de datos

Page 119: Pic 16f84a

Cap!fulo 4. Proyectos con el PIC16C71

La comunicaci6n se hara con las mismas especificaciones del ejercicio anterior,es decir a 1200 bps, 8 bits, sin paridad y con un stop bit (1200,8, N, 1). En la figura4.5 se muestra el programa que se graba en el microcontrolador, los bloques masimportantes son: el que hace la conversi6n analogo a digital, que inicia con la eti­queta MIDE y el que hace la transmisi6n serial que 10 compone la subrutina HamadaENVIAR. Estas rutinas se han explicado en ejercicios anteriores.

La computadora se debe encargar de leerel dato serial y de mostrarlo en lapantalla, para ello se debe utilizar el llamado modo grdfico. En este modo se traza laventana donde aparece la curva obtenida, al igual que se van ubicando punto a puntatodos los datos que entrega el microcontrolador. En la figura 4.6 se muestra el pro­grama en lenguaje C que realiza la tarea descrita, llamado ADQUISIl.c. Nueva­mente se tienen dos versiones, una para utilizarel COM1HamadaADQUISIl y otrapara usar el cOM2 llamado ADQUISI2. El programa ejecutable que puede co­rrer el usuario desde el DOS tiene los mismos nombres pero con extensi6n.EXE. En la figura 4.7 se tiene un pantallazo del programa ejecutable, mos­trando una grafica obtenida.

este programa toma el valor anologo leido y 10 enviaa la computadora de forma serial

****** pic16c84 ************** wdt = off ************* osc = xt ************* cp = on ******

******* definiciones ********, .

indf equ 0h ;para direccionamiento indirectotmro equ lh ;contador de tiempo realpc equ 2h ;contador de programastatus equ 3h ;registro de estados y bits de controlfsr equ 4h ;selecccibn de bancos de memoriaptoa equ Sh ;puertosptob equ 6h

fadcon0 equ 8h ;registros del convertidor aidadconl equ 88hadres equ 9htrisa equ 8Sh ;programacibn de los registrostrisb equ 86hr0c equ 0chr0d equ 0dhr0e equ 0ehunidad equ 10hdecena equ llhcentena equ 12hr14 equ 14hrlb equ lbhrlc equ lchrld equ ldhtrans equ leh ;btts especiales

;bits del registro statusrp0 equ Sh ;seleccion de paginaz equ 2h ;bandera de ceroc equ 0h ;bandera de carry

w equ 0h ;para almacenar en wr equ lh ;para almacenar en el mismo registropcfg0 equ 0 ;bits del registro adconlpcfgl equ 1adif equ lh ;bits del registro adcon0go equ 2htx equ 2 ; pines del puerto a

Page 120: Pic 16f84a

..ers

equequ

1h0h

Capitulo 4. Proyectos con el PIC16C71

*********** programa principal ************

delay1startupredo

enviar

xnext

orggotoorg

movlwmovwfnopnopdecfszgotoretlw

movwfmovlwmovwfbcfcallbcfbcfrrfbtfscbsfcalldecfszgotobsfcallretlw

00irn cto05h

.166r1c

r1credoo

trans8'-r1dptob,txdelay1ptob,txstatus,ctransstatus,cptob,txdelay1r1dxnextptob,txdelay1o

;vector de reset;va a iniciar programa principal

;carga para 833 Es aproximadamente;llevar valor de carga al retardo;limpiar circuito de vigilancia

;decrementar retardo, saltar si cero;repetir hasta terminar;retornar

;rutina para enviar dato;llevar el contenido de w a transmisibn;cargar con numero de bits;el contador;colocar 11nea de transmisibn en bajo /;para generar bit de arranque;colocar 11nea de transmisibn en bajo;limpiar carry;rotar registro de transmisi¢n;preguntar por el carry;si es uno, colocar lOnea en alto;llamar retardo de 1 bit;decrementar contador, saltar si cero;repetir hasta transmitir todo el dato;colocar lOnea de transmisi¢n en alto;llamar retardo 1 bit -bit de parada­;retornar

retardo movlwmovwf

decre decfszgotoretlw

retar2 movlwmovwf

decr2 callcalldecfszgotoretlw

decimal clrfclrfmovlw

otra subwfbtfssgotoincfgoto

sum addwfmovlw

repi te subwfbtfssgotoincfgoto

sum1 addwfretlw

0ffhr1br1b,rdecreo

0ffhr14retardoretardor14,rdecr2odecenacentenad'100'unidad,rstatus,csumcentenaotraunidadd'10'unidadstatus,csum1decenarepiteunidado

;rutina que convierte binario en bcd;borrar registros de trabajo

;restar 100 al valor inicial;verifica el carry;si es cero deja de restar 100;si es 1 incrementa centena;volver a restar;sumarle 100

;restar 10 al valor;verifica el carry;si es 0 deja de restar;si es 1 incrementa decena

;sumarle 10 al valor;el valor de conversion binario a decimal;se devuelve en los registros centena,;decena y unidad

Page 121: Pic 16f84a

Capitulo 4. Proyectos con el PIC16C71..control bcf ptob,rs ;esta rutina genera las senales de control

goto dato2 ;para escribir en el modulo lcd ydato bsf ptob,rs ;entrega el dato a ser mostrado en lapantalladato2 bsf ptob,e ;utiliza la interface a 4 bits

movwf r0emovlw 0fhandwf ptob,rmovf r0e,wandlw 0f0hiorwf ptob,rcall retardobcf ptob,ecall retardo

bsf ptob,emovlw 0fhandwf ptob,rswapf r0e,wandlw 0f0hiorwf ptob,rcall retardobcf ptob,ecall retardoretlw 0

tabla addwf pC,r ;mensaje que se muestraretlw "Eftretlw ilL"retlw n It

retlw "0"retlw "A"retlw "T"retlw "0"retlw II II

retlw "Anretlw "Nilretlw nAilretlw ilL"retlw "0"retlw "Gilretlw "0"retlw " II ;mensaje de la segunda linea

retlwretlw "A"retlw "("retlw "T"retlw .. unretlw "Anretlw "L"retlw " "retlw "E"retlw "S"retlw " n

retlw .. "retlwretlw It "

retlwretlw " II

retlw

retlw 0

trri cio bsf status,rp0 ;seleccionar pagina 1movlw 0ffh ;configura ptoa como entradasmovwf trisa ;bcf adconl,pcfgl ;configura ra3 como voltaje de referenciabcf adconl,pcfg0 ;y ra0-ra2 como entradas analogas

Page 122: Pic 16f84a

movlwmovwfbcf

begin movlwcallmovlwcallmovlwcallmovlwcall

blank movlwcall

muestra movlwmovwf

ci cl,o movfcallcallmovlwmovwf

reta1 calldecfszgotoincfmovlwsubwfbtfssgotomovlwxorwfbtfssgoto

1ineaZ movlwcall

1ineZ movlwxorwfbtfssgoto

mide movlwmovwf

08htrisbstatus,rp0

0ZhcontrolZ8hcontrol0chcontrol06hcontrol

01hcontrolor0cr0c,wtabladato05fhr0dretardor0d,rreta1r0c,r10hr0c,wstatus,c .ci cl.o /10hr0c,wstatus,zlineZ0c0hcontrol

\ ?0h.Jr0c,wstatus,zcielo

b' 01010000 ,adcon0

Capitulo 4. Proyectos con el t:!£l1iJ:2.&

;configura ptob,;vuelve a pagina 0

;inicia display a 4 bits

;display a 4 bits y Z lineas

;activa display y desactiva cursor

;selecciona el modo de desplazamiento

;borra display y cursor a casa

;inicia contador de caracteres

;hace barrido de la tabla1

;retardo entre caracteres

;sigue con la tabla

;pregunta si esta mostrando el mensaje de;la segunda linea,;pregunta si es la primera vez que entra;a la segunda linea para ir a iniciar;el puntero de la ram del modulo lcd,;ubica puntero de la ram del modulo lcd;en la segunda linea;pregunta si termino la segunda linea;para ir a iniciar de nuevo el mensaje 0;para continuar en 10 segunda l1.nea

;aqul hace la conversion analogo a digital;configura el conver., seleccionacanal,;velocidad de conver. y 10 activa;adif=0 antes de empezar conversion

bsf adcon0,0

call control

dec

de2

consu

movlwmovwfdecfszgotobsfmovlwmovwfdecfszgotonopbtfssgotobcfbcfmovfmovwfcall

callmovlw

0fhr1br1b,rdecadcon0,go0fhr1br1b,rdeZ

adcon0,adifconsuadcon0,0adcon0,adifadres,wunidadenviar

decimal0cbh

;empezar la conversion

,;pregunta fin de converSlon;si no ha terminado sigue esperando

;apaga el convertidor;si termino de convertir debe pasar

;transmite el dato serialmente

;convertir el dato binario a decimal;ubico puntero de ram donde va el numero;leido

Page 123: Pic 16f84a

Capttulo 4. Proyectos con el PIC16C71,movf centena,waddlw 30hcall datomovlw 0cch

call controlmovf decena,waddlw 30hcall datomovlw 0cdh

call controlmovf unidad,waddlw 30hcall datocall retar2clrf adresgoto mideend

iprimer digito • centenas

iubico puntero de ram donde va el numeroileido

isegundo digito • decenas

jubico puntero de ram donde va el numerojleido

jsegundo digito • unidades

itermina

Figura 4.5. Programa que convierte el dato analogo a digital y 10 envfa a lacomputadora

#include <bios.h>#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>

int puerto,COM1,COM2jint k,j,dato;int config;int COM1,COM2;int maxx,maxy;float x;char pattern[8] {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};

void leer (void);void leer(void){do{dato=bioscom(2,0x83,puerto)i /*leer dato recibido*/} while «((dato<0)I(dato>255))&(!kbhit()));}void main(void){/* autodeteccibn */int gdriver = DETECT, gmode, errorcodej /* inicializa modo grafico */

initgraph(&gdriver, &gmode, "c:\\borlandc\\bgi\\");errorcode = graphresult()i /* lee resultado de inicializacibn */if (errorcode != grOk) /* un error ocurrib */{printf("Graphics error: %s\n", grapherrormsg(errorcode));printf("Press any key to halt:")igetchO;exit(l);}maxx=getmaxxO;\VI<3.'f..~-~tt\VI<3.'f..~O "

COM1=0;COM2=1;puerto=COMl/* definir cual puerto se utiliza */

Page 124: Pic 16f84a

Capitulo 4. Proyectos con el PIC16C71

clrscr(); /*limpiar pantalla*/config=0x83; /*configurar puerto: 1200 bps,8 bits, sin paridad,l stop bit*/bioscom(0,config,puerto); /*configuracion de los puertos*/cleardeviceO;gotoxy(10,Z);printf("Curso de Microcontroladores PIC - CEKIT");gotoxy(10,4);printf("la computadora recibe los datos y los grafica - ADQUISI1.C");gotoxy(60,Z5);printf("Escape = Salir");x=0;moveto(66,maxy/Z-155);outtext("Z55");moveto(8Z,maxy/Z+100);outtext("0");setfillpattern(pattern,0);bar(100,maxy/Z-155,maxx-100,maxy/Z+100);rectangle(100,maxy/Z-156,maxx-100,maxy/Z+101);moveto(100,maxy/Z+100);do{leerO;i f(! kbhito){lineto(x+100,maxy/Z+100-dato);gotoxy(10,Z4);printf(" ");gotoxy(10,Z4);printf("El dato le1.do es: %d",dato);moveto(x+100,maxy/Z+100-dato);x+=l;if (x>maxx-Z00){setfillpattern(pattern,0);bar(100,maxy/Z-155,maxx-100,maxy/Z+100);rectangle(100,maxy/Z-155,maxx-100,maxy/Z+100);x=0;moveto(100,maxy/Z+100);}}}while(!kbhit());closegraphO;clrscrO;}

Figura 4.6. Programa en lenguaje C que lee el dato serial y 10 grafica enla pantalla (adquisi1.C)

Curao de "Icrocontmladorea PIC - CEJCIt

La ClIOIP'tadora eeetje los datos y los groflco - ADQUISI1.c

ass r-------------'-------,

Figura 4.7. Pantallazo del programaADQUISI1

Page 125: Pic 16f84a

..

EI PIC12C50X

• Arquitectura• Caracterfsticas especiales• Conjunto de instrucciones

Page 126: Pic 16f84a

CapfJulo 5. El PIC12C50X

La vida modema exige que los objetos de uso cotidiano sean de tamafio reducido y demayor funcionalidad; en especial, 10 que a sistemas electr6nicos se refiere. Esta familia demicrocontroladores es ideal para uso en sitios de espacio reducido, inclusive en aplicacio­nes donde nunca antes se habfan considerado. El PIC 12C508 Yel PICI2C509 son micro­controladores de 8 bits basados en la familia PIC16C5X; son ideales para utilizarlos comocodificadoresldecodificadores en sistemas de control remoto, sistemas de seguridad, re­ceptor de frecuencia, timer, funciones de coprocesador, etc. Su precio y su rendimiento 10ubican como uno de los microcontroladores con mejor relaci6n costolbeneficio.

Una de las mayores ventajas de esta familia es la eliminaci6n de componentesextemos ya que posee intemamente su circuito de Reset al encender el sistema (Power­On-Reset), circuito de vigilancia (Watchdog Timer) incorporado, cuatro posibles con­figuraciones de circuito de reloj, incluyendo un modo de oscilador intemo (INTRC).

Principales caracterfsticas del PIC 12C50X:• 8 pines en total, de los cuales 5 se pueden usar como entrada/salida (I/O)• Unicamente 33 instrucciones.• Velocidad de operaci6n de 4 MHz.• El PIC12C508 tiene una memoria de programa de 512 posiciones. El PIC12C509

tiene memoria de programa de 1024 posiciones.• El PIC12C508 tiene una memoria RAM de 25 posiciones. El PIC12C509 tiene

memoria RAM de 41 posiciones.• Pila de 2 niveles.• Oscilador intemo de 4 MHz con calibraci6n programable.• Temporizador/contador de 8 bits.• Pull-up intemo en los pines de entrada/salida y en el pin de reset.• Bajo consumo de potencia.

Arquitectura

Los PIC 12C50X estan basados en la arquitectura Harvard, la cual se basa en tenerbuses independientes para memoria de programa y para memoria de datos, 10 que permi­te ejecutar una instrucci6n al mismo tiempo que se prepara la siguiente. La memoria dedatos tiene una palabra de 8 bits. El bus y la memoria de prograrna tienen un ancho de 12bits, 10 que hace posible tener instrucciones poderosas que se ejecutanen un solo ciclo.

Descripci6n de los plnes

Figura 5.1. Diagrama depines del PIC12C50X

2

3

4

PIC12C508PIC12C509

8

7

6

5

Page 127: Pic 16f84a

Caplt'(lo 5. El PIC12C50X

GPO - GPl: Pin bidireccional de entrada/salida, puede ser programado por softwarepara conectar el pull-up intemo.

GP2ffOCKI: Pin bidireccional de entrada/salida; puede ser programado por soft­ware para utilizarlo como TOCKI en el conteo de eventos extemos.

GP3IMCLR Npp : Pin de entrada solamente. Puede ser configurado por softwarecomo MCLR y es activado por un nivel bajo. Cuando se configura en este modo,siempre se activa su pull-up intemo. En el momento de programar el micro, este pinse conecta al voltaje de programaci6n (Vpp).

GP4/0SC2: Pin bidireccional de entrada/salida. En caso de tener oscilador con cristalo resonador solo se puede utilizar para tal fin. Si se utiliza el oscilador intemo, sepuede usar como puerto (I/O).

GP5/0SCl/CLKIN: Pin bidireccional de entrada/salida. Cuando se utiliza un os­cilador a cristal 0 resonador solo se puede utilizar para tal fin. Si se utiliza el oscila­dor intemo, se puede usar como puerto (I/O).

Organizaci6n de la memoria de programa

o.;::tU::J(f)::JQ)"0tU.;::oEQ)

:E

Memoria de programa

512 palabras (PIC12C508) 01FFh- - - - - - - - - - - - - - - 0200h

Memoria de programa

1024 palabras (PIC12C509)03FFh0400h

Nota 1: EI vector de reset esta en la direcci6nOOOOH. La posici6n 01FFh (PIC12C508) 6 03FFh(PIC12C509) contiene la instrucci6n MbvLW XXpara la calibraci6n del reloj interno.

Figura 5.2. Mapa de la memoria de programa

Page 128: Pic 16f84a

.. Capitulo 5. El PIC12C50X

El PIC 12C50X tiene un contador de programa de 12 bits capaz de direccionar 4k dememoria. Unicamente los primeros 512 (OOOOh - Olffh) para el PIC12C508 y lk(OOOOh - 03ftb) para el PIC12C509 son implementados ffsicamente, figura 5.2. Enel caso del PIC 12C509 se tiene un'esquema de paginacion de memoria; para acce­sarlo se debe usar un bit del registro de estado.

El vector de reset esta en la direccion OOOOh. La posicion Olffh en el PIC12C508y la 03ftb en el PIC12C509 contiene el valor de calibracion para el oscilador inter­no; este valor nunca podra ser sobreescrito.

Organizaci6n de la memoria de datosLa memoria de datos esta compuesta de registros 0 bytes de RAM. Estos se dividen endos grupos: registros de funcion especial y registros de proposito general, figura 5.3.

INDF(l)

Il!llli' ••ITI[~A6A ,.;;;

pelHim,'! I~iiii.ij~

FSRIgual al

•••:Ai ..;,: banco 0

GPIO

Registro deprop6sitogeneral

10hRegistrosde Registros

prop6sito de prop6sitogeneral general

1Fh

+- FSR<6:S> .....Direcci6n

delregistro

+OOh

01h

02h

03h

04h

OSh

06h

07h

00

Banco 0

01

Banco 1

20h

2Fh

30h

3Fh

Nota 1: No es un registroimplementado fisicamente

Figura 5.3. Mapa de la memoria de datos

Los registros de funcion especial estan compuestos por el registro contador yreloj de tiempo real TMRO,el contador de programa (PC), el registro de estado, elpuerto GP y el selector de registros FSR. Los registros de proposito general se utili­zan para datos e informacion de control.

En el PIC12C508 la memoria de datos esta compuesta por 7 registros defuncion especial y 25 registros de proposito general. Para el PIC12C509 se tienela misma configuracion anterior mas un grupo de 16 registros de proposito ge­neral que se encuentran en el segundo banco de memoria y se pueden direccio­nar usando el FSR.

Page 129: Pic 16f84a

Capitu'o 5. El PIC12C50X

Registros de funci6n especialINDF: Registro de direccionamiento indirecto. Este no es un registro que este imple­mentado ffsicamente; utilizael contenido delFSRparadireccionar la memoriade datos.Loquesehagacon el datodel registro escogido depende'de la instrucci6n que se utilice.

TMRO: Contadory reloj de tiempo real de 8 bits. Este registro se puede configurarpor softwarepara que trabajecomo temporizador, cuya base de tiempoes el osciladordelmicro.El contenidoinicialdel conteose puedeestablecerya que es un registroquese puede leer y escribir. Tambien se puede configurarcomo un contador de eventosextemos que ocurren en el pin TOCK!.El incremento del conteo se puede afectarconuna preescalapara lograr un perfodo de tiempomas largo;dicha preescalase ajustaenel registroOPTION.Vale la pena aclararque la preescalase puedeutilizar tanto por elTMRO como por el Watchdog Timer, pero solo uno de los dos a la vez.

pc: Contador de programa. Es utilizado para sefialarcual es la instrucci6n que seva a ejecutar.El PC se incrementa en un paso, a menos que la instrucci6n 10 modifi­que. Cuando se ejecuta un llamado de subrutina (CALL), el bit 8 del PC se borra(puesto a cero), 10 que hace que todas las subrutinas deban ser escritas en las prime­ras 256 posiciones de cada pagina, Cuando se ejecuta una instrucci6n de saIto(GOTO),el bit 9 del PC se carga con el contenido del bit PAD del registro de estado.Esto hace que si el destino esta en otra pagina de memoria, se deba ajustar primeroel bit PAD del registro de estado con el valor correspondiente.

GPWUF: Bit de reset1 =Reset al despertar de SLEEP por cambio en un pino=Despues de encender el sistema 0 por otro reset

No implementado

PAO: Bit de selecci6n de pagina1 = Pagina 1 (200h - 3FFh) • PIC12C509o= Pagina 0 (OOOh - 1FFh) - PIC12C508Cada paqlna tiene 512 bytes.

TO: Bit de Time-out1 =Luego de encender el sistemao=Ocurri6 un Tlrne- out por WDT

PO: Power Down 0 Bit de bajo consumo.Se coloca en 0 por la instrucci6n SLEEP.

z: Cero bit1 =EI resultado de una operaci6n arltmetlca es ceroo= EI resultado de una operaci6n aritmetica no es cero

OC: Digit Carry 0 Bit de acarreo de dfgito.En operaciones aritmeticas se activa cuando hay acarreoentre el bit 3 Y el 4.

C: Carry 0 Bit de acarrreo.En instrucciones arltmeticas se activa cuando se presentsacarreo desde el bit mas significativo del resultado.

Figura 5.4. Registro de estados

Page 130: Pic 16f84a

Capitulo 5. El PIC12C50X

STATUS: Registro de estado. Contiene el estado aritmetico de laALU, la causa delultimo Reset y el bit de selecci6n de pagina de memoria, figura 5.4.

FSR: Registro selector de registros. Se utiliza con el registro INDF para apuntar alos otros registros disponibles en el II!0do de direccionamiento indirecto.

OSCCAL: Registro de calibraciondel osciladorinterno. El PIC12C50X posee unoscilador RC interno de 4 MHz. Una instrucci6n de calibraci6n de dicho osciladorse debe programar en el tope de la memoria. Este valor, OSCCAL, es programadocon una instrucci6n "MOVLW XX", donde XX es el valor de la calibraci6n, estainstrucci6n debe ser colocada en ultima disposici6n de memoria.

GPIO: Puerto de entrada/salida. Como cualquier otro registro, el GPIO puede serlefdo y escrito bajo control del programa. Este es un registro de 8 bits, de los cualessolamente los 6 mas bajos estan implementados.

TRIS: Registro de configuracion delpuerto.Este registroes cargadocon el contenidode el registroW al ejecutarla instrucci6n "TRIS f". Un "1" en un bit del registroTRISconfigurael bit correspondiente de GPIO como entrada,un "0" 10 configuracomo sali­da; a excepci6ndelpin GP3que solose puedeconfigurarcomo entrada. Este registroessolo de escrituray luegode una condici6nde Reset, se coloca todo en unos.

OPTION: Registro deconfiguracion mUltiple. Es unregistro de 8bits de s610 escritura,figura 5.5, el cualcontiene varios bitsde control paraconfigurar el TMRO y la preescaladelTimer/WDT. La ejecuci6n de una instrucci6n "OPTION" mueveel contenidodeW alregistro OPTION. Cuando sucedeun Reset todoslos bitsdel registro son puestosa uno.

1G15Wd'\ GPf5U .\rocs'ltosel':"p·SAT" PS2' I PSi" rps6 Ibit7 6 5 4 3 2 1 bitO

000 1:2 1:1001 1:4 1:2010 1:8 1:4011 1:16 1:8100 1:32 1:16101 1:64 1:32110 1:128 1:64111 1:256 1:128

I Valor TMRO WDT I

PSA: Prescaler Assignment 0 Asignaci6ndel preescalador0: TRMO (ContadorlTemporizador)1: WDT (Circuito de vigilancia)

PS2,1,0: Prescaler Value 0 Valoresdel preescalador.

GPWU: Habilita despertar en un cambio de estado del pin (GPO, GP1, GP3)1 = Deshabilitado0= Habilitado

GPPU: Habilita pull-ups en los pines (GPO, GP1, GP3)1 = Deshabilitadoo= Habilitado

TOeS: Fuente de la serial de TMRO1 = Cambio en el pin TOCKIo= Transici6n en el reloj interno

TOSE: Flanco de la sefial de TMRO1 = Flanco de bajadao= Flanco de subida

Figura 5.5. Registro OPTION

Page 131: Pic 16f84a

Capltu"!! 5. El PIC12C50X

Caracteristicas especiales

Palabra de configuraci6n para el PIC12C50X.Este registro no es direccionable durante la operaci6n normal del microcontrolador,s610 se puede utilizar en el momento de programarlo, figura 5.6.

No disponible

MCLR: bit que habilita el pin MCLR1 =~ deshabilitadoo=~ habilitado

CP: bit de protecci6n de c6digo1 =Protecci6n off.o= Protecci6n on.

WOTE: Habilitaci6n de WDT1 = WDT habilitadoo= WDT deshabilitado

FOSC1:FOSCO: Selecci6n del oscilador11 = EXTRC - oscilador RC extremo10 = INTRC - oscilador RC interno01 =Oscilador XT00 = Oscilador LP

Register: CONFIG

Address(1): FFFh

NOTA 1: Referirse alas especificacionesde programaci6n.

Figura 5.6. Palabra de configuraci6n del PIC12C50X

Stack 0 PilaEl PIC12C50X tiene una pila de dos niveles y 12bits de ancho. Una instrucci6n "CALL"guarda el valor de stack 1 en el stack 2 y el valor actual del contador de prograrnaincrementado en uno en el stack 1.Si se ejecutan mas de dos "CALL", solamente los dosultimos son almacenados. Una instrucci6n "RETLW"retorna el valor de stack 1 al con­tador de programa y el valor de stack2 al stack 1. Una caracterfstica importante es que elregistro W se carga con elliteral especificado en la instrucci6n; esto es de gran utilidadcuando se trabaja con tablas usando la memoria de programa.

Watchdog TimerEste es un oscilador interne del micro que corre independientemente del reloj de 4MHz. El WDT tiene un perfodo nominal de 18 milisegundos, luego de los cuales elmicro sufre un Reset. Para evitar esto, se debe utilizar la instrucci6n CLRWDTantes de que se complete el tiempo de este oscilador interno.

El tiempo del WDT de 18 milisegundos se puede extender hasta 2 segundoshaciendo uso de la preescala, como se vi6 cuando hablamos del registro OPTION.Esto es, el periodo del oscilador interne del WDT es dividido por el valor que se lede a la preescala. Debe tenerse en cuenta que la preescala se puede utilizar con elWDT 0 con el temporizador TMRO, pero solo con uno a la vez.

Page 132: Pic 16f84a

Capitulo 5. El PIC12C50X

El WDT se puede habilitar 0 deshabilitar en el momenta de programar el micro­controlador utilizando el fusible correspondiente de la palabra de configuracion.

ResetEl PIC12C50X tiene varias fuentes de reset, vamos a describirlas en forma breve y clara:

• El Power-On-Reset (POR) es un dispositivo interno del micro que garantiza un tiempode reset de 18 milisegundos en el momento de energizar el sistema. Esto es muy titilporque evita posibles conflictos que se podrfan presentar antes de que se estabilicenlas sefiales.Ademas, evita tener que utilizar componentes externos en el pin de reset.

..• Un nivel bajo en el pin de Master Clear (MCLR) durante operacion normal, este

pin posee un pull-up interno que evita el uso de elementos externos.

• Un reset causado por el Watchdog Timer, el cual se presenta si no se ha borrado elcontador interno antes de completar su perfodo de tiempo.

• Cuando el micro esta en modo de bajo consumo por la instruccion SLEEP, elcambio de nivel en un pin programado previamente hace que el micro "despierte"y sufra un reset.

Configuraciones del osciladorEl PIC 12C50X puede ser operado en cuatro modos diferentes de oscilador. El usua­rio puede escoger en el momento de programar el micro que tipo de oscilador va autilizar. Esto se hace en la palabra de configuracion utilizando los bits FOSC 1 YFOSCO. Los modos de oscilador son:

LP: Cristal de baja potenciaXT: Cristal 0 resonador ceramico, maximo de 4 MHz.EXTRC: Oscilador externo RC.INTRC: Oscilador interno de 4 MHz. Este no requiere ningiin componente externoy nos perrnite utilizar los dos pines que quedan disponibles como entrada/salida.Esta es una de las ventajas mas importantes de esta familia.

Para utilizar el reloj interno se deben tener en cuenta varios aspectos:1. El oscilador requiere un valor de calibracion, dicho mimero se escribe en la

ultima posicion de la memoria de programa, en la forma de una instruccion: MO­VLW XX, donde XX corresponde a dicho valor. Si se trata de un microcontroladoren version OTP (One Time Programable: programable una sola vez), dicha instruc­cion con el valor de calibracion preestablecido en la fabric a ya esta escrito, por 10tanto se puede obviar su escritura.

Si se trata de un microcontrolador en version JW (ventana), dicho valor vienegrabado de la misma forma en la ultima posicion; por 10 tanto el usuario debe leer elmicrocontrolador y tomar nota de dicho valor. Esto es necesario ya que en el mo­mento de borrar el microcontrolador con luz ultravioleta para volver a cargar otroprograma se borra tambien el valor de calibracion. Por consiguiente, el usuario debe

Page 133: Pic 16f84a

Cap(Mo 5. El PIC12C50X

incluir en su programa la instrucci6n que cargue el valor de calibraci6n en la ultimaposici6n de memoria.

Con un ejemplo se puede ilustrar mejor este caso: AI comprar un PIC12C508 deventana, 10 primero que se hace es leerlo para ver que dato tiene escrito en la posi­ci6n de memoria lFFh, el valor es por ejemplo OC50. Este c6digo equivale a lainstrucci6n: MOVLW 50h. Por 10 tanto el valor de calibraci6n de ese microcontrola­dor en particular es 50h. Se debe aclarar que no todos los PIC12C508 tienen elmismo valor de calibraci6n.

Despues de ese ejercicio se debe tener en cuenta que todos los programas escri­tos para ese microcontrolador deben llevar las siguientes lfneas:

ORGMOVLW

lFFh50h

;escribe la siguiente instrucci6n en la direcci6n lFFh;carga el valor de calibraci6n en el registro W

2. Para cargar el valor de calibraci6n en el registro OSCCAL se debe escribir lasiguiente lfnea al comienzo de todos los programas que se escriban para elPIC12C508:

ORGMOVWF

OOh ;escribe la siguiente instrucci6n en la direcci6nn OOhOSCCAL .carga el valor de W en el registro OSCCAL

Todos estos pasos se deben a la ruta que sigue el contador de programa 0 PC enel momenta en que el microcontrolador sufre un reset, el cual, primero apunta a laultima posici6n de memoria (en este caso lFFh) y luego ala primera (OOh).

Conjunto de instrucciones

El conjunto de instrucciones es el mismo que se tiene para la familia PIC 16C5X,figura 5.7. Debe notarse que solamente se tienen 33 instrucciones, a diferencia delPIC16F84 y del PIC16C71 que tienen 35.

Conclusion.El PIC12C50X es una de las mejores opciones cuando se pretende disefiar un pe­quefio sistema microcontrolado ya que no requiere componentes extemos y tiene unprecio muy competitivo. Ademas, el software es compatible con las otras familiasde microcontroladores de Microchip, 10 que hace que el sistema se pueda extendersin problemas.

Page 134: Pic 16f84a

.. Capitulo 5. El PIC12C50X

d =0 si el destino es W

Nombre

d =1 si el dastino as al ragistro

Nem6nico Operandos OperaciOn Estados afecIados

OPERACIONES ORIENTADAS A REGISTROS

SumaWyf ADDWF f, d W+f-+d C,DC,ZANDentreW y f ANDWF f, d W& f-+d ZUmpiaf CLRF f o-+f ZUmpiaW CLAW O-+W ZComplementa f COMF f, d f -e d ZDecrementa f DECF f, d f· 1-+ d ZDecf, salta sl cero DECFSZ f, d f - 1-+ d, salta si cero NingunoIncrementaf INCF f, d f + 1-+ d ZIncrem. f, salta si cero INCFSZ f, d f + 1-+ d, salta si cero NingunoOr inclusiva entreW y f 10RWF f, d Wvf-+d ZMuevef MOVF f, d f-+d ZMueveWaf MOVWF f W-+f NingunoNooperaci6n NOP NingunoRotaa Ia izquierda f RLF f,d f(n)-+ d(n+1),C -+ d(O), f(7) -+ C CRotaa la derechaf RRF f, d f(n)-+ d(n-1), C -+ d(7),1(0) -+ C CRestaWdef SUBWF f, d f - W -+ d [f+W+1-+d] C,DC,ZIntercambia mitades de f SWAPF f, d f(0-3) H f(4-7)-+ d NingunoOR exdusivaentreW y f XOAWF f, d we f-+d Z

OPERACIONES ORIENTADAS A BITS

Umpiabitf BCF f, b 0-+ f(b) NingunoActivabitf BSF f, b 1 -+ f(b) NingunoPruebabit f, salta si cero BTFSC f, b pruebablt(b) en registro(f): salta si cero NingunoPruebabit f, salta si uno BTFSS f, b pruebablt(b)en registro(f): salta si uno Ninguno

OPERACIONES UTERALESY DECONTROL

AND entreW y un literal ANDLW k k&W-+W ZUamasubrutina CALL k PC +1 -+ Stack, k -+ PC NingunoUmpiaWatchdog CLRWDT - o-+ WDT(y prescalador) TO,PDSaltaa direcci6n GOTO k k -+ PC (9 bits) NingunoOR Inc!.entreW y literal IORLW k kvW-+W ZMueve literal a W MOVLW k k-+W NingunoCargaregistro OPTION OPTION W -+ Registro OPTION NingunoRetoma, carga literalen W RETLW k k -+ W,pila-+ PC NingunoVaa modo de Espera SLEEP o-+ WDT, detiene oscilador TO,PDConfigura puerto TRIS f W -+ oontroIll 0 del registro f NingunoOR exd. entreliteral y W XORLW k keW-+W Z

Figura 5.7. Instrucciones del PIC12C50X

Page 135: Pic 16f84a

• Arquitectura• Caracteristicas especiales• Conjunto de instrucciones

Page 136: Pic 16f84a

.. Capitulo 6. Proyectos con el PIC12C508

Proyecto N° 1: Como utilizar el PIC12C50B

Paracomprendermejorel uso de las caracteristicas especiales de estos microcontro­ladoresvamosa realizarun ejercicio simpleque consisteen encenderun LED cada vezqueseoprimeun pulsador. Enesteejemplosepuedever la formade emplearel osciladorintemo, de configurar los puertos y de configurar el pin de reset 0 MCLR (intemo 0extemo).El circuitoque se utilizase muestraen la figura 6.1, constade un pulsador, un >

LED Yel microcontrolador. Cuandoel pulsadoresta libre el micro lee un nivel16gicoaltopor el pin GPO y cuandoesta oprimidoun nivel logicobajo; con este Ultimo estadoel microcontrolador hace que se enciendael LED que se maneja a travesdel pinGPI.

+5V

Figura 6.1.Diagrama del circuito de la primera practica con PIC12C508

El programa del microcontrolador debe teneren cuentala programaci6n del valordecalibraci6n delreloj yel manejo delospuertos. Deberecordarse queelvalordecalibraci6ndel reloj puede ser diferente para cada microcontrolador y que debe ser lefdo antes degrabarlo 0 borrarlo por primera vez.Paraestaprimerapractica vamosa utilizar el pindereset0 MCLRconectado a la fuente de alimentaci6n extema,por 10 tantoen el momentadegrabarelmicrocontrolador sedebeescoger laopcion quepermite habilitardicho pin. Lomismosedebehacercuando seseleccionael tipodeoscilador, en estecasodebeescogersela opci6n INTR(oscilador RC intemo). En la figura 6.2 se tieneellistado delprograma.

;Este programa enciende un LED cada vez que se oprime;un pulsadorosccal equ 05hgpio equ 06h

org lffh ;carga valor de calibracibn delmovlw 50h ;oscilador interno

org 00h ;pasa el valor de calibracibnmovwf osccal ;al registro osccalgoto inicio

inicio movlw 0fdh ;programa puertostris gpio ;deja GPl como salida para el LEDbcf gpio,l ;apaga el LED

cicl.o bcf gpio,l ;btfsc gpio,0 ;pregunta estado del pulsadorgoto ci clo ;no esta oprimido vuelve a preguntarbsf gpio,l ;si esta oprimido enciende el LEDnopgoto ciclo ;vuelve a probar estado del pulsadorend

Figura 6.2. Programa que lee el pulsador y enciende un LED con PIC12C508

Page 137: Pic 16f84a

Capitulo 6. Proyectos con el PIC12C508

"Si se desea comprobar el funcionamiento del sistema de reset cuando este se

configura para trabajar conectado intemamente ala fuente de alimentaci6n, se debeescoger la opci6n de deshabilitar el pin MCLR en el momenta de grabar el micro­controlador. Se debe entonces desconectar dicho pin de la fuente de alimentaci6n yverificar el funcionamiento del sistema.

Page 138: Pic 16f84a

Capftulo 6. Proyectos con el PIC12CS08..Si se desea comprobar el funcionamiento del sistema de reset cuando este se

configura para trabajar conectado intemamente ala fuente de alimentaci6n, se debeescoger la opci6n de deshabilitar el pin MCLR en el momento de grabar el micro­controlador. Se debe entonces desconectar dicho pin de la fuente de alimentaci6n yverificar el funcionamiento del sistema.

Page 139: Pic 16f84a

.. Capitulo 6. Proyectos con el PIC12CS08

Proyecto N° 2: Manejo de un potenciometro digital

Un potenci6metro digital tiene algunas ventajas sobre uno electromecanico comoson: mayor precisi6n, mayor velocidad, menor tamafio, no existe desgaste mecani­co, etc. Sus aplicaciones pueden ser: control de volumen digital, convertidor digitala analogo, control digital de una fuente variable y en general, cualquier aplicaci6nque involucre la variaci6n de una resistencia como medio para hacer control.

Esta practica consiste en manejar un potenci6metro digital marca Xicor, utili­zando como elemento principal un microcontrolador PIC12C508. Ademas, se tie­nen dos botones puisadores para que el usuario indique si el valor de la resistenciadebe aumentar 0 debe disminuir.

El circuito integrado del potenci6metro digital que se escogi6 es de marca Xicor.Su principal ventaja es poseer internamente una memoria EEPROM donde conser­va el valor de resistencia que debe mantener entre sus terminales. Esto es de granutilidad cuando se utiliza en sistemas que no poseen baterfas de respaldo al momen­to de cortar la alimentaci6n.

Potenci6metro digital X9CS03 de XicorEs un potenci6metro de estado s6lido no volatil que contiene un arreglo de 99 resis­tencias y cuyas uniones son accesibles por el cursor 0 pin central del potenci6metro.La posici6n del cursor es controlada por los pines CS, INC y UID; su posici6n entrelas 99 resistencias puede ser almacenada en memoria EEPROM para no perder suvalor cuando se retire la alimentaci6n.

La alimentaci6n del integrado (VCC) es de +5Vy los extremos del potenci6metro(VH y VL) se pueden conectar entre ±5Y. El hecho de tener 99 resistencias hace que elpotenci6metro tenga 100 pasos, es decir que si se polariza entre 0 y +5~ se obtienenvariacionesde 50mV en el cursor.Como se indicaen la referencia del integrado (X9C104),su resistencia total es de lookohm, tambien se consiguen en valores de 10kohm(X9C103)Y50kohm (X9C503). La figura 6.3 muestra el diagrama de pines del potenci6metro.

Figura 6.3. Diagrama de pines del potenci6metro digital

Operaclon del potenclometro. Como se muestra en la figura 6.4, el X9C 104tiene 3 bloques funcionales: el primero 10 componen el bloque de control, el con­tador y el decodificador; el segundo 10 conforma la memoria no volatil y el terceroel arreglo de resistencias de salida.

Page 140: Pic 16f84a

Capfh(Jo 6. Proyectos con el PIC12C508

VH

vwse desplaza

entre lasresistencias

99

21O--t'"

98

.g 9610--.....~8 ~

'6~0 ....o~

MemoriaEEPROM

Contadorascendenteldescendente

de 7 bit's

UfO

INC

CS

CircuitoVee de control

GND _---.oL-- ....

VLVw

Figura 6.4. Diagramafuncional del potenci6metro digital

El bloque de control opera como un contador ascendente/descendente (UpIDown).La salida del contador es decodificada para seleccionar una sola salida que se conec­te al cursor del potenci6metro. En condiciones normales, el contenido del contadorpuede ser almacenado en la memoria EEPROM.

Las entradas INC, UID Y CS controlan el movimiento del cursor a 10 largo delarreglo de resistencias. El X9C104 es habilitado cuando el pin CS tiene un nivel bajo,un flanco de bajada en el pin INC hara que se incremente 0 decremente el contador de7 bits (dependiendo de la polaridad del pin UID). La salida de ese contador es decodi­ficada para seleccionar 1 de 100 posiciones en el arreglo de resistencias.

CS

UfD

Vw

~ r;J

tCL tCYC tiCIL--+~t1H-+ tCPH

/L\ V v V

1\tiD tOl

\/LV

IJI~-------- MI

J /LV

Figura 6.5. Diagrama de tiempo de las seiialesde control del potenci6metro

Page 141: Pic 16f84a

Capftulo 6. Proyectos con el PIC12C508

El valor del contador es almacenado en la memoria EEPROM cuando el pin CSretoma a un nivel alto, siempre y cuando el pin INC este en ese nivel previamente.Cuando se retira la fuente de alimentaci6n y se vuelve a conectar, el contador secarga con el valor almacenado en la memoria. El manejo de las sefiales INC, DID YCS requiere una temporizaci6n adecuada. En la figura 6.S se muestra el diagrama detiempos y los valores minimos para un correcto funcionamiento.

Interface con el microcontroladorComo se explic6 anteriormente, el manejo adecuado de las sefiales del potenci6me­tro digital impone unas reglas especfficas. Para obviar este problema, facilitar elmanejo de las mismas y hacer mas simple el manejo para el usuario, se utiliz6 unmicrocontrolador de 8 pines PIC 12CS08.

En la figura 6.6 se muestra la uni6n entre el PIC y el X9CI04. Se puede ver quelos pines de control del potenci6metro estan unidos directamente al microcontrola­dor, en el pin de CS se ha conectado una resistencia de 2.7kohm a fuente. Esto paragarantizar que la memoria EEPROM no altere su contenido con el ruido que segenera en el momento del encendido. Los puisadores SI (subir) y S2 (bajar) seconectan directamente a los pines del PIC, se utiliza una resistencia conectada a lafuente de alimentaci6n para garantizar un nivel alto cuando no se oprimen las teclas.El pin de MCLR del microcontrolador se ha conectado a la fuente de alimentaci6npara garantizar un reset adecuado.

+5V

R1 R2 R510K 10K 2.7K

S1...L 3 5 7

p~2 6 2

7 1 Cursor delpotenci6metro

- - - -Figura 6.6. Diagrama esquernatlco del circuito completo

En este circuito se utiliza la principal caracteristicadel PIC12CS08,que consiste eneliminar la necesidad de componentesextemos. Como se puede ver, no se ha conectadoningiin tipo de osciladorya que se utiliza la opci6n de oscilador intemo de 4 MHz.

Los pines 3, S y 6 del X9C104 corresponden al potenci6metro digital propia­mente dicho. Con este circuito se puede tener una resistencia variable identica a unpotenci6metro electromecanico, la iinica restricci6n es que los extremos del mismono se pueden conectar a una fuente de alimentaci6n que sobrepase los ±Sy.

Software del microcontrolador. El programa que se graba en el microcontroladorsolamente debe encargarse de leer los pulsadores Sly S2, de acuerdo a ellos debegenerar las sefiales para que el potenci6metro aumente 0 disminuya su resistencia;

Page 142: Pic 16f84a

Capitulo 6. Proyectos con el PIC12CS08..dichas sefiales corresponden a las mostradas en el diagrama de tiempo de la figura 3.Cuando se detecta que han oprimido uno de los botones, se debe colocar la sefialdelpin DID en el estado 16gico correspondiente (alto para aumentar resistencia y bajopara disminuirla). Luego se llama la rutina que genera el nivel16gico bajo en el pinde CS y que genera el flanco de bajada en el pin INC. Esta rutina es igual en amboscasos ya que la direcci6n en que se mueve el cursor del potenci6metro se ha definidopreviamente con el pin DID.

En la figura 6.7 se muestra el programa correspondiente ala rutin a de variaci6nde resistencia. Cuando se esta usando el reloj intemo del microcontrolador (4 MHz),basta con escribir una instrucci6n NOP luego de asignar el estado 16gico correspon­diente al pin INC. Esto con el fin de cumplir los requisitos de tiempos exigidos porel potenci6metro digital (perfodo de 4 us),

;Este programa controla un potenciometro digital

osccal equ Shgpio equ 6hloops equ 0chloops2 equ 0dhinc equ 0hud equ lhcs equ 2hmas equ 4hmenos equ Sh

org lffhmovlw S0h

org 000movwf osccalgoto inicio

org 00Sh

;puertos

;salida para pulsos de variar resistencia;salida escoge si aumenta 0 baja resistencia;salida para seleccionar el integrado;entrada boton de aumentar resistencia;entrada boton de bajar resistencia

;va a iniciar programa principal

retardo ;subrutina de retardo de 200 milisegundosmovlw d'200' ;el registro loops contiene el n£meromovwf loops ;de milisegundos del retardo

top2 movlw d'110'movwf loops2

top nopnopnopnopnopnopdecfsz loops2 ;pregunta si termino 1 msgoto topdecfsz loops ;pregunta si termina el retardogoto top2retlw 0

*********** programa principal ************

tni cto movlwtrismovlwoptionbtfssgotobtfss

0f8h ;gpio se programa segun el circuitogpio0c0h

gpio,mas ;*** ciclo de lectura de teclas ***subirgpio,menos

Page 143: Pic 16f84a

CapfJulo 6. Proyectos con el PIC12C508

movlw 0ffhmovwf gpiogoto tni cto

subir bcf gpio,csnopbsf gpio,udnopnopnopnopbsf gpio, incnopnopnopbcf gpio, incnopnopbsf gpio, incnopnopbsf gpio,csnopcall retardogoto tni cto

bajar bcf gpio,csnopbcf gpio,udnopnopnopnopbsf gpio, incnopnopnopbcf gpio,incnopnopbsf gpio,incnopnopbsf gpio,csnopcall retardogoto trri cio

end

Figura 6.7. Programa que controla la variaci6n de la resistencia

Debe notarse que el pin de CS vuelveal estado16gico alto luego del pin INC. Estogarantiza que la posici6n del cursordel potenci6metro se almacene en la memoriaEE­PROM, paraque puedarecuperarse luegode un cortede energfa. Debe tenerse especialcuidado con los tiempos en la lecturade las teclas, por un ladopara eliminarlos proble­masderuidoy porotroparagenerarlosretardos adecuados luegode variarla resistencia.Estose hacecon el fm de permitir al usuario que avance de a un paso a la vez cuando 10desee. Si esto no se tiene en cuenta, bastaracon un leve toque a las teclas para que elpotenci6metro pasede la minimaa la maximaresistencia y viceversa.

Page 144: Pic 16f84a

Capitulo 6. Proyectos con el PlC12CS08..Un detalle especial que se notaen esteprograma es que se configura el registro op­

TION a pesarde queno se esta utilizando ninguno de loselementos que alli se controlan(temporizador/contador 0 watchdog). Esto se debe a que el pin GP2 tambien se puedeutilizar comoentrada deltemporizador/contador, por10 tanto siesteseva a emplear comoun pinde entrada/salida normal, en el registro OPTION se debeindicar que la fuente depulsos parael temporizador/contador es el reloj intemo y noel pinGP2ITOCKI.

El circuito que trabajamos en esta practica se puede utilizar para realizar conver­siones digitales a analogas, la unica restricci6n es que se tienen s610 100 valoresdiferentes, pero en muchos casos estos pueden ser suficientes.

Page 145: Pic 16f84a

.. Capitulo 6. Proyectos con el PIC12CS08

Proyecto N° 3: Temporizador con re/evo

Esta practica es muy simple pero de muehas aplieaciones, eonsiste en aetivaruna earga de 110 VAC durante un tiempo determinado, la sefial de aetivaci6n lagenera un interruptor. El tiempo de activacion 10 determina el programador en elmomento de grabar el mieroeontrolador, para el ejemplo utilizamos un tiempo de 10segundos. La earga que se eoneeta es un bombillo de 100 W, la eual se manejamediante un relevo que es eomandado desde un pin del micro. En la figura 6.8 semuestra el diagrama del circuito.

Bombillo100W+5V +5V +12V

r •••• --.-- • • • • • • • • •

NO NC

•COM

Rele

UneaAC1106220

VAC

\

Figura 6.8. Diagrama del temporizador con relevo

EI programa del microcontrolador se muestra en la figura 6-9, uno de los blo­ques mas importantes 10 forma el retardo programable que empieza con la etiquetaRETARDO. En este caso el registro W se carga con el mimero de milisegundosdeseado y luego se hace eillamado a la subrutina. Para saber si se debe aetivar lacarga el microcontrolador consulta el estado de pin donde se ha conectado el pulsa­dor, cuando se detecta una sefial valida se hace un retardo de 100 milisegundos paraeonfirmar que no sea un pulso de ruido. Cuando se eonfirma que se debe activar lasalida, se pone en «1» el pin que maneja el relevo.

;Este programa maneja un temporizador de x segundos,;inicia su conteo cuando se presiona un pulsadorosccal equ 5h ;puertosgpio equ 6hloops equ 0chloops2 equ 0dhveces equ 0ehrele equ lhpulsa equ 0h

org lffhmovlw 50h

org 000movwf osccal

goto tni ctoorg 005h

;calibraci4n del reIoj

;va a iniciar programa principal

retardo ;subrutina de retardo de x milisegundosmovwf loops ;# de milisegundos del retardo

Page 146: Pic 16f84a

Capftulo 6. Proyectos con el PIC12C508,top2

top

movlwmovwfnopnopnopnopnopnopdecfszgotodecfszgotoretlw

d'110'loops2

100ps2toploopstop2o

;pregunta si termino 1 ms

;pregunta si termina el retardo

***** programa principal ****

inicio

tempo

movlw 0fdh ;gpio se programa segun el circuitotris gpionopbcf gpio,rele ;apaga la salida del relebtfsc gpio,pulsa ;consulta estado del pulsadorgoto inicio ;si esta suelto vuelve a probarmovlw d'100' ;si esta oprimido retarda 100 mscall retardo ;y vuelvee a consul tarbtfsc gpio,pulsa ;si no confirma regresa a probargoto inicio ;si 10 confirma va a encender la

;salida del relevo durantemovlw d'40' ;veces * 1/4 de segundo = 10 segundosmovwf veces

bsf gpio,rele ;activa el relemovlw d'250' ;hace retardo de 0,25 scall retardomovlw 0fdh ;reprograma puertostris gpiodecfsz veces,l ;prueba si terminaron 10 segundosgoto tempogoto inicio ;si terminaro vuelve a empezarend

Figura 6.9. Programa del temporizador con relevo

Para hacer que la salida se encienda durante 10 segundos se realiza un ciclodonde se llama un retardo de 250 milisegundos durante el mimero de veces que seanecesario. Para el ejemplo se repite el ciclo 40 veces, es decir, si se llama 40 vecesun retardo de 0.25 segundos se obtiene un tiempo total de 10 segundos. Si el usuariodesea cambiar el tiempo de activaci6n, s6lo se debe cambiar el mimero que se cargaen el registro llamado VECES. Luego de terminado ese perfodo se regresa al ciclodonde se pregunta el estado del interruptor.

Este ejercicio puede aplicarse en diferentes formas, por ejemplo: Si se desea en­cender la luz de un pasillo cuando pasa alguna persona, solo se debe reeemplazar elinterruptor de activaci6n por un sensor infrarrojo 0 por un sensor de presi6n en el piso.

Page 147: Pic 16f84a

..

Instrucciones delos PIC18F84v 18C71

Page 148: Pic 16f84a

Apendice A. Instrucciones de los PIC16F84 y 16C71

Estos microcontroladores responden a una serie de instrucciones 0 codigos quese deben grabar en su memoria de programa, en total son 35. A continuacion seencuentra una tabla con la lista completa y despues una descripcion de cada una deellas con el fin de facilitar su aprendizaje.

Sid = 0 el rasultado saalmacana anWSid = 1 al resultado saalmacana enel registro

ADDWF t,d SumarWyt 00 0111 dftt tfft C,DC,ZANDWF t,d AND entre Wy t 00 0101 dfft tfff ZCLRF t Limpiar t 00 0001 1ftt tfft ZCLRW Limpiarw 00 0001 OXXX XXXX ZCOMF t,d Complementar t 00 1001 dftt tfff ZDECF f,d Decrementar f 00 0011 dfff ffff ZDECFSZ t,d Decrementar t,

saltar si cero 00 1011 dfff ffffINCF f,d Incrementar t 00 1010 dfff tfff ZINCFSZ t,d Incrementar f,

saltar si cero 00 1111 dfff ffffIORWF t,d ORentre Wy f 00 0100 dfff ffff ZMOVF t,d Moverf 00 1000 dfff ffff ZMOVWF t MoverWa t 00 00001fff ffffNOP Nooperaclon 00 OOOOOXXO 0000RLF f,d Rotar a la izquierda

a traves delcarry 00 1101 dfff ffff CRRF f,d Rotar a la derecha

a traves delcarry 00 1100 dfff ffff CSUBWF f,d RestarW def 000010 dfff ffff C,DC,ZSWAPF f,d Intercambiar nibbles de f 00 1110 dfff ffffXORWF f,d ORexclusiva entre Wy f 00 0110 dfff ffff Z

BCF f,b Limpiar bitb def 01 OObb bfff ffffBSF f,b Activar bitb dat 01 01bbbfff ffffBTFSC t.b Probar bitb dat,

saltar si escero 01 10bb btff ffffBTFSS f,b Probar bitb def,

saltar sl es uno 01 11bb bfff ffff

ADDLW k Sumar literal k a W 11 111X kkkk kkkk C,DC,ZANDLW k AND entre k y W 11 1001 kkkk kkkk _Z_CALL k L1amar subrutina 10 Okkk kkkk kkkkCLRWDT LimpiarWDT 00 00000110 0100 TO,PDGOTO k Salta a direccion k 10 1kkk kkkk kkkkIORLW k ORentre kyW 11 1000 kkkk kkkk ZMOVLW k Cargar a W conliteral k 11 ooXXkkkk kkkkRETFIE Retornar de lnterrupclon 00 00000000 1001RETLW k Retornar y cargar a Wconk 11 01XXkkkk kkkkRETURN Retornar de subrutina 00 00000000 1000SLEEP Iral modo de bajo consumo 00 0000 0110 0011 TO,PDSUBLW k Rastarla k a W 11 110X kkkk kkkk C,DC,ZXORLW k ORexclusiva antre k y W 11 1010 kkkk kkkk Z

Page 149: Pic 16f84a

Apendice A. Instrucciones delos PIC16F84y 16C71..IADDLW

Sintaxis:Operaci6n:Ciclos de instrucci6n:Bits del registro de estadosque se afectan:

Suma un valor literal al contenido del registro W.

ADDLW k(W) +kk(W)1

C,DC,Z

Ejemplo: ADDLW 15Antes de la instrucci6nDespues de la instrucci6n

W=lQW=25

IADDWF Suma el contenido de un registro al contenido del registro W.

Sintaxis:Operaci6n:Ciclos de instrucci6n:Bits del registro de estadosque se afectan:

Ejemplo:

ADDWF f,d(W) + (f) k (destino)1

C,DC,Z

ADDWF FSR,OAntes de la instrucci6nDespues de la instrucci6n

W= 17W=D9

FSR=C2FSR=C2

IANDLW

Sintaxis :Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Operaci6n 16gicaAND entre un literal y el registro wj

ANDLW k(W) AND (k) k (W)1

Z

Ejemplo: ANDLW 5FAntes de la instrucci6nDespues de la instrucci6n

W=A3 'W=03

Page 150: Pic 16f84a

IANDWF

Apendice A. Instrucciones de los PICI6F84 y 16C71

Operacion logica AND entre un registro "f' y el registro W. I

Sintaxis:Operacion :Ciclos de instruccion :Bits del registro de estadosque se afectan:

Ejemplo:

ANDWF f,d(W) AND (f) k (destino)1

z

ANDWF FSR,1Antes de la instruccionDespues dela instruccion

W= 17W= 17

FSR=C2FSR=02

IBCF Pone en cero el bit "b" del registro "f".

Sintaxis:Operacion :Ciclos de instruccion :Bits del registro de estadosque se afectan:

Ejemplo:

BCF f,bOk (f<b»1

Ninguno

BCF regis.?Antes de la instruccionDespues de la instruce ion

regis = C7regis = 47

IBSF

Sintaxis:Operacion :Ciclos de instruccion :Bits del registro de estadosque se afectan:

Pone en uno el bit "b" del registro "f".

BSF f,blk (f<b»1

Ninguno

Ejemplo: BSF regis,7Antes de la instruccionDespues de la instruccion

regis = OAregis = 8A

Page 151: Pic 16f84a

Apendice A. Instrucciones de los PICI6F84 y 16C71,IBTFSC Prueba el bit "b" del registro "f' y salta una Hnea si esta en cero.

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

BTFSC f,bsalta si (f<b» = a1 (2)

Ninguno

aquf BTFSCfalso OOTOverdad .

\

regis,a­inicio

Antes de la instrucci6nDespues de la instrucci6n

contador de programa =aquisi el bit a 'del registro regis ,= a

, contadorde programa :::;: verdadsi el bit a del registro regis = 1

contador de programa =falso

IBTFSS Prueba el bit "b" del registro "f' y salta una, lfnea si esta en uno.• ' >

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

BTFSS f.bsalta si (f<b» =11 (2)

Ninguno

aquf BTFSSfalso - OOTOverdad .........

regis.Oinicio

Antes de la instrucci6nDespues de la instrucci6n

contador de programa =aquf ­si el bit a del registro regis = 1, contadorde programa =verdad

si el bit a del registro regis =acontador de programa =falso

Page 152: Pic 16f84a

CALL

Sintaxis:Operacion :Ciclos de instruccion :Bits del registro de estadosque se afectan:

Apendice A. Instrucciones de los PIC16F84 y 16C71

Llama una subrutina que esta ubicada enla posicion de memoria 0 etiqueta "k".

CALL- k(PC) + 1 k pila, k k (PC)2

Ninguno

Ejemplo: aqul CALL rutina

Antes de la instruccionDespues de la instruccion

contador de programa = aqufcontador de programa =rutinapila = direcci6n aqui

ICLRF Borra el contenido del registro "f", 10 carga con 00.

Sintaxis:Operacion :Ciclos de instruccion :Bits del registro de estadosque se afectan:

Ejemplo:

CLRF00 k (D1

z

CLRF

f

regis

Antes de la instrucci6nDespues de la instruccion

regis =5Aregis = 00

CLRW

Sintaxis:Operacion :Ciclos de instruccion :Bits del registro de estadosque se afectan:

Ejemplo:

Borra el contenido del registro W, 10 carga con 00.

CLRW00 k (W)1

Ninguno

CLRW

Antes de la instruccionDespues de la instruccion

W=5AW=OO

Page 153: Pic 16f84a

Apendice A. Instrucciones de los PIC16F84y 16C71

"ICLRWDT

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

Borra el conteo del Watchdog Timer.

CLRWDToo k wrrr1

TO,PD

CLRWDT

Antes de la instrucci6nDespues de la instrucci6n

Contador WDT =?Contador WDT =00TO= 1, PD = 1

ICOMF

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Complementa el contenido del registro "f".

COMF f,d(t) k (destino)1

z

Ejemplo: COMF regis,O

Anfes as HiinstruccionDespues de la instrucci6n

regis == 13, W== 1regis =13, W =EC

IDECF

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Decrementa el contenido del registro "f".

DECF f,d(t) - 1 k (destino)1

z

Ejemplo: DECF regis, 1

Antes de la instrucci6nDespues de la instrucci6n

regis = 13regis = 12

Page 154: Pic 16f84a

aquf

..DECFSZ

Sintaxis:Operaci6n:CicIos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

Apendice A. Instrucciones de los PIC16F84y 16C71

Decrementa el contenido del registro "f";si el contenido queda en 00, salta una lfnea.

DECFSZ f,d(f) - I k (destino), salta si el resultado es cero .I (2)

Ninguno

DECFSZ regis, IGOTO cicIo

continua .....

Antes de la instrucci6nDespues de la instrucci6n

contador de programa = aqufregis =regis - Isi regis =0, entonces

contador de programa = continuasi regis "* 0, entonces

contador de programa = aquf + I

IGOTO EI contador de programa salta a la direcci6n "k".

Sintaxis:Operaci6n:CicIos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

GOTOkkPC2

Ninguno

GOTO

k

cicIo

Antes de la instrucci6nDespues de la instrucci6n

contador de programa = ?contador de programa =cicIo

IINCF

Sintaxis:Operaci6n:CicIos de instrucci6n :Bits del registro de estadosque se afectan:

Incrementa el contenido del registro "f".

INCF f,d(f) + I k (destino)I

Z

Ejemplo: INCF regis, I

Antes de la instrucci6nDespues de la instrucci6n

regis = 24regis =25

Page 155: Pic 16f84a

Apendice A. Instrucciones de los PIC16F84y 16C71..

INCFSZ

Sintaxis:Operaci6n:CicIos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

Incrementa el contenido del registro "f";si el contenido de "f" queda en 00, salta una linea.

INCFSZ f,d(f) + 1 k (destino), salta si el resultado es cero1 (2)

Ninguno

aquf DECFSZ regis, 1GOTO cicIo

continua.....

Antes de la instrucci6nDespues de la instrucci6n

contador de programa =aqufregis =regis + 1si regis =°,entonces

contador de programa =continuasi regis :t:.°,entonces

contador de programa =aquf + 1

IIORLW Operaci6n 16gica OR entre el registro W y elliteral "k",

Sintaxis:Operaci6n:CicIos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

IORLW k(W) OR (k) k (W)1

Z

IORLW 35

Antes de la instrucci6nDespues de la instrucci6n

W =9AW =BF

IIORWF Operaci6n 16gica OR entre el registro W y el registro "f".

Sintaxis:Operaci6n:CicIos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

IORWF f,d(W) OR (f) k (destino)1

Z.

IORWF regis,O

Antes de la instrucci6nDespues de la instrucci6n

regis = 13, W = 91regis =13 , W = 93

Page 156: Pic 16f84a

IMOVLW

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

Apendice A. Instrucciones de los PIC16F84 y 16C71

Carga el registro W con elliteral "k".

MOVLW kkk(W)1

Ninguno

MOVLW 5A

Antes de la instrucci6nDespues de la instrucci6n

W=?W=5A

IMOVF

Sintaxis :Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Mueve el contenido del registro "f".,t

MOVF f,d(f) k (destino)1

z

Ejemplo: MOVF regis,O

Antes de la instrucci6nDespues de la instrucci6n

W=?W = valor guardado en regis

IMOVWF Mueve el contenido del registro W al registro "f",

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

MOVWF f(W) k (f)1

Ninguno

MOVWF OPTION

Antes de la instrucci6nDespues de la instrucci6n

OPTION = ?,OPTION =48,

W=48W =48

Page 157: Pic 16f84a

Apendice A. Instrucciones de los PICI6F84 y 16C71

"INOP

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

No hace nada.

Napkk(W)1

Ninguno

Nap

I OPTION Carga el registro OPTION con el contenido del registro W J

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

OPTIONW k OPTION (Programaalgunasfuncionesespeciales)1

Ninguno

OPTION

I RETFIE

Esta instrucci6n se considera obsoleta, pero porfacilidad en el aprendizaje, se utiliza en el nivel basico.

Retorno del llamado a interrupci6n.

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

RETFIEpila k contador de programa , 1 k intcon,gie2

Ninguno

RETFIE

Antes de la instrucci6nDespues de la instrucci6n

contador de programa = ?contador de programa =pila

Page 158: Pic 16f84a

IRETLW

Apendice A. Instrucciones de los PIC16F84 y 16C71

Retorno de interrupci6n y carga el registro W con e1literal "k" .1

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

RETLW kk k W, pila k contador de programa2

Ninguno

Ejemplo: CALL tabla

tabla ADDWF PC.RETLW klRETLW k2

RETLW kn

Antes de la instrucci6nDespues de la instrucci6n

W=07W =k7

IRETURN

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

Retorno desde subrutina.

RETURNpila k contador de programa2

Ninguno

RETURN

IRLFDespues de la interrupci6n, contador de programa = pila

Rote el contenido del registro ''f' a la izquierda, usando el carryISintaxis :Operaci6n:

Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

RLF f,dRota el contenido del registro "f" a la izquierda a tra­yes del carry. Si d=O, el resultado se guarda en W,si d=1 en "f".1

C

RLF regis,O

Antes de la instrucci6nDespues de la instrucci6n

----~-

C=O,W=?,regis= 11100110C = 1, W = 1100 1100

regis = 1110 0110

Page 159: Pic 16f84a

Apendice A. Instrucciones de los PICl6F84 y 16C71

Sintaxis:Operaci6n:

Rote el contenido del registro "f" a la derecha, usando el carry

RRF f,dRota el contenido del registro"f' ala derecha a travesdel carry.Si d=<>, el resultadose guarda en W, si d=1en "f".

Ciclos de instrucci6n : 1Bits del registro de estadosque se afectan: C

Ejemplo : RRF regis,O

Antes de la instrucci6nDespues de la instrucci6n

C=O,W=?,regis= 11100110C=,O, W = 01110011 -

t,,_ ... ,.. ..J

regis = 11100110

ISLEEP Entra en modo dormido (standby).

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

SUBLW

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo 1 :

SLEEPOOkWDT, 1 kTO,OkPD1

TO,PD

SLEEP

Resta el contenido del registro W de elliteral "k"(usando el metodo de complemento ados). .

SUBLW kk-(W)k(W)1

C, DC, Z

SUBLW 02

Ejemplo 2:

Ejemplo 3 :

Antes de la instrucci6nDespues de la instrucci6n

Antes de la instrucci6n

~e la instrucci6n

/ Antes de la instrucci6nDespues de la instrucci6n

W=I,C=?W = 1, C = 1 (positivo)

W=2,C=?W =0, C =1 (cero)

W=3,C=?W = FF , C = °(negativo)

•. - -_.-I-

Page 160: Pic 16f84a

..SUBWF

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo 1 :

Apendice A. Instrucciones de los P1C16F84 y 16C71

Resta el contenido del registro W de el registro "f'(usando el metoda de complemento ados).

SUBWF f,d(f) - (W) k (destino)1

C,DC,Z

SUBWF regis,l

Ejemplo 2:

Ejemplo 3:

Antes de la instrucci6nDespues de la instrucci6n

Antes de la instrucci6nDespues de la instrucci6n

Antes de la instrucci6nDespues de la instrucci6n

regis =3, W =2, C =?regis =l, W =2, C =1 (positivo)

regis =2, W =2, C =?regis =0, W =2, C =1 (cero)

regis =l, W =2, C =i >:

regis =FF, W =2, C =0 (negativo)

SWAPF Intercambia los cuatro bits altos y loscuatro bits bajos del registro "f".

Sintaxis:Operaci6n:

Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo 1 :

SWAPF f,df<3:0> k d<7:4>f<7:4> k d<3:0>1

Ninguno

SWAPF regis,O

Antes de la instrucci6nDespues de la instrucci6n

regis =A5, W =?regis = A5, W = 5A

Page 161: Pic 16f84a

Apendice A. Instrucciones de los PIC16F84 y 16C71

TRIS Carga el registro TRISJ(programaci6n de los puertoscomo entrada/salida) con el contenido del registro W.

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo 1 :

TRIS fW k (registro TRIS del puerto "A 6 B")1

Ninguno

TRIS puertoA

IXORLW

Esta instrucci6n se considera obsoleta, pero por facilidaden el aprendizaje, se utiliza en el nivel basico.

Operaci6n 16gica XOR entre el registro W y elliteral "k". ISintaxis :Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

XORLW k(W) XOR (k) k (W)1

z

XORLW AF

Antes de la instrucci6nDespues de la instrucci6n

W =B5W =lA

IXORWF Operaci6n 16gica XOR entre e1 registro W y el registro "f'J

Sintaxis:Operaci6n:Ciclos de instrucci6n :Bits del registro de estadosque se afectan:

Ejemplo:

XORWF f,d(W) XOR (f) k (destino)1

z

XORWF regis, 1

Antes de la instrucci6nDespues de la instrucci6n

regis =AF, W =B5regis' =lA, W =B5

, I