You are on page 1of 32

Microcontrolador PIC16F84

Ing. Alejandro Carlos Florez

2007
VER:010108

MICROCONTROLADOR PIC16F84

PIC16F84
INDICE GENERAL

Pag. ndice General .............................................................................................................. 02 Diagrama de pines ....................................................................................................... 04 Diagrama interno microcontrolador ........................................................................... 04 Memoria de programa ................................................................................................. 05 Memoria de registros ................................................................................................... 06 A.L.U. .......................................................................................................................... 07 Registro de trabajo (W) ............................................................................................... 07 Contador de programa (PC) ........................................................................................ 07 Stack o Pila .................................................................................................................. 08 Subrutinas .................................................................................................................... 09 Interrupciones .............................................................................................................. 10 Los puertos de entradas y salidas ................................................................................ 11 Temporizador principal (TMR0) ................................................................................. 12 Watchtdog ................................................................................................................... 13 Reinicializacin o reset ............................................................................................... 14 Modo SLEEP o de reposo ........................................................................................... 15 Acceso indirecto a la memoria de registros ................................................................ 16 Memoria de datos (EEPROM) .................................................................................... 17 Registro STATUS. Estados ......................................................................................... 18 Registro OPTION. Opciones ...................................................................................... 19 Registro INTCON. Interrupciones .............................................................................. 20 Registros PORTA y PORTB. Puertos de entrada y salida de datos .......................... 21 Registros TRISA y TRISB. Seleccin de entrada o salida ........................................ 22 Registros EECON1. Control de lectura / escritura en la memoria EEPROM .............. 23 Formato de las instrucciones ....................................................................................... 24 Set de Instrucciones ..................................................................................................... 25

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

2
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

INTRODUCCION
Desde la invencin del circuito integrado, el desarrollo constante de la electrnica digital ha dado lugar a dispositivos cada vez ms complejos, entre ellos los microprocesadores y los microcontroladores de amplio uso en la electrnica actual. Ante la imposibilidad de conocer con profundidad todas las marcas y familias de microcontroladores existentes en el mercado, es importante detenerse en uno de estos modelos para su completo estudio y aprendizaje. Este conocimiento, junto con los aspectos bsicos de los restantes, nos permitir hacer una adecuada seleccin en el momento de encarar un proyecto electrnico determinado. De todas forma el funcionamiento interno y la programacin de este tipo de dispositivos no presenta grandes cambios entre distintos modelos, una ves que se a comprendido el funcionamiento de uno de ellos, los conocimientos adquiridos son fcilmente migrados a otras marcas. Se ha seleccionado para su estudio, un microcontrolador de la empresa Microchip, modelo PIC16F48, debido a su profunda penetracin en el mercado, su bajo costo y la gran cantidad de documentacin escrita y electrnica relacionada con este. Debido a la complejidad interna de los microcontroladores es difcil abordar la descripcin de un sector sin hacer referencia a otras partes del dispositivo, aun cuando estas todava no han sido detalladas, esto se debe a la fuerte interrelacin que existe entre los distintas bloques que forman estos controladores, asociados directa o indirectamente por su configuracin interna y el software cargado. Este apunte no escapa a la situacin descripta anteriormente, pero es ms ventajoso seleccionar un tema y detallarlo con profundidad, aun con el riesgo de nombrar partes o procedimientos analizados mas adelante, frente al beneficio de concentrar en un solo sector del texto descripciones completas que sern de fcil acceso para consultas y estudio posteriores. En un primer contacto, esta distribucin de la informacin, har ms compleja su comprensin, pero facilitara en gran medida las lecturas posteriores. Como mtodo de estudio es conveniente un primer anlisis con profundidad de cada seccin del informe, dejando de lado trminos desconocidos o partes detalladas mas adelante. Una vez que se han conocido los aspectos bsicos del microcontrolador se debe proceder a una relectura de todo el apunte buscando el entendimiento global del funcionamiento del dispositivo. Para finalizar, es recomendable un estudio orientado a: 1. Entender el funcionamiento bsico del microcontrolador. 2. Recordar en forma elemental la funcin de cada una de sus partes. 3. Entender el potencial de este controlador para una posterior seleccin frente a un proyecto electrnico. 4. Restar importancia a datos tcnicos o detalles especficos que puedan ser encontrados en el manual correspondiente.

3
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

DIAGRAMA DE PINES

MICROCONTROLADOR PIC16F84 OSC1/CLKIN : Entrada para el oscilador con cristal / Entrada de clock externo. OSC2/CLKOUT : Salida para el oscilador a cristal / Salida del clock interno MCLR : Reset general del microprocesador / Entrada de tensin externa para la Programacin. RA0 : Entrada o salida de datos. RA1 : Entrada o salida de datos. RA2 : Entrada o salida de datos. RA3 : Entrada o salida de datos. RA4/TOCKI : Entrada o salida de datos / Entrada externa para el contador interno TMRO. RB0/INT : Entrada o salida de datos / Entrada Schmitt-Triger para interrupciones externas. RB1 : Entrada o salida de datos (/Pull up) RB2 : Entrada o salida de datos (/Pull up) RB3 : Entrada o salida de datos (/Pull up) RB4 : Entrada o salida de datos (/Pull up) RB5 : Entrada o salida de datos (/Pull up) RB6 : Entrada o salida de datos (/Pull up) RB7 : Entrada o salida de datos (/Pull up)

RA2 RA3 RA4/T0CKI MCLR VSS RB0/INT RB1 RB2 RB3

1 2 3 4 5 6 7 8 9

18 17 16 15 14 13 12 11 10

RA1 RA0 OSC1/CLKIN OSC2/CLKOUT VDD RB7 RB6 RB5 RB4

DIAGRAMA INTERNO SIMPLIFICADO


PIC16F84 CONTADOR DE PROGRAMA (PC) MEMORIA DE PROGRAMA 1024 X 14 BIT FLASH RAM MEMORIA DE REGISTROS 68 X 8 BIT SRAM OSCILADOR OSC1/OSC2 CLKOUT CLKIN

MEMORIA DE DATOS 64 X 8 BIT EEPROM MCLR ( RESET GENERAL)

REGISTRO DE TRABAJO W WATCHDOG TIMER

ALU UNIDAD ARITMETICA LOGICA

Vdd, Vss

ENTRADA Y SALIDA CONFIGURABLES

PORT A / TOCKI PORT B / INT

4
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

MEMORIA DE PROGRAMA

En la memoria de programa o memoria principal del microcontrolador se encuentran alojados los programa a ejecutar por este dispositivo. La capacidad en este modelo es de 1024 celdas de 14 bit cada una y pertenece al tipo FLASH RAM (No voltil), la cual mantiene guardados los datos aun sin tensin de alimentacin. En cada una de las celdas de esta memoria se encuentra una instruccin del controlador, formada por un cdigo de operacin (OPCODE) y un valor numrico como dato asociado. El cdigo de operacin es el encargado de indicar que operacin interna se debe ejecutar. El valor numrico provee datos adicionales como un lugar de memoria, un bit dentro de un registro, una constante etc. dependiendo de las caractersticas de cada instruccin. Esta secuencia de nmeros de 14 bit forman el programa del microcontrolador, los cuales van a ser ledos, decodificados y ejecutados uno a continuacin del otro. OPCODE bit 13 DATOS bit 0

Los lugares de memoria 000h y 004h poseen una caracteritica particular y son utilizados por el microcontrolador del siguiente modo: 000h (DIRECCION DE INICIO / RESET): Al encender (o reset) este dispositivo el contador del programa (PC) toma el valor 000h y es en este lugar de memoria donde va a buscar la primer instruccin para ejecutar. Generalmente en este lugar se pone una instruccin de salto hacia el inicio del verdadero programa. 004h (DIRECCION DE INTERRUPCIONES): Al igual que en caso anterior, al producirse una interrupcin el contenido del contador de programa (PC) se carga automticamente con el valor 004h y es en este lugar de la memoria donde va a buscar la primer instruccin a ejecutar para atender esta interrupcin. Tambin es normal colocar en este lugar una instruccin de salto a la rutina correspondiente situada en otra zona de la memoria. Lugar de memoria donde comienza el programa principal luego del encendido o un reset. (PC=000h) Lugar de memoria donde comienza la rutina de atencin a una interrupcin luego de una interrupcin externa o interna (PC=004h).

GOTO 100h

000h ( 0 )

GOTO 200h

004h 005h

Inicio del programa principal

100h 1024 celdas

Inicio de la rutina de atencin a interrupciones

200h

MEMORIA DEL PROGRAMA


CAPACIDAD: 1024 x 14 bit (1K x 14 bit) TIPO: FLASH RAM (No voltil) 3FFh (1023) 14 bit

Las instrucciones GOTO 100h y GOTO 200h estn a modo de ejemplo.

5
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

MEMORIA DE REGISTROS

