You are on page 1of 43

I.P.E.T.

Juan XXIII

Computadoras Electrónicas

Gustavo A. Yarce

Paraná - Entre Ríos


2011
2 Gustavo A. Yarce
Índice general

1. Microcontroladores 9
1.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2. Estructura de un microcontrolador . . . . . . . . . . . . . . . . . . 10

2. El PIC16f873 13
2.1. Estructura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2. El reloj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3. Osciladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4. Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3. Estructura de la memoria 19
3.1. Memoria de Programa . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2. Memoria de Datos(RAM) . . . . . . . . . . . . . . . . . . . . . . . 20
3.3. Registros Específicos - El PC . . . . . . . . . . . . . . . . . . . . . 20
3.3.1. La pila . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.4. Direccionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.5. Los Puertos del PIC . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.6. Puerto A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.7. Puerto B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.8. Puerto C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.9. El Registro de Estado . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.10. El acumulador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

4. Lenguaje Ensamblador 31
4.1. Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.2. Instrucciones del MPLAB . . . . . . . . . . . . . . . . . . . . . . . 34
4.3. Estructura de un programa ASM . . . . . . . . . . . . . . . . . . . 35

5. Programación 37
5.1. CALL - RETURN . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2. Rutinas de retardo . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

3
4 Gustavo A. Yarce

5.2.1. Rutina simple de retardo . . . . . . . . . . . . . . . . . . . . 38


5.2.2. Rutina de demora doble . . . . . . . . . . . . . . . . . . . . 39
5.2.3. Rutina de retardo triple . . . . . . . . . . . . . . . . . . . . 40
Índice de figuras

1.1. Estructura de sistema programable . . . . . . . . . . . . . . . . . . . . 9


1.2. Estructura de un microcontrolador . . . . . . . . . . . . . . . . . . . . 11

2.1. pic16f873 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2. Esquema del Ciclo de Instrucción . . . . . . . . . . . . . . . . . . . . 16

3.1. Organización de la memoria de Programa . . . . . . . . . . . . . . . . 19


3.2. Organización de la memoria RAM . . . . . . . . . . . . . . . . . . . . 21

5
6 Gustavo A. Yarce
Índice de tablas

3.1. Tabla de configuración de bancos . . . . . . . . . . . . . . . . . . . 20


3.2. Registro de Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

4.1. Instrucciones orientadas a registros . . . . . . . . . . . . . . . . . . 32


4.2. Instrucciones orientadas a bit . . . . . . . . . . . . . . . . . . . . . 33
4.3. Instrucciones orientadas a literal y conrol . . . . . . . . . . . . . . . 33

7
Prologo
Este documento no pretende ser un libro completo sobre microcontroladores,
es una ayuda para el alumno, para su utilización como guía de aprendizaje.
Se tiene como objetivo presentar los conceptos básicos y las características
generales de los dispositivos microprogramables, para el desarrollo y resolución
de problemas que se presentan en el ámbito técnico.
Los temas tratados y el desarrollo que se realiza sobre ellos persiguen la enseñanza
en entornos educativos técnicos de nivel medio que necesitan conocimientos sobre
estas tecnologías.
Se prioriza la enseñanza de una metodología de programación correcta tratando
de conservar la facilidad de uso como herramienta. Siempre se considera que lo
más importante es adquirir una base de conocimientos que permita una posterior
evolución hacia conocimientos relacionados con la Electrónica y la programación.
Capítulo 1

Microcontroladores

1.1. Introducción
Antes de ver qué es un microcontrolador y de analizar sus puntos fuertes y sus
defectos, será útil hacer un repaso relativo a la estructura de cualquier sistema
programable, que pueda hacer uso de un microcontrolador.

Figura 1.1: Estructura de sistema programable

La figura 1.1 presenta el esquema tipo de cualquier sistema programable.


Veamos que elementos son indispensables para su funcionamiento:
La unidad central
La memoria ROM

9
10 Gustavo A. Yarce

La memoria RAM

Los circuitos de interfaz

Un bus de interconexión

La presencia de estos elementos básicos es indispensable y aun cuando no


siempre se presenten tan claramente como en nuestro esquema siempre existen.
Obsérvese, que son los mismos que los de un sistema informático clásico, pero
dentro del marco de una aplicación que pueda ser tratada por un microcontrolador.

La unidad central, generalmente constituida por un microprocesador más


o menos evolucionado, ejecuta el programa que da vida a la aplicación. Los
programas pueden ser muy diversos, puesto que, como es evidente, el que asegura
la gestión de un termostato inteligente no tiene nada que ver con el que controla
el correcto funcionamiento de una fotocopiadora. Sin embargo, estos programas
tienen en común el hecho de que muy raramente necesitan cálculos complejos
y, en cambio, sí suelen incluir numerosas manipulaciones de la información de
entrada/salida.

El programa se almacena en un segundo elemento, que es la memoria ROM.


Esta memoria puede constituirse de diferentes formas: UVPROMUVPROM,
EEPROM u OTPROMOTPROM, cualquiera que sea la que se utilice es una
memoria no volátil desde la que se ejecutará el programa una vez alimentado
el sistema. Para poder trabajar correctamente, nuestro microprocesador necesita,
a menudo, almacenar datos temporales en alguna parte, y aquí es donde interviene
la memoria RAM, que no necesita ser de grandes dimensiones.

1.2. Estructura de un microcontrolador

De lo visto anteriormente, un microcontrolador debe contener todos los


elementos de la figura 1.1 en un único encapsulado. El esquema básico de un
microcontrolador sería

Encontramos en él la unidad central pero se ha simplificado con respecto a


los microprocesadores clásicos. En contrapartida se le han añadido instrucciones
Computadoras Electrónicas 11

Figura 1.2: Estructura de un microcontrolador

de manejo de bits, muy útiles para las entradas/salidas. En ciertos circuitos, esta
unidad central está dotada de un gran número de registros internos, que sirven de
memoria RAM, por lo que puede parecer que ésta última está ausente de algunos
esquemas.

A continuación podemos ver la memoria ROM, aunque ésta no siempre aparece.


Cierto número de microcontroladores estaban, y todavía están, disponibles sin
ROM (ROMless).
Posteriormente, los fabricantes han introducido en el chip una memoria
programable eléctricamente y borrable mediante rayos ultravioleta (UVPROM)
o, más recientemente, borrable eléctricamente (EEPROM).

Un último producto para almacenar de forma no volátil son las memorias


