ARQUITECTURA DE MICROCONTROLADORES
Instrucciones del Microcontrolador
Arquitectura interna del microcontrolador
Estructura interna de un microcontrolador
Revisar la estructura de las diversas marcas y modelos de microcontroladores sería una
labor que saldría de las metas de éste curso, por lo que, a manera de ejemplo, nos
concentraremos en una marca, Microchip, y en su modelo PIC16F84A.
El nombre verdadero de este microcontrolador es PICmicro (Peripheral Interface
Controller), conocido bajo el nombre PIC. Su primer antecesor fue creado en 1975 por la
compañía General Instruments. Este chip denominado PIC1650 fue diseñado para
propósitos completamente diferentes. Diez años más tarde, al añadir una memoria
EEPROM, este circuito se convirtió en un verdadero microcontrolador PIC.
Todos los microcontroladores PIC utilizan una arquitectura Harvard, lo que quiere decir
que su memoria de programa está conectada a la CPU por más de 8 líneas. Hay
microcontroladores de 12, 14 y 16 bits, dependiendo de la anchura del bus.
Tabla 2.1. Gamas de microcontroladores PICmicro.
Entre sus ventajas:
Eficiencia del código, permiten una gran compactación de los programas.
Rapidez de ejecución, a frecuencia de 20MHz->5 millones de
instrucciones/segundo.
Seguridad en acceso por la separación de memoria de datos y de programa.
Juego reducido de instrucciones y de fácil aprendizaje.
Compatibilidad de pines y código entre dispositivos de la misma familia o sin
reducción de las prestaciones internas (muy versátiles).
Gran variedad de versiones en distintos encapsulados (desde 8 hasta 84 pines) sin
reducción de las prestaciones internas (muy versátiles).
Posibilidad de protección del código muy fiable.
Herramientas de desarrollo software y hardware abundantes y de bajo coste.
Hasta hace algunos años el PIC16F84A era más frecuentemente utilizado en el aprendizaje
de estos dispositivos, hoy día es considerado obsoleto, aunque aún existe una amplia
documentación respecto a aplicaciones del mismo.
Figura 2.1. Microcontrolador PIC16F84A
Refiriéndonos a él sus principales características son:
Memoria flash del programa: 1 kB.
Memoria de datos RAM: 68 bytes.
Memoria de datos EEPROM: 64 bytes.
Pila (STACK): 8 niveles.
Interrupciones: 4 tipos diferentes (pata externa RB0/INT, exceso del temporizador
TMR0, interrupción al cambio PORTB<7:4> y al completar la escritura del
EEPROM de datos).
Juego de instrucciones: 35.
Frecuencia de trabajo: 20 MHz máxima.
Temporizadores: sólo uno, el TMR0 de 8 bits con preescaler (divisor de frecuencia)
programable de 8 bits. También tiene perro guardián (WDT).
Líneas de E/S digitales: 13 (5 Puerto A y 8 Puerto B) con control individual de
dirección.
Voltaje de alimentación: 2 a 6 V DC.
Registros de hardware de funciones especiales: 15.
Extensión de instrucciones:14 bits.
Extensión de datos: 8 bits.
Modos de acceso: directo, indirecto y relativo.
Ciclo de instrucción: 2 para saltos y 1 para el resto.
Memoria de programa de 1000 ciclos de escritura/borrado de flash reforzado.
Memoria de datos EEPROM de 10,000,000 de ciclos de borrado/escritura típica.
Retención de datos de EEPROM de >40 años.
Programación en serie dentro del circuito (ICSP = In Circuit Serial Programming)
mediante dos pines.
Power-On Reset (POR), Power-up Timer (PWRT), Oscillator Start-up Timer
(OST).
WatchDog Timer (WDT) con su propio oscilador rc incorporado en el chip para un
funcionamiento confiable.
Protección de códigos.
Modo SLEEP para economizar consumo.
Opciones seleccionables de oscilador.
Tecnología CMOS con flash reforzado y EEPROM.
Tecnología de baja potencia y alta velocidad.
Diseño estático completo.
Rango amplio de tensiones de funcionamiento comercial e industrial: 2.0 Volts a
5.5 Volts.
Consumo muy bajo:
o Menor a 2 mA típico de corriente a 5 Volts, 4 MHz.
o Menor a 0,5 A típico de corriente en reposo a 2 Volts.
En la figura 2.2 mostramos la arquitectura básica del 16F84A, en el que veremos diversos
elementos que al momento de la programación resultarán vitales en el funcionamiento
correcto de nuestras aplicaciones.
Otro microcontrolador muy útil en el aprendizaje, pero con más recursos y prestaciones es
el PIC16F877A, que en general es una mejora del 84A, contando con cinco puertos de
entrada y salida optimizadas para comunicación serial, conversiones analógica-digital entre
otras prestaciones. El fabricante en fechas recientes informa que este dispositivo será
descontinuado proponiendo el uso del PIC16887.
Figura 2.2. Arquitectura del PIC16F84A.
2.2. Tipos y distribución de las memorias internas
En un microcontrolador PIC de gama media como el PIC16F84A podemos distinguir tres
bloques de memoria:
Memoria de programa. Posee 8192 posiciones para instrucciones de 14 bits de
longitud y está organizada en páginas de 2,048 posiciones, sin embargo, en el
16F84A sólo se han implementado las primeras 1000. Es memoria de tipo FLASH
no volátil y es en donde se almacenan las instrucciones que gobiernan la aplicación.
Memoria de datos RAM. Es una memoria volátil que guarda variables y datos. Los
registros que maneja son de 8 bits.
Memoria de datos EEPROM. Es una memoria de datos de lectura y escritura no
volátil que permite garantizar que determinada información estará siempre
disponible al reinicializarse el programa. Se gestiona de manera distinta a la
memoria de datos RAM.
Figura 2.3. Diagrama a bloques del PIC16F84A mostrando las memorias.
2.2.1. Memoria de programa
El microcontrolador está diseñado para que en su memoria de programa se almacenen todas
las instrucciones del programa de control. Como éste siempre es el mismo, debe estar
grabado de forma permanente. Existen algunos tipos de memoria adecuados para soportar
estas funciones, de las cuales se citan las siguientes:
ROM con máscara, se graba mediante el uso de máscaras. Sólo es recomendable
para series muy grandes debido a su elevado coste.
EPROM: se graba eléctricamente con un programador controlador por un PC.
Disponen de una ventana en la parte superior para someterla a luz ultravioleta, lo
que permite su borrado. Puede usarse en fase de diseño, aunque su coste unitario es
elevado.
OTP: su proceso de grabación es similar al anterior, pero éstas no pueden borrarse.
Sus bajos costes las hacen idóneas para productos finales.
EEPROM: también se graba eléctricamente, pero su borrado es mucho más sencillo,
ya que también es eléctrico. No se pueden conseguir grandes capacidades y su
tiempo de de escritura y su consumo es elevado.
FLASH: se trata de una memoria no volátil, de bajo consumo, que se puede escribir
y borrar en circuito al igual que las EEPROM, pero que suelen disponer de mayor
capacidad que estas últimas. Son recomendables aplicaciones en las que es
necesario modificar el programa a lo largo de la vida del producto. Por sus mejores
prestaciones, está sustituyendo a la memoria EEPROM para contener instrucciones.
Con anterioridad Microchip comercializaba dos microcontroladores prácticamente iguales
que sólo se diferencian en que la memoria de programa de uno de ellos es tipo EEPROM y
la del otro tipo Flash, hablamos trata del PIC16C84 y el PIC16F84, respectivamente.
La memoria de programa almacena todas las
instrucciones de la aplicación en ejecución, la cual
estará grabada de forma permanente. La
información contenida en esta memoria se graba
previamente mediante un equipo físico denominado
programador o grabador (figura 2.4). Esta memoria
es denominada ROM Flash y admite unas 1000
grabaciones durante la vida útil del circuito
integrado.
Todas las instrucciones ocupan una posición de
memoria (figura 2.5).
Figura 2.4. Grabador de PIC K150.
Existen dos posiciones de memoria que son de particular importancia: la dirección 0 que es
la posición de reinicio del microcontrolador (RESET) y a la posición 4 que es una posición
de redirección a la que se apunta tras una interrupción de programa cualquiera.
Figura 2.5. Mapa de la memoria de programa.
A la memoria de programa de los PIC16 se accede mediante un registro de 13 bits que
actúa como puntero de la instrucción que se debe ejecutar en el siguiente ciclo de
instrucción. Este registro de 13 bits se denomina Contador de Programa (Program Counter)
y su acrónimo es PC (ver figura 2.5).
Con este contador de programa de 13 bits se pueden direccionar 8K posiciones de memoria.
Debido a que la codificación de las instrucciones es de 14 bits y para aprovechar las
ventajas de la arquitectura Harvard, cada una de esas 8K posiciones corresponde a una
instrucción y por tanto, el contador de programa es capaz de direccionar 8K x 14 posiciones
o 8000 instrucciones. Como cada instrucción ocupa una posición de memoria resulta
mucho más fácil saber si un dispositivo tiene memoria de programa suficiente para una
aplicación.
Los 8K de memoria de programa disponible están
divididos en 4 páginas de 2K cada una (0h 7FFh,
800h-FFFh, 1000h-17FFh y 1800h-1FFFh). Esto es
debido a que las instrucciones de salto y llamada a
subprograma permiten cargar sólo 11 bits en el PC
(desplazamiento en 211 = 2K), tal como se muestra en
la figura 2.6. Si se están ejecutando instrucciones
secuencialmente, el contador de programa pasará de
una página a otra sin necesidad de intervención por
parte del usuario o programador.
Para saltar entre páginas de la memoria de programa
los 2 bits más altos del PC deben modificarse. Esto
se realiza escribiendo en el registro PCLATH
(registro situado en la memoria de datos).
La instrucción CALL y las interrupciones originan la
carga del contenido del PC en el nivel superior de la
pila y con las instrucciones RETURN, RETLW y
RETFIE se saca el contenido del nivel superior de la
misma. Figura 2.6. Paginado de memoria
de programa.
2.2.2. Memoria de Datos
Los microcontroladores PIC funcionan con datos de 8 bits por lo que las posiciones de la
memoria de datos tienen esa longitud. La memoria de datos se organiza en "bancos",
pudiendo existir hasta cuatro en los modelos de mayor capacidad (figura 2.7).
El banco 0 tiene un tamaño de 32 bytes,
mientras que todos los demás sólo disponen de
16. El banco 0 ocupa las 32 primeras posiciones
de la memoria y lo poseen todos los modelos de
PIC16XXX. Las 16 posiciones de menos peso
de los bancos 1, 2 y 3 no son accesibles y
cuando se direcciona desde el valor 00h al 0Fh,
siempre se acude al banco 0. Cuando la
dirección está comprendida entre la 10h y la
1Fh, hay que seleccionar a cuál de los cuatro
posibles bancos corresponde con los bits 6 y 5
del registro FSR.
La memoria de datos funciona de forma similar
al "banco de registros" de un procesador por lo
cual sus posiciones implementan registros de
propósito especial y de propósito general. Las
ocho primeras posiciones del banco 0 soportan
registros específicos.
En un PIC16F84A tenemos dos zonas de
memoria de datos:
RAM estática o SRAM, donde residen
los Registros Específicos (SFR) con 24
posiciones de tamaño byte, aunque dos
de ellas no son operativas y los Registros
de Propósito General (GPR) con 68. La
RAM del PIC16F84A se halla dividida
en dos bancos (banco 0 y banco 1) de
128 bytes cada uno. Figura 2.7. Mapa de memoria de datos.
EEPROM, de 64 bytes donde,
opcionalmente, se pueden almacenar
datos que no se pierden al desconectar la
alimentación.
En el 16F84A se toman 9 bits para seleccionar
una localidad en la memoria de datos (figura
2.8).
Figura 2.8. Direccionamiento de
memoria.
Existen 2 modos de direccionamiento para acceder a cualquiera de las posiciones de la
memoria de datos:
Direccionamiento directo: La posición de memoria con la que se trabaja viene
directamente definida en el código de la instrucción.
Direccionamiento indirecto: La posición de memoria con la que se trabaja viene
definida por el contenido del registro FSR (Posición 04h, 84h, 104h o 184h), es
decir, el registro FSR actúa como puntero de la posición de memoria con la que se
pretende operar.
Figura 2.9. Direccionamiento directo e indirecto en un PIC.
Tanto para el direccionamiento directo como el indirecto la dirección completa (9 bits) no
se puede obtener del código de la operación (7 bits) o del registro FSR (8 bits), por lo que:
Para direccionamiento directo, la dirección a operar se obtiene completando la
dirección incluida en el código de la instrucción con los bits RP1:RP0 del registro
STATUS.
Para direccionamiento indirecto, la dirección se obtiene completando el contenido
del registro FSR con el bit IRP del registro STATUS.
Tabla 2. Modos de direccionamiento.
Banco accedido Directo (RP1:RP0) Indirecto (IRP)
0 0 0
0
1 0 1
2 1 0
1
3 1 1
2.2.3. Registros especiales
Los registros de propósito general son las áreas de la RAM donde el usuario puede alojar
datos de manera temporal mediante la creación de variables. Los registros especiales en
cambio sirven para evaluar y controlar el funcionamiento del dispositivo, por lo que
merecen especial atención. Estos registros están repartidos en dos bancos, el 0 y el 1, y
situados en las 12 primeras posiciones o registros de cada uno (00h-0Bh, y 80h-8Bh). La
figura 2.10 muestra los registros especiales del 16F84A clasificados por banco.
Figura 2.10. Registros especiales en la memoria de datos del 16F84A.
Revisamos ahora la descripción de los registros especiales más comúnmente usados.
Registro INDF (00h y 80h). El registro INDF (Indirect File) que ocupa la posición
00 no tiene existencia física, por lo que no se podrá acceder a él. En realidad, este
registro sirve únicamente para especificar la utilización del direccionamiento
indirecto junto con el registro FSR.
Registro TMR0 (01h). El registro TMR0 (Timer 0) almacena el valor del contador
TMR0, que como ya sabemos, está funcionando continuamente e incrementando el
valor que tiene almacenado. Las opciones que controlan este contador residen en el
registro OPTION. El registro TMR0 se incrementa en una unidad con cada impulso
de reloj seleccionado mediante el registro OPTION. Cada vez que llega al valor FF,
vuelve a 00 generando una interrupción, si se ha autorizado, y continúa su ciclo
indefinidamente. El registro TMR0 se puede leer o escribir directamente con
cualquier instrucción, con el fin de conocer su posición actual, o para inicializarlo
en un estado determinado. Es importante saber que después de cualquier escritura
en este registro, es necesario un retardo de dos ciclos de instrucción para que se
retome la incrementación, independientemente de la fuente de reloj usada. Las
instrucciones concernidas son MOVF TMR0 o CLRF TMR0. El reloj interno deja
de funcionar en el modo SLEEP, por lo que no se puede contar con sus
interrupciones en este modo ni por consiguiente, que salga de este modo de
funcionamiento por medio de dicha interrupción. Obsérvese que todas las
instrucciones que escriben en el TMR0 ponen a cero al prescaler (divisor), cuando
éste está asignado al temporizador.
Contador de programa PC (02h y 82h). Este registro, normalmente denominado
PC (Program Counter), es equivalente al de todos los microprocesadores y contiene
la dirección de la próxima instrucción a ejecutar. Se incrementa automáticamente al
ejecutar cada instrucción, de manera que la secuencia natural de ejecución del
programa es lineal, una instrucción después de la otra. Algunas instrucciones (que
llamaremos de control) cambian el contenido del PC alterando la secuencia lineal de
ejecución. Otras instrucciones de control como los saltos condicionales, que
producen un incremento adicional del PC si se cumple una condición específica,
haciendo que el programa salte, sin ejecutar, la instrucción siguiente. El PC está
implementado por dos registros, PCLATH (5 bits) y PCL (8 bits)
o Los 8 bits de menor peso del PC los proporciona el registro PCL (02h) y a
diferencia de la mayoría de los microprocesadores convencionales, es
también un registro accesible al programador como registro de memoria
interna de datos. Es decir que cualquier instrucción común que opere sobre
registros puede ser utilizada para alterar el PCL y desviar la ejecución del
programa.
o Los 5 bits de mayor peso del PC que no pueden leerse ni escribirse
directamente proceden del registro PCLATH en la dirección 0Ah y 8Ah.
En la instrucción de salto relativo, el resultado de las mismas sólo afecta a los 8 bits
de menor peso. Los 5 bits de mayor peso se suministran desde PCLATH (figura
2.11 (a)). En las instrucciones GOTO y CALL se efectúa la misma operación
teniendo presente que el PC se codifica mediante 11 bits y se suministran en la
propia instrucción, desde el código OP. Los dos bits de más peso del PC de cargan
con los bits 4 y 3 del registro PCLATH (figura 2.11 (b)).
Dado que la memoria de programa se organiza en páginas de 2 K, la posición de la
memoria la indican los 11 bits de menor peso del PC y los 2 bits de mayor peso
indican la página. El reset pone a 0 todos los bits de PCL y PCLATH haciendo que
el reinicio comience en la dirección 0000h.
(a) (b)
Figura 2.11. Carga del PC: (a) Por salto relativo; (b) Por salto absoluto.
Los ocho registros de pila no están situados en el mismo espacio de memoria que
los demás (figura 2.12). Son registros de trece bits capaces de contener íntegramente
al PC. Su utilización es automática, ya que el PC se introduce en la pila durante la
ejecución de una instrucción CALL o de una interrupción, y se extrae de la pila
durante la ejecución del retorno correspondiente.
Figura 2.12. Posición del STACK o pila, círculo verde.
Cuando los datos contenidos en el PC son almacenados o extraídos de la pila el
registro PCLATH no se ve modificado. Estos registros de pila deben considerarse
como un buffer de memoria circular, lo que significa que, si se introduce más de 8
valores del PC, el noveno valor tomará la posición del primero, y así sucesivamente.
Ningún bit de registro indica que la pila está llena, por lo que debemos tener
cuidado de que no se desborde.
Registro de Estado (03h y 83h). El registro de Estado (STATUS) contienen varios
bits de estado de la unidad central, el estado aritmético de la ALU, el estado del
reset y un par de bits de selección de página denominados RP1 y RP0. Ocupa la
posición 03h del banco 0 y la 83h del banco 1. Algunos de estos bits los podemos
cambiar manualmente a través del programa. Otros no los activamos nosotros, sino
que los activa automáticamente el PIC cuando se dan ciertos procesos. Estos bits se
llaman flags (banderas). Para hacernos una idea práctica una bandera se levanta (se
pone a 1) cuando ha pasado algo, al igual que ocurre en el fútbol con los linieres. El
registro STATUS está formado por 8 bits (figura 2.13).
Figura 2.13. Organización del registro STATUS.
R/W significa que el bit correspondiente se puede leer y escribir, mientras que R
significa que solamente puede ser leído. También se indica el estado que se
establece tras un reset. Dada la importancia del registro, listamos a continuación las
características de cada bit.
o Bit 7, IRP: Selección del banco en direccionamiento indirecto. Este bit
junto con el de más peso del registro FSR sirven para determinar el banco de
la memoria de datos seleccionado. En el PIC16X84 al disponer de dos
bancos no se usa y debe programarse como 0.
o Bit 6 y 5, RP0 y RP1: Register Bank Select. Selección de página o banco
de la memoria con direccionamiento directo. Cada página contiene 128
bytes. Como el PIC16X84 sólo tiene dos bancos únicamente se emplea RP0
de forma que cuando vale 0 se accede al banco 0 y cuando vale 1 se accede
al banco 1. Después de un reset, RP0 se pone automáticamente a 0. RP1
debe mantenerse a 0. El bit RP1 deberá ser puesto a cero, ya que si no nos
saldríamos del rango de memoria.
Figura 2.14. Configuración de bits para selección de bancos.
o Bit 4 (flag), TO: Time Out. Tiempo de término o acabado, es una bandera
o señalador:
1. Se pone a 1 tras conectar la alimentación o al ejecutar CLRWDT o
SLEEP.
0. Se pone a 0 por desbordamiento del Perro Guardián WDT.
o Bit 3 (flag), PD: Power Down. Apagado, también es una bandera:
1. Se pone automáticamente a 1 tras conectar la alimentación V DD o
ejecutar CLRWDT, que resetea el contador WatchDog.
0. Se pone a 0 al ejecutar la instrucción SLEEP.
o Bit 2 (flag), Z. Bandera indicadora de cero (Zero) aritmético:
1 = El resultado de una operación aritmética o lógica es 0.
0 = El resultado es distinto de 0.
o Bit 1 (flag), DC (Digit Carry). Acarreo en el 4º bit de menos peso.
Funciona igual que el bit de Carry descrito a continuación. De interés en
operaciones en BCD.
o Bit 0 (flag), C (Carry). Acarreo en el 8º bit o bit de más peso. Es el bit de
"acarreo" en operaciones de suma AADWF y ADDLW, así como también el
bit de "préstamo" en las instrucciones de sustracción SUBWF y SUBLW.
También lo emplean las instrucciones RLF y RRF de rotación de bits.
Suma:
1. Se pone a 1 cuando se ha producido acarreo en la suma en
el bit de mayor peso con las operaciones AADWF y
ADDLW.
0. Se pone a 0 si en la suma no se ha producido acarreo.
Resta:
1. Se pone a 1 si en la resta no se ha producido préstamo.
0. Se pone a 0 cuando se ha producido préstamo en la resta
con las operaciones SUBWF y SUBLW.
Registro FSR (04h y 84h). El contenido del FSR se utiliza para el
direccionamiento indirecto junto con el registro INDF. Este registro contiene 8 bits.
Registros PORTA y PORTB (05h y 06h). Estos registros contienen los niveles
lógicos de las patillas de E/S. Cada bit se puede leer o escribir según la patilla
correspondiente se haya configurado como entrada o como salida. Conviene
recordar que cualquier línea puede funcionar como entrada o como salida. Sin
embargo, si actúa como entrada la información que se introduce no se memoriza,
por lo que la información debe ser mantenida hasta que sea leída. Si la línea actúa
como salida, el bit que procede del bus de datos se guarda en la báscula, con lo que
la información que ofrece esta patilla permanece invariable hasta que se reescriba
este bit.
Figura 2.15. Bits de los registros de entrada y salida del 16F84A.
Registro EEDATA (08h). El registro EEDATA (Datos de EEPROM) guarda el
contenido de una posición de la memoria EEPROM de datos antes de su escritura o
después de su lectura, según leamos o escribamos en ella. Como ya sabemos la
memoria EEPROM es bastante lenta, dato que tendremos en cuenta cuando
accedamos a ella para escribirla, pues tarda unos 10 ms en completar el proceso.
Registro EEADR (09h). El registro EEADR (Dirección de EEPROM) guarda la
dirección de la posición de memoria EEPROM cuando queramos acceder a ella,
bien para su lectura, o bien para su escritura. El registro EEADR puede direccionar
como máximo 256 bytes de los cuales sólo los 64 primeros están disponibles, con lo
que los dos bits de mayor peso han de tener el valor de '0'.
Registro PCLATH (0Ah y 8Ah). El registro PCLATH (Contador de Programa
Alto) ya lo vimos cuando analizamos el PCL y su relación con el PC.
Registro INTCON (0Bh y 8Bh). Este registro contiene varios bits de selección de
fuentes de interrupción, el bit de activación global de interrupciones y varios flag
que indican la causa de una interrupción. Sirve para el control global de las
interrupciones y para indicar la procedencia de algunas de ellas, gracias a los bits de
estado.
Se dispone de cuatro potenciales recursos de interrupción:
o Una fuente externa a través del pin RB0/INT.
o El desbordamiento del temporizador 0 (TMR0).
o Un cambio de estado en los pines RB4 a RB7.
o Programación de la EEPROM de datos.
Cada bit del registro INTCON tiene un significado concreto que se muestra en la
figura 2.16.
Figura 2.16. Organización de bits del registro INTCON.
Características de los bits:
o Bit 7, GIE: Habilitación global de interrupciones (Global Interrupt Enable).
1: Concede el permiso de interrupciones.
0: Cancela el permiso de las interrupciones.
o Bit 6, EEIE: Habilitación de las Interrupciones de la memoria EEPROM.
1: Permite que se produzcan interrupciones debidas al fin de escritura
de la EEPROM, etc.
0: Este tipo de interrupciones estarán inhibidas.
o Bit 5, T0IE: Habilitación de la interrupción del temporizador por
desbordamiento (Timer 0 Interrupt Enable).
1: Autoriza las interrupciones debidas al desbordamiento del
temporizador.
0: Interrupción del temporizador deshabilita de manera que cuando
se produzca el flag correspondiente permanecerá inactivo.
o Bit 4, INTE: Habilitación de la entrada de interrupción externa (Interrupt
Enable) por patilla RB0/INT.
1: Autoriza las interrupciones provocadas RB0/INT del puerto B.
0: Interrupción externa deshabilita de manera que cuando se
produzca una interrupción externa el flag correspondiente
permanecerá inactivo.
o Bit 3, RBIE: Habilitación de las interrupciones del puerto B (RB Interrupt
Enable).
1: Autoriza las interrupciones provocadas por un cambio de estado
de las líneas RB4 a RB7 del puerto B.
0: Interrupción del puerto B deshabilitada.
o Bit 2 (flag), T0IF: Bit de interrupción de desbordamiento del TMR0.
1: El TMR0 ha rebosado. Se borra por software.
0: El TMR0 no ha rebosado.
o Bit 1 (flag), INTF: Bit de interrupción de la Entrada de Interrupción INT
(patilla RB0/INT).
1: La entrada de interrupción se ha activado (patilla RBO/INT del
puerto B). Se borra por software.
0: No hay interrupción externa.
o Bit 0 (flag), RBIF: Bit de interrupción del puerto B.
1: Cambio de estado en una de las líneas de RB4 a RB7 del puerto B.
Se borra por software.
0: Ninguna línea de RB4 a RB7 del puerto B ha cambiado.
Cada flag o bandera individual debe ponerse a cero por software.
Solamente hay un vector de interrupción en la memoria de programa (dirección
0004h), por lo que se deben comprobar los bits de INTCON en la subrutina de
interrupción para saber cuál es la fuente de la misma.
Cuando llega una interrupción, el PIC pone el bit GIE a cero, de forma que no se
perturbe el tratamiento de la interrupción en curso, debido a otras interrupciones
eventuales. Este bit se pone automáticamente a uno al terminar la subrutina de
interrupción, con la ejecución de la instrucción RETFIE.
Los indicadores de interrupciones correspondientes permanecen funcionales incluso
cuando no se han autorizado.
En este caso también pueden leerse y escribirse todos los bits que componen este
registro.
Registro OPTION (81h). El registro OPTION (o registro de opciones) se emplea
para programar las opciones del temporizador TMR0, el tipo de flanco con el que se
detecta una interrupción y la activación de las resistencias de polarización del puerto
B. Ocupa la posición 81h de la página 1 del banco de registros. Debe escribirse
usando la instrucción especial OPTION. Esta instrucción carga el contenido de W
en el registro OPTION.
Figura 2.17. Organización de bits del registro OPTION.
Descripción de bits:
o Bit 7, /RBPU (RB Pull Up). Conexión de las resistencias de polarización
del Puerto B. Se conectan todas cuando el puerto B actua como entrada.
1: Todas las resistencias son desconectadas.
0: Las resistencias se activan de forma individual.
o Bit 6, INTDEG (INTerrupt EDGe). Selecciona el tipo de flanco para la
interrupción externa. Este bit indica el tipo de flanco de la señal externa que
ha de provocar una interrupción en la patilla RB0/INT.
1: La interrupción es producida por el flanco ascendente o de subida.
0: La interrupción es producida por el flanco descendente o de
bajada.
o Bit 5, T0CS (Timer 0 Signal Source). Selección de la fuente de reloj para
el TMR0.
1: TMR0 se usa en modo contador de los pulsos introducidos a
través de RA4/T0CKI
0: TMR0 se usa en modo temporizador haciendo uso de los pulsos de
reloj internos (Fosc/4).
o Bit 4, T0SE (Timer 0 Signal Edge). Tipo de flanco activo de T0CKI
(patilla RA4/T0CKI).
1 = El TMR0 se incrementa con el flanco descendente de la señal
aplicada a RA4/T0CK1.
0 = El TMR0 se incrementa con el flanco ascendente.
o Bit 3, PSA (PreScaler Assignement). Se usa para la asignación del divisor
de frecuencias o Prescaler.
1 = El divisor de frecuencia se asigna al WDT.
0 = El divisor de frecuencia se asigna a TMR0.
o Bits 0, 1 y 2, PS0, PS1 y PS2 (Prescaler Rate Select Bits). Configura la
tasa del valor del divisor de frecuencia o prescaler. Difiere dependiendo que
se haya asignado al TMR0 o al WDT, ver figura 2.18.
Figura 2.18. Combinaciones del prescaler.
Registro TRISA y TRISB (85h y 86h). Estos son registros de idéntica longitud
que PORTA y PORTB, respectivamente, debido a que sirven para configurar si los
bits de cada puerto serán de entrada o de salida:
o 1: La patilla del puerto correspondiente será de entrada
o 0: En este caso la patilla actuará como una salida.
Cuando se produce un reset, todos los bits de los registros TRIS pasan a tener el
valor 1 y todas las líneas de E/S actúan como entrada por evidentes motivos de
seguridad para evitar daños irreparables. Todas las patillas de E/S que no se
empleen deben ser llevadas a +5v, regla de las entradas CMOS, preferiblemente a
través de una resistencia para evitar que si por error se configurasen como salidas
puedan darse problemas si presentan un estado bajo.
Registro EECON1 (88h). Este registro contiene configuraciones importantes
acerca de la escritura y la lectura de la EEPROM de datos. En concreto tiene 5 bits
de control, cuya distribución se presenta en la figura 2.19.
Figura 2.19. Distribución de bits del registro EECON1.
U (Unimplemented). En el registro EECON1, los tres primeros bits no están
implementados por lo que su lectura es '0'.
La descripción de bits es como sigue:
o Bit 4 (flag): EEIF. Bit de interrupción de escritura en la memoria EEPROM
(EEPROM Interrupt Flag).
1: Este bit se pone a uno al terminar la operación de escritura en la
EEPROM, y debe ponerse a cero por software.
0: No se ha completado la operación de escritura o no ha empezado.
o Bit 3 (flag), WRERR. Bit de error de escritura (Write Error).
1: Este bit se pone a 1 si se produce un error de escritura de forma
prematura (Reset o Watchdog). En este caso, los contenidos de
EEADR y EEDATA no varían, de manera que el proceso pueda ser
repetido correctamente.
0: Se ha completado la operación de escritura.
o Bit 2, WREN. Bit de habilitación de escritura. (Write Enable).
1: Este bit debe ser habilitado para poder escribir en la EEPROM.
0: Deshabilita la escritura de datos en la memoria EEPROM.
o Bit 1, WR. Bit de control de escritura (Write Data).
1: Indica que se ha iniciado una operación de escritura. Este bit debe
ponerse a uno para escribir un dato.
0: Indica que se ha completado una operación de escritura. El PIC lo
pone automáticamente a cero
o Bit 0, RD. Bit de control de lectura (Read Data).
1: Inicia una lectura de la memoria EEPROM. Este bit debe ponerse
a uno para poder leer un dato.
0: No se ha iniciado una lectura de la EEPROM. El PIC lo pone
automáticamente a cero
Los bits de control RD y WR inician operaciones de lectura y escritura
respectivamente. Estos bits sólo pueden ser puestos a '1' por software, nunca
a '0'. Son puestos a '0' cuando se completa la operación de lectura o escritura.
Para leer una posición de memoria, se debe escribir la dirección en el
registro EEADR y colocar a '1' el bit de control RD. El dato estará
disponible en un próximo ciclo de instrucción, normalmente en el siguiente,
en el registro EEDATA hasta que se lea otro o se escriba en este registro.
Registro EECON2 (89h). Este registro no está implementado físicamente, por lo
cual no se puede leer. Tan sólo sirve para un proceso de protección de escritura que
consiste en copiar en él unos datos específicos, con el fin de evitar que un programa
por error pueda programar la EEPROM, manipulando simplemente los bits del
EECON1.
2.2.4. Estado predeterminado de los registros especiales
En la siguiente tabla, se muestran los estados que tienen los registros al alimentar el PIC,
después de un reset y al salir del modo SLEEP.
Leyenda: (u) = no cambia; (x) = desconocido; (-) = no existe, se lee como 0; ( ? ) = depende
de otras condiciones.
Notas:
Uno o más bits de INTCON pueden quedar afectados a causa de la salida del modo
SLEEP.
Cuando la salida del modo SLEEP se produce por una interrupción y GIE está
activado, el PC se carga con el vector de interrupción (0004 h).
Las posibles fuentes de reset afectan de forma diversa a los contenidos de los
diferentes registros de control, de estado o de datos. En la descripción de cada
registro se indica el estado de los bits después de un reset de alimentación. Es
aconsejable examinar esta tabla después de un reset antes de cualquier utilización,
excepto en el caso de que se reinicie por programa cada registro.
Tabla 3. Estados predeterminados de los registros especiales.
Conexión Reset por MLCR Salida del modo SLEEP
Reset por WDT
Registro Direc. de la
en modo normal
alimentac. en modo normal en modo SLEEP por WDT por interrupción
PC - 000 h 000 h 000 h 000 h PC + 1 PC + 1
W - xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
INDF 00 h ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
TMR0 01 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
PCL 02 h 0000 0000 0000 0000 0000 0000 0000 0000 PC+1 PC+12
STATUS 03 h 0001 1xxx 000u uuuu 0001 0uuu 0000 1uuu uuu0 0uuu uuu1 0uuu
FSR 04 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
PORT A 05 h ---x xxxx ---u uuuu ---u uuuu ---u uuuu ---u uuuu ---u uuuu
PORT B 06 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
EEDATA 08 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
EEADR 09 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
PCLATCH 0A h ---0 0000 ---0 0000 ---0 0000 ---0 0000 ---u uuuu ---u uuuu
INTCON 0B h 0000 000x 0000 000u 0000 000u 0000 000u uuuu uuuu1 uuuu uuuu1
INDF 80 h ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
OPTION 81 h 1111 1111 1111 1111 1111 1111 1111 1111 uuuu uuuu uuuu uuuu
PCL 82 h 0000 0000 0000 0000 0000 0000 0000 0000 PC+1 PC+12
STATUS 83 h 0001 1xxx 000u uuuu 0001 0uuu 0000 1uuu uuu0 0uuu uuu1 0uuu
FSR 84 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
TRIS A 85 h ---1 1111 ---1 1111 ---1 1111 ---1 1111 ---u uuuu ---u uuuu
TRIS B 86 h 1111 1111 1111 1111 1111 1111 1111 1111 uuuu uuuu uuuu uuuu
EECON1 88 h ---0 x000 ---0 ?000 ---0 ?000 ---0 ?000 ---u uuuu ---u uuuu
EECON2 89 h ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
PCLATCH 8A h ---0 0000 ---0 0000 ---0 0000 ---0 0000 ---u uuuu ---u uuuu
INTCON 8B h 0000 000x 0000 000u 0000 000u 0000 000u uuuu uuuu1 uuuu uuuu1
2.3. Recursos especiales
Cada fabricante oferta numerosas versiones de una arquitectura básica de microcontrolador.
En algunas amplía las capacidades de las memorias, en otras incorpora nuevos recursos, en
otras reduce las prestaciones al mínimo para aplicaciones muy simples, etc. La labor del
diseñador es encontrar el modelo mínimo que satisfaga todos los requerimientos de su
aplicación. De esta forma, minimizará el costo, el hardware y el software.
Los principales recursos específicos (algunos ya comentados muy brevemente) que
incorporan los microcontroladores son:
Temporizadores (Timers). Se emplean para controlar periodos de tiempo
(temporizadores) y para llevar la cuenta de acontecimientos que suceden en el
exterior (contadores). Para la medida de tiempos se carga un registro con el valor
adecuado y a continuación dicho valor se va incrementando o decrementando al
ritmo de los impulsos de reloj o algún múltiplo hasta que se desborde y llegue a 0,
momento en el que se produce un aviso. Cuando se desean contar acontecimientos
que se materializan por cambios de nivel o flancos en alguna de las patitas del
microcontrolador, el mencionado registro se va incrementando o decrementando al
ritmo de dichos impulsos.
Perro guardián (Watchdog). Cuando el computador personal se bloquea por un
fallo del software u otra causa, se pulsa el botón del reset y se reinicializa el sistema.
Pero un microcontrolador funciona sin el control de un supervisor y de forma
continuada las 24 horas del día. El Perro guardián consiste en un temporizador que,
cuando se desborda y pasa por 0, provoca un reset automáticamente en el sistema.
Se debe diseñar el programa de trabajo que controla la tarea de forma que refresque
o inicialice al Perro guardián antes de que provoque el reset. Si falla el programa o
se bloquea, no se refrescará al Perro guardián y, al completar su temporización,
Protección ante fallo de alimentación (Brownout). Se trata de un circuito que
resetea al microcontrolador cuando el voltaje de alimentación (V DD) es inferior a un
brownout el dispositivo se mantiene reseteado, comenzando a funcionar
normalmente cuando sobrepasa dicho valor.
Estado de reposo o de bajo consumo. Son abundantes las situaciones reales de
trabajo en que el microcontrolador debe esperar, sin hacer nada, a que se produzca
algún acontecimiento externo que le ponga de nuevo en funcionamiento. Para
ahorrar energía, (factor clave en los aparatos portátiles), los microcontroladores
disponen de una instrucción especial (SLEEP en los PIC), que los pasa al estado de
reposo o de bajo consumo, en el cual los requerimientos de potencia son mínimos.
interrupción ocasionada por el acontecimiento esperado, el microcontrolador se
despierta y reanuda su trabajo.
Conversor A/D (ADC). Los microcontroladores que incorporan un Conversor A/D
(Analógico/Digital) pueden procesar señales analógicas, tan abundantes en las
aplicaciones. Suelen disponer de un multiplexor que permite aplicar a la entrada del
CAD diversas señales analógicas desde las patitas del circuito integrado.
Conversor D/A (DAC). Transforma los datos digitales obtenidos del
procesamiento del computador en su correspondiente señal analógica que saca al
exterior por una de las patitas de la cápsula. Existen muchos efectores que trabajan
con señales analógicas.
Comparador analógico. Algunos modelos de microcontroladores disponen
internamente de un Amplificador Operacional que actúa como comparador entre
una señal fija de referencia y otra variable que se aplica por una de las patitas de la
cápsula. La salida del comparador proporciona un nivel lógico 1 ó 0 según una señal
sea mayor o menor que la otra. También hay modelos de microcontroladores con un
módulo de tensión de referencia que proporciona diversas tensiones que se pueden
aplicar en los comparadores
Modulador de anchura de pulsos (PWM). Son circuitos que proporcionan en su
salida pulsos de anchura variable, que se ofrecen al exterior a través de las patitas
del encapsulado.
Puertas de E/S digitales. Todos los microcontroladores destinan algunas de sus
patitas a soportar líneas de E/S digitales. Por lo general, estas líneas se agrupan de
ocho en ocho formando Puertas. Las líneas digitales de las Puertas pueden
configurarse como Entrada o como Salida cargando un 1 ó un 0 en el bit
correspondiente de un registro destinado a su configuración.
Puertas de comunicación. Con objeto de dotar al microcontrolador de la
posibilidad de comunicarse con otros dispositivos externos, otros buses de
microprocesadores, buses de sistemas, buses de redes y poder adaptarlos con otros
elementos bajo otras normas y protocolos. Algunos modelos disponen de recursos
que permiten directamente esta tarea, entre los que destacan:
o UART, adaptador de comunicación serie asíncrona.
o USART, adaptador de comunicación serie síncrona y asíncrona
o Puerta paralela esclava para poder conectarse con los buses de otros
microprocesadores.
o USB (Universal Serial Bus), que es un moderno bus serie para los PC.
o Bus I2C, que es un interfaz serie de dos hilos desarrollado por Philips.
o CAN (Controller Area Network), para permitir la adaptación con redes de
conexionado multiplexado desarrollado conjuntamente por Bosch e Intel
para el cableado de dispositivos en automóviles. En EE.UU. se usa el
J185O.
La figura 2.20 ilustra una comparativa de recursos de los microcontroladores PIC16F84 y el
PIC16F88.
Figura 2.20. Comparativa de los recursos de los PICs 16F84 y el 16F88.
2.4. Palabra de configuración
Hay ciertos aspectos del PIC que han de ser activados o desactivados cuando se programa y
no se pueden volver a cambiar hasta que el PIC no se reprograme de nuevo.
El PIC16F84 dispone de 4 elementos programables (los modelos superiores tienen más)
que se encuentran en la llamada palabra de configuración. A estos 4 elementos o bits de
configuración también se les conoce como fuses (fusibles).
La palabra de configuración se encuentra en la dirección de memoria de programa 2007 h.
Esta posición está más allá del espacio de memoria de programa destinada al usuario y
pertenece al espacio de memoria de prueba y configuración (2000h - 3FFFh). Solamente se
puede acceder a este espacio durante la programación del dispositivo.
Figura 2.21. Palabra de configuración del 16F84A.
Los bits en cuestión son:
CP, bit 4 a 13: Bits de protección de código. Activando este bit tendremos la
garantía de que el código escrito en el PIC no pueda ser leído por otra persona, para
que no se copie, modifique, etc. Esto no impide que el PIC funcione como siempre,
ni que no se pueda sobrescribir su contenido. Lo único que nos impide es leerlo.
o 1: Protección de código deshabilitada.
o 0: Memoria protegida por código.
PWRTE, bit 3: Bit para habilitar el Power-up Timer o temporizador de encendido.
Si activamos el bit PWRTE, conseguimos que se genere un retardo en la
inicialización del microcontrolador. Esto se utiliza para que la tensión se estabilice,
por lo que se recomienda su uso.
o 1: Power-up timer deshabilitado.
o 0: Power-up Timer habilitado.
WDTE, bit 2: Bit para habilitar el Watchdog timer o temporizador perro guardián.
El "perro guardián" del PIC se configura aquí. Con esto el PIC tiene la capacidad de
autorresetearse. Es útil ante problemas que impidan el funcionamiento del programa
del PIC, como un bucle infinito, el WDT lo sacará de él reseteando al PIC.
Su funcionamiento es sumamente sencillo. Simplemente es un registro que debemos
borrar cada cierto tiempo. Si pasa un tiempo (entre 2.5ms y 2.5 seg) y el registro no
ha sido borrado, el PIC se resetea. La instrucción para borrar el registro es
CLRWDT. Con poner un par de ellos a lo largo de nuestro código es suficiente para
tener una garantía de que nuestro PIC no se quede "colgado".
o 1: WDT habilitado.
o 0: WDT deshabilitado.
FOSC1, FOSC0, bit 0 y 1: Selección del oscilador. Mediante FOSC1 y FOSC0
controlamos el modo de oscilación que usará el PIC para funcionar. El oscilador se
puede configurar de 4 maneras distintas, dependiendo de la velocidad y del tipo de
circuito oscilador empleado.
o 00: Oscilador LP. (Low Power) Esta modalidad permite un descenso del
consumo en el PIC gracias a que la frecuencia de oscilación es menor que en
la configuración XT. Al igual que con XT y HS, necesitaremos un cristal de
cuarzo (de 32 a 200 KHz) y dos condensadores.
o 01: Oscilador XT. Tendremos que disponer de un cristal de cuarzo y dos
condensadores. Esto permitirá generar los pulsos necesarios para el
microcontrolador con una frecuencia determinada. La exactitud es muy alta,
por lo que se recomienda para casi todas las aplicaciones. El valor del cristal
generalmente será de 4 Mhz (como máximo) y los condensadores serán
cerámicos de entre 15 y 33 nF.
o 10: Oscilador HS. Para cuando necesitemos aplicaciones de alta velocidad,
entre 4 y 20 Mhz. Este montaje se basa también en un cristal de cuarzo,
como el XT.
o 11: Oscilador RC. Este es el sistema más sencillo y económico. Se basa en
un montaje con una resistencia y un condensador. La velocidad a la que
oscile el PIC dependerá de los valores del condensador y de la resistencia.
La máxima frecuencia que podremos emplear con este sistema será de
5.5MHz (con el PIC16F84A-20).
Existen dos maneras de programar la palabra de configuración:
a) Cuando se programa el PIC. En todos los programadores es posible activar o
desactivar estas opciones a nuestra conveniencia. En la figura 2.22 puede verse una
captura del programa IC-Prog en donde se resalta el área donde se realiza la
implementación de la palabra de configuración.
Figura 2.22. Vista del software programador IC-Prog. El recuadro rojo muestra la zona
donde se implementa la palabra de configuración.
b) Activación por código. La línea de memoria de configuración es creada por el
programa ensamblador con los valores por defecto. Podemos hacer que estos
valores cambien introduciendo una línea de código en el código. Este código está
contenido en el fichero que incluimos en la cabecera (P16F84A.INC):
_CP_ON EQU H'000F Activa code protect
_CP_OFF EQU H'3FFF Desactiva code protect
_PWRTE_ON EQU H'3FF7 Activa power on reset
_PWRTE_OFF EQU H'3FFF Desactiva power on reset
_WDT_ON EQU H'3FFF Activa Watchdog
_WDT_OFF EQU H'3FFB Desactiva Watchdog
_LP_OSC EQU H'3FFC Oscilador LP
_XT_OSC EQU H'3FFD Oscilador XT
_HS_OSC EQU H'3FFE Oscilador HS
_RC_OSC EQU H'3FFF Oscilador RC
Como podemos ver los nombres de las etiquetas son bastante intuitivos. Este código
debe situarse al principio del programa, después del tipo de PIC a usar y de la
definición de las etiquetas. La línea de configuración siempre comienza con la
directriz __CONFIG y cada opción debe estar separada de otra con el carácter &.
Por ejemplo:
#INCLUDE <P16F84A.INC> ;Fichero de etiquetas del microcontrolador
; Bits de configuración.
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON
En el ejemplo, Code Protect y Watchdog Timer están desactivados, Power on Reset
en cambio está activado, y el cristal usado no supera los 4 MHz.
Cuando carguemos el archivo de programa del PIC en el programador (por ejemplo,
en IC-Prog), estarán marcadas las opciones que hemos configurado en el código.
Aunque lo hayamos hecho así, podemos cambiar estas opciones en la ventana del
programador.
2.5. Instrucciones del microcontrolador.
Los 16F87X cuentan con 35 instrucciones, las cuales están divididas entre instrucciones
orientadas a registros, orientadas a bits y orientadas a control. Por medio de estas, se crea el
programa en lenguaje Ensamblador (assembler) respetando la sintaxis necesaria para cada
una.
2.5.1. Instrucciones orientadas a bits
Este grupo de instrucciones actúa directamente sobre un bit específico de cualquier registro.
Con ellas es posible escribir o leer un bit para luego tomar decisiones de acuerdo al
resultado.
Tabla 4. Instrucciones para el manejo de bits
Sintaxis Descripción Ciclos
BCF f,b Pone en "0" el bit b del registro f 1
BSF f,b Pone en "1" el bit b del registro f 1
BTFSS f,b Lee el bit b del registro f 1 (2 si salta)
BTFSC f,b Lee el bit b del registro f 1 (2 si salta)
2.5.2. Instrucciones orientadas a Registros
Este tipo de instrucciones maneja registros directamente, es decir, con estas instrucciones
vamos a poder asignarle valores a cada registro, operar matemáticamente con ellos, operar
con lógica booleana entre ellos, etc.
Tabla 5. Instrucciones para el manejo de registros
Sintaxis Descripción Ciclos
ADDWF f,d Suma el contenido del registro W con el de f 1
ANDWF f,d Realiza la operación lógica AND entre el contenido del registro W con el de f 1
CLRF f Borra el contenido del registro f 1
CLRW Borra el contenido del registro W 1
COMF f,d Niega el valor del registro f 1
DECF f,d Decrementa en una unidadel contenido del registro f 1
Decrementa en una unidad el contenido del registro f y salta la instrucción siguiente si
DECFSZ f,d 1 (2 si salta)
es cero.
INCF f,d Incrementa en una unidadel contenido del registro f 1
Incrementa en una unidad el contenido del registro f y salta la instrucción siguiente si
INCFSZ f,d 1 (2 si salta)
es cero.
IORWF f,d Realiza la operación lógica OR entre el contenido del registro W con el de f 1
MOVF f,d Mueve el contenido del registro f 1
MOVWF f Mueve el contenido del registro W al registro f 1
NOP No realiza ninguna operación 1
RLF f,d Rota el contenido del registro f hacia la izquierda a través del carry bit 1
RRF f,d Rota el contenido del registro f hacia la derecha a través del carry bit 1
SUBWF f,d Resta el contenido del registro W al registro f 1
SWAPF f,d Intercambia los cuatro primeros bits con los cuatro últimos del registro f 1
XORWF f,d Realiza la operación lógica XOR entre el contenido del registro W con el de f 1
Todas las operaciones se guardan en:
El registro W si d=0
El registro f si d=1
Para el caso de RLF y RRF el bit opuesto al rotado se pone en 0
2.5.3. Instrucciones orientadas al control del flujo del proceso
Este juego de instrucciones nos permite controlar algunos registros y funciones específicas.
También estas instrucciones se utilizan para guardar algún valor determinado en un registro
o hacer operaciones matemáticas y lógicas entre un registro y un valor cualquiera que no
necesariamente esté guardado en un registro, es decir un valor literal.
Tabla 6.Instrucciones para el control del flujo de proceso
Sintaxis Descripción Ciclos
ADDLW k Suma el valor k al registro W 1
ANDLW k Realiza la operación lógica AND entre el valor k y el registro W 1
CALL k Llamada a la subrutina k 2
CLRWDT Limpia el WD-Timer 1
GOTO k Salto incondicional a la etiqueta k 2
IORLOW k Realiza la operación lógica OR entre el valor k y el registro W 1
MOVLW k Guarda en el registro W el valor k 1
RETFIE Retorno de una interrupción 2
RETLW Retorno de una subrutina con el valor k en el registro W 2
RETURN Retorno de una subrutina 2
SLEEP Se pone el PIC en estado de reposo (dormido) 1
SUBLW k Resta el valor k al registro W 1
XORLW Realiza la operación lógica XOR entre el valor k y el registro W 1
2.6. Ejemplo de uso de instrucciones en Ensamblador
Mostramos a continuación como ejemplo de un programa básico en Ensamblador, cuya
finalidad es en este caso establecer el modo de operación de los puertos.
De la teoría que se ha visto en esta unidad tenemos que los registros importantes en la
configuración de los puertos son:
STATUS dirección 0x3
PORTA dirección 0x5
PORTB dirección 0x6
TRISA dirección 0x5
TRISB dirección 0x6
Por defecto el PIC tendrá todos los I/O port's (es decir los puertos RA y RB), colocados
como entrada de datos, y si queremos cambiarlos habrá que configurarlos en los registros
correspondientes. Para lograrlo debemos tener en cuenta que:
Si se asigna un CERO (0) a un pin, éste quedará como salida.
Si se asigna un UNO (1), quedará como entrada.
Y que ésta asignación se hace en:
TRISA para los pines del PUERTO A (5 bits), por ejemplo, si TRISA es igual a
11110 todos sus pines serán entradas salvo RA0 que esta como salida.
TRISB para los pines del PUERTO B (8 bits), por ejemplo, si TRISB es igual a
00000001 todos sus pines serán salidas salvo RB0 que esta como entrada.
Ahora bien, cuando el PIC arranca se encuentra en el BANCO 0, pero TRISA y TRISB
están en el BANCO 1, por lo que deberemos cambiar de banco para hacer el cambio. Esto
se logra a través del Registro STATUS:
Colocando un CERO (0) en RP0 estaremos en el BANCO 0.
Colocando un UNO (1) en RP0, estaremos en el BANCO 1.
Ejercicio 2.1. Escribir las instrucciones necesarias para lograr que los tres bits menos
significativos del puerto A funcionen como salidas, y los cuatro bits más significativos del
puerto B deben comportarse como salidas, el resto en ambos puertos deben ser entradas.
Solución: En primer lugar, debemos cambiar de banco:
bsf 0x03,5
Cargamos en el acumulador el valor en binario necesario para configurar el
puerto A:
movlw b'11000'
Trasladamos el dato hacia el registro TRISA:
movwf 0x85
Cargamos el valor binario correspondiente:
movlw b'00001111'
Trasladamos el valor hacia el registro TRISB
movwf 0x86
Finalmente, volvemos al banco 0:
bcf estado,5
Aunque el ejercicio 2.1 ejemplifica como gestionar los registros de la memoria del
microcontrolador para configurar los puertos, no es aún un código ejecutable en el circuito
integrado. El siguiente ejercicio presenta un programa ejecutable por el microcontrolador
que implementa las acciones del ejercicio 2.1.
Ejercicio 2.2. En el siguiente código identifique el segmento en el que se han incluido las
instrucciones del ejercicio 2.1. Busque en las hojas de datos o en la bibliografía la
finalidad de las instrucciones que desconozca, o asesórese de su docente.
;-------------------------------------------------------------------
; PROGRAMA DE CONFIGURACIÓN DE PUERTOS
;-------------------------------------------------------------------
#include p16f84a.inc
;--------------------Variables------------------------------------
ESTADO equ 0x03
CONFIGPTOA equ 0x05
CONFIGPTOB equ 0x06
;----------------Configuración de reset------------------------
org 0x00
RESET goto INICIO
;--------------Configuración de puertos-----------------------
org 0x05
INICIO bsf ESTADO,5
movlw b'11000'
movwf CONFIGPTOA
movlw b'00000000'
movwf CONFIGPTOB
bcf ESTADO,5
;-------------------------------------------------------------------
end
;-------------------------------------------------------------------
3. Características eléctricas del microcontrolador
En esta unidad el alumno:
Analiza las características eléctricas del microcontrolador.
3.1. Distribución de terminales
El 16F84A está fabricado en tecnología CMOS, es de muy bajo consumo de potencia, y es
de memoria estática FLASH.
El encapsulado más común para estos microcontroladores es el DIP (Dual In line Pin) de 18
pines, y utiliza un reloj de 4 o de 20 MHz (cristal de cuarzo). Existe también en
encapsulado tipo Surface Mount (montaje superficial) el cual es mucho más pequeño
(figura 3.1).
Figura 3.1. Encapsulados del 16F84A.
La distribución de sus terminales se presenta en la figura 3.2.
Figura 3.2. Distribución de terminales del 16F84A.
La descripción de pines es la que sigue.
Pines 1, 2, 3 17 y 18 RA0-RA4/TOCKI: Es el PORTA (puerto A). Corresponden a 5
Iíneas bidireccionales de E/S. Es capaz de entregar niveles TTL cuando la tensión de
alimentación aplicada en VDD es de 5V + 5%. El pin RA4 como entrada puede programarse
en funcionamiento normal o como entrada del contador/temporizador TMR0.
Pin 4 - MCLR / Vpp: Es una terminal de múltiples aplicaciones, es la entrada de Reset si
está a nivel bajo y también es la habilitación de la tensión de programación cuando se está
programando el dispositivo. Cuando su tensión es la de V DD el PIC funciona normalmente,
si se manda a masa el PIC reinicia su funcionamiento.
Pines 5 y 14 - VSS y VDD: Son respectivamente las patas de masa y alimentación. La
tensión de alimentación de un PIC está comprendida entre 2V y 6V, aunque se recomienda
no sobrepasar los 5.5V.
Pines 6, 7, 8, 9, 10, 11, 12, 13 RB0-RB7: Es el PORTB (puerto B). Corresponden a ocho
líneas bidireccionales de E/S. Pueden manejar niveles TTL cuando la tensión de
alimentación aplicada en VDD es de 5V ± 5%. RB0 puede programarse además como
entrada de interrupciones externas INT. Los pines RB4 a RB7 pueden programarse para
responder a interrupciones por cambio de estado. Las patas RB6 y RB7 se corresponden
con las líneas de entrada de reloj y entrada de datos respectivamente, cuando está en modo
programación del integrado.
Pines 15 y 16 OSC1/CLKIN y OSC2/CLKOUT. Corresponden a los pines de la entrada
externa de reloj y salida de oscilador a cristal respectivamente.
3.2. Características del reloj del sistema
Todo microprocesador o microcontrolador requiere de una señal de reloj que sincronice su
funcionamiento. Esta señal se obtiene mediante un oscilador de frecuencia. Existen
microcontroladores que tienen un oscilador interno y no requieren de componentes
externos. El microcontrolador PIC16F84 requiere de un circuito externo de oscilación o
generador de pulsos de reloj.
En el momento de programar el microcontrolador se deberá especificar en los parámetros el
tipo de oscilador que utilizamos en el circuito electrónico. En ese momento, se programan
dos bits de configuración denominados FOSC1 y FOSC2. Por ejemplo, si la frecuencia de
trabajo es de 20 MHz entonces la configuración del microcontrolador deberá estar en "HS";
pero si la frecuencia de trabajo es de 4 MHz entonces la configuración del microcontrolador
deberá estar en "XT".
Existen 4 modos de oscilador para el PIC16F84A. Tres utilizan cristal de cuarzo (LP, XT y
HS) y la cuarta utiliza una resistencia y un condensador (RC).
Relacionados con los modos de oscilador y la frecuencia máxima a la que el PIC podrá
trabajar tenemos 3 versiones del PIC16F84A:
El PIC16LF84A-04, ideal para aplicaciones de bajo consumo, puede trabajar con
una Vdd de 2 a 5,5 voltios en los modos LP, XT y RC, pero no dispone del modo
HS. Puede utilizarse en el modo LP para frecuencias entre 0 y 200 KHz, en el modo
XT para frecuencias entre 100 KHz y 2 MHz y en el modo RC desde 0 hasta 2
MHz.
El PIC16F84A-04, para aplicaciones generales, puede trabajar en los cuatro modos.
En el modo LP para frecuencias entre 32 KHz y 200 KHz, en el modo XT para
frecuencias entre 100 KHz y 4 MHz y en el modo RC hasta 4 MHz. Puede trabajar
con una Vdd de 4 a 5,5 voltios en los modos XT, LP y RC, pero el rango se acorta
de 4,5 a 5,5 voltios con el modo HS.
El PIC16F84A-20 se reservará normalmente para el modo HS y frecuencias entre 4
MHz y 20 MHz. Puede trabajar con una Vdd de 4 a 5,5 voltios en los modos XT,
LP y RC, pero el rango se acorta de 4,5 a 5,5 voltios con el modo HS.
3.2.1. Modo oscilador XT, LP y HS
El circuito que implementa este modo se muestra en la figura 3.3. La condición más
importante para que este oscilador funcione es que los condensadores C1 y C2 deberán ser
iguales. En una tabla más adelante están reflejados algunos valores de los condensadores
C1 y C2. Debe utilizarse una resistencia en serie (Rs) para cristales AT de corte en tira,
aunque no es indispensable.
Figura 3.3. Circuito para oscilador a cristal.
La siguiente tabla presenta una selección de capacitores para la configuración de
osciladores a cristal.
Tabla 7. Selección de cristales para osciladores a cristal.
Modo Frecuencia OSC1/C1 OSC2/C2
32 Khz 68 - 100 pF 68 - 100 pF
LP
200 Khz 15 - 33 pF 15 - 33 pF
100 Khz 100 - 150 pF 100 - 150 pF
XT 2 Mhz 15 - 33 pF 15 - 33 pF
4 Mhz 15 - 33 pF 15 - 33 pF
4 Mhz 15 - 33 pF 15 - 33 pF
HS
20 Mhz 15 - 33 pF 15 - 33 pF
Para una VDD > 4,5 V, se recomienda que C1 = C2 = 33 pF.
3.2.2. Modo oscilador RC
Es el más económico por que tan solo se utiliza un condensador no polarizado y una
resistencia. Es adecuado para las aplicaciones donde las temporizaciones no requieran
precisión. La frecuencia depende de:
La tensión de alimentación
El valor de la resistencia
El valor del condensador
La temperatura de funcionamiento
Además de esto, la frecuencia de oscilación puede variar de un microcontrolador a otro
debido a variaciones en algunos parámetros en la fabricación de cada integrado. También
han de tenerse en cuenta la variación debidas a la tolerancia de la resistencia y condensador
utilizados. Incluso las capacidades parasitas que puedan aparecer, como el trazado de las
pistas o con los contactos del zócalo donde va insertado el microcontrolador pueden afectar
a la frecuencia de la oscilación, sobre todo si se utilizan condensadores de pequeño valor.
En general las variaciones de la frecuencia de oscilación son mayores cuanto mayor sea R y
menor sea C.
En la figura 3.4. aparece como debe conectarse el circuito RC al PIC.
Figura 3.4. Circuito oscilador en modo RC.
Los valores de R deben estar comprendidos entre 5 y 100 K , mientras que los valores de
C no deben ser inferiores a 20 pF. Es importante saber que, para valores de resistencia
menor a 5 K , el sistema se hace inestable o se podría detener la oscilación
completamente. Para valores de resistencias mayores a 100 K (por ejemplo 1 MOhmio),
el oscilador se hace muy susceptible al ruido, humedad y a la temperatura por lo tanto se
recomienda que este tipo de oscilador se encuentre en el siguiente rango (5K < R < 100
K . Por otro lado, se recomienda utilizar un condensador no polarizado mayor de 20 pF
para disminuir el ruido y aumentar la estabilidad del sistema. La frecuencia del oscilador,
dividida por 4, está disponible en el terminal OSC2/CLKOUT y puede utilizarse para
comprobar la frecuencia o para sincronizar otros dispositivos.
A continuación, se muestran algunos gráficos que muestran valores de frecuencia de
oscilación según el condensador y la resistencia. También es importante saber que la
tensión de alimentación que tendrá el microcontrolador influye directamente en la
frecuencia final. Las siguientes figuras muestran la frecuencia obtenida en base al voltaje de
alimentación y la configuración de resistencias y condensador.
Figura 3.5. Frecuencias obtenidas para varias resistencias y un capacitor de 300pF.
Figura 3.6. Frecuencias obtenidas para varias resistencias y un capacitor de 100 pF.
Figura 3.7. Frecuencias obtenidas para varias resistencias y un capacitor de 22 pF
Si nos damos cuenta, para algunos valores del voltaje, el valor de frecuencia se hace
verdadero para la expresión de la frecuencia que da la fórmula: . Donde C está
expresado en Faradios y R en Ohmios. Por desgracia el punto en el que coincide la
frecuencia y el voltaje no es lineal para todos los valores de V.
3.2.3. Oscilador externo
A continuación, se exponen dos configuraciones que se pueden emplear con tres de los
cuatro modos de funcionamiento: XT, HS ó LS. En ambos casos se utiliza un oscilador
externo.
Conviene recordar que, según la frecuencia de la señal inyectada, debemos usar la opción
LP para frecuencias comprendidas entre 32 y 200 KHz, la opción XT para frecuencias
situadas entre los 100 KHz y los 4 MHz, y la opción HS para frecuencias comprendidas
entre 4 y 20 MHz (dependiendo esta última de la velocidad máxima permitida por el PIC).
Señal de reloj externa: En ciertas ocasiones disponemos una fuente de reloj que proviene
de una fuente externa como puede ser un oscilador TTL o CMOS. La onda generada por
esta fuente externa puede servir para poner en funcionamiento el PIC. En la siguiente figura
tenemos la forma de conexionar la entrada digital a través de un inversor lógico.
Figura 3.8. Conexión de una señal de reloj externa.
Como se puede observar, todos los circuitos oscilatorios que se conectan al PIC a través de
una sola patilla, van conectadas a la entrada OSC1, dejando la entrada OSC2 abierta.
El oscilador TTL es un dispositivo basado en un cristal que contiene toda la circuitería para
generar una onda cuadrada. Al incluir toda la circuitería esto lo convierte en la opción más
costosa; pero permite una precisión óptima en la señal de reloj emitida.
Estos tipos de cristales están diseñados especialmente para tecnologías TTL. Las
frecuencias disponibles para esta versión de cristal son muy amplias y las más usuales son
1, 1.8432, 2, 4, 8, 10, 11.059, 12, 14.31818, 16, 20, 25, 32, 33, 40, 50, 80 y 100 MHz. En la
figura 3.9 se muestra como debe conectarse este dispositivo al microcontrolador.
Figura 3.9. Un modelo de oscilador TTL y su conexión al PIC16F84A.
3.3. El Reset y sus fuentes
Un reset puede ser provocado por 3 causas diferentes que dan origen a 5 modos:
Conexión de la alimentación al PIC POR (Power On Reset).
Activando la patilla MLCR mientras el PIC está en modo normal.
Activando la patilla MLCR mientras el PIC está en modo SLEEP.
Cuando se ejecuta un reset, se producen dos acciones importantes.
El contador de programa se vuelve a colocar en el principio del programa (0000 h).
Los registros modificados vuelven a su estado por defecto.
Un desbordamiento del WDT mientras el PIC está en modo normal.
Un desbordamiento del WDT mientras el PIC está en modo SLEEP.
En todos los casos, salvo en el quinto, el contador de programa PC se pone a 0000 h (vector
de reset), donde debe encontrarse la primera instrucción ejecutable del programa. Además,
todos los registros específicos (SFR) son colocados en estados predeterminados (ver Estado
predeterminado de los registros específicos en Registros del PIC16F84A, sección 2.2.4).
En el quinto caso, cuando se produce un desbordamiento del WDT mientras el PIC está en
modo SLEEP, no se produce un reset propiamente dicho, sino que el PIC se sale del modo
SLEEP, se "despierta" mediante el temporizador watchdog y el PC se incrementa en una
unidad para pasar a la instrucción que sigue a la instrucción SLEEP, igual que cuando se
sale de este modo mediante una interrupción, si el bit GIE del registro INTCON está a uno.
3.3.1. Reset a la alimentación
Los distintos modos de provocar un reinicio por alimentación (Power On Reset, POR) de
una bandera son:
Power-up Timer (PWRT). Es un sistema interno del microcontrolador que lo
mantiene reseteado durante unos 72 ms hasta que se estabilice la tensión de
alimentación. Utiliza un circuito oscilador RC interno y un contador para conseguir
ese tiempo.
El tiempo en que está activo PWRT puede ser distinto entre distintos PIC, según el
valor de Vcc, la temperatura y otras variables.
PWRT puede ser habilitado/deshabilitado mediante el bit de configuración PWRTE,
recomendándose su activación (ver Palabra de configuración, sección 2.4).
Oscillator Start-up Timer (OST). Es un temporizador interno que proporciona un
retardo de 1024 ciclos del oscilador después de que termine el retardo que
proporciona PWRT. Se utiliza para mantener reseteado al microcontrolador para
asegurarse que la oscilación del cristal de cuarzo o resonador se ha iniciado y se ha
estabilizado. OST actúa solamente si se utilizan los modos XT, LP y HS y cuando
se alimenta al PIC o cuando se despierta desde el modo SLEEP.
Teniendo en cuenta lo que hemos visto sobre POR, PWRT y OST, la secuencia que se
sigue si PWRT y OST están habilitados es:
PWRT actúa después de que POR termine.
OST actúa después de que PWRT termine.
El tiempo total variará según el modo del oscilador y la configuración de PWRTE. Por
ejemplo, en el modo RC con PWRT deshabilitado el tiempo de reset será mínimo. Lo
anterior se expresa mejor en la siguiente tabla.
Tabla 8. Secuencias del Reset.
Configuración oscilador Alimentación Despertar desde SLEEP
PWRT habilitado PWRT deshabilitado
XT, HS, LP 72 ms + 1024 TOSC 1024 TOSC 1024 TOSC
RC 72 ms - -
También se puede construir un circuito externo de reset a la alimentación (figura 3.10).
Figura 3.10. Circuito para implementar un reset externo:
Este circuito de reset a la alimentación externo es únicamente necesario si la subida de la
tensión de alimentación es muy lenta.
Algunas reglas básicas para realizar este circuito son:
Es recomendable que R1 sea menor de 40 K para asegurarse que su tensión no
supere los 0,2 voltios cuando MCLR esté a nivel alto (la corriente máxima en la
la patilla MCLR.
Se recomienda que R2 esté entre 50 y 100 ohmios.
El diodo D1 ayuda a provocar una descarga rápida del condensador cuando se
elimina la alimentación.
Nota: Si en MCLR se aplica una tensión por debajo de VSS se pueden inducir corrientes
mayores de 80 mA, que pueden causar problemas. Para solucionar esto se coloca una
resistencia de 50 a 100 ohmios para aplicar un nivel bajo a la patilla MCLR en lugar de
llevar esta patilla directamente a VSS. En nuestro caso esta resistencia es R2.
Para terminar, habría que decir que, en la mayoría de los casos será más que suficiente con
conectar MCLR a la alimentación positiva (VCC) y usar los dispositivos de reset del PIC.
3.3.2. Reset manual
En el caso de que sea necesario se puede aplicar un reset manual a la patilla MCLR
mediante un pulsador y una resistencia. La figura 3.11 muestra una configuración básica
para realizar un reset manual.
Figura 3.11. Configuración para un reset manual.
La resistencia de 100 ohmios puede eliminarse del circuito al no existir peligro de que en
MCLR aparezcan tensiones menores de V SS. Pero debería mantenerse si se coloca un
condensador en paralelo al pulsador.
3.3.3. Origen del reset
Es posible distinguir por software el origen del reset, para lo que basta con leer los bits TO
(Timer Out) y PD (Power Down) del registro de estado como se muestra en la tabla
siguiente.
Tabla 9. Determinación de la fuente del Reset.
TO PD ORIGEN DEL RESET
0 0 Desbordamiento WDT en modo SLEEP. Se ha salido del modo SLEEP.
0 1 Desbordamiento WDT en modo normal.
1 0 Activación MCLR en modo SLEEP
Conexión de alimentación (POR)
1 1
Activación MCLR en modo normal
3.4. Características de la fuente de alimentación del MCU
El conexionado básico para las terminales de alimentación del 16F84A se presenta en la
figura 3.12. En ella se pueden apreciar las terminales de alimentación V DD (Voltaje
drenador) y VSS (Voltaje surtidor), la nomenclatura se debe a que el microcontrolador
emplea en su diseño transistores FET. Se incluye además la configuración para
implementar un reset manual.
Figura 3.12. Conexión básica de alimentación del 16F84A.
Las características eléctricas máximas del microcontrolador son:
Temperatura ambiente máxima para funcionamiento de -55°C to +125°C.
Tensión máxima de VDD respecto a VSS de -0,3 a +7,5V.
Tensión de cualquier patilla con respecto a V SS (excepto VDD, MCLR, y RA4) de
V a (VDD + 0.3V).
Tensión en MCLR con respecto a VSS -0,3 a +14V.
Tensión en RA4 con respecto a VSS -0,3 a +8,5V.
Disipación de potencia total de 800 mW.
Máxima corriente de salida a VSS 150 mA.
Máxima corriente de salida de VDD 100 mA.
, 50 mA.
Máxima corriente que puede suministrar una sóla salida como fuente o sumidero, 25
mA.
Rango de alimentación:
o 16LF84A: De 2 a 5,5 V en configuración de oscilador XT, RC y LP.
o 16F84A: De 4 a 5,5 v en configuración de oscilador XT, RC y LP; y de 4,5 a
5.5 v en configuración de oscilador HS.
Consumo típico:
o 16LF84A: de 1 a 4 mA en configuración de oscilador RC y XT (FOSC=2
(FOSC=32kHz, VDD=2V, WDT deshabilitado).
o 16F84A: de 1,8 a 4.5 mA en configuración de oscilador RC y XT (FOSC=4
MHz, VDD=5,5V); y de 3 a 10 mA en configuración de oscilador RC y XT
durante la programación de la FLASH (FOSC=4MHz, VDD=5,5V).
o 16F84A-20: de 10 a 20 mA en configuración de oscilador HS (FOSC=20
MHz, VDD=5,5V).
3.5. Ejemplo de circuitos osciladores empleando un reset
Como una práctica relativa al empleo de circuitos osciladores ponemos el caso de un
circuito contador síncrono ascendente.
De su curso de Electrónica Digital sabe que un circuito secuencial que pasa por una
secuencia preestablecida de estados después de la aplicación de pulsos se denomina
contador. Los pulsos de entrada, llamados pulsos de cuenta, pueden ser pulsos de un
dispositivo de reloj o pueden ser generados por alguna fuente externa, por lo que pueden
ocurrir a intervalos de tiempo específicos o aleatoriamente.
De las diferentes secuencias que un contador puede seguir, la secuencia binaria natural es la
más simple y la más directa. Un contador que sigue la secuencia binaria se llama contador
binario. A su vez un contador de n bits consiste en n flip-flops y puede contar en binario de
0 hasta 2n - 1. La secuencia de cuenta se repite una vez haya alcanzado el último valor.
Ejercicio 3.1. Retome la teoría del diseño secuencial de su curso de Electrónica Digital
para diseñar un circuito contado ascendente desde 0 hasta 9 que cuente con las siguientes
características:
Emplear circuitos osciladores 555 para generar la señal de reloj a una frecuencia
adecuada para la visualización de los valores.
Emplear dispositivos TTL de preferencia y CMOS en su defecto.
Poseer dos señales de control:
o E (ENABLE). Habilitador de conteo.
E=0, conteo ascendente, desde el número en retención por pausa.
E=1, pausa el conteo.
o R (RESET). Reinicio del conteo.
R=0, conteo normal (ascendente).
R=1, reinicia el conteo desde 0.
Visualizar las salidas en un display de 7 segmentos, se permite el uso del CI
decodificador BCD correspondiente.
Debe entregarse el arreglo implementado físicamente donde se evaluará un arreglo de
circuito organizado y limpio en protoboard y la funcionalidad de las características
solicitadas.
Agregue un reporte electrónico donde deberá incluir:
Hoja de presentación.
Introducción.
Planteamiento del problema.
Desarrollo de la Solución conteniendo: diagramas y tablas de estado; mapas de
Karnaugh y ecuaciones de estado; diagrama del circuito lógico; simulación en
Proteus; listado de material utilizado en la implementación física; evidencias de la
operación óptima de la implementación física (fotografías).
Conclusiones.
4. Herramientas de desarrollo de los microcontroladores
En esta unidad el estudiante:
Utiliza las herramientas de desarrollo de los microcontroladores.
4.1. Lenguajes de bajo y de alto nivel
Antes de proceder a la realización de proyectos de aplicación primero debemos identificar a
los lenguajes de programación en función de la manera en que son capaces de implementar
instrucciones en un dispositivo programable.
Un lenguaje de bajo nivel está formado por instrucciones de bajo nivel de abstracción con
respecto del dispositivo a programar. Tales instrucciones de orden aritmético-lógicas no se
encuentran encapsuladas en funciones, a menos que estén ya contempladas en la
arquitectura del hardware. Las palabras para las instrucciones usan abreviaturas del inglés,
también llamadas palabras nemotécnicas, tales como: ADD, DIV, SUB, etc. Los lenguajes
de este tipo son denominados Ensambladores.
Características:
Las instrucciones están completamente relacionadas con la arquitectura del
dispositivo a programar.
Se aprovecha al máximo la potencia de la computadora al estar obligado a realizar
un uso óptimo de las instrucciones disponibles.
Al tener acceso directo a los recursos del dispositivo se maximiza la velocidad.
Al depender de la arquitectura del dispositivo la portabilidad de un programa es
mínima.
El nivel de abstracción es mínimo por depender de la manera en que se ha
implementado el hardware.
El uso del lenguaje requiere de máxima atención y de estar organizada en base a los
esquemas del dispositivo y del objetivo de la aplicación.
Un lenguaje de alto nivel permite al programador escribir las instrucciones de un
programa utilizando palabras o expresiones sintácticas muy similares al inglés. Por
ejemplo, en C se pueden usar palabras tales como: case, if, for, while, etc. Los lenguajes de
alto nivel buscan la independencia del tipo de máquina y se aproximan al lenguaje natural.
Características:
Genera un código más sencillo y comprensible.
El código es válido para diversas máquinas y, posiblemente, para diversos sistemas
operativos.
Reducción de velocidad al ceder el trabajo de bajo nivel a la máquina.
Algunos requieren que la máquina cliente posea una determinada plataforma.
El lenguaje natural de los microcontroladores es el Ensamblador, el cual, de acuerdo con lo
descrito, es distinto entre fabricantes, y por lo general, entre los modelos de un mismo
fabricante. Sin embargo, es posible programarlos usando lenguajes de alto nivel
específicamente modificados para este fin.
4.2. Ambiente integrado de desarrollo para microcontroladores
Un entorno de desarrollo integrado o entorno de desarrollo interactivo (en inglés Integrated
Development Environment (IDE)), es una aplicación informática que proporciona servicios
integrales para facilitarle al desarrollador o programador el desarrollo de software.
(a) (b)
(c)
(d)
: (a) Proteus VSM Studio; (b) PIC
Simulator IDE; (c) MPLABX; (d) CCSC Compiler
Normalmente, un IDE consiste de un editor de código fuente, herramientas de construcción
automáticas y un depurador. La mayoría de los IDE tienen auto-completado inteligente de
código (IntelliSense) y pueden incluir un compilador. En el caso de los microcontroladores
existen varios IDE que además de las prestaciones comentadas pueden incluir simuladores.
Así podemos citar a Proteus VSM Studio, PIC Simulator IDE, MPLABX IDE, (figura 4.1).
4.2.1. Ensamblador y compilador
El editor de código con el que viene equipado el IDE permite escribir el texto en formato
plano (ASCII) cuya extensión es *.asm (algorithmic state machine) mismo que deberá ser
llevado a un compilador para verificar su estructura y sintaxis de tal forma que sea posible
obtener el código objeto ejecutable por el microcontrolador (archivos que tienen por
extensión *.hex, por su contenido en formato hexadecimal).
En los microcontroladores PIC el compilador para el lenguaje ensamblador es el MPASM,
s de
lenguajes de alto nivel, entonces ocurre que por lo general en un mismo ambiente de
desarrollo pueden convivan varios compiladores de ese orden, entre los que podemos citar
a:
. Es un compilador basado en el lenguaje Basic
producido por microEngineering Labs, Inc. Se promociona como un estándar para
la industria. Mantiene versiones de paga y una versión limitada estudiantil sin costo.
CCS C Compiler. Es un compilador basado en el lenguaje C producido por Custom
Computer Services, Inc. Declara ser un compilador fácil de usar y de rápido
aprendizaje. Es completamente de pago.
MPLAB® XC Compiler. Es también un compilador basado en C, desarrollador por
e uso
por 60 días.
4.2.2. Simulador, depurador y emulador
Distinguimos estos conceptos diciendo que:
Un simulador es la representación de un dispositivo o arreglo físico en software
que pretende proporcionar una funcionalidad similar, pero sin utilizar ningún
dispositivo de hardware. En el caso de un programa para microcontrolador el código
se ejecuta en el entorno IDE simulando el procesador en software. Un ejemplo muy
claro de la ejecución simulaciones la provee el módulo ISIS de Proteus (figura 4.2).
Figura 4.2. Simulación en Proteus ISIS.
Un depurador (en inglés debugger) es igualmente una especie de simulación que
ofrece un acceso equivalente utilizando el hardware de depuración en el chip con
los procesadores de producción estándar, aunque igualmente puede hacerse por
software. Ofrece la posibilidad de realizar pausas en la ejecución y hacer puntos de
prueba sobre la marcha, así como pruebas por línea en código. La empresa
Microchip oferta dispositivos depuradores en dispositivo (In-Circuit Debugger)
conocidos como MPLAB ICD (figura 4.3).
Figura 4.3. Depurador MPLAB ICD 3.
Un emulador tradicionalmente imita al procesador mediante el uso de un
procesador de enlace de salida conectado a un zócalo, donde normalmente se coloca
el procesador objetivo. Este procesador de salida tiene muchas señales internas
implementadas para proporcionar información sobre el estado del procesador. Los
sistemas modernos utilizan el procesador objetivo directamente con el acceso JTAG
(interfaz ICSP). Un ejemplo de estos dispositivos se muestra en la figura 4.4.
Figura 4.4. Dispositivo de emulación MPLAB REAL ICE.
4.2.3. Dispositivos programadores de microcontroladores
Llamados coloquialmente también quemadores, grabadores, y en inglés, downloaders, los
programadores de microcon
nuestra aplicación (archivo *.hex) en el circuito integrado.
con sus diversas familias, a los cuales ha denominado PIC kit (figura 4.5).
Figura 4.5. Grabador PICkit 3
La ventaja fundamental de adquirir el producto oficial radica en que garantiza las
posteriores actualizaciones que pudieran hacerse al controlador del dispositivo, además de
ofrecer compatibilidad con otros accesorios producidos por el fabricante. La desventaja
fundamental consiste en su alto coste, que generalmente se suele cotizar en dólares en el
mercado mexicano.
Existen grabadores fabricados por terceros que tienen una funcionalidad limitada por ser
compatibles sólo con algunos modelos de microcontroladores, o por las continuas
actualizaciones que realiza el fabricante sobre el lenguaje y las directivas de configuración
del microcontrolador. Sin embargo, siempre es posible adecuar el código de tal forma que
estos dispositivos sean utilizables, lo que representa una ventaja al considerar su costo.
Ejemplos de estos grabadores, disponibles a la fecha de elaboración de este texto (Junio de
2016) se visualizan en la figura 4.6.
VOLNIA USP 3.0 MicroProg R2
MASTER PROG PIC K150
4.3. Ejemplos básicos de programación
Proponemos ahora el desarrollo de una aplicación que nos permita visualizar en lo general
el uso de las herramientas de desarrollo. Para ello debemos considerar algunas
convenciones:
Los ficheros de código fuente llevarán la extensión *.ASM
Los ficheros de listado llevarán la extensión *.LST
Los ficheros de código objeto llevarán la extensión *.OBJ
Los ficheros de errores llevarán la extensión *.ERR
Los ficheros ejecutables en formato Intel Hex llevarán la extensión *.HEX
Comentario descriptivo del programa (utilizar una cabecera estandarizada).
Definir el microcontrolador que se usará dependiendo de la versión del compilador
utilizado (con las directivas LIST e INCLUDE).
Introducir las opciones de compilación (que serán vistas más adelante) (opcional).
Establecer las constantes que se usarán (con la directiva EQU).
Reservar espacios de memoria (directiva RES) (si es necesario).
Configurar los puertos.
Desarrollar el programa con comentarios, en lo posible explicando cada línea de
código.
Los mnemónicos escritos en minúscula y las constantes y variables en mayúscula
hacen que el código escrito sea más visible.
Colocar las rutinas en el mismo sitio, todas contiguas.
Dibujar diagramas de flujo o escribir seudocódigo.
La estructura fundamental de un programa se muestra en la figura 4.7.
Figura 4.7. Estructura fundamental de un programa en ensamblador.
También es importante notar la posición de los elementos del código organizado en cuatro
columnas (figura 4.8).
Figura 4.8. Organización de los elementos de código.
Una descripción de las columnas sería que
Las etiquetas:
o Deben situarse en la primera columna.
o Debe contener únicamente caracteres alfanuméricos.
o El máximo de caracteres es de 31.
En la columna de operación se situarán las instrucciones. El campo del código de
operación es el único que nunca puede estar vacío; éste siempre contiene una
instrucción o una directiva del ensamblador.
El campo de operandos o de dirección puede contener una dirección o un dato, o
puede estar en blanco. Normalmente contendrá registros o literales con los que se
operará (f, l o k, b y w).
El campo del comentario o de etiquetas es opcional. Aquí se situará cualquier
comentario personalizado que deseemos. Estos son útiles para saber qué hace un
programa sin tener que descifrar el código entero. El compilador (ensamblador)
ignorará todo texto más allá del carácter punto y coma ";".
Los comentarios generalmente se sitúan en la cuarta columna para describir la acción de
una línea de código, pero pueden situarse en cualquier parte de programa para describir
cualquier otro evento, siempre que estén después del carácter ";" (semicolon en inglés).
Normalmente las columnas son separadas por una tabulación. El espacio mínimo entre dos
columnas es de un carácter, que puede ser un espacio en vez de una tabulación.
En el caso de los delimitadores de campos en la estructura:
Los campos van separados sólo con espacios y/o tabulaciones. No agregue nunca
otros caracteres (comas, puntos, etc.)
No utilice espacios extra, particularmente después de comas que separan operandos.
Por ejemplo: movlw 5, w
No use caracteres delimitadores (espacios y tabulaciones) en nombres o etiquetas.
En cuanto a las etiquetas también es importante advertir que se sitúan a la izquierda de las
instrucciones y sirven para agrupar fragmentos de código. Estos fragmentos pueden ser de
dos tipos:
El primer tipo no es un fragmento tal cual, si no que es un punto del programa al
que podremos saltar de manera incondicional a través de la instrucción adecuada.
El segundo tipo es denominado subrutina. Este empieza con una etiqueta y acaba
con la instrucción RETURN o RETLW, que veremos más adelante.
Además:
La etiqueta es el primer campo en una línea en lenguaje ensamblador y puede no
existir.
Si una etiqueta está presente, el ensamblador la define como el equivalente a la
dirección del primer byte correspondiente a esa instrucción.
Esta etiqueta puede volver a usarse en otro lugar, pero como operando de una
instrucción. El ensamblador reemplazará ésta etiqueta por el valor asignada a la
línea de instrucción en que fue creada. Se usan frecuentemente en las instrucciones
de salto.
No puede existir más de una etiqueta en la primera columna o primer campo de
instrucción.
No pueden usarse como nombres de etiquetas a palabras ya reservadas por el
ensamblador (ORG, EQU, etc.) o nombres de instrucciones (movlw, call, nop, etc.)
Un ejemplo de uso de las etiquetas sería:
DATO EQU 05h
INICIO movlw DATO
goto INICIO
En el ejemplo la instrucción goto INICIO causa que la dirección de la instrucción con la
etiqueta INICIO (movlw) se cargue en el PC (Contador de Programa). Por lo tanto, ésta
instrucción será luego ejecutada.
No se permite el uso de números o caracteres no alfabéticos como primera letra de la
etiqueta. Como regla práctica: usar siempre letras, y en mayúscula, al menos la primera.
Ejemplos:
TABLA2X2 Permitido
+PESO NO permitido!
=>SALIDA NO permitido!
-SALTO NO permitido!
5ALFA NO permitido!
Dato1 Permitido
Dato2 Permitido
Loop_A Permitido
El ensamblador permite elegir con libertad el tipo de elemento a colocar en el campo de
operando o dirección.
En cuanto a los sistemas de numeración, el ensamblador admite distintos formatos, tal
como se muestra en la tabla siguiente.
Tabla 10. Sistemas numéricos en Ensamblador.
Hexadecimal Binario Octal Decimal
0A00h %01001011 @123 D'250'
$0A00 B'00100101' 123Q .250
01011010b
Ejemplo:
movlw .100 Significa cargar el número 100 decimal en el registro W.
Los nombres pueden aparecer en el campo de operando; éstos son tratados como el dato
que representan.
Algunos ensambladores permiten el uso de caracteres en ASCII. Por ejemplo:
data "hola 1,2,3" ;cadena de caracteres
data 'N' ;caracter sencillo
CHAR equ 't'
movlw 'R'
El ensamblador permite combinaciones de datos con operandos especiales, aritméticos o
lógicos. Éstos operandos se llaman expresiones.
Por ejemplo:
REG1 EQU 05h
VALOR EQU 20h
movlw VALOR+2
addwf REG1,1
addwf REG1+1,1
El resultado del ejemplo utilizará el resultado de sumar (VALOR+2) o (REG+1) como
operando.