Esta memoria del tipo SRAM (RAM esttica) es utilizada por el microcontrolador para guardar datos propios (Sector SFR) que configuran su forma de trabajar y datos adicionales generados por el programa al transcurrir su ejecucin (Sector GPR). Este ultimo sector esta totalmente disponible para ser empleado por el programa para guardar distintos valores binarios generados durante su funcionamiento. La memoria esta organizada en dos bancos de 80 byte cada uno pero, para fines de uso, la mayora de los lugares son los mismos en los dos bancos y se obtiene igual resultado al leer o escribir cualquiera de estos. Por ejemplo: 1. 2. 3. El lugar de memoria 03h (STATUS) es el mismo independientemente del BANCO seleccionado. El lugar 05h (PORTA) del BANCO 0 es distinto al del BANCO 1 (TRISA). Los lugares desde 0Ch a 4Fh (GPR) son los mismos independientemente del BANCO seleccionado.

Para acceder al banco con el cual se va a trabajar se debe cambiar el bit 5 (RP0) del registro de STATUS. Si RP0=0 es seleccionado el BANCO 0 Si RP0=1 es seleccionado el BANCO1

SFR

00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch

BANCO 0 Direccin indirecta TMRO PCL STATUS FSR PORTA PORTB EEDATA EEADR PCLATH INTCON

BANCO 1 Direccin indirecta OPTION PCL STATUS FSR TRISA TRISB EECON1 EECON2 PCLATH INTCON

MEMORIA DE REGISTROS
CAPACIDAD: 80 Byte ( 80 x 8 bit ) TIPO: RAM ESTATICA (Voltil ) SFR: Registros de funciones especiales, usados por el microcontrolador en su configuracin y operacin. GPR: Registros de propsitos generales, libres para ser usados por el programa.

GPR

68 REGISTROS DE PROPOSITOS GENERALES 4Fh OCh No disponible 7Fh 8 bit

REFLEJA LOS 68 REGISTROS DE PROPOSITOS GENERALES DEL BANCO 0

No disponible 8 bit

REGISTROS ASOCIADOS
REGISTRO / DIR STATUS 03h NOMBRE / BITS RP0 5 RP1 6 0: Habilita BANCO 0 Sin uso EFECTO 1:Habilita BANCO 1

6
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

A. L. U. UNIDAD ARITMETICA LOGICA

Con el nombre de Unidad Aritmtica Lgica (A.L.U.) se reconoce al sector de un microcontrolador o microprocesador destinado a realizar las operaciones lgicas (AND, OR, XOR, etc.) y matemticas (Suma, resta, decremento, etc.) implementadas en el set de instrucciones. La A.L.U. del controlador trabaja con uno o dos nmeros de 8 dgitos (1 byte) y siempre uno de estos es el contenido del registro de trabajo W.

REGISTRO DE TRABAJO (W)

Este registro de 8 bit es utilizado por el microcontrolador como registro principal para todas las instrucciones del grupo operaciones matemticas y lgicas. El contenido de este registro es uno de los trminos involucrados en todas las operaciones, el otro termino proviene de la memoria de registro o de un dato asociado a la instruccin. El resultado de la operacin puede ser guardado en este registro de trabajo (W) o en la memoria de registros (f) de acuerdo al formato de la instruccin programada. Seleccin del destino para el byte resultado
d=1 d=0

DATO 8 bit asociados a la instruccin, k

W
8 bits
Registro de trabajo de 8 bit

REGISTRO 8 bit de un registro de la memoria de registros, f

W
Registro de trabajo de 8 bit

8 bits

A.L.U. Unidad Aritmtica Lgica

A.L.U. Unidad Aritmtica Lgica

Operaciones del tipo xxxLW k

Operaciones del tipo xxxWF f,d

7
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

CONTADOR DE PROGRAMA

UBICACIN : Lugar 02h y 0Ah de la memoria de registros. Este registro, denominado PC es de fundamental importancia para el funcionamiento del microcontrolador, en su interior contiene el nmero del lugar de la MEMORIA DE PROGRAMA donde se encuentra el numero de la instruccin a ejecutar. El contador se incrementa en forma automtica cada vez que se ha ejecutado una instruccin, de manera que la secuencia natural de ejecucin del programa es lineal, una despus de la otra. Algunas instrucciones que llamaremos de control, cambian el contenido del PC alterando la secuencia lineal de ejecucin. Dentro de estas instrucciones se encuentran los saltos (GOTO) y llamadas a subrutinas (CALL) que permiten cargar en forma directa un valor constante en el PC haciendo que el programa salte a una nueva posicin de memoria, indicada por este valor. Otras instrucciones de control son los saltos condicionales, que producen un incremento adicional del PC si se cumple una condicin especifica. El registro contador de programa (PC) tiene 13 bit los cuales se encuentran divididos en dos grupos, parte baja (PCL) con los bits 0 a 7 y parte alta (PCH) con los bits 8 a 12. La parte baja (PCL) del contador del programa es accesible al programador en el lugar 02h de la memoria de registros. Cualquier instruccin comn que opere sobre este registro puede ser utilizada para alterar el PC y desviar la ejecucin del programa. Como el microcontrolador opera con datos de 8 bits, y la memoria de registros es tambin de 8 bits, solo se pueden leer o modificar los bits 0 a 7 del PC (PCL). Los bits restantes, 8 a 12, que forman la parte alta (PCH) pueden ser ledos o escritos directamente modificando el contenido del registro PCLATH, este se encuentra en el lugar de memoria 0Ah de la memoria de registros. Si la memoria de programa tiene en total 1024 (1K) celdas, el contador de programa solo va a utilizar 10 bits (0 a 9) de los 13 disponibles, tomando valores que van desde 000h hasta 3FFh (0 a 1023). La modificacin de los tres ltimos dgitos (bit 10 a 12) no es tomada en cuenta por el microcontrolador e interpreta que estn en 0. Cuando el microcontrolador arranca o es puesto en reset el contador de programa se pone a cero (000h) automticamente y es en este lugar de la memoria de programa donde va a buscar la primer instruccin a ejecutar.

000h
INSTRUCCIN QUE SE ESTA EJECUTANDO

PCL=05H

202h 203h 204h 205h 206h 207h 208h 209h 20Ah 20Bh

15 14 13 12 11 10

9 8

3 2

1 0

BANCO 0 Dir. indirecta TMRO PCL STATUS FSR PORTA PORTB EEDATA EEADR PCLATH INTCON

PCLATH=02H
CONTADOR DE PROGRAMA (PC)

00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh

3FFh MEMORIA DE PROGRAMA


NO DISPONIBLES SIN USO PARA ESTE MODELO

MEMORIA DE REGISTROS

8
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

LOS PUERTOS DE ENTRADA Y SALIDA

UBICACIN: Lugares 05h y 06h de la memoria de registros. Un recurso fundamental en los microcontroladores es su conexin al exterior mediante los pines del circuito integrado, los cuales permiten la entradas y salidas (E/S) de datos digitales (bit) hacia los perifricos externos. Este modelo de PIC dispone de 13 lneas para el intercambio de datos digitales, cada una de las cuales tiene su correspondencia con un pin de la cpsula. Estas entradas/salidas se agrupan en dos puertos del siguiente modo: Puerto A (PORTA) Puerto B (PORTB) Posee 5 pines (RA0 a RA4) Posee 8 pines (RB0 a RB7 )

Cada pin de estos dos grupos se encuentra conectados electrnicamente, en forma directa, a un bit de los registros PORTA y PORTB de la memoria de registros, cuyos valores pueden ser modificados por el programa que se esta ejecutando en ese momento, leer los bits de PORTA o PORTB equivale a leer el valor logico de los pines del controlador. Escribir un 0 o un 1 en los bits de PORTA o PORTB equivale poner un 0 o un 1 a los pines correspondientes del controlador. Los registros PORTA y PORTB se encuentran respectivamente en los lugares 05h y 06h del BANCO 0 de la memoria de registros y la correspondencia entre pines y bits es la siguiente.

1 2 3

RA2 RA3

RA1 18 RA0 17
16 15 14

PORTA (05h)
7 6 5 4 3 2 1 0

4 5 6 7 8 9

PORTB (06h)

RB0 RB1 RB2 RB3

RB7 13 RB6 12 RB5 11 RB4 10

CORRESPONDENCIA ENTRE BITS Y PINES DEL MICROCONTROLADOR

Para configurar los pines del procesador como entradas o salidas digitales se deben utilizar los registros TRISA y TRISB. Cada bit de estos registros esta asociado a un pin del procesador, de la misma forma que PORTA y PORTB, asignandole valores de 0 o 1 a estos bits, se define si el pin trabaja como entrada o salida del sigiente modo: Bit=1 Bit=0 INPUT OUTPUT ( Entrada digital) ( Salida digital )
Para recordar esto se puede asociar como 1NPUT y 0UTPUT ).

Los registros TRISA y TRISB se encuentran respectivamente en los lugares 05h y 06h del BANCO1 de la memoria de registros. Por ejemplo, si ponemos un 0 en el bit 5 del registro TRISB el pin RB5 (11) funcionara como salida de datos digitales. 9
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