FLASH, de bajo consumo, que se puede escribir y borrar en circuito al igual
que las EEPROM, pero suelen disponer de mayor capacidad que estas últimas.
El borrado solo es posible con bloques completos y no se puede realizar sobre
posiciones concretas.
En lo referente a la memoria RAM, suele utilizarse una del tipo SRAM
(RAM estática) de pequeño tamaño, por qué generalmente la unidad central
posee suficientes registros para realizar operaciones intermedias. En algunos casos,
esta memoria se completa con una EEPROM de datos, que memoriza de forma
semipermanente datos del usuario que se manejan como constante en la ejecución
del programa y que de vez en cuando (pasados meses o años) deben ser modificados.
12 Gustavo A. Yarce

Algo más delicado es hacer un esquema tipo para los circuitos de interfaz, ya
que es un punto donde se distinguen los diferentes microcontroladores, en función
de las aplicaciones que pretenden. No obstante se pueden encontrar los siguientes
elementos básicos:

Líneas de entrada/salida paralelo, en cantidad variable, según la finalidad y


el tamaño del encapsulado (se plantea un problema de número máximo de
pines debido al crecimiento del número de estas líneas).

Al menos una interfaz de entrada/salida serie asíncrona, más o menos


evolucionada según los circuitos.

Uno o varios temporizadores internos cuyas posibilidades pueden ser muy


variables pero que, generalmente, funcionan como contadores ascendentes y
descendentes, generadores de impulsos programables, etc.

Uno o varios convertidores analógicos/digitales, precedidos o no de multiple-


xores para ofrecer varias vías.

A veces, pero es raro, un covertidor digital/analógico.

Por último, aunque no sea una verdadera interfaz de entrada/salida en el


sentido en que nosotros entendemos, ciertos microcontroladores disponen de un
acceso a su bus interno. Esto permite conectar con otros circuitos destinados a
cumplir funciones que faltan en el chip, lo que a veces resulta útil. Precisemos,
aunque es evidente, que todos los microcontroladores sin memoria ROM interna
disponen necesariamente de esta interfaz, puesto que es necesario permitirle
acceder a una memoria ROM externa.
Capítulo 2

El PIC16f873