Cualquier lnea puede funcionar como entrada o como salida. Sin embargo, si acta como entrada, la informacin que se introduce desde el exterior no se memoriza, por lo cual el valor de dicha informacin debe mantenerse hasta que sea ledo PORTA o PORTB (Lectura en "tiempo real"), momento en el cual el valor existente en el pin se fija en el registro. Cuando un pin de E/S funciona como salida, el bit escrito en PORTA o PORTB se guarda en un biestable de salida con lo cual la informacin que ofrece este pin permanece invariable hasta que se reescriba otro bit. Si leemos un bit cuyo pin esta configurado como salida, obtenemos el valor logico que posee el pin en ese momento. Cuando se produce un reset, todos los bits de los registros TRISA/B pasan a tener el valor 1 y todas las lneas de E/S actan como Entrada para evitar daos irreparables por cortocircuitos accidental. Cada pin de un puerto programado como salida puede suministrar una corriente saliente mxima de 20 mA (Salida en 1) y una corriente entrante mxima de 25 mA (Salida en 0). Sin embargo, hay que tener en cuenta que existen limitaciones de disipacin de potencia total en el C.I., estas son: 1. 2. Todo el Puerto A puede suministrar (Salida en 1) un mximo de 50 mA y absorber (Salida en 0) un mximo de 80 mA en total. El Puerto B puede suministrar (Salida en 1) entre todas sus lneas un mximo de 100 mA y absorber (Salida en 0) un mximo de 150 mA.

Estas restricciones obligan a limitar la corriente de salida total de cada puerto as como la de entrada. Por lo tanto, habr que conjugar los mximos admitidos por cada lnea con los mximos permitidos por cada puerto, que comprende a todas las lneas. Si el PUERTO B esta programado como entrada se pueden habilitar resistencias internas de Pull-up para evitar el ingreso de ruido externo.

REGISTROS ASOCIADOS
REGISTRO / DIR PORTA 05h PORTB 06h TRISA TRISB INTCON 85h 86h 0Bh 8Bh NOMBRE / BITS 0a4 0a7 TOCS OPTION 81h INTEDG RBPU 0a4 0a7 4 5 6 7 EFECTO Salida y entrada de datos al PUERTO A Salida y entrada de datos al PUERTO B 1 = Pin del PUERTO A configurado como entrada. 0 = Pin del PUERTO A configurado como salida. 1 = Pin del PUERTO A configurado como entrada. 0 = Pin del PUERTO A configurado como salida. 1 = interrupcin por el pin 6 (RB0/INT) activada. 0 = interrupcin por el pin 6 (RB0/INT) desactivada. 1 = Ingreso de la seal clock por el pin 3 (RA4/TOCKI) 0 = Seal de clock interno (CLKOUT) 1 = interrupcin por flanco ascendente en el pin 6 (RB0/INT). 0 = interrupcin por flanco descendente en el pin 6 (RB0/INT). 1 = Resistencias de pull-up del PUERTO B desactivados. 0 = Resistencias de pull-up del PUERTO B activados.

10
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

STACK O PILA

El stack o pila es una pequea memoria interna inaccesible al programador, separado del resto de las memorias (registros, programa y EEPROM). Su tamao es de 8 celdas de 13 bit cada una. El stack es utilizado para guardar en forma temporal el contenido del contador del programa incrementado (PC+1). Cuando se produce una interrupcin del programa principal o un salto a una subrutina, se debe preservar el contenido del contador de programa (PC), para que el microcontrolador pueda retornar, luego de la interrupcin o de la subrutina, a la siguiente instruccin del programa principal. Como en toda memoria del tipo pila, los datos son accedidos de manera tal que el ultimo que entra es el primero que sale (LIFO). Las ocho (8) posiciones del stack, representan en cierta medida, una limitacin de estos microcontroladores, ya que no permite hacer uso intensivo del anidamiento de subrutinas (Llamar una subrutina desde otra subrutina). Esto de hecho impone una traba para el programador y adems parece impedir o dificultar la programacin estructurada, sin embargo es una buena solucin de compromiso ya que estos microcontroladores estn diseados para aplicaciones de alta velocidad en tiempo real, en las que demoras adicionales por un excesivo anidamiento de subrutinas son inaceptables. Por otra parte existen tcnicas de organizacin del programa que permiten mantener la claridad de la programacin estructurada, sin necesidad de utilizar tantas subrutinas anidadas. Si por error se llaman en secuencia continua mas ocho (8) subrutina, el ultimo contenido ser cargado en el primer lugar del stack, borrando el contenido anterior (primer valor del PC+1 para el retorno) lo cual producir un error de software. Es importante tener en cuenta que las interrupciones tambin utilizan el stack y pueden producirse en cualquier sector del programa.

PC +1
CALL RB4/INT TIMER0 RB4/RB7 EEPROM RETURN RETFIE RETLW

Este modelo de microcontrolador posee cuatro (4) instrucciones y cuatro (4) interrupciones que hacen uso del stack, estas son:

INSTRUCCIONES: 1. 2. 3. 4. CALL RETURN RETFIE RETLW

ULTIMO EN ENTRAR PRIMERO EN SALIR

INTERRUPCIONES: 1. 2. 3. 4. Externa (RB4/INT) TIMER0 Cambio en las pines RB4 a RB7 Final de escritura en la memoria EEPROM

7 13 bit

STACK

La instruccin CALL y las 4 interrupciones empujan el contenido del contador de programa incrementado (PC+1) al stack. Las instrucciones RETURN, RETFIE, RETLW al contrario de las anteriores, extraen el valor del STACK y lo ingresan al contador de programa (PC).

11
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

10

SUBRUTINAS

Cuando en un programa se repite en dos o ms sectores un conjunto de instrucciones es conveniente emplear el llamado a subrutinas (CALL) para eliminar estas copias, optimizar el uso de la memoria y clarificar el programa. Una subrutina se construye trasladando las secuencias repetida, con el agregado de una ultima instruccin de retorno, a un lugar de memoria predeterminado, normalmente al final del programa principal. De este modo, cada vez que es necesario ejecutar esta secuencia de instrucciones se realiza un salto, por medio de la instruccin CALL, desde la secuencia principal al lugar de memoria donde se instalo la rutina. Luego de ejecutarse este conjunto de instrucciones el retorno (RETxx) final devuelve el programa a la prxima instruccin posterior al salto, continuando as la secuencia normal de ejecucin. Programa optimizado con subrutinas

Programa original

SALTO A RUTINA 1

(1)

SALTO A RUTINA 1

(1) Sectores de memoria donde se repite un conjunto de instrucciones.

(1)
SALTO A RUTINA 1

FIN

(1)
FIN

(1)
RETORNO DE RUTINA

MEMORIA DE PROGRAMA

MEMORIA DE PROGRAMA

Debido a que el uso de subrutinas es normal en la programacin de procesadores, dentro del set de instrucciones se incorporan, al menos, dos instrucciones para el manejo de rutinas:

CALL nn : Salto a subrutina. Donde nn es el nmero del lugar de memoria donde se encuentra la rutina. RETURN: Retorno de subrutina. Retorna a la instruccion siguiente al llamado de subrutina (CALL) Al ejecutarse la instruccin CALL el numero existente en los registros que forman el contador del programa se incrementa (PC+1) y es transferido al STACK. Al finalizar la rutina, este valor (PC+1) es recuperado para continuar con el programa principal, en la instruccin siguiente al llamado a la subrutina (CALL).

12
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

EJEMPLO: 102h OPERACIONES INTERNAS AUTOMATICAS 1) Se rescata el contenido del STACK y se guarda en el contador de programa. (104h al PC). 2) La prxima instruccin es buscada en el lugar de memoria 104h 103h xxxx xx,xx CALL 520h 104h OPERACIONES INTERNAS AUTOMATICAS 1) El contenido del contador de programa (PC) es incrementado y guardado en el STACK. (104h al STACK) 2) El contador de programa (PC) se carga con el numero 520h, sacado de la instruccin CALL 3) La prxima instruccin es buscada en el lugar de memoria 520h

520h SUB RUTINA RETURN

11

INTERRUPCIONES

Una interrupcin consiste en una detencin del programa en curso para realizar una determinada rutina que atienda la causa que ha provocado la interrupcin. Tras el fin de la rutina de interrupcin, se retorna al programa principal en el punto en que se abandono. Las causas que originan una interrupcin pueden ser externas, como la activacin del pin 6 (RB0/INT) con el nivel lgico apropiado, o internas, como las que pueden producirse al desbordarse el temporizador TMR0. En las aplicaciones industriales, las interrupciones son un producto muy potente para atender los acontecimientos fsicos en tiempo real. Las interrupciones evitan que el microcontrolador explore continuamente el nivel lgico de un pin o el valor de un contador. Los PIC16F84 tienen cuatro posibles fuentes de interrupcin: 1. 2. 3. 4. Interrupcin externa provocada al activar el pin 6 (RB0/INT) del puerto B Desbordamiento del contador TMR0 (FFh a 00h). Cambio de estado en los pines 10 al 13 (RB4, RB5, RB6 y RB7) del Puerto B Finalizacin de la escritura en la EEPROM.

Cuando una interrupcin se produce, el contador de programa incrementado (PC+1) es guardado en el STACK y luego se carga, en forma automtica, con el nuevo valor 0004h. En este lugar de la memoria de programa se debe encontrar un salto a la rutina de atencin a las interrupciones, que ser la encargada de determinar cual, de las cuatro posibles, fue la interrupcin activada y que accin se va a llevar a cabo. Cada un de estas rutinas debe terminar con la instruccin RETFIE (Retorno de interrupcin) para volver al programa principal y seguir con la secuencia normal de este. Mediante los bits del registro INCON se pueden controlar y monitorear las interrupciones, escribiendo o leyendo estos bits es posible: 1. 2. 3. Habilitar en forma general TODAS las interrupciones (GIE). Habilitar en forma PARTICULAR cada interrupcin (EEIE, TOIE, INTE, RBIE). Determinar cual interrupcin se activo, mediante los indicadores correspondientes (TOIF, INTF, RBIF).

El bit GIE de habilitacin general del permiso de interrupcin se pone en 0 (Interrupciones deshabilitadas) automticamente cuando se activa una de estas para evitar que se produzca otra interrupcin antes de finalizar con la primera. Al retornar de la interrupcin, el bit GIE se vuelve a activar.

REGISTROS ASOCIADOS
REGISTRO / DIR 0Bh INTCON 8Bh OPTION 81h NOMBRE / BITS INTEDG 0a7 6 EFECTO Registro general para el control de todas las interrupciones de microcontrolador. 1 = interrupcin por flanco ascendente en el pin 6 (RB0/INT). 0 = interrupcin por flanco descendente en el pin 6 (RB0/INT). 13
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

12

TEMPORIZADOR / CONTADOR PRINCIPAL

UBICACIN : Lugar 01h de la memoria de registros (TMR0). El microcontrolador PIC16F84 posee un contador / temporizador interno de 8 bit el cual puede ser utilizado para controlar tiempo trascurrido entre eventos (temporizador) o como un contador de pulsos externos. El valor de este temporizador esta disponible, para su lectura y escritura, en el lugar de memoria 01h de la memoria de registros, llamado TMR0. Este registro puede ser modificado o ledo en forma directa por cualquier instruccin que trabaje con la memoria, de esta forma es posible emplear el valor del contador en cualquier momento de la ejecucin del programa o cambiar su contenido. El registro TMR0 toma valores que van desde 0 a 255 (00h y FFh) en forma creciente, al llegar a 255 el prximo incremento produce un desborde dejando el contador en cero (0) reiniciando la cuenta. Este contador puede interrumpir la ejecucin del programa del microcontrolador. Al producirse el desborde detallado anteriormente y si esta interrupcin se encuentra habilitada se genera un salto del programa a la direccin de memoria de programa 004h (Atencin de interrupciones). Los pulsos de incremento del contador pueden venir de dos fuentes distintas: interna o externa, esto determinara el funcionamiento de TMR0 como temporizador o contador. TEMPORIZADOR: Los pulso para incrementar el contador son tomados del reloj interno (CLKIN/OUT), cuyo periodo es constante y esta determinado por la frecuencia a la cual trabaja el oscilador del microcontrolador. Para clculos de tiempo se pueden utilizar las siguientes frmulas: Fosc: Frecuencia del microcontrolador. Rango del divisor: 2 a 256 Tiempo = (4/Fosc) (256-Valor en TMR0) (Rango del Divisor) Valor en TMR0: 0 a 255 Valor a cargar en TMR0 = 256-(Tiempo Fosc/4) / (Rango del Divisor) CONTADOR: Los impulsos ingresan desde el exterior por el pin 3 (T0CKI/RA4), trabajando como un contador de eventos externos. En este caso es posible programar el incremento mediante el flanco ascendente o descendente de la seal. Los pulsos de clock que actan sobre el contador, tanto de la fuente externa como de la interna, pasan previamente por un divisor de frecuencia mltiple, el cual puede ser programado desde 1:2 hasta 1:256, aumentando el rango de tiempo o cuentas a controlar. Una desventaja es que el divisor se comparte con el watchdog y no puede ser utilizado por los dos sistemas al mismo tiempo. Si sobre el contador no se requiere divisin (1:1), el divisor se asigna directamente al watchdog. Se debe tener en cuenta que cuando se escribe un nuevo valor sobre TMR0 para iniciar una nueva temporizacin, el incremento del mismo se retrasa durante los 8 ciclos de reloj siguientes (2 ciclos de instrucciones) y el divisor de frecuencia se pone a 1:2.

REGISTROS ASOCIADOS
REGISTRO / DIR NOMBRE / BITS TOCS PS0 a PS2 OPTION 81h PSA TOSE 0Bh 8Bh 01h 85h TOIF TOIE RA4 3 4 5 3 0a7 4 5 0,1,2 EFECTO 1 = Ingreso de la seal clock por el pin 3 (RA4/TOCKI) 0 = Seal de clock interno (CLKOUT) Seleccin de la relacin de divisin para TMR0 o Watchdog (WDT) 000/111 TMR0=1:2/1:256 WDT=1:1/1:128 1 = Divisor asignado a WDT (Watchdog). 0 = Divisor asignado a TMR0 (Temporizador). 1 = Incremento de TMR0 por flanco ascendente en el pin RA4/TOCKI. 0 = Incremento de TMR0 por flanco descendente en el pin RA4/TOCKI. 1 = Indica que TMR0 a desbordado. ( Poner a 0 por software ) 0 = Indica que TMR0 no a desbordado. 1 = Habilita la interrupcin del TMR0. 0 = Deshabilita la interrupcin del TMR0. Contenido del temporizador. Pin de ingreso de la seal externa de clock a TMR0

INTCO TMR0 TRISA

14
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

13

WATCHDOG (PERRO GUARDIAN)

El watchdog (WDT: WatchDog Timer) o perro guardin se trata de un sistema para evitar que el microcontrolador se cuelgue o quede en espera continua de un evento que no viene. Este control interno esta formado por un contador de 8 bits, cuyo valor no es accesible por programa, que acta como temporizador y tiene el objetivo de generar un reset o un despertar del controlador cuando su valor se desborda (Pasa de FFh a 00h). Este contador esta controlado por un oscilador RC interno propio y su funcionamiento es independiente del oscilador principal. El tiempo nominal programado del watchdog es de 18 ms, pero puede aumentarse utilizando el divisor de frecuencia interno, con el cual, trabajando en el rango mayor (1:128) puede alcanzar hasta 2,3 segundos. Para evitar que se desborde el WDT y genere un reset hay que ponerlo a 0, reiniciando la temporizacin, este objetivo se consigue por software con las instrucciones CLRWDT y SLEEP. La instruccin CLRWDT pone a 0 el valor de WDT y reiniciando la cuenta. Sin embargo, la instruccin SLEEP, adems de borrar el WDT, detiene a todo el sistema entrando en un modo de trabajo con consumo mnimo (modo de reposo o de bajo consumo). Si no se desactiva al watchdog cuando se entra en este modo, al acabar su conteo y producirse el desborde el controlador despertara y continuara con la instruccin siguiente a SLEEP. El programador debe analizar la secuencia de trabajo y situar alguna de estas dos instrucciones en sitios estratgicos del programa para asegurase su ejecucin, antes que transcurra el tiempo que controla el watchdog. De esta manera, si el programa se cuelga (bucle infinito, espera de acontecimiento que no se produce, etc.) o esta en reposo (SLEEP), pasado el tiempo programado para el watchdog se producir un reset o saldr de este estado.

OBSERVACIONES
Para desactivar al watchdog, hay que poner un 0 en el bit 2 (WDTE) de la palabra de configuracin (Configuration Word). 2. La instruccin CLRWDT pone a 1 los bits TO y PD del registro de STATUS en forma automtica. 3. Al salir del modo SLEEP por desborde de WDT se ponen en 0 los bits TO y PD del registro de STATUS en forma automtica. 1.

REGISTROS ASOCIADOS
REGISTRO / DIR CONFIGURATION OPTION 81h NOMBRE / BITS EFECTO WDTE 2 Habilita el Watchdog Seleccin de la relacin de divisin para TMR0 o Watchdog (WDT) PS0 a PS2 0,1,2 000/111 TMR0=1:2/1:256 WDT=1:1/1:128 1 = Divisor asignado a WDT (Watchdog). PSA 3 0 = Divisor asignado a TMR0 (Temporizador).

15
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

14

REINICIALIZACION O RESET

La reinicializacin o reset de los microcontroladores PIC16F84 puede ser originada por las siguientes causas: 1. 2. 3. 4. Conexin de la alimentacin (POR: Power-On Reset) Activacin del pin 4 (MCLR: Master Clear Reset) durante una operacin normal. Activacin del pin 4 (MCLR: Master Clear Reset) en el estado de reposo o SLEEP. Desbordamiento del watchdog durante una operacin normal.