2.1. Estructura
Microcontrolador diseñado por la empresa Microchip (http://www.microchip.com),
que se fabrica en varias versiones de las cuales se analizará con más detalle el
pic16f873. Son idénticas en cuanto a su arquitectura interna todos los pic de la
familia 16f87x a excepción de la memoria ROM y la memoria RAM y puertos.

La memoria EEPROM y la Flash son eléctricamente grabables y borrables,


lo que permite escribir y borrar el programa bajo prueba manteniendo el
microcontrolador en el mismo zócalo y usando el mismo dispositivo para grabar
y borrar. Esta característica supone una gran ventaja frente a la mayoría de
los microcontroladores, que tienen como memoria de programa reescribible una
tipo EPROM. Se graba eléctricamente, pero para borrarlas hay que someterlas
durante cierto tiempo a rayos ultravioleta, lo que implica sacar del zócalo el circuito
integrado y colocarlo en un borrador de EPROM.

Otra ventaja del PIC16F873 en cuanto a simplificar el proceso de escritura,


borrado y reescritura de programas, tan necesario en la fase de diseño, es su sistema
de grabación de datos, que se realiza en serie. Para escribir un programa en la
memoria se manda la información en serie usando sólo dos pins, una para la señal
de reloj y otra para los datos serie. A continuación exponemos las características
más significativas:

Frecuencia de operación 20 MHz


Memoria FLASH de programa (palabra de 14 bits) 4k

13
14 Gustavo A. Yarce

Memoria de datos 192 bytes

Memoria de datos EEPROM 128 bytes

Interrupciones 13

Puertos de E/S Puertos A, B, C

Temporizadores 3

Módulos de Captura/Comparacion/PWM 2

Comunicación serial tipo MSSP, USART

Módulo de conversión Análogo-Digital (10 bits) 5 canales de entrada

Conjunto de 35 instrucciones

El PIC16F873 se presenta en un encapsulado de 28 pines como se ve en la


Figura 2.1 y la descripción de cada pin se muestran en el cuadro

Figura 2.1: pic16f873


Computadoras Electrónicas 15

2.2. El reloj
La frecuencia de trabajo del microcontrolador es un parámetro fundamental a
la hora de establecer la velocidad de ejecución de instrucciones y el consumo de
energía.
Cuando un PIC16F873 funciona a 20 MHz, que es su máxima frecuencia, le
corresponde un ciclo de instrucción de 200 ns, puesto que cada instrucción tarda
en ejecutarse 4 períodos de reloj, o sea,
4 4
Ciclo de instrucción = = = 200ns
fOSC 20M HZ

Todas las instrucciones del PIC se realizan en un ciclo de instrucción, menos


las de salto que tardan el doble.

Los impulsos de reloj entrar por la pin OSC1/CLKIN y se dividen por 4


internamente, dando lugar a las señales Q1, Q2, Q3 y Q4. Durante un ciclo de
instrucción, que comprende las cuatro señales mencionadas, se desarrollan las
siguientes operaciones:

Q1: Durante este impulso se incrementa el Contador de Programa.


Q4: Durante este impulso se busca el código de la instrucción en la memoria
del programa y se carga en el Registro de Instrucciones.
Q2-Q3: Durante la activación de estas dos señales se produce la decodificación
y la ejecución de la instrucción.

Para conseguir ejecutar cada instrucción en un ciclo de instrucción (excepto las


de salto), se aplica la técnica de segmentación o pipe-line, que consiste en realizar
en paralelo las dos fases que comprende cada instrucción.

La estructura segmentada del procesador permite realizar al mismo tiempo la


fase de ejecución de una instrucción y la de búsqueda de la siguiente. Cuando la
instrucción ejecutada corresponde a un salto no se conoce cuál será la siguiente
hasta que se realice, por eso en esta situación se sustituye la fase de búsqueda por
un ciclo “vacio”, originando que las instrucciones de salto tarde en realizarse dos
ciclos de instrucción.
16 Gustavo A. Yarce

Figura 2.2: Esquema del Ciclo de Instrucción

2.3. Osciladores
Los PIC admiten cuatro tipos de osciladores externos para aplicarles la
frecuencia de funcionamiento, se colocan entre las pins OSC1 y OSC2. El tipo
empleado debe especificarse en dos bits de la “Palabra de Configuración”, como se
comentará más adelante. Los tipos que se pueden emplear son:

Oscilador RC: Es un oscilador de bajo coste formado por una simple


resistencia y un condensador. Proporciona una estabilidad mediocre de la
frecuencia, cuyo valor depende de los valores de los dos elementos R-C.

Oscilador HS: Es un oscilador que alcanza una alta velocidad comprendida


entre 4 y 10 MHz y está basado en un cristal de cuarzo o un resonador
cerámico.

Oscilador XT: Es un oscilador de cristal o resonador para frecuencias


estándar comprendidas entre 100 KHz y 4 MHz.

Oscilador LP: Oscilador de bajo consumo con cristal o resonador diseñado


para trabajar en un rango de frecuencias de 35 a 200 KHz.
Computadoras Electrónicas 17

2.4. Reset
Cuando se aplica un nivel lógico bajo a la pin MCLR# el microcontrolador
reinicializa su estado. Dos acciones importantes se producen en la reinicialización
o Reset:

1. El Contador de Programa se carga con la dirección 0, apuntando a la primera


dirección de la memoria de programa en donde deberá estar situada la
primera instrucción del programa de aplicación.

2. la mayoría de los registros de estado y control del procesador toman un


estado conocido y determinado.

Se puede provocar el Reset de varias maneras, pero si se desea realizar


manualmente, habrá que colocar, conectado al pin MCLR#, que al ser apretado
genere un nivel lógico bajo.
18 Gustavo A. Yarce
Capítulo 3

Estructura de la memoria

3.1. Memoria de Programa


La memoria FLASH tiene una capacidad 4K palabras de 14 bits cada una. Esta
memoria está dividida en páginas de 2K y esta direccionado con el PC(3.3), que
tiene un tamaño de 13 bits.

Figura 3.1: Organización de la memoria de Programa

19
20 Gustavo A. Yarce

3.2. Memoria de Datos(RAM)


La memoria RAM de datos de los PIC 16F873 posee una capacidad de 192
bytes, en una estructura de 4 bancos de 128 bytes cada uno.
Para seleccionar el banco a acceder hay que manipular el bit 5 (RP0) y el bit 6
(RP1) del registro ESTADO(03h).

BANCO RP1 RP0


0 0 0
1 0 1
2 1 0
3 1 1

Tabla 3.1: Tabla de configuración de bancos

La memoria de datos tiene posiciones implementadas en RAM y EEPROM,

1. Area de RAM estática o SRAM, se alojan los registros operativos


fundamentales en el funcionamiento del procesador y en el manejo de todos
los periféricos y registros que el se pueden como información de trabajo
propia de la aplicación.

2. Area EEPROM, de 64 bytes donde, opcionalmente, se pueden almacenar


datos que no se pierden al deconectar la alimentación.

La zona de memoria RAM se halla dividida en 4 bancos (banco 0,1,2 y 3) de


128 bytes cada uno.En las posiciones iniciales de cada banco se ubican los Registros
Específicos que gobiernan al procesador y sus recursos

3.3. Registros Específicos - El PC


Los 13 bits contenidos en el PC, que direccionan la memoria de código, están
guardados en dos registros específicos. El registro PCL(02h) guarda los 8 bits de
menos peso y se puede leer y escribir. Los bits <12:8>del PC se alojan en PCH,
Computadoras Electrónicas 21

Figura 3.2: Organización de la memoria RAM

que al no poder ser leído ni escrito, se accede a él a través del PCLATH(0Ah).

Las instrucciones de salto CALL y GOTO sólo proporcionan 11 bits de la


dirección a saltar, esto es una limitante del tamaño del salto que se puede producir,
siendo su tamaño máximo de 2K.
Al resetearse el PIC, todos los bits del PC toman valor 1, de manera que la
dirección de arranque del programa es siempre la ultima posición de memoria
de programa. En esta posición se deberá poner una instrucción de salto al punto
donde verdaderamente se inicia el programa. A diferencia de la mayoría de los
22 Gustavo A. Yarce

microprocesadores convencionales, el PC es también accesible al programador


como registro de memoria interna de datos, en la posición de 02. Es decir que
cualquier instrucción común que opere sobre registros puede ser utilizada para
alterar el PC y desviar la ejecución del programa. El uso indiscriminado de este
tipo de instrucciones complica el programa y puede ser muy peligroso, ya que
puede producir comportamientos difíciles de predecir. Sin embargo, algunas de esta
instrucciones utilizadas con cierto método, pueden ser muy útiles para implementar
poderosas estructuras de control tales como el goto computado. Como el PIC opera
con datos de 8 bits, y la memoria de datos es también de 8 bits, estas instrucciones
solo pueden leer o modificar los bits 0 a 7 del PC.
Para saltar entre una página y otra, los bits más significativos del PC deberán
ser modificados. Debido a que las instrucciones GOTO y CALL sólo pueden
direccionar un bloque de 2K (pues usan una dirección de 11 bits) deben existir otros
dos bits que completen los 13 bits del PC para moverse sobre los 4K de memoria
de programa. Estos dos bits extra se encuentran en un SFR denominado PCLATH
(Program Counter Latch High) en sus bits PCLATH<4:3>. Por esto antes de un
GOTO o un CALL el usuario deberá asegurarse que estos bits apunten a la página
deseada. Si las instrucciones se ejecutan secuencialmente el PC cruza libremente
los límites de página sin necesidad de que el usuario escriba en el PCLATH.

3.3.1. La pila
La memoria de stack o pila es una area de memoria completamente separada de
la memoria de datos y la memoria de programa. El stack consta de 8 niveles de 13
bits cada uno. Esta memoria es usada por la CPU para almacenar las direcciones
de retorno de subrutinas. El apuntador de stack no es ni legible ni escribible.
Cuando se ejecuta una instrucción CALL o es reconocida una interrupción el PC es
guardado en el stack y el apuntador de stack es incrementado en 1 para apuntar a la
siguiente posición vacía. A la inversa, cuando se ejecuta una instrucción RETURN,
RETLW o RETFIE el contenido de la posición actual del stack es colocado en el
PC.
El Stack o Pila, es una zona de memoria, transparente al usuario, con la cual se
salvan las direcciones cuando se ejecuta la instrucción CALL y las interrupciones,
en esta zona se guarda el valor del PC(3.3). Es de vital importancia no sobrepasar
el límite de 8 niveles en la realización de programas. PCLATH no se modifica
en ninguna de estas operaciones y cuando el apuntador de stack ya está en la
posición 8 y se ejecuta otro CALL se reinicia a la posición 1 sobrescribiendo en
dicha posición. No existe ningún indicador que avise de esta situación.
Computadoras Electrónicas 23

3.4. Direccionamiento
En los PIC de gama media la memoria de datos está organizada para alojar
un máximo de 4 bancos de 128 bytes cada uno. Los PIC16C84 sólo tienen
implementados los 48 primeros bytes de los bancos 0 y 1. En el resto de los
PIC de esta familia se destinan dos bits del registro ESTADO (RP0 y RP1) para
determinar el banco y otros siete
para elegir una de las 128 posiciones del banco seleccionado, tal y como muestra
la figura 8.

Direccionamiento Directo: El operando que utiliza la instrucción en curso


se referencia mediante su dirección, que viene incluida en el código OP de
la misma, concretamente en los 7 bits de menos peso. El banco a acceder
lo determinan los bits RP0 y RP1 del registro ESTADO. En el caso del
PIC16C84 sólo se usa el bit RP0 al tener implementados únicamente dos
bancos. Se accede a la RAM de forma inmediata. La dirección de RAM a
la que se quiere acceder está implícita en la propia instrucción. Por ejemplo:
MOVWF 20 realiza una operación de escritura en la dirección 0x20. Este
modo de direccionamiento es el más habitual.

Direccionamiento Indirecto: Este modo de direccionamiento se usa cuando


en una instrucción se utiliza como operando el registro INDF, que ocupa
la dirección =de ambos bancos. En realidad el registro INDF no está
implementado físicamente y cuando se le hace referencia, se accede a la
dirección de un banco especificada con los bits de menos peso del registro
FSR. El bit de más peso de FSR junto al bit IRP del registro ESTADO se
encargan de seleccionar el banco a acceder, mientras que los 7 bits de menos
peso apuntan a la posición. Como sólo hay dos bancos en el PIC16C84 en
este modo de direccionamiento, el bit IRP es 0 siempre. En este modo de
direccionamiento se utilizan dos registros especiales: FSR y INDF. FSR es
un puntero de RAM, es decir, contiene la dirección de memoria a la que
se desea acceder. El registro INDF, utiliza el valor del registro FSR para
acceder al registro deseado. Por ejemplo: si escribimos 20 en FSR y después
escribimos 215 en INDF, habremos escrito un 215 en la dirección de memoria
20 (que era la que contenía FSR). El direccionamiento indirecto se usa para
manejar tablas ó manipular segmentos de memoria. Por ejemplo, Podemos
programar un bucle, en el cual, incrementamos el valor de FSR para acceder
a unas direcciones de memoria consecutivas.
24 Gustavo A. Yarce

3.5. Los Puertos del PIC

Los PIC16f873 disponen de tres puertos de E/S. La Puerta B tiene 8 líneas,


RB0-RB7, y también tiene una con funciones multiplexadas, la RB0/INT, que,
además de línea típica de E/S, también sirve como pin por la que reciben los
impulsos externos que provocan una interrupción. Además tenemos el puerto C,
con 8 líneas.

Cada línea de E/S puede configurarse independientemente como entrada o


como salida, según se ponga a 1 o a 0, respectivamente, el bit asociado del registro
de configuración de cada puerta (TRISA, TRISB y TRISC). Se llaman PORTA,
PORTB y PORTC los registros que guardan la información que entra o sale por
la puerta y ocupan las direcciones 5 y 6 del banco 0 de la memoria de datos. Los
registros de configuración TRISA, TRISB Y TRISC ocupan las mismas direcciones
pero en el banco 1. Al reiniciarse el PIC todos los bits de los registros TRIS quedan
a 1, con lo que las líneas de las puertas quedan configuradas como entradas. Cada
línea de salida puede suministrar una corriente máxima de 20 mA y si es de entrada
puede absorber hasta 25 mA. Al existir una limitación en la disipación máxima de
la potencia del chip se restringe la corriente máxima de absorción de la Puerta A
a 80 mA y la de suministro a 50 mA. La Puerta B puede absorber un máximo de
150 mA y suministrar un total de 100 mA.

3.6. Puerto A

La Puerta A posee 6 líneas, RA0-RA5, y soportan funciones multiplexadas.


Son bidireccionales y dependen del valor del registro TRISA. Los pines
RA0/AN0,RA1/AN1 y RA2/AN2, además de líneas de E/S digitales también
pueden actuar como los canales 0,1 y 2 por los que se pueden utilizar como entradas
al conversor A/D.
El pin RA3/AN3,Vref+ puede actuar como entrada de la tensión de referencia
para los periféricos que la precisan. El pin RA4/TOCKI, que puede actuar como
línea de E/S o como el pin por la que se reciben los impulsos que debe contar
TMR0.
Las líneas RA3-RA0 admiten niveles de entrada TTL y de salida CMOS. La
línea RA4/TOCKI dispone de un circuito Trigger Schmitt que proporciona una
buena inmunidad al ruido y la salida tiene drenador abierto. RA4 multiplexa su
Computadoras Electrónicas 25

función de E/S con la entrada de impulsos externos para el TMR0. En el circuito


de la figura 9 se muestra la adaptación de las pins RA3-RA0 a las señales internas
del procesador.
Cuando se lee una línea de la Puerta A se recoge el nivel lógico que tiene en ese
momento. Las líneas cuando actúan como salidas están conectadas a unos biestable,
lo que significa que sus pins sacan el nivel lógico que se haya cargado por última vez
en el registro PUERTAA. La escritura de una puerta, tal y como se ve en la figura
9, implica que primero se deposita el nivel lógico en la línea correspondiente del bus
interno de datos y se activa la señal WRITE, lo que origina el almacenamiento de
dicho nivel en el biestable. En esta situación, el biestable de configuración (TRIS)
debería tener valor 0 para que actuase como salida. Con estos valores la puerta OR
tendría un 0 a su salida y la AND también. Estos valores producen la conducción
de los transistores MOS, en función del valor escrito, dando como salida final VDD
o VSS (1 ó 0 respectivamente).
Si una línea actúa como entrada, el nivel lógico depositado en ella desde
el exterior pasa a la línea correspondiente del bus interno de datos cuando se
activa la señal READ y se hace conductor el dispositivo triestado que les une. Al
programarse como entrada, los dos transistores MOS de salida quedan bloqueados
y la línea de alta impedancia. Téngase en cuenta que cuando se lee una línea de
entrada se obtiene el estado actual que tiene su pin correspondiente (almacenado
en el tercer biestable) y no el que haya almacenado en el biestable de datos. La
información presente en una línea de entrada se muestrea al iniciarse el ciclo de
instrucción y debe matenerse estable durante su desarrollo.
Cuando se produce un RESET al conectar la tensión de alimentación(Power
On Reset) todas las patitas de la puerta A quedan configuradas como canales de
entrada para el conversor A/D y son leídas como 0. Para que el PORTA funcione
como líneas de E/S digitales se debe configurar el valor adecuado en el ADCON1,
en general se suele cargar en dicho registro el valor 011x en sus 4 bits de menos
peso.

3.7. Puerto B

Consta de 8 líneas bidireccionales de E/S, RB7-RB0, cuya información se


almacena en el registro PORTB, que ocupa la dirección 6 del banco 0. El registro
de configuración TRISB ocupa la misma dirección pero del banco 1. La línea
RB0/INT tiene dos funciones multiplexadas; además de pin de E/S actúa como la
pin para la petición de una interrupción externa, cuando se autoriza esta función
26 Gustavo A. Yarce

mediante la adecuada programación del registro INTCON.


Las cuatro líneas de más peso, RB7-RB4, pueden programarse para soportar
una misión especial. Cuando las 4 líneas actúan como entradas se las puede
programar para generar una interrupción si alguna de ellas cambia su estado
lógico. Esta posibilidad es muy práctica en el control de teclados. En la figura
10 se muestra el esquema de conexionado entre las pins RB7-RB4 y las líneas
correspondientes del bus interno.
El estado de las pins RB7-RB4 en modo de entrada se compara con el valor
antiguo que tenían y que se había almacenado en un biestable durante la última
lectura de la Puerta B. El cambio de estado en alguna de esas líneas origina una
interrupción y la activación del señalizador RBIF. La línea RB6 también se utiliza
para la grabación serie de la memoria de programas y sirve para soportar la señal
de reloj. La línea RB7 constituye la entrada de los datos en serie.
Los pines del puerto B disponen de una resistencia interna de pull-up al positivo
de la alimentación, que queda conectada cuando el bit RBPU#, que es el bit 7 del
registro OPTION, tiene el valor 0. Las resistencias pull up se utilizan para forzar
a un nivel alto una entrada de un componente lógico. Sirve por ejemplo cuando
necesitas leer el estado de un interruptor o una tecla. Cuando la tecla se activa se
lleva a un estado lógico determinado, pero cuando está abierta está al aire y los
circuitos lógicos hacen una interpretación indeterminada. La resistencia pull up
fuerza a nivel lógico alto cuando está abierta y permite que se lleve a nivel bajo
al cerrarse sin producir un cortocircuito. También puede servir cuando se conecta
una entrada a una salida de colector abierto. El pull up suple la resistencia faltante
del driver de colector abierto

3.8. Puerto C

Consta de 8 líneas bidireccional cuyo sentido se configura mediante el registro


TRISC,
El Puerto C tiene varias funciones en sus pines, tiene las funciones de
comunicacion I2C, el reloj externo del timer 1, Usart, etc.
Cuando se usan los módulos relacionados con este puerto, se debe tener cuidado
pues algunas veces cambia el estado E/S del pin sin importar lo que indique TRISC,
para saber cuando si cambiaría debemos ver la descripción de cada módulo.
Todos los buffers de este puerto son del tipo Schmitt Trigger, además poseen las
siguientes funciones multiplexadas:
Computadoras Electrónicas 27

RC0/T1OSO/T1CKI: E/S, puede ser también salida del Timer1 ó entrada


del impulsos para el Timer1.

RC1/T1OSI/CCP2: E/S, puede ser también entrada al oscilador del Timer1


ó entrada al módulo de captura 2, salida del comparador 2 , salida de PWM2.

RC2/CCP1: E/S, puede ser también entrada captura 1, salida comparador


1 o salida PWM1.

RC3/SCK/SCL: E/S, puede ser también señal de reloj en modo SPI ó señal
de reloj en modo I2C.

RC4/SDI/SDA: E/S, puede ser también entrada de datos en modo SPI o


Señal de reloj en modo I2C.

RC5/SD0: E/S, puede ser también salida de datos en modo SPI.

RC6/TX/CK: E/S, línea de transmisión eb USART ó señal de reloj síncrona


en transmisión serie.

RC7/RX/DT: E/S, línea de recepción USART ó línea de datos en


transmisión serie síncrona.

3.9. El Registro de Estado

Hasta ahora ESTADO es el registro más usado y llega el momento de describirlo


en su totalidad. Ocupa la dirección 3 tanto del banco 0 como del 1 de la memoria
de datos RAM. Sus bits tienen tres misiones distintas:

1. Se encargan de avisar de la incidencias del resultado de la ALU (C, DC y Z).

2. Indican el estado de Reset (TO# y PD#).

3. Seleccionan el banco a acceder en la memoria de datos (IRP, RP0 y RP1)

En la tabla 3.2, se muestra el diagrama de distribución de los bits del registro


ESTADO, su misión es la siguiente:
28 Gustavo A. Yarce

IRP RP1 RP0 T0# PD# Z DC c


7 6 5 4 3 2 1 0

Tabla 3.2: Registro de Estado

C: Acarreo en el bit de más peso


1: Acarreo en el bit de más peso.
0: No acarreo en el bit de más peso.

DC: Acarreo en el 4o bit


1: Acarreo en el 4o bit.
0: No acarreo en el 4o bit.

Z: Cero
1: El resultado de una instrucción lógico-aritmética ha sido cero.
0: El resultado de una instrucción lógico-aritmética no ha sido cero.

PD#: Power Down


1: Se pone a este valor después de la conexión a la alimentación o al ejecutar
clrwdt.
0: Se pone a este valor al ejecutar sleep.

TO#: Time Out


1: Se pone a este valor después de la conexión a la alimentación o al ejecutar
clrwdt y sleep.
0: Se pone a este valor al desbordarse el Perro Guardián (Watchdog).

RP1-RP0: Selección de banco en direccionamiento directo


El PIC16F873 tiene cuatro bancos, emplea el bit RP0 y RP1, de forma que
se puede acceder a cualquier banco.

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.
Computadoras Electrónicas 29

3.10. El acumulador

Uno de los registros mas utilizado, es el registro de trabajo “W”, el cual, se


utiliza para mover un dato/valor de un registro a otro, cargar valores en un registro,
y con la ayuda de la ALU puede hacer operaciones matemáticas. El registro W no
está implementado en la memoria RAM en la posición 0x00 ni en otra posición.
W es un registro independiente que tiene un bus directo con la ALU (un camino
privado). La ALU es la única entidad que puede leer o escribir este registro de
trabajo.
30 Gustavo A. Yarce
Capítulo 4

Lenguaje Ensamblador

4.1. Instrucciones
El juego de instrucciones de un microprocesador o microcontrolador es el con-
junto de entradas binarias que producen acciones definidas durante un ciclo de
instrucción. Un juego de instrucciones es para el microcontrolador lo mismo que
una tabla de verdad es para una puerta lógica, un registro de desplazamiento o
un sumador. Por supuesto, las acciones que realiza un microcontrolador con cada
instrucción, son más complejas que las que realizan los dispositivos y puertas antes
mencionados.

Una instrucción es un patrón de dígitos binarios el cual debe estar a disposición


del microcontrolador en el tiempo y forma que éste lo requiera.
Por ejemplo, cuando el procesador de un microcontrolador PIC16F84A recibe
el patrón binario de 12 bits ’0000 0100 0000’ en el momento adecuado, significa:
Clear (borrar o poner a cero) el registro W, y corresponde a la instrucción CLRW.
Para los PIC se han creado unas instrucciones y una estructura de programa
que los hacen más sencillos y atractivos todavía..
Las instrucciones de los microcontrolador PIC cumplen con las siguientes
condiciones:
Juego de instrucciones reducido: Por ejemplo, solo existen 35 instrucciones
en el PIC16F873.
Sencillas y rápidas: La mayoría se ejecuta en un ciclo de instrucción, y solo
las de salto precisan 2 ciclos. El ciclo de instrucción consta de 4 ciclos de
reloj principal. De esta manera un dispositivo con un cristal de cuarzo de 20
MHz realiza 5 millones de instrucciones por segundo.

31
32 Gustavo A. Yarce

Ortogonalidad: La ubicación de los operandos que manejan es muy flexible.


Cualquier objeto del procesador puede actuar como origen o como destino.
Formato uniforme de las instrucciones: Todas las instrucciones tienen una
longitud fija de bits. Esta característica significa un notable ahorro de la
memoria de programa y una facilidad en la construcción de compiladores.
Formato uniforme de los datos.
Un programa es una serie de instrucciones mediante las cuales un sistema
basado en CPU realiza una tarea en particular y la forma mas simple de realizar un
programa es mediante el lenguaje ensamblador (Ver Sistemas microprogramables,
Lenguajes de programación para sistemas basados en CPU).
Podríamos decir que el lenguaje ensamblador “es complejo por su sencillez”.
Esto quiere decir que, a diferencia de los lenguajes de alto nivel, aquí no hay
funciones que solucionen y simplifiquen algoritmos, si no que hay que implementar
hasta los pasos más elementales.

Mnemónicos Descripción Flags Ciclos


ADDWF f,d w+f→d C, DC, Z 1
ANDWF f,d w AND f → d Z 1
CLRF f 00 h → f Z 1
CLRW f 00 h → w Z 1
COMF f,d Complemento de f → d Z 1
DECF f,d f-1→d Z 1
DECFSZ f,d f - 1 → d (si es 0 salta) Ninguna 1(2)
INCF f,d f+1→d Z 1
INCFSZ f,d f + 1 → d (si es 0 salta) Ninguna 1(2)
IORWF f,d w OR f → d Z 1
MOVF f,d f→d Z 1
MOVWF f w→f Ninguna 1
NOP - No operación Ninguna 1
RLF f,d Rota f izq por carry → d C 1
RRF f,d Rota f dcha por carry → d C 1
SUBWF f,d f-w→d C,DC,Z 1
SWAPF f,d Intercambia nibbles de f → d Ninguna 1

Tabla 4.1: Instrucciones orientadas a registros


Computadoras Electrónicas 33

Mnemónicos Descripción Flags Ciclos


BCF f,b Pone a 0 bit b de registro f Ninguna 1
BSF f,b Pone a 1 bit b de registro f Ninguna 1
BTFSC f,b Salto si bit b de reg. f es 0 Ninguna 1(2)
BTFSS f,b Salto si bit b de reg. f es 1 Ninguna 1(2)

Tabla 4.2: Instrucciones orientadas a bit

Mnemónicos Descripción Flags Ciclos


ADDLW k w+k→w C,DC,Z 1
ANDLW k w AND k → w Z 1
CALL k Llamada a subrutina k Ninguna 2
CLRWDT - Borra temporizador del WDT TO,PD 1
GOTO k Ir a dirección k Ninguna 2
IORLW k w OR k → w Z 1
MOVLW k k→w Ninguna 1
RETFIE - Retorno de una interrupción Ninguna 2
RETLW k Retorno con k en w Ninguna 2
RETURN - Retorno de una subrutina Ninguna 2
SLEEP - Modo Standby TO, PD 1
SUBLW k k-w→w C,DC,Z 1
XORLW k w XOR k → w Z 1

Tabla 4.3: Instrucciones orientadas a literal y conrol

Notas:

Al modificar un registro de E/S con una operación sobre él mismo (por


ejemplo MOVF PORTB,1), el valor utilizado es el que se halle presente en
las patillas del PORTB. Por ejemplo, si el biestable tiene un “1” para una
patilla configurada como entrada y se pone a nivel bajo desde el exterior, el
dato se volverá a escribir como “0”.

Si se ejecuta esta instrucción sobre el TMR0 y d=1, se borrará el conteo


de la preescala asignada (preescaler), si está asignado al TMR0, pero no se
borrará la preescala asignada en OPTION_REG, que controla Timer0.

Si se modifica el Contador de Programa PC o una condición de prueba es


34 Gustavo A. Yarce

verdadera, la instrucción requiere dos ciclos máquina. El segundo ciclo se


ejecuta como un NOP.

En las tablas siguientes, por orden alfabético, veremos todos los datos de interés
sobre las 35 instrucciones.
Algunos son de poca importancia. En cambio otros, como la operación,
la sintaxis, el comportamiento del registro STATUS y los ejemplos, son
imprescindibles para comprender su funcionamiento.
Aparte de estas 35 instrucciones, hay otro tipo de instrucciones usadas para
simplificar la tarea de programar, y que generalmente están formadas por dos
instrucciones básicas. Estas no las trataremos a fondo, pero las veremos en un
resumen después de comprender el funcionamiento de las 35 instrucciones básicas.

4.2. Instrucciones del MPLAB


No son propiamente instrucciones del microcontrolador, sino que son comandos
insertados en el programa que controlan el proceso de ensamblado Estos comandos
no tienen traducción al código máquina. Suelen escribirse en la segunda columna.

Algunas de estas “pseudoinstrucciones” son:

END: Indica fin del programa. Es el único comando obligatorio ya que el


ensamblador necesita saber donde termina el proceso de ensamblado. Se pone
en la última línea del programa. Todas las líneas posteriores a la línea en la
que se encuentra esta directiva son ignoradas y no se ensamblan.

ORG: Su sintaxis es:

[<label>] ORG <expr>

Indica al programa ensamblador a partir de que posición de memoria de


programa tiene que ensamblar las instrucciones. Ejemplo: ORG 0x04
Si las instrucciones de un programa comienzan a escribirse sin indicar ORG,
el ensamblador toma por defecto ORG 0x00. Pueden escribirse varios ORG
en el mismo programa
Computadoras Electrónicas 35

EQU. Su sintaxis es:

<label>EQU <expr>

Es una etiqueta de asignación. El valor <expr>es asignado a la etiqueta


<label>. Usualmente las asignaciones EQU se ponen al principio del
programa (antes que las instrucciones). Siempre que <label>aparece en el
programa es sustituido por el valor numérico de la expresión que se le haya
asignado.

_ CONFIG. Esta directiva indica la configuración elegida para el proceso de


grabación del microcontrolador.
Ejemplo:

_CONFIG _CP_OFF & _WDT_OFF & PWRTE_ON & _XT_OSC

En este caso la configuración elegida es:

• No hay protección de código (_CP_OFF)


• No se habilita el Watchdog (_WDT_OFF)
• Se habilita el Reset mediante Power-up Timer(_PWRTE_ON).
• Se utiliza el oscilador por cristal de cuarzo (_XT_OSC)

4.3. Estructura de un programa ASM


E general la estructura del programa en ensamblador tiene, 3 columnas
obligatoria, la primer columna es la “ETIQUETA” y sirve para darle el nombre
a una posición de la memoria del programa al que se necesita apuntar(EQU.
La segunda columna, se llama “INSTRUCCIÓN” y lo que justamente hace,
es una instrucción a realizar por el programa. La tercera columna, se llama
“OPERANDO” y es el operando de una instrucción, o sea, de la segunda columna.
Hay instrucciones que no tienen operando.
Opcionalmente se puede incluir un cuarta columna, llamada “OBSERVACIO-
NES” y sirve solo para el usuario, el que está programando el PIC. Comienzan con
un “;” (punto y coma)
36 Gustavo A. Yarce
Capítulo 5

Programación

5.1. CALL - RETURN

La instrucción CALL ( llamada la subrutina) consigue que la ejecución del


programa continúe en la dirección donde se encuentra la subrutina a la que hace
referencia. Es similar a GOTO pero coloca en la pila la dirección de la siguiente
instrucción que se debe ejecutar después de la CALL. La subrutina finaliza con la
instrucción RETURN (Retorno de la subrutina) que retoma la dirección guardada
en le pila y la coloca en el contador del programa PC continuando el flujo de
control con la instrucción que sigue a la CALL.

En la familia PIC de gama media la pila tiene ocho niveles de memoria del
tipo FIFO (primero en entrar, último en salir). Si se produce la llamada a una
subrutina durante la ejecución de otra subrutina, la dirección de retorno de esta
segunda es colocada en la cima de la pila sobre la dirección anterior. Esta segunda
dirección es la primera en salir de la pila mediante la instrucción RETURN. Con
la pila de ocho niveles, una subrutina puede llamar a otra y ésta, a su vez, llamar a
otra hasta un máximo de ocho. La gama baja sólo puede realizar dos llamadas de
este tipo al poseer una pila de sólo dos niveles. Las subrutinas deben colocarse al
comienzo de las páginas debido a que el bit 8 del contador del programa es puesto
a 0 por la instrucción CALL (o por cualquier instrucción que modifica el PC). Las
subrutinas deben colocarse en la mitad inicial de las páginas (las 256 palabras).

37
38 Gustavo A. Yarce

5.2. Rutinas de retardo

5.2.1. Rutina simple de retardo

Una rutina de simple puede ser implementada como:

call retardo ;llama a la rutina de retardo

retardo movlw .k1 ;carga k1 en el acumulador


movwf mem1 ;guarda el valor del w en mem1
r1 decfsz mem1,1 ;decrementa mem1
goto r1 ;se ejecuta esta inst. si dec. no es cero
return

Cuando ejecuta la instrucción “Call” esta lleva en ejecutarse 2 ciclos. Cuando


esta dentro de la rutina “retardo” se encuentra con la instrucción “movlw .k1”
que consume 1 ciclo, luego ejecuta la instrucción “movwf mem1” que consume 1
ciclo. Luego se ejecuta la parte principal de la rutina de demora, las instrucciones
“decfsz mem1,1” y la instrucción “goto r1” se ejecutan (k1-1) veces, ya que mienstras
esta decrementado y no llega a cero no se saltea la instrucción goto, por lo tanto
mienstras no de cero el decremento la instrucción decfsz consume 1 ciclo y la
instrucción goto 2, por lo tanto,(k1-1 )*3 ciclos le lleva realizar este decremento,
cuando llego a cero la instrucción decfsz consume 2 ciclos, por lo tanto el total
de ciclo de la rutina de demora es 3*(k1-1) + 2 ciclos. Luego retorna al programa
principal mediante la instrucción “return” que consume 2 ciclos. El total de ciclos
que lleva la rutina completa es 2 + 1 + 1 +(k1-1) + 2 = 35 ciclos, y el tiempo
que consume esto es con un reloj de 4 Mhz, por lo tanto el perído es 2, 5e7 ; cada
instrucción consume 4 ciclos, por lo que el tiempo que tarda en ejecutarse cada
instrucción es 4 ∗ 2,5e − 7 = 1e−6 .
La secuencia de demora es {3 ∗ 254 + 2 = 764}, el máximo tiempo que puede
realizar la demora es
(2 + 1 + 1 + 3 ∗ 254 + 2 + 2) = 770ciclos
Lo que lleva un tiempo de 770 u seg.
Computadoras Electrónicas 39

5.2.2. Rutina de demora doble


Una rutina de doble puede ser implementada como:
call retardo ;llama a la rutina de retardo

retardo movlw .k2 ;{1}


movwf mem2 ;{2}
r2 movlw .k1 ;{3} carga k1 en el acumulador
movwf mem1 ;{4} guarda el valor del w en mem1
r1 decfsz mem1,1 ;{5} decrementa mem1
goto r1 ;{6} se ejecuta esta instr. si el dec. <>0
decfsz mem2,1 ;{7}
goto r2 ;{8}
return ;{9}

La instrucción “Call” consume 2 ciclos, luego se ejecuta la instrucción retardo,


luego ejecuta la instrucción {1} que tarda 1 ciclo, luego se ejecuta la instrucción
{2} - 1 ciclo. Luego ejecuta la instrucción {3} aquí esta tarda 1 ciclo, luego ejecuta
la instrucción {4} - 1 ciclo, luego se ejecuta la instrucción {5} {6} que ya fue
analizado en el punto anterior y tarda siempre 3*(k1-1)+2 ciclos. luego se ejecuta
la instrucción {7} que decrementa mem2, si el decremento no es cero tarda en
ejecutarse 1 ciclo y pasa a ejecutar la instrucción {8}, que vuelve a la instrucción
{3}. Entonces el secuencia de instrucciones:

{3} 1 ciclo
{4} 1 ciclo
{5} {6} 3*(k1-1)+2 ciclos
{7} 1 ciclo
{8} 2 ciclo
Total 7+(3*(k1-1) ciclos

Esta secuencia ciclos se ejecutan en su totalidad (k2-1) veces. Luego la tercera


vez esta secuencia resulta en:
{3} 1 ciclo
{4} 1 ciclo
{5} {6} 3*(k1-1)+2 ciclos
{7} 2 ciclos
Total 6+3*(k1-1) ciclos
se ejecuta “decfsz mem2” como el decremento es 0 consume 2 ciclos
40 Gustavo A. Yarce

El total de ciclos consumidos en esta rutina


2 + 1 + 1 + {(7 + (3 ∗ (k1 − 1)) ∗ 2 + 6 + 3 ∗ (k1 − 1)} + 2 ciclos
El máximo tiempo que se tarda, se cargan mem1 y mem2 con 0FFh.
La primera secuencia tarda
{3} 1 ciclo
{4} 1 ciclo
{5} {6} 764 ciclos
{7} 1 ciclo
{8} 2 ciclo
Total 769 ciclos
Esta secuencia se ejecuta 0Feh veces o 254 veces.
La segunda secuencia es
{3} 1 ciclo
{4} 1 ciclo
{5} {6} 764 ciclos
{7} 2 ciclos
Total 768 ciclos

EL número de ciclos total es


2 + 1 + 1 + {769 ∗ 254 + 768} + 2 = 2 + 1 + 2 + {101} + 2 = 196100ciclos
Lo que lleva un tiempo de 196100∗1e−6 = 0,1961 segundos o 196.1 milisegundos.

5.2.3. Rutina de retardo triple

retardo movlw .k3 ;{1}


movwf mem3 ;{2}
r3 movlw .k2 ;{3}
movwf mem2 ;{4}
r2 movlw .k1 ;{5}
movwf mem1 ;{6}
r1 decfsz mem1,1 ;{7}
goto r1 ;{8}
decfsz mem2,1 ;{9}
goto r2 ;{10}
decfsz mem3,1 ;{11}
goto r3 ;{12}
return ;{13}
Computadoras Electrónicas 41

La llamada a subrutina “call” tarda 2 ciclos. Luego salta a la subrutina en la


cual se encuentra con {1} y {2} que tardan en ejecutarse 2 ciclos. Luego entra en
la rutina principal, entre las líneas {7}{8} tenemos el bucle simple el cual tarda
en ejecutarse 3*(k1-1)+2 ciclos,

Entre las líneas {5}{6}{7}{8}{9}{10}, tenemos el bucle doble, el cual incluye


el bucle simple. Denominaremos a la expresión del bucle simple como
A = [3 ∗ (k1 − 1) + 2]
Por lo tanto el bucle doble puede expresarse como:

{5} 1 ciclo
{6} 1 ciclo
{A} A ciclos
{9} 1 ciclo
{10} 2 ciclos

Este bucle se ejecuta (k2-1). La expresión que rige el segundo bucle,

[(1+1+A+1+2)*(k2-1)]+[1+1+A+2]= [(5+A)*(k2-1]+[4+A]ciclos

Para indicar la expresión del bucle doble lo haremos como

B=[(5+A)*(k2-1)]+[4+A]

En la línea 3 comienza el bucle triple y finaliza en 12 la cual ocupa las siguientes


líneas:
3 1 ciclo
4 1 ciclo
B B ciclos
11 1 ciclo
12 2 ciclos

C=[(1+1+B+1+2)*(k3-1)]+[1+1+B+2]=[(5+B)*(k3-1)]+[4+B]=
42 Gustavo A. Yarce

Para determinar una rutina generaliza es

A=[3*(k1-1)+2]
B=[(5+A)*(k2-1)]+[4+A]
C=[(5+B)*(k3-1)]+[4+B]

D = 2 + 1 +1 +C + 2

Para el máximo de los valores cargados en k1, k2 y k3 para 255.

A=[3*(255-1)+2]=764 ciclos
B=[(5+764)*(255-1)]+[4+764] = [195326]+[768] = 196064 ciclos
C=[(5+196094)*(255-1)]+[4+196094] = 50005244 ciclos

D = 2 + 1 + 1 + 50005244 + 2 = 50005250 ciclos

Para un oscilador de 4 MHz, el tiempo de ciclo de instrucción es t = 1e−6 seg.

D= 50.005250 segundos
Índice alfabético

acumulador, 29 Return, 37
ROM, 9, 10
Call, 37 Rutina simple, 38
ciclo de instrucción, 15
contador de programa, 17, 20 sistema programable, 9
SRAM, 11
direccionamiento, 23
direccionamiento directo, 23
direccionamiento indirecto, 23

EEPROM, 10, 13, 14


EQU, 35
Estado, 27
estado, 20

FLASH, 11, 13, 19

instrucciones, 31

memoria de datos, 20

osciladores, 16

PC, 20, 22
PIC, 24
pic16f873, 13, 14
pila, 22
puerto a, 24
puerto b, 25
puerto c, 26

RAM, 10, 20
registro de estado, 27
reloj, 15
reset, 17
Retardo, 38

43

You might also like