Cualquiera de estas posibilidades pone en marcha un temporizador interno propio que, luego de 18 ms, origina un reset interno. El retraso en la generacin del reset es para dar tiempo a que se estabilice la tensin VDD de alimentacin y la frecuencia del oscilador principal. Este temporizador est gobernado por un oscilador RC independiente. Los bits TO y PD del Registro STATUS toman distintos valores segn la causa que haya provocado el reset. Leyendo este registro y analizando estos bits se puede determinar el origen del reinicio.

VALORES DEL REGISTRO STATUS DE ACUERDO AL TIPO DE RESET STATUS TO PD PC REF. ORIGEN DEL RESET 1 1 000h 0001 1xxx 1 Conexin de la alimentacin 1 1 000h 0001 1uuu 2 MCLR en el modo normal 1 0 000h 0001 0uuu 3 MCLR en el modo SLEEP 0 1 000h 0000 1uuu 4 WDT en el modo normal
U: No cambia X: desconocido - No usado. Se lee como 0 C: Segn la condicin

VALORES DE LA MEMORIA DE REGISTROS DE ACUERDO AL TIPO DE RESET (2) MCLR en el modo normal REGISTRO DIRECCION (1) Conexin de la Alimentacin (3) MCLR en el modo SLEEP (4) WDT en el modo normal W XXXX XXXX UUUU UUUU INDF 00h - - - - - - - - - - - - - - TMR0 01h XXXX XXXX UUUU UUUU PCL 02h/82h 0000 0000 0000 0000 STATUS 03h/83h 0 0 0 1 1 XXX Ver tabla anterior FSR 04h/84h XXXX XXXX UUUU UUUU PORTA 05h - - - X XXXX - - - U UUUU PORTB 06h XXXX XXXX UUUU UUUU EEDATA 08h XXXX XXXX UUUU UUUU EEADR 09h XXXX XXXX UUUU UUUU PCLATH 0Ah/8Ah - - -0 0000 - - -0 0000 INTCON 0Bh/8Bh 0000 000X 0000 000U INDF 80h - - - - - - - - - - - - - - OPTION 81h 1111 1111 1111 1111 TRISA 85h - - -1 1111 - - -1 1111 TRISB 86h 1111 1111 1111 1111 EECON1 88h - - -0 X000 - - -0 C000 EECON2 89h - - - - - - - - - - - - - - U: No cambia X: desconocido - No usado. Se lee como 0 C: Segn la condicin

16
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

15

EL MODO SLEEP O DE REPOSO

En este modo especial de funcionamiento el microcontrolador queda inactivo y baja su consumo elctrico en forma notable (<10uA). Para ingresar en este modo se debe ejecutar la instruccin SLEEP que origina las siguientes acciones: 1. 2. 3. 4. Si el watchdog est activo, se reinicia (WDT=00h) y continua funcionando normalmente. El oscilador principal del sistema deja de funcionar. Los puertos de E/S mantienen el mismo estado que tenan antes de ejecutar SLEEP. Los bits TO y PD del registro de estado toman los valores 1 y 0, respectivamente.

Existen tres posibilidades para que el microcontrolador salga del estado de reposo: 1. 2. Se activa el pin MCLR y se genera un reset. Esto pone a T0=1 y a PD=0. Si el watchdog estaba activo cuando se ejecuto SLEEP, luego de transcurrido el tiempo correspondiente, se desborda y despierta al controlador, continuando el programa con la instruccin siguiente a SLEEP . Esto pone a T0=0 y a PD=0. Si se produce una interrupcin por RB0/INT, cambios en RB4 a RB7 o fin de escritura de datos en la EEPROM el controlador despierta, continuando el programa en la direccin de memoria 004h si la interrupcin correspondiente esta habilitada, en el caso contrario, continua con la instruccin siguiente a SLEEP. Esto pone a T0=1 y a PD=0.

3.

Para conocer la causa por la que se ha salido del estado SLEEP se deben analizar los bits PD y TO del registro STATUS. Para bajar al mximo el consumo del microcontrolador en el modo de reposo se recomienda conectar el pin T0CKI a VDD o a VSS y el pin MCLR al nivel lgico alto (VDD).

16

ACCESO INDIRECTO A LA MEMORIA DE REGISTROS

Normalmente a la memoria de registro se accede en forma DIRECTA, indicando en la instruccin del programa el nmero del lugar de la memoria que se desea leer o escribir. Por ejemplo, si queremos cargar en el registro de trabajo W el nmero que se encuentra en el lugar 50h de la memoria de registros pondremos: MOVF 50h,0 ; El contenido del lugar 50h, de la memoria de registros, se copia en W

En el acceso INDIRECTO el nmero del lugar de memoria no se indica en la instruccin, sino que se encuentra en otro lugar de la memoria de registros, este es FSR (04h/84h). Para leer el contenido del lugar de memoria guardado en FSR se debe leer siempre el registro INDF (00h). Este registro no esta implementado fsicamente, y cualquier instruccin que haga referencia a l, en realidad esta accediendo a la direccin de la memoria de registros, cuyo nmero esta guardado en FSR. Si queremos repetir el ejemplo anterior pero en este caso accediendo indirectamente haremos: MOVLW MOVWF MOVF 50h ; Carga en el registro de trabajo W el valor 50h. FSR ; Copia el contenido de W en el registro FSR. INDF,W ; El contenido del lugar indicado por FSR (50h), de la memoria de ; registros, se copia en W.

17
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

EJEMPLO: Poner a 0 (00h) todos los lugares de la memoria de registros desde la direccin 10h hasta 1Fh haciendo uso del acceso directo a memoria y del acceso indirecto a memoria.

PROGRAMA USANDO ACCESO DIRECTO CLRF 10h CLRF 11h CLRF 12h ................ ................ CLRF 1Fh

PROGRAMA USANDO ACCESO INDIRECTO MOVLW MOVWF LOOP CLRF INC BTFSS GOTO 10h FSR INDF FSR FSR LOOP

16 LINEAS DE PROGRAMA

6 LINEAS DE PROGRAMA

17

MEMORIA DE DATOS (EEPROM)

Los PIC16F84 tienen 64 byte (64x 8 bit) de memoria EEPROM, donde se pueden almacenar datos y variables que no se pierden cuando se desconecta la alimentacin del sistema. Esta memoria soporta 1.000.000 dc ciclos de escritura / borrado y es capaz de guardar la informacin sin alterarla mas de 40 aos. Se debe tener en cuenta que debido a las caractersticas fsicas de la memoria EEPROM, guardar un dato en esta demora en promedio 10 ms, tiempo que resulta muy largo para la velocidad del procesador, por este motivo existen varios bits en el registro EECON1 para supervisar la completa y correcta grabacin de la misma. La lectura, en cambio, demora el mismo tiempo que una lectura normal de la memoria de registros. A esto debemos agregar que el acceso a la memoria EEPROM no es directo, para leer o escribir en esta se debe usar los siguientes registros de la memoria de registros: EEADR : Ubicado en la direccin 09h de la memoria de registros, en este lugar se carga el nmero de la celda de la memoria EEPROM donde se va a guardar el dato. Las 64 celdas o posiciones de la memoria EEPROM estn numeradas desde 00h (0000 0000b) a 3Fh (0011 1111b), por eso los 2 bits de ms peso del registro EEADR siempre valen 0. EEDATA: Ocupa la direccin 08h de la memoria de registros, en este lugar se deposita el byte ledo o que se desea escribir en la memoria EEPROM. EECON2 : En realidad no est implementado fsicamente. Al leerlo todos sus bits son 0. Slo se emplea como un dispositivo de seguridad durante el proceso de escritura de la EEPROM. EECON1: Ubicado en la direccin 88h de la memoria de registros, tiene la misin de controlar las operaciones de lectura y escritura en la memoria EEPROM.

18
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

PROCESO DE LECTURA
Se inicia un ciclo de lectura colocando la direccin a acceder en el registro EEADR y poniendo en el registro EECON 1 el bit RD = 1. El dato ledo estar disponible en el registro EEDATA en el siguiente ciclo y permanecer en l hasta que se realice una nueva lectura o escritura en la EEPROM. EJEMPLO: Hacer un programa para leer el lugar 50h de la memoria EEPROM, el resultado debe quedar en W.
BCF MOVLW MOVWF BSF BSF BCF MOVF STATUS , RP0 50h EEADR STATUS , RP0 EECON1 , RD STATUS , RP0 EEDATA , W ; Selecciona el banco 0 de la memoria de registros. ; Carga en W el nmero 50h. ; Copia el contenido de W en el registro EEADR. ; Selecciona el banco 1 de la memoria de registros. ; Pone el bit RD del registro EECON en 1. (Inicio / fin de lectura) ; Selecciona el banco 0 de la memoria de registros. ; Mueve el contenido de EEDATA a W.

PROCESO DE ESCRITURA
Para escribir un byte en una posicin de la EEPROM se debe seguir una determinada secuencia de instrucciones en las que participa el registro EECON2. Este registro, que en realidad no se halla implementado fsicamente, slo asume funciones de seguridad en el proceso, cargndose en l dos valores: 55 H y AA H. La duracin tpica de un cielo de escritura es de 10 ms, muy larga en comparacin con la velocidad del PIC. El ciclo de escritura comienza cargando en EEADR la direccin de la posicin a escribir y en el registro EEDATA el valor a grabar. EJEMPLO: Hacer un programa para escribir el lugar 60h de la memoria EEPROM el nmero 27h.
BCF MOVLW MOVWF MOVLW MOVWF BSF BSF MOVLW MOVWF MOVLW MOVWF BSF STATUS,RP0 60h EEADR 27h EEDATA STATUS , RP0 EECON1 , WREN 55h EECON2 AAh EECON2 EECON1 , WR ; Selecciona el banco 0 de la memoria de registros. ; Carga en el registro W el lugar de la memoria a escribir. ; Mueve el contenido de W al registro EEADR. ; Carga en el registro W el nmero a escribir. ; Mueve el contenido de W al registro EEDATA. ; Selecciona el banco 1 de la memoria de registros. ; Habilita escritura en EEPROM. ; Carga en el registro W el nmero 55h. ; Mueve el contenido de W al registro EECON2. ; Carga en el registro W el nmero AAh. ; Mueve el contenido de W al registro EECON2. ; Pone el bit WR del registro EECON en 1 (Inicio de escritura).

Al finalizar el proceso de escritura el bit WR pasa a valer 0 automticamente y el sealizador FEIF se pone a 1. Este ltimo bit hay que ponerlo a 0 posteriormente mediante software. Una buena precaucin es verificar si la escritura de la EEPROM ha sido correcta, restando el dato escrito con el byte en el registro EEDATA. Si no hubo error el bit Z del registro STATUS pasa a valer 1. Un error de escritura puede producirse por ruido, falla en la alimentacin o un reset prematuro.

REGISTROS ASOCIADOS
REGISTRO / DIR NOMBRE / BITS EEIF WRERR EECON1 88h WREN WR RD EEADR EEDATA EECON2 09h 08h 88h 4 3 2 1 0 0a7 0a7 0a7 EFECTO 1 = Escritura en EEPROM finalizada con xito. 0 = Escritura sin completar (Error en escritura). 1 = Operacin de escritura con error. 0 = Operacin de escritura sin error. 1 = Escritura en la EEPROM habilitada. 0 = Escritura en la EEPORM inhabilitada. 1 = Inicio de escritura de datos en la memoria EEPROM. 0 = Se pone en este valor lgico al terminar la escritura. 1 = Inicio de lectura del dato en la memoria EEPROM. 0 = Se pone en este valor lgico al terminar la lectura. Nmero de celda a leer o escribir en la memoria EEPROM. Valor ledo o a escribir en la EEPROM. No implementado fisicamente. Acta en el proceso de grabacin.

19
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

18

STATUS: REGISTRO DE ESTADO

UBICACIN: Direccin 03h/83h de la memoria de registros. DETALLE: Este registro refleja el resultado de las operaciones en la Unidad Lgica Aritmtica. Cada uno de los bit de estos registros se modifica indicando un resultado o un estado especial del microcontrolador.

R/W/0

R/W/0

R/W/0

R/1

R/1

R/W/x

R/W/x

R/W/x

IRP
bit 7

RP1

RP0

TO

PD

DC

C
bit 0

bit 7 bit 6 bit 5

: IRP: Sin uso, mantener en 0 : RP1: Sin uso, mantener en 0 : RP0: Seleccin de banco de memoria de datos. 0 = Banco 0 (00h-4Fh) 1 = Banco 1 (80h-CFh) : TO: Bit de tiempo terminado 1 = Luego del encendido, instruccin CLRWDT o instruccin de SLEEP. 0 = A terminado el tiempo en el watchdog (WDT). : PD: Indicador de encendido. 1 = Luego del encendido o por la instruccin CLRWDT. 0 = Por la ejecucin de la instruccin SLEEP. : Z: Indicador de 0 en el resultado de operaciones aritmticas y lgicas. 1 = El resultado fue 0. 0 = El resultado no fue 0. : DC: Acarreo de dgito positivo o negativo producido por las instrucciones de suma y resta. 1 = Un acarreo se a producido a partir de bit 3. 0 = No se a producido acarreo a partir de bit 3. : C: Acarreo positivo o negativo producido por las instrucciones de suma y resta. 1 = Un acarreo se a producido a partir del bit 7. 0 = No se a producido acarreo a partir del bit 7.

bit 4

bit 3

bit 2

bit 1

bit 0

20
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

19

OPTION: REGISTROS DE OPCIONES

UBICACIN: Direccin 81h de la memoria de registros. DETALLE: Este registro permite configurar el funcionamiento de algunos de los dispositivos internos del microcontrolador.

R/W/1

R/W/1

R/W/1

R/W/1

R/W/1

R/W/1

R/W/1

R/W/1

RBPU INTEDG TOCS


bit 7

TOSE

PSA

PS2

PS1

PS0
bit 0

bit 7

: RBPU: Pull-up interno para el puerto B (PORTB) configurado como entrada. 1 = Pull-ups deshabilitados. 0 = Pull-ups habilitados. : INTEDG: Seleccin del flanco (subida o bajada) para la interrupcin por el pin RB0/INT. 1 = Interrupcin por flanco ascendente. 0 = Interrupcin por flanco descendente. : TOCS: Seleccin de la fuente de seal de clock. 1 = Ingreso de la seal clock por el pin 3 (RA4/TOCKI) 0 = Clock interno (CLKOUT) : TOSE: Bit de seleccin de flanco activo de entrada por el pin 3 (RA4/TOCKI) 1 = Incremento por flanco ascendente. 0 = Incremento por flanco descendente. : PSA: Asignacin del divisor a WDT o TMR0. 1 = Divisor asignado a WDT. 0 = Divisor asignado a TMR0.

bit 6

bit 5

bit 4

bit 3

bit 2-0 : PS2:PS0: Seleccin de la relacin de divisin.


Bits
000 001 010 011 100 101 110 111

TMR0
1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256

WDT
1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

OBSERVACIONES: 1. 2. Si se utiliza el divisor para TMRO no se puede emplear en WDT. El microcontrolador tiene implementada la instruccin OPTION para mantener la compatibilidad con modelos viejos. No se debe usar esta instruccin, si el registro detallado anteriormente. Al programar se debe tener la precaucin de no interpretar la etiqueta del nombre del registro como la instruccin.

21
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

20

INTCON: REGISTRO DE INTERRUPCIONES

UBICACIN: Direccin 0Bh/8Bh de la memoria de datos. DETALLE: Por medio de este registro se pueden contralor las interrupciones del microcontrolador, los bits 0 a 2 son indicadores de interrupciones y los bits 3 a 6 habilitan las distintas interrupciones. El bit 7 (GIE) corresponde a la habilitacin general.

R/W/0

R/W/0

R/W/0

R/W/0

R/W/0

R/W/0

R/W/0

R/W/x

GIE
bit 7

EEIE

TOIE

INTE

RBIE

TOIE

INTF

RBIF
bit 0

bit 7

: GIE: Habilitacin general de todas las interrupciones. 1 = Habilita todas las interrupciones. 0 = Deshabilita todas las interrupciones. : EEIE: Habilitacin de la interrupcin por fin de escritura en la memoria EEPROM. 1 = Habilita interrupciones por escritura completa. 0 = Deshabilita interrupciones por escritura completa. : TOIE: Habilitacin de la interrupcin por desbordamiento del TMR0. (FFh a 00h ) 1 = Habilita la interrupcin del TMR0 . 0 = Deshabilita la interrupcin del TMR0. : INTE: Habilitacin de la interrupcin mediante el pin 6 (RBO/INT). 1 = Habilita la interrupcin RBO/INT . 0 = Deshabilita la interrupcin RBO/INT. : RBIE: Habilita la interrupcin por cambio de valor lgico en cualquiera de los pines RB4 a RB7 1 = Habilita la interrupcin por cambio en RB4 a RB7. 0 = Deshabilita la interrupcin por cambio en RB4 a RB7. : T0IF: Indica que el contador TMR0 a desbordado (FFh a 00h) 1 = TMR0 a desbordado. ( Debe ser puesto en 0 por software ) 0 = TMR0 no a desbordado. : INTF: Indica que se a producido un cambio en el flanco del pin de interrupciones RB0/INT. 1 = La interrupcin RBO/INT a ocurrido. ( Debe ser puesto en 0 por software ) 0 = La interrupcin RBO/INT no a ocurrido. : RBIF: Indicador de interrupcin por cambio de valor lgico en cualquiera de los pines RB4 a RB7. 1 = Uno de los pines RB7 a RB4 a cambiado de estado. ( Debe ser puesto en 0 por software ) 0 = Ninguno de pines RB7 a RB4 a cambiado de estado.

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

22
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

21

PORTA/PORTB, REGISTROS DE ENTRADA Y SALIDA DE DATOS

UBICACIN: direccin 05h/06h de la memoria de registros DETALLE: Cada bit de estos registros se corresponde con un pin de entrada /salida del microcontrolador. La lectura o escritura de estos bits equivale a leer o colocar un valor lgico en un pin de entrada / salida. R/W/1 R/W/1 R/W/1 R/W/1 R/W/1 R/W/1 R/W/1 R/W/1

RA4
bit 7 bit 0 a 4 : RAn: Valor lgico en el pin. 1 = El pin correspondiente (n) queda en VDD. 0 = El pin correspondiente (n) queda en VSS. R/W/1 R/W/1 R/W/1 R/W/1

RA3

RA2

RA1

RA0
bit 0

PORTA

R/W/1

R/W/1

R/W/1

R/W/1

RB7
bit 7

RB6

RB5

RB4

RB3

RB2

RB1

RBO
bit 0

PORTB

bit 0 a 7 : RBn: Valor lgico en el pin. 1 = El pin correspondiente (n) queda en VDD. 0 = El pin correspondiente (n) queda en VSS.

22

TRISA/TRISB: REGISTROS DE CONFIG. DE ENTRADA O SALIDA

UBICACIN: direccin 85h/86h de la memoria de registros DETALLE: Cada bit de estos registros se corresponde con un pin de entrada /salida del microcontrolador. El valor lgico de cada bit determina si el pin correspondiente opera como entrada o salida. R/W/1 R/W/1 R/W/1 R/W/1 R/W/1 R/W/1 R/W/1 R/W/1

RA4
bit 7

RA3

RA2

RA1

RA0
bit 0

TRISA

bit 0 a 4 : RAn: Valor lgico en el pin. 1 = El pin correspondiente (n) queda configurado como entrada de datos. 0 = El pin correspondiente (n) queda configurado como salida de datos. R/W/1 R/W/1 R/W/1 R/W/1 R/W/1 R/W/1 R/W/1 R/W/1

RB7
bit 7

RB6

RB5

RB4

RB3

RB2

RB1

RBO
bit 0

TRISB

bit 0 a 7 : RBn: Valor lgico en el pin. 1 = El pin correspondiente (n) queda configurado como entrada de datos. 0 = El pin correspondiente (n) queda configurado como salida de datos.

23
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

23

EECON1: CONTROL DE LECTURA / ESCRITURA EN LA EEPROM

UBICACIN: direccin 85h/86h de la memoria de registros DETALLE: Registro de control para la lectura o escritura en la memoria EEPROM .

R/W/0

R/W/0

R/W/0

R/1

R/1

R/W/x

R/W/x

R/W/x

EEIF
bit 7

WRERR WREN

WR

RD
bit 0

bit 4

: EEIF: Indica el final de la operacin de escritura en la memoria EEPROM. 1 = Escritura completada con xito ( Se debe poner a 0 por programa). 0 = Escritura sin completar. : WRERR: Indicador de error en la escritura en la memoria EEPROM. 1 = Operacin de escritura con error. 0 = Operacin de escritura sin error. : WREN: habilitacin de la escritura en la memoria EEPROM. 1 = Escritura en la EEPROM habilitada. 0 = Escritura en la EEPORM inhabilitada. : WR: Indicador de inicio de escritura en la memoria EEPROM. 1 = Escritura de datos en la memoria. 0 = Escritura en memoria finalizada. : RD: Indicador de inicio de lectura de la memoria EEPROM. 1 = Lectura del dato en la memoria. 0 = Lectura de memoria finalizada.

bit 3

bit 2

bit 1

bit 0

24
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

24

FORMATOS DE LAS INSTRUCCIONES

Un programa esta formado por una secuencia de nmeros binarios de 14 bit que el microcontrolador lee y decodifica para obtener la instruccin que debe ejecutar (OPCODE) y datos adicionales asociada a esta. Existen tres (3) tipos de formatos generales de instrucciones, en cada uno de estos los 14 bits son distribuidos de distinto modo de acuerdo a la operacin especifica que debe realizar el microcontrolador. O

13

8 7 6

Tipo 1
13

OPCODE

NUMERO DE REGISTRO

10 9

7 6

Tipo 2
13

OPCODE

NUMERO DE REGISTRO

8 7

Tipo 3

OPCODE

VALOR NUMERICO (1 BYTE)

DESCRIPCION OPCODE d b NUMERO DE REGISTRO (f) VALOR NUMERICO (k)


EJEMPLOS:
d OPCODE DESTINO REGISTRO

Indica al microprocesador que operacin debe realizar. Destino. Si d=0 el resultado de la operacin va al registro general W, si d=1 el resultado va a el lugar de memoria de registros indicado (f). Bit. Indica la ubicacin de un bit dentro de un numero binario de 8 dgitos. Indica el numero del lugar de memoria de registros con el cual trabaja la instruccin. Este registro puede estar en el sector de Registro de Funciones Especiales (SFR) o en el sector de Registros de Propsitos Generales (GRP) Es un valor numrico directamente colocado en el cdigo de la instruccin.

Tipo 1

COMF 05h,0h

001001

0000 0101

El contenido del registro 05h (PORTA) es complementado. El resultado queda en el registro general de trabajo W. (d=0)
OPCODE BIT REGISTRO

Tipo 2

BCF 03h,05h

0100

101

000 0011

El bit 05h en el registro 03h (STATUS) es puesto en 0.


OPCODE REGISTRO

Tipo 3

ADDLW 07h

11111x

0000 0111

Suma al byte 07h, existente en la instruccin, el contenido del registro W. El resultado queda en el registro W.

25
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

25

SET DE INSTRUCCIONES
SIMBOLOS

W f k d b x

Registro de trabajo interno de uso general. ( 8 bits

W: 0 a 255 )

Registro de funciones especiales (SFR) y registros de propsitos generales (GPR) ubicados en la memoria de registros. Los primeros 8 o 11 bits bajos (10/7..0) de algunas instrucciones. ( 8/11 bits k: 0 a 255/2048)

Bit (8) de algunas instrucciones que determina el destino del resultado de la operacin. (d: 0 o 1) Numero de 3 bit. ( 3 bit b: 0 a 7) Bit cuyo valor no tiene importancia No utilizado por este modelo

ADDLW k

11

111x

kkkk

kkkk

Suma entre nmero y registro. Suma al byte k, existente en la instruccin, el contenido del registro W. El resultado queda en el registro W. k+W W Bits del registro de STATUS afectados : C, DC, Z. Ciclos: 1

ADDWF f,d

00

0111

dfff

ffff

Suma entre registros. Suma el byte existente en el registro W con el contenido del registro f . Si d es 0 el resultado queda en W, si d es 1 el resultado queda en f. Si d=0 W+f W Si d=1 W+f f Bits del registro de STATUS afectados : C, DC, Z. Ciclos: 1

ANDLW k

00

0111

dfff

ffff

Realiza la operacin lgica AND entre el byte k y el contenido del registro W. El resultado queda en el registro W. W and k W Bits del registro de STATUS afectados : Z. Ciclos: 1

ANDWF f,d

00

0101

dfff

ffff

Realiza la operacin lgica AND entre el registro W y el registro f . Si d es 0 el resultado queda en W, si d es 1 el resultado queda en f. Si d=0 W and f W Si d=1 W and f f Bits del registro de STATUS afectados : Z. Ciclos: 1

26
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

BCF f,b

01

00bb

bfff

ffff

El bit b en el registro f es puesto en 0. 0 f (b) Bits del registro de STATUS afectados : Ninguno.

Ciclos: 1

BSF f,b

01

01bb

bfff

ffff

El bit b en el registro f es puesto en 1. 1 f(b) Bits del registro de STATUS afectados : Ninguno.

Ciclos: 1

BTFSC f,b

01

10bb

bfff

ffff

Si el bit b del registro f es 0 la prxima instruccin del programa no es ejecutada. En su lugar se ejecuta una instruccin NOP. Si f(b) = 0 NOP Bits del registro de STATUS afectados : Ninguno. Ciclos: 1 o 2

BTFSS f,b

01

11bb

bfff

ffff

Si el bit b del registro f es 1 la prxima instruccin del programa no es ejecutada. En su lugar se ejecuta una instruccin NOP. Si f(b) = 1 NOP Bits del registro de STATUS afectados : Ninguno. Ciclos: 1 o 2

CALL k

10

0kkk

kkkk

kkkk

Llamado a subrutina. La direccin de retorno (PC+1) es guardada en el STACK. Los 11 bits (k) de la instruccin son cargados en el contador del programa (PC<10,0>). Los dos bit superiores del registro PCLATH (PCLATH<4,3>) son cargados como bit superiores en el contador del programa (PC<11,12>). PC+1 STACK k PC<10,0> PCLATH<4,3> PC<12,11> 8 bits Registro PCLATH 14 bits

--- k k xxx

10 0 kkk

kkkk

kkkk

Cdigo de la instruccin CALL k

bit 12

PCH (High)

bit 8

bit 7

PCL (Low)

bit 0

CONTADOR DE PROGRAMA (PC) Bits del registro de STATUS afectados : Ninguno. Ciclos: 2

27
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

CLRF f

00

0001

1fff

ffff

El contenido del registro f es puesto en 0. El bit Z del STACK es puesto en 1. 00h ( f ) 1 Z Bits del registro de STATUS afectados : Z.

Ciclos: 1

CLRW

00

0001

0xxx

xxxx

El contenido del registro W es puesto en 0. El bit Z del STACK es puesto en 1. 00h ( f ) 1 Z Bits del registro de STATUS afectados : Z. Ciclos: 1

CLRWDT

00

0000

0110

0100

Pone en cero ( 0 ) el timer del watchdog. Pone en cero (0) el divisor. Los bits TO y PD son puestos en 1 00h 0 1 1 WDT Divisor TO PD

Bits del registro de STATUS afectados : TO,PD.

COMF f,d

00

1001

dfff

ffff

El contenido del registro f es complementado. Si d es 0 el resultado queda en W, si d es 1 el resultado queda en f. Si d=0 f W Si d=1 f f Bits del registro de STATUS afectados : Z. Ciclos: 1

DECF f,d

00

0011

dfff

ffff

Decrementa el contenido del registro f. Si d es 0 el resultado queda en W, si d es 1 el resultado queda en f. Si d=0 f -1 W Si d=1 f -1 f Bits del registro de STATUS afectados : Z. Ciclos: 1

DECFSZ f,d

00

1011

dfff

ffff

Decrementa el contenido del registro f. Si d es 0 el resultado queda en W, si d es 1 el resultado queda en f. Si el resultado del decremento es 0 la prxima instruccin del programa no es ejecutada. En su lugar se ejecuta una instruccin NOP. Si d=0 f -1 W Si d=1 f -1 f Si f = 0 Proxima instruccin = NOP Bits del registro de STATUS afectados : Ninguno. Ciclos: 1 o 2

28
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

GOTO k

10

1kkk

kkkk

kkkk

Salto incondicional. Los 11 bits (k) de la instruccin son cargados en el contador del programa (PC<10,0>). Los dos bit superiores del registro PCLATH (PCLATH<4,3>) son cargados como bit superiores en el contador del programa (PC<11,12>). La prxima instruccin es buscada en este nuevo lugar de memoria. k PC<10,0> PCLATH<4,3> PC<12,11> 8 bits Registro PCLATH 14 bits

--- k k xxx

10 1 kkk

kkkk

kkkk

Cdigo de la instruccin CALL k

bit 12

PCH (High)

bit 8

bit 7

PCL (Low)

bit 0

CONTADOR DE PROGRAMA (PC) Bits del registro de STATUS afectados : Ninguno. Ciclos: 2

INCF f,d

00

1010

dfff

ffff

Incrementa el contenido del registro f. Si d es 0 el resultado queda en W, si d es 1 el resultado queda en f. Si d=0 f +1 W Si d=1 f +1 f Bits del registro de STATUS afectados : Z.

INCFSZ f,d

00

1011

dfff

ffff

Incrementa el contenido del registro f. Si d es 0 el resultado queda en W, si d es 1 el resultado queda en f. Si el resultado del incremento es 0 la prxima instruccin del programa no es ejecutada. En su lugar se ejecuta una instruccin NOP. Si d=0 f +1 W Si d=1 f +1 f Si f = 0 Proxima instruccin = NOP Bits del registro de STATUS afectados : Ninguno. Ciclos: 1 o 2

IORLW k

11

1000

kkkk

kkkk

Realiza la operacin lgica OR entre el byte k y el contenido del registro W. El resultado queda en el registro W. W or k W Bits del registro de STATUS afectados : Z. Ciclos: 1

29
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

IORWF f,d

00

0100

dfff

ffff

Realiza la operacin lgica OR entre el registro W y f . Si d es 0 el resultado queda en W, si d es 1 el resultado queda en f. Si d=0 W+f W Si d=1 W+f f Bits del registro de STATUS afectados : Z. Ciclos: 1

MOVLW k

11

00xx

kkkk

kkkk

Copia en el registro W el contenido de los ocho primeros bit (k) de la instruccin. k W Bits del registro de STATUS afectados : Z. Ciclos: 1

MOVF f,d

00

1000

dfff

ffff

Si d es 0 el contenido del registro f se copia en registro W, si d es 1 el contenido del registro f se copia a si mismo. Si d=0 f W Si d=1 f f Bits del registro de STATUS afectados : Z. Ciclos: 1

MOVWF f

00

0000

1fff

ffff

El contenido del registro W se copia en el registro f W f Bits del registro de STATUS afectados : Ninguno.

Ciclos: 1

NOP

00

0000

0xx0
Ciclos: 1

0000

Operacin nula o sin operacin. Bits del registro de STATUS afectados : Ninguno.

RETFIE

00

0000

0000

1001

Retorno de subrutina llamada por una interrupcin. El contenido del tope del STACK es copiado en el registro contador de programa (PC). El bit de interrupcin global (GIE) es puesto en 1. STACK PC 1 GIE Bits del registro de STATUS afectados : Ninguno. Ciclos: 2

RETLW k

11

01xx

kkkk

kkkk

Retorno de subrutina con un valor. En el registro W se copian los 8 bits inferiores (0..7) de la instruccin (k). En el contador de programa (PC) se copia el contenido del tope del STACK (TOS). k W STACK PC Bits del registro de STATUS afectados : Ninguno. Ciclos: 2

30
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

RETURN

00

0000

0000

1000

Retorno de subrutina. En el contador de programa (PC) se copia el contenido del tope del STACK (TOS). El tope del STACK es actualizado. STACK PC Bits del registro de STATUS afectados: Ninguno. Ciclos: 2

RLF

00

1101

dfff

ffff

Rotacin a la izquierda con el acarreo. El contenido del registro f es desplazado un bit a la izquierda. El bit del indicador de acarreo se copia en el bit de menor peso de f (bit 0) y el bit saliente de f (bit 7) se copia en el acarreo. bit 7 Registro f bit 0

Bits del registro de STATUS afectados: C.

Ciclos: 1

RRF

00

1100

dfff

ffff

Rotacin a la derecha con el acarreo. El contenido del registro f es desplazado un bit a la derecha. El bit del indicador de acarreo se copia en el bit de mayor peso de f (bit 7) y el bit saliente de f (bit 0) se copia en el acarreo. bit 7 Registro f bit 0

Bits del registro de STATUS afectados: C.

Ciclos: 1

SLEEP

00

0000

0110

0011

Ir al modo standby o de reposo. En el STATUS, el bit de apagado (PD) es puesto en cero (0), el bit de tiempo terminado (TO) es puesto en uno (1). El timer del watchdog y el preescaler son puestos en 0. El oscilador interno deja de funcionar. 0 PD 1 TO 0 Divisor 00h WDT (Watchdog) Bits del registro de STATUS afectados: TO, PD Ciclos: 1

SUBLW k

11

110x

kkkk

kkkk

Resta entre nmero y registro. Resta al byte k, existente en la instruccin, el contenido del registro W. El resultado queda en el registro W. kW W Bits del registro de STATUS afectados: C, DC, Z Ciclos: 1

31
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

MICROCONTROLADOR PIC16F84

SUBWF f,d

00

0010

dfff

ffff

Resta entre registros. Resta al contenido del registro f el byte existente en el registro W. Si d es 0 el resultado queda en W, si d es 1 el resultado queda en f. Si d=0 f -W W Si d=1 f -W f Bits del registro de STATUS afectados: C, DC, Z Ciclos: 1

SWAPF f,d

00

1110

dfff

ffff

Intercambio de bits. Los cuatro primeros bits (3..0) del registro f son intercambiados con los cuatro ltimos bits (7..4). Si d es 0 el resultado queda en W, si d es 1 el resultado queda en f. Si d=0 f<0..3> W <4..7> f<4..7> W <0..3> Si d=1 f<0..3> f <4..7> f<4..7> f <0..3> Bits del registro de STATUS afectados: Ninguno. Ciclos: 1

XORLW k

11

1010

kkkk

kkkk

Operacin lgica XOR entre registro y nmero. Realiza la operacin lgica XOR entre el contenido del registro W y los 8 bits bajos (k) de la instruccin. El resultado queda en el registro W. W xor k W Bits del registro de STATUS afectados: Z. Ciclos: 1

XORWF f,d

00

0110

dfff

ffff

Operacin lgica XOR entre registros. Realiza la operacin lgica XOR entre los contenido de los registro W y f. Si d es 0 el resultado queda en W, si d es 1 el resultado queda en f. Si d=0 W xor f W Si d=1 W xor f f Bits del registro de STATUS afectados: Z.

32
EET N 5 / DIGITALES III / Prof. ALEJANDRO C. FLREZ

You might also like