Download MicrocontroladorPIC1..

Document related concepts
no text concepts found
Transcript
INSTITUTO POLITÉCNICO NACIONAL
Escuela Superior de Ingeniería Mecánica y Eléctrica.
EL MICROCONTROLADOR PIC16F84 Y SU
APLICACION EN LAS COMUNICACIONES
TESIS
PARA OBTENER EL GRADO DE
INGENIERO EN COMUNICACIONES Y ELECTRONICA
PRESENTAN
ALVARADO CORONA RAFAEL
BOLAÑOS RODRÍGUEZ BEATRIZ ANGELICA
URZUA OSORIO DAGOBERTO
DIRECTOR DE TESIS
DR. PRIMITIVO REYES LOPEZ
México, DF.
Mayo del 2004
1
INSTITUTO POLITÉCNICO NACIONAL
ESCUELA SUPERIOR DE INGENIERIA MECANICA Y ELECTRICA
UNIDAD PROFESIONAL “ADOLFO LÓPEZ MATEOS”
REPORTE TÉCNICO
QUE PARA OBTENER EL TITULO DE
POR LA OPCIÓN DE TITULACIÓN
DEBERA(N) DESARROLLAR
INGENIERO EN COMUNICACIONES Y
ELECTRONICA
SEMINARIO DE TITULACIÓN
C. ALVARADO CORONA RAFAEL
C. BOLAÑOS RODRÍGUEZ BEATRIZ
ANGELICA
C. URZUA OSORIO DAGOBERTO
“EL MICROCONTROLADOR PIC16F84 Y SU
APLICACION EN LAS COMUNICACIONES”
OBJETIVO:
Mostrar el marco teórico sobre el amplio campo de aplicación de este
microcontrolador y destacar sus posibilidades de uso en las Comunicaciones.
1
INTRODUCCIÓN
JUSTIFICACIÓN
CONCEPTOS BASICOS Y FUNDAMENTOS GENERALES
2 LOS MICROCONTROLADORES Y EL PIC 16F84.
3 PROGRAMADORES
4 DESARROLLO DE CIRCUITOS
REFERENCIAS BIBLIOGRAFICAS
2
INTRODUCCIÓN AL MICROCONTROLADOR
¿Qué es un microcontrolador?
Un microcontrolador es un dispositivo electrónico capaz de llevar a cabo procesos
lógicos. Estos procesos o acciones son programados en lenguaje ensamblador
por el usuario, y son introducidos en este a través de un programador. A lo largo
de esta tesis veremos todos los reglas y trucos de este lenguaje complicado por su
sencillez.
Un poco de historia
Inicialmente cuando no existían los microprocesadores las personas se ingeniaban
en diseñar sus circuitos electrónicos y los resultados estaban expresados en
diseños
que
implicaban
muchos
componentes
electrónicos
y
cálculos
matemáticos. Un circuito lógico básico requería de muchos elementos electrónicos
basados en transistores, resistencias, etc, lo cual desembocaba en circuitos con
muchos ajustes y fallos; pero en el año 1971 apareció el primer microprocesador
el cual originó un cambio decisivo en las técnicas de diseño de la mayoría de los
equipos. Al principio se creía que el manejo de un microprocesador era para
aquellas personas con un coeficiente intelectual muy alto; por lo contrario con la
aparición de este circuito integrado todo sería mucho más fácil de entender y los
diseños electrónicos serian mucho más pequeños y simplificados. Entre los
microprocesadores mas conocidos tenemos el popular Z-80 y el 8085. Los
diseñadores de equipos electrónicos ahora tenían equipos que podían realizar
mayor cantidad de tareas en menos tiempo y su tamaño se redujo
considerablemente; sin embargo, después de cierto tiempo aparece una nueva
tecnología llamada microcontrolador que simplifica aun mas el diseño electrónico.
3
Diferencias entre microprocesador y microcontrolador
Si has tenido la oportunidad de realizar un diseño con un microprocesador pudiste
observar que dependiendo del circuito se requerían algunos circuitos integrados
adicionales además del microprocesador como por ejemplo: memorias RAM para
almacenar los datos temporalmente y memorias ROM para almacenar el programa
que se encargaría del proceso del equipo, un circuito integrado para los puertos de
entrada y salida y finalmente un decodificador de direcciones.
Figura 1. Estructura de un sistema abierto basado en un microprocesador. La
disponibilidad de los buses en el exterior permite que se configure a la medida de
la aplicación.
Un microcontrolador es un solo circuito integrado que contiene todos los
elementos electrónicos que se utilizaban para hacer funcionar un sistema basado
con un microprocesador; es decir; contiene en un solo integrado la Unidad de
Proceso, la memoria RAM, memoria ROM, puertos de entrada, salidas y otros
periféricos, con la consiguiente reducción de espacio.
El microcontrolador es en definitiva un circuito integrado que incluye todos los
componentes de un computador. Debido a su reducido tamaño es posible montar
4
el controlador en el propio dispositivo al que gobierna. En este caso el controlador
recibe el nombre de controlador empotrado (embedded controller).
Figura 2. El microcontrolador es un sistema cerrado. Todas las partes del
procesador están contenidas en su interior y sólo salen al exterior las líneas que
gobiernan los periféricos.
Ventajas de un microcontrolador frente a un microprocesador
Estas ventajas son reconocidas inmediatamente para aquellas personas que han
trabajado con los microprocesadores y después pasaron a trabajar con los
microcontroladores. Estas son las diferencias más importantes:
Por ejemplo la configuración mínima básica de un microprocesador estaba
constituida por un Micro de 40 Pines, Una memoria RAM de 28 Pines, una
memoria ROM de 28 Pines y un decodificador de direcciones de 18 pines; pero un
microcontrolador incluye todo estos elementos en un solo Circuito Integrado por lo
que implica una gran ventaja en varios factores: En el circuito impreso por su
amplia simplificación de circuitería, el costo para un sistema basado en
microcontrolador es mucho menor y, lo mejor de todo, el tiempo de desarrollo de
su proyecto electrónico se disminuye considerablemente.
5
Los microcontroladores hoy día
Los microcontroladores están conquistando el mundo. Están presentes en nuestro
trabajo, en nuestra casa y en nuestra vida, en general. Se pueden encontrar
controlando el funcionamiento de los ratones y teclados de los computadores, en
los teléfonos, en los hornos microondas y los televisores de nuestro hogar. Pero la
invasión acaba de comenzar y el nacimiento del siglo XXI será testigo de la
conquista masiva de estos diminutos computadores, que gobernarán la mayor
parte de los aparatos que fabricaremos y usamos los humanos.
Cada vez existen más productos que incorporan un microcontrolador con el fin de
aumentar sustancialmente sus prestaciones, reducir su tamaño y coste, mejorar su
fiabilidad y disminuir el consumo.
Algunos fabricantes de microcontroladores superan el millón de unidades de un
modelo determinado producidas en una semana. Este dato puede dar una idea de
la masiva utilización de estos componentes.
Los microcontroladores están siendo empleados en multitud de sistemas
presentes en nuestra vida diaria, como pueden ser juguetes, horno microondas,
frigoríficos, televisores, computadoras, impresoras, módems, el sistema de
arranque de nuestro coche, etc. Y otras aplicaciones con las que seguramente no
estaremos tan familiarizados como instrumentación electrónica, control de
sistemas en una nave espacial, etc.
Una aplicación típica podría emplear varios microcontroladores para controlar
pequeñas partes del sistema. Estos pequeños controladores podrían comunicarse
entre ellos y
con un procesador central, probablemente más potente, para
compartir la información y coordinar sus acciones, como, de hecho, ocurre ya
habitualmente en cualquier PC.
6
Objetivo.
El objetivo del presente trabajo es proporcionar un panorama amplio para conocer
estos dispositivos y en particular del PIC16F84 que por sus relevantes
características, bajo costo y facilidad de programación nos brinda la oportunidad
de crear un sinfín de aplicaciones cuyo único límite es la imaginación. Además se
pretende dar un enfoque práctico, mostrando sus aplicaciones en diferentes áreas
y particularmente en el área de Comunicaciones, donde se mostrará el uso del
microcontrolador PIC16F84 para la modulación por ancho de pulso (PWM).
Cabe hacer la aclaración que el PIC16F84 requiere de algunos mínimos
componentes externos dependiendo de la aplicación que se pretenda darle. Como
ejemplo podemos mencionar el uso de un cristal de cuarzo y capacitores o
resistencias dependiendo del tipo de oscilador que se elija para hacerlo operar.
En cuanto a las condiciones actuales se mencionan también algunos otros
microcontroladores de otras empresas como los COP de NATIONAL, AVR´s de
ATMEL, la serie 8031 de INTEL, etc. Para así comprarlos con el PIC16F84 de
MICROCHIP y darnos cuenta de las superiores cualidades y características con
respecto a sus competidores mas cercanos. Se cree conveniente que para que se
pueda conocer más a fondo este dispositivo y trabajar con él primero debemos
definir que es y para que sirve un microcontrolador, sus características generales,
un amplio panorama de aplicaciones y mencionar el caso particular del PIC16F84
con los bloques que lo integran basándose en la familia 16X84 para así saber que
es la memoria de datos, la memoria de programas, el perro guardián, el registro
STATUS, etc, se aborda también el tema del diseño del conjunto de instrucciones
y estos temas son presentados en el capitulo II.
En el capitulo III y habiendo descrito los recursos con que cuenta el PIC16F84 en
el capitulo I, son presentadas las 35 instrucciones del set RISC de esta familia,
dando algunos ejemplo de uso en ciertos casos. Se hablará también de cómo
7
programar estos dispositivos y varios modelos de programadores existentes, así
mismo se hablará del software empleado en su programación y de otros paquetes
extras que facilitan el trabajo.
En el capitulo IV se dan ejemplos de prácticos sobre circuitos reales de diferentes
ramas de la ingeniería y uno de sus múltiples usos en el área de las
Comunicaciones que es la modulación por ancho de pulso o PWM.
En el capitulo V se presentan las conclusiones derivadas del análisis del
microcontrolador PIC16F84 y sus aplicaciones en el área de las Comunicaciones,
se incluyen hojas de especificaciones y costos de estos microcontroladores.
8
Planteamiento del Problema.
Debido a los grandes avances tecnológicos, nosotros como ingenieros
tenemos una gran participación en el desarrollo de nuevas tecnologías, esta es
una razón por la cual estamos proponiendo que una solución de bajo costo, la cual
sería el uso del microcontrolador, cabe señalar que este se debe seleccionar de
acuerdo a la aplicación que vallamos a desarrollar ya que se puede utilizar en un
sin
fin
de
aplicaciones,
esto
es
de
vital
importancia
pues
existen
microcontroladores de mucha capacidad y de poca capacidad por lo tanto, algunos
son muy económicos y otros son un poco mas caro.
Como
fue
mencionado
anteriormente
existen
otros
modelos
de
microcontroladores diferentes al PIC16F84, tal es el caso por ejemplo de los COP
de NATIONAL o los AVR´s de ATMEL que poseen algunos recursos similares al
PIC16F84 de microchip, pero que por su alto costo y dificultad de programación,
así como el tipo de tecnología empleada en su construcción, hacen decidirse por
una opción más económica y con mejores prestaciones como lo es el PIC16F84.
9
** INDICE **
INTRODUCCION
CAPITULO 1.- CONCEPTOS BASICOS Y FUNDAMENTOS GENERALES
01
1.1.- LA COMPUTADORA
02
1.2.- EL PROCESADOR
04
1.3.- LAS INSTRUCCIONES
07
1.4.- DESARROLLO DE LA COMPUTACION
09
1.5.- CLASIFICACION DE LAS COMPUTADORAS
13
CAPITULO 2.- LOS MICROCONTROLADORES Y EL PIC 16F84.
15
2.1.- DEFINICIONES Y APLICACIONES DE LOS MICROCONTROLADORES.
15
2.2.- MICROCONTROLADORES MAS COMUNES.
17
2.3.- COMPETIDORES DIRECTOS DEL PIC Y SUS PRINCIPALES RECURSOS.
18
2.4.- DESCRIPCION DE LOS PINES.
19
2.5.- DESCRIPCION INTERNA.
23
2.6.- TIPOS DE ARQUITECTURA DEL CONJUNTO DE INSTRUCCIONES.
35
2.7.- CONSIDERACIONES MAS COMUNES PARA EL DISEÑO DE LA ARQUITECTURA
DEL CONJUNTO DE INSTRUCCIONES.
36
2.8.- CLASIFICACION DE ISAs CON REGISTRO DE PROPOSITO GENERAL.
39
2.9.- REDUCED INSTRUCTION SET COMPUTER (RISC).
40
2.10.- CONSIDERACIONES PARA EL DISEÑO DEL CONJUNTO DE INSTRUCCIONES RISC.
43
2.11.- DISEÑO DEL CONJUNTO DE INSTRUCCIONES
44
CAPITULO 3.- PROGRAMADORES
57
CAPITULO 4.- DESARROLLO DE CIRCUITOS
70
4.1.- DESARROLLO DE UN DETECTOR DE RUIDO DE ALTA FRECUENCIA DE BAJO
70
COSTO BASADO EN EL MICROCONTROLADOR PIC16F84
4.2.- DESARROLLO DE UN CIRCUITO PARA PWM
77
4.3.- PROYECTOS CON EL PIC16F84
82
BIBLIOGRAFIA
96
10
CAPITULO I.- CONCEPTOS BASICOS Y FUNDAMENTOS GENERALES
Introducción.
En el campo de la electrónica existen diversos dispositivos programables, tal
es el caso de los microcontroladores que están ocupando un lugar de privilegio
dentro de la industria electrónica. En particular los microcontroladores de la
empresa Microchip, en los cuales se puede implementar fácilmente una gran
variedad de programas con un set reducido de instrucciones, y estos dispositivos
son conocidos como PIC.
Fundamentos de los procesadores.
A través de la historia de la humanidad, los cálculos principalmente se han
realizado con nuestro cerebro. Conforme la civilización ha avanzado se han
desarrollado herramientas de cálculo que han ayudado a el cómputo manual. En
un principio se usaron los dedos, piedras y se tallaron maderas para realizar
conteos. Posteriormente apareció el ábaco y la regla de cálculo.
A medida que el tamaño y complejidad de los cálculos aumentaban,
aparecieron dos limitantes en cuanto al cálculo manual:

La velocidad con que un humano realiza los cálculos.

La vulnerabilidad a cometer errores, por causa de distracción, fatiga,
etc., factores que no afectan a las máquinas.
En consecuencia aparecieron las primeras máquinas de cálculo automático.
11
Tanto el cálculo humano o artificial, contienen los siguientes componentes:

Un Procesador capaz de interpretar y ejecutar programas.

Una memoria para almacenar los programas y datos a procesar.

Mecanismos de entrada y salida para transferir información entre la
computadora y el exterior.
Unidad de
Procesamiento
Central
Entrada
Salida
Memoria
Principal (a)
(b)
Figura 1-1. Componentes principales (a) Cómputo humano (b) Cómputo de una máquina.
1.1
LA COMPUTADORA
Las computadoras actuales aún siguen la filosofía y conceptos que
introdujo John von Neumann, tales como el uso de una Memoria, que consiste en
un lugar donde se guardan ordenadamente las instrucciones que serán realizadas
por la máquina, así como los datos y resultados. De esta forma se tenía la
posibilidad de alterar el programa de instrucciones, es por esto que se denominan
máquinas de programa almacenado. Von Neumann también introdujo el uso del
sistema binario.
La máquina programada de von Neumann se compone de bloques
electrónicos digitales, que reciben, guardan y procesan información binaria,
comunicándose entre ellos por líneas digitales, conocidas como buses.
12
Figura 1-2. Arquitectura Von Neumann.
La Unidad de Control y el Camino de Datos conforman la Unidad de
Procesamiento Central, también llamado Procesador, la cual se encarga de
recibir ordenadamente las instrucciones desde la Memoria Principal para
interpretarlas y generar las señales de control, que se aplican sobre los
componentes del sistema para llevar a cabo las instrucciones.
El Generador de pulsos de reloj, se encarga de sincronizar las
operaciones que se llevan a cabo en los componentes que intervienen en el
manejo de los datos. La frecuencia del generador depende del diseño y tecnología
de la computadora y determina la velocidad de procesamiento del mismo.
La Memoria Principal almacena, tanto los datos como el conjunto
ordenado de instrucciones que al ser ejecutadas, proporcionan los resultados
esperados. Al conjunto ordenado de instrucciones se conoce como Programa. La
máquina tiene la capacidad de romper la secuencia ordenada según los resultados
parciales que se van obteniendo.
La encargada de adaptar el formato de la información entre la máquina y
los periféricos es la Unidad de Entrada y salida.
13
1.2
EL PROCESADOR
Un procesador de propósito general es un autómata de estados finitos
que ejecuta instrucciones almacenadas en una memoria. El estado del sistema
esta definido por los valores almacenados en las localidades de memoria junto
con los valores almacenados en ciertos registros del procesador.
La evolución de las computadoras se basa en los procesadores, que han
llegado a ser mucho más poderosos y han desplazado ampliamente el uso de
supercomputadoras en las empresas e industria.
Los procesadores también conocidos como CPU son usados en estaciones
de trabajo, servidores y dispositivos periféricos como impresoras y controladores
de disco. También son usados en muchas aplicaciones, incluyendo control y
monitoreo de funciones.
Funciones que realiza
La función primaria del procesador es ejecutar secuencias de instrucciones o
programas, almacenados en una memoria principal.
El procesador transfiere las instrucciones y los datos de entrada,
de la
memoria principal a sus registros. Ejecuta las instrucciones en la secuencia
almacenada, excepto cuando ésta es alterada por una instrucción de salto.
Transfiere los datos de salida de sus registros a la memoria principal.
El manejo eficiente del flujo de instrucciones y datos es una tarea básica que
debe desarrollar el procesador.
14
Elementos que lo integran
El procesador consta de los siguientes elementos:

Camino de datos (datapath).

Unidad de control.
Figura 1-3. Componentes del procesador.
Camino de datos o “datapath”
Se encarga del procesamiento de los datos, el camino de datos esta
compuesto por unidades funcionales y de almacenamiento que ejecutan ciertas
operaciones lógicas y aritméticas contenidas en las instrucciones. El datapath esta
estructurado de la siguiente forma:

Archivo de registros, almacena temporalmente los operandos.

Unidades funcionales, las cuales pueden ser ALUs (que ejecutan la suma,
resta y operaciones lógicas), desplazadores (shifters) o multiplicadores.

Multiplexores, los cuales guían a los datos a través del datapath.
15
La implementación de un “datapath” se crea en base a una tecnología de
“hardware” específica, la cuál es la que dicta la duración del ciclo de reloj, y esta
determinado por los circuitos más lentos que operan durante un periodo de ciclo
de reloj, por lo que es el procesador quien lo determina. Además de que ocupa la
mayor parte de los transistores y del área del procesador.
Unidad de Control
Se encarga de interpretar, coordinar, y realizar la transferencia de datos
entre la unidad aritmético-lógica, memoria y dispositivos de entrada y salida.
Analiza e interpreta los bits de los campos que componen a una instrucción,
posteriormente genera las señales de control adecuadas para especificar al
Camino de datos la operación que debe realizar, los operandos de entrada y el
lugar donde debe guardar el resultado. Además determina la dirección de la
siguiente instrucción a ejecutar.
Existen dos métodos para el diseño de la unidad de control:
Control
cableado y microprogramado.
Control cableado. Se basa en un circuito lógico secuencial o máquina de
estado finito, que genera secuencias específicas de señales de control en
respuesta a instrucciones externas. Su objetivo es minimizar el número de
componentes usados y maximizar la velocidad de operación. Una vez construida
la unidad de control, la única manera de implementar cambios es rediseñando
totalmente la unidad, es por esta característica que se conoce como Cableado o
Hardwired.
Microprogramación.
Se
construye
en
torno
a
una
unidad
de
almacenamiento llamada memoria de control, todas las señales de control se
almacenan en un formato similar a un programa. La memoria de control almacena
16
un conjunto de microprogramas diseñadas para implementar o emular el
funcionamiento de un conjunto de instrucciones en particular. Cada instrucción
origina la búsqueda del microprograma correspondiente. La extracción de la
información contenida en los microprogramas es muy similar a la búsqueda y
ejecución de un programa almacenado en memoria principal. Este tipo de control
es más sistemático al organizar las señales de control en palabras con formato
(microinstrucciones), los cambios en el diseño se pueden realizar fácilmente al
alterar el contenido de la memoria de control. El inconveniente es que son muy
costosas y tienden a ser lentas ya que se debe emplear tiempo extra en la
búsqueda de la microinstrucción dentro de la memoria de control.
(a)
(b)
Figura 1-4. Unidad de control (a) Cableado (hardwired)
1.3
(b) Microprogramado.
LAS INSTRUCCIONES
Dependiendo de la estructura de la computadora, se tiene un tamaño de
bits en el que se trabajan las instrucciones. Este tamaño se conoce como palabra
y suele ser de 8, 16, 32 ó 64 bits. Las instrucciones como los datos pueden ser de
una o varias palabras.
Una instrucción especifica sus parámetros por medio de campos, los
cuales suelen ser: Código de operación (codifica el tipo de operación lógica o
aritmética que realizará la instrucción), Operando fuente y destino, entre otros.
CÓDIGO
OPERANDO 1 OPERANDO 2
OP
RESULTADO
Figura 1-5. Campos de una instrucción.
17
Tanto las unidades de control cableadas como microprogramadas son
estructuradas como instrucciones o microinstrucciones pipelines como una
manera de incrementar la ejecución. El Pipeline es un método de bajo costo para
aumentar el rendimiento del procesador al descomponer su operación en una
secuencia de pasos relativamente independientes. Los procesadores actuales
usan el pipeline para incrementar su porcentaje efectivo de instrucciones
ejecutadas.
Etapas para la ejecución de una instrucción
Las instrucciones pueden descomponerse por ejemplo en cinco etapas
básicas, que son.
1° Etapa. Búsqueda de instrucción
Se localiza el código binario de la instrucción en la Memoria Principal. El
contador de Programa (PC), se encarga de depositar en el bus de direcciones la
dirección de la instrucción a ejecutar. Una vez decodificada la dirección en la
memoria, se lee la posición correspondiente y su contenido se transfiere por el
bus de datos e instrucciones a la Unidad de Control.
2° Etapa. Búsqueda del registro/Decodificación de la instrucción
La unidad de control interpreta el código binario de la instrucción que se ha
recibido de la Memoria principal y accede al archivo de registros para leerlos.
3° Etapa. Ejecución
La unidad de control genera las señales precisas para que el “datapath”
realice la operación correspondiente a la instrucción actual.
18
4° Etapa. Acceso a memoria
Es realizada únicamente por instrucciones de carga, almacenamiento, saltos
y bifurcaciones. El acceso a la memoria esta determinada por el tipo de
instrucción.
5° Etapa. Post-escritura (escritura del resultado)
El resultado obtenido en la etapa de ejecución de la instrucción se guarda en
el registro destino.
1.4
DESARROLLO DE LA COMPUTACIÓN
El desarrollo de la tecnología, en especial la relacionada con la
electrónica, ha afectado fuertemente la evolución de la organización de las
computadoras, por lo que se identifican cuatro etapas:
1° Etapa.
Es la época inicial o nacimiento de la computadora, y esta marcada por la
estructura propuesta por Von Neumann.
Figura 1-6. Arquitectura simplificada propuesta por Von Neumann.
19
La mayor actividad se realiza en la Unidad de Control y la Memoria Principal.
La unidad de control envía a la memoria la dirección de la instrucción, recibe su
código, lo interpreta y en fase de ejecución, selecciona la operación en la ALU,
busca los operandos y almacena los resultados. Es un ir y venir de datos e
instrucciones entre la memoria y la unidad de control. Así también las entradas y
salidas que proporcionan y reciben datos.
La tecnología usada en la implementación de esta estructura consistió en
válvulas de vacío. La velocidad de respuesta entre ambos bloques era similar, ya
que ambos estaban construidos con dichos dispositivos. En la programación de
las computadoras se usaba el lenguaje máquina binario.
2° Etapa
Es la época de los circuitos de pequeña y mediana escala de integración
(SSI y MSI), estos son usados en la construcción del procesador, pero no en la
Memoria, la cual se implementaba con tecnologías como núcleos de ferrita, cuyos
tiempos de acceso eran muy elevados, esto propicio una diferencia considerable
entre las tecnologías utilizadas para la construcción de esos dispositivos.
La velocidad de la memoria principal es 10 veces más lenta que la unidad de
control, lo que origina largos periodos de inactividad del procesador en la etapa de
acceso a Memoria.
Como medida para compensar la diferencia de velocidades surgen las
computadoras CISC. La unidad de control, la integra una memoria de control. Por
lo que el rendimiento quedaba a expensas de la velocidad de la memoria de
control, que al ser pequeña y estar construida con semiconductores, era mucho
más elevada que la memoria principal.
20
Figura 1-7. Arquitectura de una computadora CISC.
3° Etapa
El aumento de la densidad de integración permitió construir memorias más
rápidas, las cuales se incorporaron en la memoria principal, tratando de equilibrar
su velocidad con la del procesador. En está etapa aparece la memoria caché, la
cuál se intercala entre la memoria principal y unidad de control, esta contiene la
información más utilizada por el procesador. La memoria caché alcanza
velocidades de 5 a 10 veces más que la memoria principal, su capacidad es
pequeña pero su efectividad consiste en que contenga las instrucciones más
solicitadas por el procesador.
Figura 1-8. Arquitectura que utiliza memoria caché.
21
Las computadoras de memoria caché, al momento de decodificar
instrucciones complejas, hacen que el procesador se tarde más en realizar la
operación que en acceder a la memoria, es por esto que el interés en las
computadoras CISC ha ido disminuyendo.
4° Etapa
Se han realizado modificaciones en cuanto al diseño en la organización de
las computadoras, con mira al mejoramiento de la velocidad del procesador y el
equilibrio con la memoria caché, algunas de estas modificaciones son las
siguientes:
1.- Eliminación del microcódigo. Las instrucciones se vuelven sencillas, por lo
que desaparece la memoria de control.
2.- Reducción del tiempo de ciclo de máquina. Como consecuencia de la
simplificación de las instrucciones.
3.- Interpretación directa por el hardware de las instrucciones y ejecución de las
mismas en un ciclo de máquina.
4.- Ampliación de la caché para contener datos e instrucciones.
Los procesadores actuales dan gran importancia a la memoria caché, la
cual está dedicada exclusivamente a contener instrucciones y los datos más
usados. Se han establecido jerarquías entre distintos tamaños de caché,
existiendo varios niveles con distintas velocidades y capacidades.
También con estos criterios se realza el uso de las computadoras de
conjunto de instrucciones RISC.
22
Figura 1-9. Arquitectura básica de computadoras RISC.
1.5
CLASIFICACIÓN DE LAS COMPUTADORAS
Por el tipo y categorías de computadoras que se han fabricado suelen
clasificarse en cinco generaciones, las cuáles tienen aproximadamente una
duración de una década y que se caracterizan por un conjunto de parámetros, los
cuales podemos visualizarlos en la siguiente tabla.
23
CARACTERÍSTICAS
Duración
Tecnología
Fabricante
Máquina
Sistema
Operativo
Tipo de
Memoría
G
Primera
1950-1960
Válvulas
electrónicas
IBM-UNIVAC
IBM 701
E
N
Tambores y
cintas magnéticas
A
C
I
Máquina
N
E
S
Cuarta
Quinta
1960-1970
1970-1980
1980-1990
1990-2000
Transistores
CI SSI-MMI
CI LSI
CI VLSI
DIGITAL
APPLE
DEC-INTEL
BURROUGHS
NCR, CDC
CDC 6600
encadenamiento.
Núcleos de
Ferrita
PDP-8
PDP-11
Estructurados
bajo
multiprogramació
n y multiproceso
Memorias en CI
Y
Memorias Caché
FORTRAM
Lenguaje
O
Tercera
Muy primarios
Tubos de William.
R
Segunda
Monitor de
Muy rudimentario
E
Fujitsu
M382
Cray X-MP
Alpha21164
P6
SO de
tiempo
Multiprocesamiento
compartido
Memorias
Virtuales
Caché a varios niveles
Alto Nivel.
COBOL
BASIC
FORTRAN
Lenguaje natural
ALGOL
PASCAL
extendido
“C”
Conexión de los
Procesador.
CI en placas de
Memoria
circuito impreso
Integrada
Gran avance en
Extensión de
los sistemas
lenguajes de
operativos
alto nivel
PL1
Aportacion
es
Hardware
Aportacion
es
Software
Producto
Registros
Indexados
Canales
Mejoras en
ensambladores y
Fuerte impulso de
macro-
FORTAN
ensambladores
Computadora
Computadora
comercial
Mini computadora
Micro
computadora
CI de alta escala de
integración
Intento de sustituir
por hardware
Multiprocesador
Tabla 1-1. Características principales de las computadoras es las distintas generaciones.
24
CAPITULO 2.- LOS MICROCONTROLADORES Y EL PIC 16F84
Introducción.
Como
fue
mencionado
anteriormente
existen
otros
modelos
de
microcontroladores diferentes al PIC16F84, tal es el caso por ejemplo de los COP
de NATIONAL o los AVR´s de ATMEL que poseen algunos recursos similares al
PIC16F84 de microchip, pero que por su alto costo y dificultad de programación,
así como el tipo de tecnología empleada en su construcción, hacen decidirse por
una opción más económica y con mejores prestaciones como lo es el PIC16F84. A
continuación se definirá el concepto de microcontrolador, sus aplicaciones en la
vida cotidiana y en la industria y se presentaran los competidores más directos y
conocidos del PIC16F84, para así mostrar sus características principales, sus
recursos, su tecnología empleada, etc. Se presentaran también todos los recursos,
características y tecnología del PIC de la empresa MICROCHIP.
2.1.- Definición y aplicaciones de los microcontroladores.
El microcontrolador es un circuito integrado o chip que incluye es su interior
las tres unidades funcionales de una computadora: CPU, memoria y unidades de
E/S, es decir, se trata de un computador monopastilla, aunque de limitadas
prestaciones y que normalmente se dedica a resolver una tarea específica. Es
más pequeño que una caja de cerillos y, en ocasiones, cuesta menos, por lo que
suele ir incrustado en el dispositivo que controla.
Un microcontrolador es un microprocesador optimizado para ser utilizado
para controlar equipos electrónicos. Los microcontroladores representan la
inmensa mayoría de los chips de computadoras vendidos, sobre un 50% son
controladores "simples" y otro son DSPs más especializados. En el hogar pueden
existir en los electrodomésticos entre una y dos docenas de microcontroladores.
25
Pueden encontrarse en casi cualquier dispositivo eléctrico como lavadoras, horno
de microondas, teléfonos, etc.
Un microcontrolador difiere de una CPU normal, debido a que es más fácil
convertirla en un ordenador en funcionamiento, con un mínimo de chips externos
de apoyo. La idea es que el chip se coloque en el dispositivo, enganchado a la
fuente de energía y de información que necesite. Un microprocesador tradicional
permite hacer esto, ya que espera que todas estas tareas sean manejadas por
otros chips.
Por ejemplo, un microcontrolador típico tendrá un generador de reloj
integrado y una pequeña cantidad de memoria RAM y ROM /EPROM/ EEPROM,
significando que para hacerlo funcionar, todo lo que se necesita son unos pocos
programas de control y un cristal de sincronización. Los microcontroladores
disponen generalmente también de una gran variedad de dispositivos de entrada /
salida, como convertidores de analógico a digital, temporizadores, UARTs y buses
de interfaz serie especializados, como I2C y CAN. Frecuentemente, estos
dispositivos integrados pueden ser controlados por instrucciones de procesadores
especializados. Los modernos microcontroladores frecuentemente incluyen un
lenguaje de programación integrado, como el BASIC, ENSAMBLADOR, NIPLE,
etc, que se utilizan bastante con este propósito.
Los microcontroladores negocian la velocidad y la flexibilidad para facilitar su
uso. Debido a que se utiliza bastante sitio en el chip para incluir funcionalidad,
como los dispositivo de E/S ( entrada / salida) o la memoria que incluye el
microcontrolador, se ha de prescindir de cualquier otra circuitería.
26
2.2.- Microcontroladores más comunes.
Los microcontroladores más comunes en uso son:

AVR

Atmel

Hitachi

68HC12

H8

68HC16

Holtek

32-bit

HT8

683xx

Intel

NEC

8-bit

78K

8XC42

ST

MCS51

ST 62

8xC251

ST 7

16-bit

Texas Instruments

MCS96

TMS370

MXS296

Zilog

National Semiconductor

Z8

COP8

Z86E02

Microchip

Genérico

12-bit instruction PIC

14-bit instruction PIC

PIC16F84

16-bit instruction PIC

Motorola

8-bit

68HC05

68HC08

68HC11

16 Bit
27
Algunas arquitecturas de microcontrolador están disponibles por tal cantidad
de vendedores y en tantas variedades, que podrían tener su propia categoría.
Entre ellos encontramos, principalmente, las variantes de 8051 y Z80.
2.3.- Competidores directos del PIC y sus principales recursos.
Ahora se mostrarán 3 competidores directos del PIC de la gama media que
ofrecen recursos similares a los del PIC pero a un costo mayor, con muchas más
instrucciones, de mayores dimensiones, etc. Particularmente se presentarán
primero y en el orden siguiente el microcontrolador de ATMEL AT90S2313 (AVR )
con sus principales características, después seguirá el Motorola 68HC11 y por
último el 8051 de INTEL, se notará como es que estos microcontroladores
requieren tarjetas para desarrollo demasiado costosas y en precio superar al
PIC16F84 de MICROCHIP, presentando similares recursos y características y en
algunos casos inferiores con respecto al PIC.
AT90S2313 (AVR )
Es un microcontrolador de 8 bits con un encapsulado de 20 pines. Parte de estos
pines tienen una función específica y no pueden ser reconfigurados (VCC,
GND,RESET, XTAL1 y XTAL2). Otros, tienen un modo de trabajo totalmente
configurable por programa y dependerá de la aplicación en la que se aplique.
28
2.4.- Descripción de los pines
Pin 1 (RESET): (Entrada).
Reinicia
la
ejecución
de
instrucciones
del
microcontrolador
cuando está a 0 lógico. Un 1 lógico no afecta al funcionamiento del
microcontrolador.
Como mínimo este terminal debe estar a 0 dos ciclos de máquina para que se
procese el RESET.
Pines 20,10 (VCC, GND): (Alimentación).
Vcc debe estar comprendido entre 2,7 y 6V. Usualmente la alimentación esta en
5V estabilizados
Pines 4,5 (XTAL1,XTAL2):
(Entradas
de
reloj).
Entre
estas
líneas
se
conecta
el
cristal
de cuarzo con la frecuencia de resonancia adecuada para la generación del reloj
interno, o por el terminal XTAL1 se introduce la señal de reloj del sistema.
29
Pin 2 PD0 (RX). (Bidireccional).
Este terminal puede funcionar como entrada o salida digital asociado al BIT 0 del
puerto D, además puede tener la función especial de recepción de datos serie
para la UART.
Pin 3 PD1 (TX). (Bidireccional).
Este terminal puede funcionar como entrada o salida digital asociado al BIT 1 del
puerto D, también puede tener la función especial de transmisión de datos serie
desde la UART.
Pin 6 PD2 (INT0). (Bidireccional).
Este terminal puede funcionar como entrada o salida digital asociado al BIT 2 del
puerto D, además puede usarse para la generación externa de interrupción.
30
Pin 7 PD3 (INT1). (Bidireccional).
Este terminal puede funcionar como entrada o salida digital asociado al BIT 3 del
puerto D, además puede usarse para la atender interrupciones externas.
Pin 8 PD4 (T0). (Bidireccional).
Este terminal puede funcionar como entrada o salida digital asociado al BIT 4 del
puerto
D,
además
puede
usarse
como
entrada
de
reloj
para
el
temporizador/contador 0.
Pin 9 PD5 (T1). (Bidireccional).
Este terminal puede funcionar como entrada o salida digital asociado al BIT 5 del
puerto
D,
además
puede
usarse
como
entrada
de
reloj
para
el
temporizador/contador 1.
Pin 11 PD6 (ICP). (Bidireccional).
Este terminal puede funcionar como entrada o salida digital asociado al BIT 6 del
puerto D, además puede usarse como entrada de captura de cuenta del
temporizador/contador 0.
31
Pin 12 PB0 (AIN0). (Bidireccional).
Este terminal puede funcionar como entrada o salida digital asociado al BIT 0 del
puerto B, además puede usarse como una de las dos entradas analógicas del
comparador analógico integrado.
Pin 13 PB1 (AIN1). (Bidireccional).
Este terminal puede funcionar como entrada o salida digital asociado al BIT 1 del
puerto B, además puede usarse como una de las dos entradas analógicas del
comparador analógico integrado.
Pin 14 PB2. (Bidireccional).
Este terminal puede funcionar como entrada o salida digital asociado al BIT 2 del
puerto B.
Pin 15 PB3 (OC1). (Bidireccional).
Este terminal puede funcionar como entrada o salida digital asociado al BIT 3 del
puerto B, además puede usarse como salida del temporizador/contador 1.
Pin 16 PB4. (Bidireccional).
Este terminal puede funcionar como entrada o salida digital asociado al BIT 4 del
puerto B.
Pines 16,17,18 / PB5,6,7 (MOSI,MISO,SCK). (Bidireccionales).
Estos terminales pueden funcionar como entradas o salidas digitales asociadas a
32
los bits 5,6,7 del puerto B, además pueden usarse como terminales para la
comunicación serie síncrona para la programación de la memoria flash interna.
2.5.- Descripción interna.
En la siguiente figura muestra el diagrama en bloques de la arquitectura interna
del AT90S2313 AVR (RISC)
Detalles de los bloques del diagrama:

Un banco de 32 registros de 8 bits de propósitos generales, sobre los que
se realizan la totalidad de las operaciones de cálculo.

Una ALU de 8 bits para el cálculo aritmético y lógico con los datos
almacenados en el banco de registros de propósitos generales.

Una RAM de 128x8 bits, para almacenamiento de datos
33

Una EEPROM interna de 128x8, para el almacenamiento de datos que
deban
mantenerse,
aun
cuando
no
este
con
alimentación
del
microcontrolador.

Una memoria Flash EPROM de 1Kx16 bits para el almacenamiento de las
instrucciones del programa. Esta memoria dispone de un bus dedicado,
distinto del de datos, por el que transitan las instrucciones hacia el
decodificador de instrucciones,encargado de su ejecución.

Un puerto serie asíncrono o UART

Un puerto serie síncrono SPI

Un contador /temporizador de 8 bits

Un contador /temporizador de 16 bits con funciones de PWM, generación
de salida, control, etc.

Un WATCHDOG o perro guardián que vigila el correcto funcionamiento del
programa.

Un comparador analógico

15 líneas de entrada/salida

Una unidad de generación de interrupciones
En la siguiente figura se muestra el mapa de memoria de programa y datos.
34
Como podemos observar, el microcontrolador utiliza una arquitectura
HARVARD, donde la memoria de datos y programa tienen buses independientes.
La memoria de programa presenta 1k direcciones de 16 bits. Cada
instrucción. A pesar de los diferentes modos de direccionamiento que presente,
ocupa 16 bits, por lo que cada dirección de la memoria de programa contiene
aproximadamente una instrucción.
La memoria de datos se divide en tres regiones. La inferior, que ocupa las
primeras 32 direcciones, esta ocupada por el banco de registros de propósitos
generales (direcciones $00-$1F); La región central, cubre 64 direcciones en donde
se ubican los registros asociados a los diferentes puertos de entrada/salida del
microcontrolador, UART, comparador analógico, PUERTO B, PUERTO D, etc
direcciones $20-$5F). La región más alta, ocupa 128 posiciones y está asociada a
la memoria SRAM (direcciones $60-$DF).
Registros de propósitos generales
Todas las instrucciones que operan con los contenidos de los registros tienen
acceso al conjunto del banco, salvo las instrucciones que cargan datos de forma
35
inmediata como SBCI, SUBI, CPI, ANDI, ORI y LDI que sólo acceden a la segunda
mitad de los registros (R16..R31) Como ya se dijo con anterioridad, cada registro
está también mapeado en memoria, así el registro r31 ocupa la dirección $1F del
espacio de memoria de datos, etc. Los últimos 6 registros del banco, r26-r31,
pueden tener funciones alternativas como apoyo a los modos de direccionamiento,
en ese caso, se agrupan por pares para constituir los registros X,Y,Z de 16 bits
cada uno.
36
La memoria de datos SRAM.
La siguiente figura muestra cómo esta organizada la memoria datos
Muchas instrucciones utilizan el nombre del registro (R0..R31) en lugar de la
dirección que ocupa este en el espacio de direccionamiento de datos.
De forma parecida ocurre con los registros de I/O. Las instrucciones de entrada y
salida permiten reasignar un número a cada uno de ellos, de forma que el primer
registro de este tipo que encontramos se numera como 0 (dirección $20), el
siguiente, 1 (dirección $21) y así sucesivamente.
37
Modos de direccionamiento de datos y programas
El AVR AT90S2313 permite 5 modos de direccionamiento de datos:

Directo

Indirecto

Indirecto con predecremento

Indirecto con postincremento

Indirecto con desplazamiento

Inmediato
MODO DE REGISTRO DIRECTO
La instrucción contiene un campo de 5 bits que permite especificar cualquier
registro de los 32 registros existentes en el mapa de registros
El operando es contenido en registro d (Rd).
38
MODO DE REGISTRO DIRECTO (2 REGISTROS)
La instrucción contiene la dirección del operando fuente (Rr) y del destino
(Rd)(ambos operandos son registros del mapa de registros).
Los Operandos son contenidos en los registros r (Rr) y d (Rd).
El resultado se guarda en registro d (Rd).
MODO DE REGISTRO E/S DIRECTO
En este caso, la instrucción contiene la dirección de 6 bits del registro de E/S.
N es el registro que actúa como fuente o destino de la información
39
MODO DE DIRECCIONAMIENTO DIRECTO
La instrucción viene acompañada de una palabra de 16 bits que contiene la
dirección de memoria (SRAM, E/S, FILE REGISTER), además de un campo Rd/Rr
que contiene el registro que será fuente o destino de la información.
MODO DE DIRECCIONAMIENTO INDIRECTO CON DESPLAZAMIENTO
La instrucción contiene el desplazamiento que se sumará al registro Y o Z
para formar la dirección donde se encuentra el operando.
40
MODO DE DIRECCIONAMIENTO INDIRECTO
La dirección del operando se encuentra en el registro X, Y o Z especificado
en el código de operación de la instrucción.
MODO DE DIRECCIONAMIENTO INDIRECTO CON PREDECREMENTO
Es igual al modo anterior, con la diferencia que en este caso, el registro
X,Y,Z previamente se decrementa en una unidad.
41
MODO DE DIRECCIONAMIENTO INDIRECTO CON POSTINCREMENTO
Igual que el modo indirecto, pero al final el contenido del registro X, Y o Z se
incrementa en una unidad.
MODO DE DIRECCIONAMIENTO DE CONSTANTES EN MEMORIA DE
PROGRAMA (instrucción LPM)
Es común que los programas contengan valores constantes, estas
constantes se almacenan junto con las instrucciones, en la memoria de programa.
Debido a que este microcontrolador presenta una arquitectura Harvard, en donde
los buses de datos y programa están separados, el acceso a estas constantes
parece una tarea imposible. No obstante, existe un puente entre el bus de datos
42
de la memoria de programa y el bus de datos de la memoria de datos, que de
forma controlada, sólo utiliza la instrucción LPM.
Se recuerda que la memoria de programa tiene un tamaño de 1Kx16 bits, mientras
que los buses de datos usan un tamaño de 8 bits. En estas condiciones, el acceso
a un byte de la memoria de programa requiere que, en primer lugar, se especifique
la dirección del dato en los 15 bits más significativos del registro Z. El BIT 0 de
dicho registro se utiliza para seleccionar el byte alto o bajo de la constante.
La ejecución de LPM vuelca el dato en el registro R0.
MODO DE DIRECCIONAMIENTO DE PROGRAMA INDIRECTO (IJUMP,ICALL)
Estas instrucciones permiten que la ejecución del programa salte a la
posición de la memoria de programa indicada por el contenido del registro Z.
43
MODO DE DIRECCIONAMIENTO RELATIVO DE PROGRAMA (RJMP ,RCALL)
La instrucción contiene un desplazamiento K que se suma al contenido del
PC para encontrar la siguiente instrucción a ejecutar. Esto es, la ejecución del
programa continua en la dirección PC+k+1 los valores validos de k van desde 2048 a 2047.
El diseño del conjunto de instrucciones conocido también como Instruction
Set Architecture (ISA) es la parte del procesador que es visible al programador o al
diseñador de compiladores. El ISA es la interfaz entre el software y el hardware.
Para dar órdenes al “hardware” de la computadora es necesario hablarle en
su lenguaje. Las palabras de la máquina se denominan instrucciones y vocabulario
se denomina al repertorio de instrucciones o conjunto de instrucciones. Es este
capítulo se desarrollará el diseño de la arquitectura del conjunto de instrucciones
del procesador, buscando implementar un lenguaje que haga fácil la construcción
del hardware, también se desarrollaran los caminos de datos adecuados, para
ejecutar las instrucciones.
44
2.6 TIPOS DE ARQUITECTURA DEL CONJUNTO DE INSTRUCCIONES
Con respecto a la cantidad de instrucciones que soporta un procesador,
éstos se pueden clasificar en dos tipos:

CISC (complex instruction set computer) Computadoras con un
conjunto de instrucciones complejo.

RISC (reduced instruction set computer) Computadoras con un
conjunto de instrucciones reducido.
Conjunto de Instrucciones CISC
Es el tipo más antiguo y común, su característica más esencial es la
microprogramación. Tienen una gran cantidad de instrucciones y por tanto son
muy rápidos procesando código complejo. Las instrucciones compuestas son
decodificadas internamente y ejecutadas con una serie de microinstrucciones
almacenadas en una ROM interna. Para esto se requieren de varios ciclos de
reloj. Los procesadores CISC más populares son los de la familia 80x86 de Intel.
Conjunto de Instrucciones RISC
Lo tienen procesadores con un conjunto de instrucciones sencillas;
permiten una ejecución más rápida de las instrucciones. El código complejo puede
descomponerse en instrucciones más elementales, evitando así retardos de la
memoria principal, haciendo uso de numerosos registros y memoria caché. El
diseño en hardware de este tipo de procesadores es más sencillo en comparación
a los CISC. Otro de los objetivos del RISC es lograr que cada instrucción se
realice en un solo ciclo de reloj.
45
La ventaja que ofrece el procesador es la rapidez, pero para
alcanzarla es conveniente que las instrucciones sean simples. La tendencia
actual es que los procesadores contengan pocas instrucciones y que éstas
sean sencillas para ejecutarlas en un ciclo de reloj.
Los tipos de instrucciones en general se pueden clasificar de la siguiente
forma:
 Instrucciones de transferencia. Mueven la información entre las
localidades de Memoria Principal y los registros del procesador
 Instrucciones aritméticas y lógicas. Son las encargadas de efectuar
básicamente la suma y resta, así como, realizar operaciones AND, OR y XOR.
 Instrucciones
de
salto.
Rompen
la
ejecución
ordenada
de
las
instrucciones que componen un programa. Con la mayoría de las instrucciones, el
contador de programa se incrementa para apuntar a la siguiente instrucción que
hay en la secuencia del programa. Sin embargo, las instrucciones de salto cargan
en el PC valores aleatorios que modifican el flujo ordenado de las instrucciones de
un programa. Existen instrucciones de salto que son condicionales, es decir, para
que se altere el PC es necesario que se cumpla alguna condición, en caso
contrario continúa el flujo ordenado de las instrucciones.
2.7 CONSIDERACIONES MÁS COMUNES PARA EL DISEÑO DE LA
ARQUITECTURA DEL CONJUNTO DE INSTRUCCIONES
Al diseñar la arquitectura del conjunto de instrucciones de un procesador
se debe tomar en cuenta, el número de instrucciones a manejar, el número de
operandos que tendrán las instrucciones, los tipos y tamaños de éstos, etc. A
46
continuación se mencionan algunas características que hacen la diferencia entre
las arquitecturas de conjunto de instrucciones:
 Operandos almacenados en la CPU. Se refiere a que algunas ISA
guardan los operandos en localidades internas del CPU.
 Número de operandos por instrucción. Es el número de operandos que
son nombrados en una instrucción.
 Localidad del operando. El operando puede encontrarse o localizarse en
la memoria o estar guardado internamente en la CPU.
 Instrucciones.
Las instrucciones que formaran parte del conjunto de
instrucciones.
 Tipo y tamaño de los operandos. se definen y se especifica el tipo y
tamaño de los operandos.
De las características arriba mencionadas, el almacenamiento interno en
la CPU es lo que hace la diferencia primordial entre los procesadores.
Tipos de ISA con respecto a la forma de almacenamiento de los datos.
Existen tres tipos de ISA que son las más comunes y son los siguientes:
 Acumulador – Se utiliza un registro llamado acumulador, ya que todas las
operaciones se acumulan en éste. Por ejemplo.
Instrucción
add A
Operación
acc - acc + mem[A]
47
La instrucción 1 realiza una suma de un dato en memoria y el acumulador
(acc), el resultado se almacena en el acumulador.
 Pila - Los operandos se encuentran en el tope de la pila. Así todas las
operaciones se realizan en el tope de la pila. Por ejemplo.
Instrucción
add
Operación
top - top + next
Se realiza una suma con los operandos que se encuentran en el tope de
la pila y el resultado se almacena en el tope.
 Registros de Propósito General (GPR) – Los operandos que son
mencionados explícitamente, son almacenados en cada uno de los registros o en
localidades de memoria. Por ejemplo.
Instrucción
Operación
1 add A B
A= A+B
2 add A B C
A= B+C
La instrucción 1 realiza la suma del registro A
y B, el resultado es
almacenado en en registro A. La instrucción 2 hace la suma del registro B y C , el
resultado se almacena en A.
Diferencias entre los Tipos de Arquitecturas de Conjunto de Instrucciones
Acumulador
Ventajas: Maneja instrucciones cortas.
Desventajas: El acumulador es sólo un lugar de almacenamiento temporal
por lo tanto el tráfico en la memoria es mayor para este método.
48
Pila
Ventajas: Es un modelo simple para evaluar expresiones e instrucciones
cortas.
Desventajas: Una pila no puede ser accedida aleatoriamente, esto hace
difícil la generación de código eficiente. La pila es accedida por una misma
operación varias veces y llega a generar cuellos de botella.
Registros de Propósito General
Ventajas: Permite que la generación de código se realice fácilmente. Los
datos pueden permanecer almacenados en los registros durante largos periodos
de tiempo.
Desventajas: Todos los operandos deben ser nombrados y las instrucciones
son grandes.
Las primeras CPUs tenían las características de los dos primeros tipos
arriba mencionados, pero en los últimos 15 años todas las CPUs construidas son
procesadores de Registros de Propósito General. La razoón principal es que los
registros son más rápidos que la memoria,
los datos pueden ser guardados
internamente en la CPU y ésto se refleja en la rapidez con la que un programa
corre. Otra razón es que los registros son más fáciles de usar por el compilador.
2.8.- CLASIFICACIÓN DE ISAs CON REGISTRO DE PROPÓSITO GENERAL
Existen dos características principales del conjunto de instrucciones que
dividen a las arquitecturas GPR, y éstas son:
49

Sí una instrucción aritmética-lógica tiene dos o tres operandos
ADD R3, R1,
R2
R3 <-R1 + R2
ADD
or
R1,
R2
R1 <- R1 + R2
Tabla 2-1. Instrucción aritmética-lógica

Los operandos pueden ser direcciones de memoria en instrucciones
aritmético-lógicas, y éstas son las formas en que se pueden presentar:

Registro - Registro
ADD R3, R1, R2

(R3 <- R1 + R2)
Registro - Memoria
ADD R1, A

(R1 <- R1 + A)
Memoria - Memoria
ADD C, A, B
(C <- A + B)
2.9.- REDUCED INSTRUCTION SET COMPUTER (RISC)
Como se mencionó anteriormente los CPUs modernos son del tipo GPR
(Registro de Propósito General). Como ejemplos de estos CPUs son la IBM 360,
DEC VAX, Intel 80x86 y Motorola 68xxx, sin embargo, estos CPUs
fueron
claramente mejores que los CPUs anteriores basados en pila y acumulador, ya
que fueron mitigando inconvenientes en algunas áreas, pero presentaban los
problemas que se mencionan a continuación:
1.
Las instrucciones varianban en longitud de 1 byte a 6-8 bytes. Esto
causa problemas con la prebúsqueda y “pipelining” de las instrucciones.
50
2.
Las instrucciones aritmético-lógicas pueden tener operandos que son
localidades de memoria. Porque el número de ciclos tomados para acceder a
memoria varía. Esto no es bueno para los diseñadores de compiladores,
“pipelining” y múltiples emisiones.
3.
Muchas instrucciones aritmético-lógicas tenían sólo 2 operandos,
donde uno de los operandos también es el destino. Esto significa que el operando
es destruido durante la operación o se almacena antes en otro lugar.
A principios de los 80’s se introdujo la idea del RISC surgiendo del
proyecto SPARC iniciado en Berkeley y el proyecto MIPS en Stanford. RISC
significa Computadora de Conjunto Reducido de
Instrucciones. El ISA es
compuesto de instrucciones donde todas tienen exactamente el mismo tamaño,
usualmente de 32 bits. Por lo que puede realizar satisfactoriamente la
prebúsqueda y el “pipelined”. Todas las instrucciones aritmético-lógicas tienen 3
operandos los cuáles sólo son registros. Los accesos a memoria solo se realizan a
través de instrucciones explícitas de Carga / Almacenamiento.
Por ejemplo el código ensamblador de A = B + C sería:
LOAD R1, A
LOAD R2, B
ADD
R3, R1, R2
STORE C, R3
A pesar de que se realizan cuatro instrucciones, podemos reutilizar los
valores contenidos en los registros.
51
Conjuntos de Instrucciones Reducido
La arquitectura de conjunto de instrucciones reducido, trabaja con
instrucciones de una misma longitud, y el número de bits usados en el código de
operación es reducido. Por lo que menos instrucciones pueden ser realizadas.
Las instrucciones que son eliminadas de este tipo de conjunto de
instrucciones, son las operaciones menos importantes como cadenas y BCD
(binary-coded decimal). En efecto, ahora que los accesos a la memoria son
restringidos, no hay muchos tipos de instrucciones MOV o ADD. Por lo que la
arquitectura anterior es llamada CISC (Complete Instruction Set Computer). Las
arquitecturas RISC también son conocidas como arquitecturas de LOAD/STORE.
El número de registros en esta arquitectura usualmente es de 32 o más
registros. El primer CPU RISC
fue el MIPS 2000, que tiene 32 GPRs
contrariamente a los 16 de la arquitectura 68xxx y 8 en la arquitectura 80x86. La
única desventaja del RISC es el tamaño de su código. Usualmente se necesitan
más instrucciones y hay una pérdida en instrucciones cortas (POP, PUSH).
Sin embargo, aun se siguen desarrollando CPUs CISC, Intel sigue
invirtiendo tiempo y dinero en la manufactura del Pentium II y el Pentium III, esto
ocurre, porque así permite mantener la compatibilidad. La IBM PC compatible es
la computadora más común en el mundo. Intel quiere una CPU que pueda correr
todas las aplicaciones que están en manos de más de 100 millones de usuarios.
Por otro lado Motorola construyo la serie 68xxx la cual es usada en la
Macintosh para hacer la transición y conjuntamente IBM y Apple construyeron el
Power PC (PPC) un CPU RISC, el cual es instalado en la nueva Power Macs.
52
2.10.-
CONSIDERACIONES
PARA
EL
DISEÑO
DEL
CONJUNTO
DE
INSTRUCCIONES RISC.
Es necesario tener algunas consideraciones en el diseño del hardware,
que también influyen en la arquitectura del conjunto de instrucciones, y son:
1.
La simplicidad favorece la regularidad
2.
Más pequeño es más rápido
3.
Un buen diseño demanda compromisos
4.
Hacer que el caso común sea rápido
La simplicidad favorece la regularidad
Esto se refiere a lograr que el hardware que obedece al conjunto de
instrucciones sea sencillo, al considerar que las instrucciones son de una misma
longitud y que sus formatos sean sencillos. Ya que cuando se tienen instrucciones
de diferentes longitudes y muchos formatos diferentes, el hardware sea complica.
Más pequeño es más rápido
Se refiere al tamaño y complejidad del hardware, ya que entre mas
pequeño y sencillo es más rápido.
Un buen diseño demanda compromisos
Existen problemas cuando una instrucción necesita campos mayores
que los estipulados. Por lo que se presenta un conflicto entre el propósito de que
todas las instrucciones tengan la misma longitud y de que todas las instrucciones
tengan un formato sencillo. Si el interés o compromiso es que las instrucciones
tengan una misma longitud, entonces será necesario manejar distintos tipos de
formatos para diferentes tipos de instrucciones.
53
Hacer que el caso común sea rápido
Una forma de evitar los accesos a memoria es tener diferentes
instrucciones aritméticas, es común que las operaciones aritméticas contengan
operadores constantes o de direccionamiento inmediato, permitiendo que estas
instrucciones sean mucho más rápidas que sí se cargasen de memoria.
2.11.- DISEÑO DEL CONJUNTO DE INSTRUCCIONES
En esta sección se define la arquitectura del conjunto de instrucciones
del procesador que se desarrollará en este trabajo de tesis.
Se determino que la arquitectura del conjunto de instrucciones será de
carga – almacenamiento o RISC, por las características que posee este tipo de
arquitectura. El conjunto de instrucciones contendrá operaciones básicas, el
tamaño de palabra o será de 16 bits.
Conjunto de Instrucciones
El conjunto de instrucciones consta de 14 instrucciones, las cuales se
subdividen de la siguiente manera:

Instrucciones Aritmético-Lógicas. add, sub, and, or, srl, sll.

Instrucciones de Acceso a Memoria. ld y st.

Instrucciones de Toma de Decisión. bc, bz.

Instrucciones de Salto. j

Instrucciones de Control. clr_c, set_c, load_p
54
Formatos
El tamaño de las instrucciones es de 16 bits y se manejan 4 tipos de
formatos a los que obedecen las instrucciones, y estos son los siguientes:
Instrucciones Aritméticas-Lógicas: Este tipo de instrucciones se componen
de cuatro campos, los cuales representan el código de operación (op), y tres
campos correspondientes a los registros operandos y destino (rf1, rf2 y rd),
respectivamente. Cada operando campo es representado por 4 bits, como se
muestra en el siguiente esquema.
15
12 11
op
87
rf1
43
rf2
0
rd
Instrucciones de Acceso a memoria: El formato de instrucciones cuenta con
tres campos,
que representan el código de operación (op), un campo para
denotar el registro y 8 bits para representar la dirección. A continuación se
muestra el esquema de este formato.
15
12 11
op
87
0
dirección
registro
Instrucciones Toma de decisiones: El formato cuenta con tres campos,
código de operación (op), el desplazamiento representado por 8 bits y
bits no
utilizados, este formato lo podemos ver a continuación.
15
12 11
op
87
xxxx
0
desplazamiento
Instrucciones de Salto: En el formato se tiene un campo de 4 bits
correspondiente al código de operación y el campo de dirección representado por
12 bits, como lo vemos a continuación.
15
12 11
op
0
dirección
55
Modos de Direccionamiento
Para este procesador se tienen 3 modos de direccionamiento, que son
los siguientes:
1.
Direccionamiento de registro. El operando es un registro
15
12 11
87
op
rf1
43
0
rf2
rd
Registro
Figura 2-1. Modo de direccionamiento de registro
2.
Direccionamiento de página. La dirección efectiva se forma de la
concatenación del registro de página y el campo de dirección de la instrucción,
donde los bits más significativos son ocupados por el registro de página y los
restantes por el campo de dirección de la instrucción.
15
12 11
op
87
registro
0
dirección
Memoria
11
87
R e g. P a g.
0
Figura 2-2. Modo de direccionamiento de página
3.
Direccionamiento relativo al PC. La dirección se compone al sumar el
contador de programa, más el desplazamiento.
15
12 11
op
87
xxxx
0
desplazamiento
Memoria
P C
+
Figura 2-3. Modo de direccionamiento relativo al PC
56
Instrucciones
add
Suma con acarreo
Sintaxis
add rd, rf1, rf2
Suma el contenido de los registros rf1, rf2 y la bandera de acarreo, el
resultado es guardado en rd.
sub
Resta con acarreo
Sintaxis
sub rd, rf1, rf2
Resta el contenido de los registros rf1, rf2 y la bandera de acarreo, guarda
el resultado en rd.
and
Realiza la operación lógica AND
Sintaxis
and rd, rf1, rf2
Efectúa la operación lógica AND entre los registros rf1 y rf2, depositando el
resultado en rd.
or
Realiza la operación lógica OR
Sintaxis
or rd, rf1, rf2
Realiza la operación lógica OR entre los registros rf1 y rf2, guarda el
resultado en rd.
srl
Realiza corrimiento lógico a la derecha
Sintaxis
srl rd, rf1, rf2
Corrimiento lógico a la derecha, a rf1 se le aplica el número de corrimientos
contenido en rf2, guarda el resultado en rd.
sll
Realiza corrimiento lógico a la izquierda
Sintaxis
sll rd, rf1, rf2
Corrimiento lógico a la izquierda, a rf1 se le aplica el número de
corrimientos contenido en rf2, el resultado se coloca en rd.
57
ld
Cargar palabra
Sintaxis
ld rd, dir
El registro rd es cargado con el contenido de la dirección de memoria
compuesta por el contenido del registro que almacena el número de página y la
dirección estipulada en dir.
st
Almacenar palabra.
Sintaxis
st rd, dir
Almacenar palabra, el contenido del registro rd es transferido a la dirección
de memoria compuesta por el número de página y la dirección dir.
bc Saltar si la bandera de acarro esta habilitada.
Sintaxis
bc
desplazamiento
Si la bandera de acarreo es 1, el PC se desplaza en el número de
localidades denotado por desplazamiento. Si la bandera de acarreo es 0 entonces
continua con la siguiente instrucción.
bz
Saltar si la bandera de cero esta habilitada
Sintaxis
bz
desplazamiento
Si la bandera de cero es 1, el PC se desplaza en el número de localidades
denotado por desplazamiento. Si la bandera de acarreo es 0 entonces continua
con la siguiente instrucción.
j
Salto incondicional
Sintaxis
j dir
Salta a la dirección de memoria dir.
58
clr_c
Limpiar bandera de acarreo.
Sintaxis
clr_c
La bandera de acarreo es puesta a cero.
set_c
Establece bandera de acarreo.
Sintaxis
set_c
La bandera de acarreo es puesta a uno.
load_p
Cargar página
Sintaxis
load_p pagina
El registro de página es cargado para usarlo con
posteriores
direccionamientos.
Elementos necesarios para la implementación del conjunto de instrucciones.
El diseño de la implementación del “datapath” o camino de datos de un
procesador esta determinado en gran parte por la arquitectura del conjunto de
instrucciones que se tenga, por lo que es importante agrupar las instrucciones y
analizar que elementos electrónicos se necesitan para que éstas se lleven a cabo,
una vez realizado esto es importante identificar elementos que son comunes en
los diferentes tipos instrucciones que se tiene. Posteriormente, se determinara el
tipo de camino de datos a implementar, basándose en la frecuencia de reloj y el
número de instrucciones por ciclo (CPI), que se requiera.
A continuación analizaremos los elementos que se necesitan para que las
instrucciones del ISA propuesto se lleven acabo. Así también realizaremos la
implementación de cada uno de los elementos en el lenguaje de descripción en
Hardware Verilog.
59
Búsqueda de instrucciones
El primer elemento necesario es un elemento o dispositivo que almacene las
instrucciones de un programa, para lo cual se hace uso de una unidad de
memoria que almacene y proporcione las instrucciones en base a una dirección
dada. También
se necesita un elemento que contenga la dirección de la
instrucción, conocido como contador de programa (PC), para poder ejecutar el
programa almacenado en la memoria es necesario leer cada una de las
instrucciones del programa, por lo que es necesario un elemento que realice el
incremento necesario de la dirección de memoria, esto puede hacerse a través de
un sumador que incremente la dirección actual en un determinado número de
localidades para ir a la siguiente instrucción. El datapath necesario para realizar lo
anteriormente dicho se ilustra a continuación.
Incremento
Add
P
C
Memroira
de
Instrucciones
Instrucción
Figura 2-4. Datapath para la búsqueda de instrucción.
El PC es de 12 bits con lo que se podrán direccionar hasta 212 localidades de
memoria. A continuación se muestra el diagrama y código en verilog.
60
module PC(clk_PC, reset, direccion, PC_E, direccion_PC);
PC_E
input clk_PC, PC_E, reset;
input [11:0] direccion;
output [11:0] direccion_PC;
reg
[11:0] direccion_PC;
always @(posedge clk_PC)
begin
if(reset) direccion_PC = 12'b000000000000;
else if (PC_E) direccion_PC = direccion;
end
Direccion
P
C
Direccion_PC
clk_PC
reset
endmodule
Figura 2-5. Código Verilog y Diagrama del Contador de programa PC.
La memoria de instrucciones tiene un tamaño de 212 localidades de 16 bits
cada una. En seguida vemos segmento del código de una memoria de
instrucciones y su diagrama.
module Memo_Instr (pc, rst, instruccion);
input [11:0] pc ;
input rst;
output [15:0] instruccion ;
reg [15:0] instruccion ;
always @(pc)
begin
if (rst) instruccion = 16'b0;
else begin case (pc)
12'b000000000000 : instruccion = 16'b0111000000001100 ;
12'b000000000001 : instruccion = 16'b1100001100100000 ;
12'b000000000010 : instruccion = 16'b1110010001010001 ;
. . .
endcase end
end
endmodule
pc
Memoria
De
Instrucciones
Instruccion
rst
Figura 2-6. Código Verilog y Diagrama de la Memoria de Instrucciones.
El sumador es de 14 bits y su código y representación gráfica se ilustra
enseguida.
61
module sumador_PC(dir_PC, PC_incrementado);
INC
parameter INC=1'b1;
Sumador PC
input [11:0] dir_PC;
output [11:0] PC_incrementado;
dir_PC
PC
incrementado
assign PC_incrementado = dir_PC + INC ;
endmodule
Figura 2-7. Código Verilog y Diagrama del Sumador.
Instrucciones Aritmético-Lógicas
Las instrucciones que se encuentran dentro de esta agrupación son: la suma
(add), resta (sub), la operación and (and), or (or), corrimiento a la derecha (srl), y
corrimiento a la izquierda (sll).
Para ejecutar las instrucciones se necesita primeramente obtener los datos a
procesar del banco de registros e introducirlos a una unidad lógica aritmética,
para que realice la operación. El datapath correspondiente se representa de la
siguiente manera.
escribir
Reg1
Reg2
EscReg
EscDato
Banco de
Registros
operacion
ALU
Resultado
Figura 2-8. Diagrama del datapath de Instrucciones aritmético-lógicas.
Banco de registros
El ISA propuesto realiza las operaciones a través del uso de registros, por lo
que es necesario contar con un banco de registros. El banco de registros,
permite leer o escribir un dato especificando el número de registro.
62
Considerando el formato de las instrucciones aritmético-lógicas, se requieren
de tres operandos de registros, dos para leer los datos del banco de registros y
uno para escribir el resultado en un registro. Por lo que es necesario que el banco
de registros cuente con dos entradas para indicar los registros a leer y dos salidas
para leer el dato contenido en los registros respectivos. Para escribir un dato es
necesario tener una señal que indique cuando se realizará una escritura, así como
una entrada para indicar el registro a escribir y otra para proporcionar el dato.
El banco de registros cuenta con 16 registros de 16 bits, ya que es el número
de registros que permite al procesador realizar de forma eficientemente los
programas que se propongan, cada registro tiene un ancho de 16 bits, puesto que
el tamaño de los datos estipulados en el diseño de la arquitectura fue de 16 bits.
Las entradas para leer o escribir registro deben ser de 4 bits para poder
direccionar los registros del cero al quince (16 registro). Las salidas y la entrada
para el dato a escribir son de 16 bits. Esto se representa en el diagrama que se
muestra enseguida, así como parte del código de implementación en Verilog.
module Registros (clk, rst, we, wr, r1, r2, wd, d1, d2);
input
clk, rst;
...
output [15:0] d1;
...
reg [15:0] ram [15:0];
always @(posedge clk or posedge rst)
begin
if (rst) begin
ram[0] <= 5;
ram[1] <= 1;
.......
ram[14] <= 14; ram[15] <= 15; end
end
assign d1 = ram[r1];
assign d2 = ram[r2];
endmodule
we
r1
r2
wr
Banco de
d1
Registros
wd
d2
Figura 2-9. Código Verilog y diagrama del Banco de registros.
63
Unidad aritmético-logica (ALU)
Realiza operaciones de suma, resta, and, or, corrimientos a la derecha e
izquierda. La ALU es de 16 bits y realiza las operaciones para números sin signo.
Tiene dos entradas para los datos a procesar y 3 salidas, una para el resultado y
dos para señales de acarreo y cero. A continuación se muestra el diagrama e
implementación en Verilog de la ALU.
module ALU(ctrl_ALU, A, B, c_en, c_sal, cero, R);
input [2:0] ctrl_ALU;
input [15:0] A, B;
input
c_en;
output
c_sal, cero;
output [15:0] R;
reg [15:0] Raux, R;
........
always @( ctrl_ALU or A or B or c_en)
begin
case (ctrl_ALU)
suma: begin {c_sal,R} = A + B + c_en;
cero = (R == 1'b0) ? 1'b1: 1'b0; end
resta: begin {c_sal,Raux} = A - B - c_en;
if (c_sal == 1) R=(~Raux)+1; else R=Raux;
cero = (R == 1'b0) ? 1'b1: 1'b0; end
op_and: begin R = A & B; c_sal = 1'b0; cero = 1'b0; end
.......
endcase
end
endmodule
ctrl_ALU
c_en
A
ALU
c_sal
c_en
R
B
Figura 2-10. Código Verilog y Diagrama de la ALU
Instrucciones de acceso a memoria
Las instrucciones de acceso a memoria son: carga (ld) y almacenamiento (st)
de dato. Almacenar o cargar un dato de memoria, implica leer o escribir en un
registro del banco de registro y escribir o leer un dato en una localidad de la
memoria de datos. Para direccionar la memoria se hace uso de la paginación,
para lo cual es necesario un registro de pagina, que es de 4 bits. La dirección de
la memoria esta compuesta en los primeros 4 bits por la página y enseguida por
la dirección estipulada en la dirección. A continuación se ilustra el datapath
correspondiente a este tipo de instrucciones.
64
escribir
Reg1
Reg2
EscReg
Banco de
Registros
Memoria
de datos
Dato
EscDato
Página
Direccion
Figura 2-11. Diagrama del datapath para ejecutar
instrucciones de toma de decisiones.
La memoria de datos puede direccionar hasta 212 localidades, cada
localidad tiene un ancho de 16 bits, un segmento de código y el diagrama de ésta,
podemos verlo enseguida.
module Memo_Datos(clk, rst_memo, esc_memo, dir, dato_e, dato_s);
esc_memo
input [15:0] dato_e;
....
output [15:0] dato_s;
reg [15:0] ram[31:0];
always @(posedge clk or posedge rst_memo)
begin
if (rst_memo) begin
ram [0] <= 1; ram [1] <= 2; ram [2] <= 3;
....
ram[30] <= 31; ram[31] <= 31; end
else if (esc_memo) ram [dir] <= dato_e;
end
assign dato_s = ram[dir];
endmodule
dato_e
dir
Memoria
de
Datos
dato_s
clk
rst_memo
Figura 2-12. Código Verilog y diagrama de la memoria de datos.
El registro de página, contiene el número de página en el que se
direccionará, este registro es de 4 bits que se concatena con la dirección
representada en la instrucción. El código y diagrama se ilustran enseguida.
65
module Pagina (pag_E,, pag, s_Pag);
input pag_E;
input [3:0] pag;
output [3:0] s_Pag;
pag_E
Pagina
s_Pag
assign s_Pag = pag_E ? pag : 0;
endmodule
Figura 2-13. Código Verilog y diagrama del registro de página.
Instrucciones de Toma de decisiones y Salto
La instrucciones de toma de decisiones y salto, son: saltar si la señal de
acarreo esta activa (bc), saltar si la señal de cero esta activa (bz) y saltar a cierta
dirección (j). Para ejecutar estas instrucciones se necesita modificar el datapath de
la búsqueda de instrucciones, ya que es allí donde se almacena la dirección de la
siguiente instrucción, por lo que se agregaría un multiplexor para decidir que
dirección será la siguiente: si la estipulada en el salto condicional, la secuencia
normal del programa o será otra dirección, la decisión sobre que dirección se
ejecutará, la proporciona el control del procesador.
Instrucciones de Control
Las instrucciones de limpiar señal de acarreo (clr_c), establecer bandera de
acarreo (set_c), cargar página (load_p), no necesitan un hardware especial, ya
que éstas pueden ser ejecutadas por líneas de control.
Una vez que ya conocemos los caminos de datos o “datapath” necesarios
para realizar las instrucciones, podemos combinarlos en un sólo datapath y
realizar el control necesario para que las instrucciones se lleven a cabo. Para
realizar el datapath del conjunto de instrucciones, es necesario determinar el tipo
de datapath mas adecuado para la implementación. Esto lo veremos en el capítulo
cuatro.
66
En el siguiente capítulo hablaremos de las herramientas que se
utilizaran para el diseño, simulación e implementación del camino de datos o
datapath.
CAPITULO 3.- PROGRAMADORES
En este capitulo se tratarán los programadores existentes.
NOPPP, the "No-Parts" PIC Programmer
NOPPP es un sencillo programador para los microcontroladores PIC16C84,
PIC16F83 y PIC16F84. Se conecta al puerto paralelo del PC. Un extenso artículo
con los planos y descripción fué publicado en Electronics Now Magazine,
Septiembre de 1998.
El NOPPP es inusualmente simple y utiliza componentes fácilmente
localizables.Probablemente ya tendrás todos los componentes necesarios. Aquí
tienes el circuito (modificado ligeramente respecto al diseño original para mayor
fiabilidad):
En el PIC, la patilla MCLR se pone a +5V para el funcionamiento normal (no
se usa aquí), a +12V para grabación, y a 0V para resetear. Realmente los +12V no
"queman una EPROM" -- el voltaje superior es meramente una señal para activar
67
el circuito interno de programación de la memoria flash. Debe ser mayor de 12.0
volts. La salida D0 del PC controla esta señal. No hay peligro para el chip si se
aplica esta señal en un momento inadecuado.
El PIC se comunica mediante protocolo serie síncrono de dos líneas (mas
masa).El Pin B6 es la señal de strobel; los pulsos en este pin le indican al PIC
cuando debe recibir o transmitir cada bit de datos. El Pin B7 se utiliza como
entrada y salida. Cuando el PIC está recibiendo datos desde el PC, la señal
SLCTIN es mantenida a nivel bajo y por lo tanto D2 no conduce por lo que D1 y
R1 no se utilizan en este momento y el PIC recibe los datos mediante la señal
AUTOFD.
Cuando el PIC está enviando datos, las señales SLCTIN y AUTOFD están a
nivel alto, D1 no conduce y D2 y R1 proporcionan la polarización (pull-up). La
resistencia R2 mas la resistencia interna de la línea AUTOFD (dentro del puerto
del PC normalmente 4.7k, auque a veces mucho menos en los nuevos puertos
paralelos CMOS) proporcionan algo de Pull-up adiciona. El PC lee la información
através de la línea BUSY, que es 0.6V mayor que la salida del PIC debido al diodo
D2. El puerto paralelo del Pc tiene (o debería tener) entradas CMOS o Schmitt y
no debería necesitar verdaderos niveles lógicos TTL.
R2 y R3 ayudan a reducir las interferencias aislando la capacidad de entrada
del PIC, de modo que circule menos corriente durante transiciones bruscas.El PIC
tiene entradas del tipo Schmitt, que no impiden la reducción del tiempo de subida
(rise tiem). R4 proteje la base de Q1
El circuito original publicado en Electronics Now es suficientemente fiable.
Sin embargo, revisando una revista me encontre un circuito con algunas
modificaciones, me tome la molestia de armarlo y con la novedad de que funciona
perfectamente y aqui te lo muestro. Novedades del circuito, usa diodos 1n4148,
transistores bc548 y se omiten algunas resistencias .
68
Para alimentar el circuito se requieren dos fuentes de alimentacion reguladas
una de 5 volts y una de 12 volts.
El software original para este programador esta desarrollado en c y funciona
perfectamente bajo una ventana de ms-dos, pero eso no es todo tambien hay una
version adaptada del noppp para windows que de igual manera ya la he probado y
funciona muy bien y aqui te las presento un mano a mano.
El circuito.
Este programador, basado en el Ludipipo, está adaptado a la programación
de PICs, es simple y barato (2 euros), pero permite programar a través del puerto
serie de cualquier PC de sobremesa (en los portátiles da problemas) una cantidad
nada despreciable de PICs distintos, y todo ello utilizando software de
programación estándar, como ICPROG 1.4.
69
Se ha probado con éxito a programar los siguientes PICs:
16F627, 16F628.
16C84, 16F83, 16F84.
16F873, 16F874, 16F876, 16F877.
18F242, 18F252, 18F258, 18F442, 18F452, 18F458.
Y, al menos en teoría (no los he probado) debería funcionar
correctamente con los siguientes:
16C62, 16C63, 16C64, 16C65, 16C66, 16C67.
16C71, 16C72, 16C73, 16C74, 16C75, 16C76, 16C77, 16C715.
16C620, 16C621, 16C622, 16C623, 16C624, 16C625.
16F870, 16F871, 16F872.
16C923, 16C924.
Teniendo en cuenta el costo en tiempo y dinero que requiere la
construcción de este programador, no se puede pedir más.
Sin entrar en detalles sobre el funcionamiento del circuito, decir sólo
que se basa en principios muy parecidos a los del JDM2, pero con ciertos
retoques en la temporización y la estabilidad de las señales. En este caso, se
utiliza como alimentación de +5V el condensador C2, que se carga mediante D2,
D3 y D4 en los momentos en que las señales DTR, RTS y TXD del puerto serie
son negativas, y su tensión queda estabilizada mediante D7. D5 fija la tensión de
programación en 12V y D6 limita la tensión de la señal CLOCK a 5V.
70
Figura 3.1
Realización práctica.
El diseño final aparece en la figura 3.2. El trazado se ha hecho sobre
un grid de una décima de pulgada para que se pueda construir sobre una placa
board. La construcción de este circuito es bastante simple, así que sólo queda
aclarar que el conector CON1 es de los que se utilizan para fabricar cables serie, y
se debe montar de forma que la placa encaje entre sus dos filas de patitas,
quedando cinco patitas en la cara de cobre y 4 en la cara de componentes (ver
figuras 3 y 4).
71
Figura 3.2
Figura 3.3
72
Figura 3.4
Para conectar el programador al PC hará falta también un cable serie
transparente (cableado pin a pin) que tenga cableados al menos los pines que se
indican en la figura 3.5. Este cable se puede fabricar o comprarlo ya hecho (es el
tipo de cable que se utiliza para conectar un modem al PC).
Figura 3.5
Utilización.
Lo primero que hay que tener claro a la hora de utilizar este
programador es el orden en que se deben hacer las cosas para no estropear ni el
73
programador, ni el PIC, ni el puerto serie del PC. Siempre que queramos insertar o
extraer un PIC del zócalo hay que desconectar el programador del puerto serie,
ya que, al extraer la alimentación del puerto serie, mientras esté conectado estará
alimentado. Por tanto, el proceso a seguir consta de los siguientes pasos:
1º.-Con el programador desconectado insertar el PIC en el zócalo en la
posición correcta (figura 6).
2º.-Conectar el programador al cable que viene del puerto serie del PC.
3º.-Llevar a cabo las operaciones de grabación o lectura necesarias.
4º.-Desconectar el programador del cable que viene del puerto serie del PC.
5º.-Extraer el PIC del zócalo.
Figura 3.6
Como software de grabación recomiendo ICPROG 1.05A, que ha sido
probado y funciona perfectamente con este programador. Se puede bajar de su
website. Una vez instalado, en el menú SETTINGS – OPTIONS, en la sección
LANGUAGE elegimos ESPAÑOL. A continuación, en el menú AJUSTES
escogemos TIPO HARDWARE (se puede hacer directamente pulsando F3) y
aparece la ventana de la figura 3.7. Todas las opciones deben quedar como en la
figura 3.7, salvo el puerto, en el que habrá que marcar el que hayamos utilizado,
pulsando OK para finalizar.
74
Figura 3.7
Existe una prestación en este software que permite ver la posición en la
que habría que insertar el PIC en el zócalo, pero sólo es válida para el JDM
original, así que no hagáis caso de ella. Sólo queda seleccionar el modelo de PIC
que vamos a grabar o leer, y llevar a cabo las acciones deseadas. El programa
trabaja igual con ficheros .BIN ó .HEX. Para grabar un PIC, abrimos el fichero
mediante el menú ARCHIVO y seleccionamos PROGRAMAR TODO en el menú
COMANDO (o pulsamos F5). Para leer un PIC, seleccionamos LEER TODO en el
menú COMANDO (o pulsamos F8) y luego podemos salvarlo a un fichero
mediante el menú ARCHIVO. En la página de ICPROG hay instrucciones sobre el
programa.
PROGRAMADOR TIPO IN-CIRCUIT JDM
Presentamos ahora, el popular programador in-circuit, llamado JDM; que es
compatible con el popular programa para programar pics de la webb llamado ICPROG, este puede programar el nuevo y economico procesador tipo pic 16F628 y
ahora se esta usando mucho, parece que rapidamente desplazara a su antecesor;
75
PIC16F84A. Se diseñó sobre un circuito impreso de 2x4 cm. con el programa
tango.pcb, lo usaremos en nuestras practicas del curso de procesadores y sera
herramienta de desarrollo para el grupo Mekatrun en la Universidad Nacional de
Colombia. Apartir de aca, no usaremos mas el popular programa Pony Prog por
considerar JDM mucho mejor, sin embargo es compatible con el programador incircuit de pony-prog, ademas es mas pequeño funciona mejor y hace un mejor uso
de la energia del puerto serial de tu PC.
Estas son vistas del programador JDM tipo in-circuit tiene cinco pines que se
insertan en tu protoboard para programar cualquier PIC debes cablear los pines
VPP,VCC,GND,RB7,RB6. y !...............listo..................!
Para que el programa IC-PROG lo pueda detectar, se debe configurar el
hardware asi como muestra el grafico siguiente (invierte Vcc).
76
Se debe construir un cable para el puerto serial, de la forma que muestra la
figura siguiente; note que la resistencia de 2.2K se ha instalado sobre el mismo
conector; esto permite ahorrar un hilo y poder usar un popular y economico cable
telefonico de cuatro hilos, con su respectivos conectores tipo RJ-11 para circuito
impreso y cable.
77
Este es el diseño electronico; en el se realizo una modificacion en algunas
componentes del diseño original, para mejorar su desempeño. los diodos 1N4148
se remplazaron por diodos tipo shottky que presentan una caida de tension directa
menor y se le puede robar mas energía al puerto serial de su P.C.
78

Dos transistores son 2N2222,

Zener de 5.1/0.5W

Zener de 8.2/0.5W

Condensador de 100uF/16v y otro de 100uF/6.3v

Resistencia de 10k y de 2.2k , 1/8W.

Cuatro diodos tipo shottky de pequeña señal
El circuito impreso presenta este aspecto y asi como indica el grafico debe
cablearse en el protoboard, te sirve para muchos pics tipo flash o inclusive los que
no lo son, si se cablean los cinco pines; RB7,RB6,Vcc,Gnd,Vpp.
Las uniones de superficie conectan pistas por el lado de las soldaduras, las
puedes obtener de unidades de diskette malas. o circuitos de desecho que tengan
componentes de montaje superficial.
79
CAPITULO 4.- DESARROLLO DE CIRCUITOS
En este capitulo abordaremos el tema del desarrollo de varios circuitos
prácticos basados en el uso del microcontrolador PIC16F84.
4.1.- DESARROLLO DE UN DETECTOR DE RUIDO DE ALTA FRECUENCIA DE
BAJO COSTE BASADO EN EL MICROCONTROLADOR PIC16F84.
RUIDO DE ALTA FRECUENCIA.
Señal no deseada presente en la onda de tensión del terminal de
alimentación.
Las frecuencias a las que afecta son superiores a la del armónico 50 de la
señal fundamental (2500 o 3000 Hz).
CAUSAS:
–ASDs, PWMs, convertidores y conmutadores de señal .
–Otros.
EFECTOS:
–Errores de comunicación y control.
–Problemas con equipos sensibles:
ordenadores, sensores, etc.
80
OBJETIVO:
Diseñar y construir un detector de ruido de alta frecuencia que permita:
Medir y detectar una presencia de ruido de al menos el 40% de la señal
fundamental.
Seleccionar el nivel de ruido máximo para realizar la detección.
Seleccionar la banda de frecuencias en la que se mide y detecta el ruido.
DECISIONES:
Selección de las bandas de estudio:
Filtro de capacidades conmutadas.
Selección del umbral de detección:
Tensión de referencia ajustable.
Presentación de medida y modo de trabajo:
Pantalla de cristal líquido.
81
PARA EL HARDWARE USAREMOS:
 FILTRO MF10. Filtro de capacidades conmutadas de frecuencia de corte proporcional a la
frecuencia de reloj.
 Permite configuración paso alto.
 Máximo 4º orden.
 Frecuencia máxima de corte 20kHz para una frecuencia máxima de reloj de
1MHz.
 Banda de trabajo mínima hasta 200kHz.
 Bajo precio.
SELECCIÓN Y GENERACIÓN DE FRECUENCIAS.
 Selección mediante un interruptor binario triple.
 Desestimación del microcontrolador como generador.
 Circuito oscilador con cristal e inversor.
 Subfrecuencias con contador y multiplexor.
Nota: Buffer de aislamiento.
82
CIRCUITO DE FRECUENCIA.-
VCC
GND
9
7
6
5
3
2
4
13
12
14
15
1
4
3
2
1
15
14
13
12
11
10
9
7
74'151
I0
I1
I2
I3
I4
I5
I6
I7
S0
S1
S2
E
/Z
Z
6
5
FREC
FRECUENCIA AL FILTRO
I17005
16
820pF
8
820pF
Q1
Q2
Q3
Q4
Q5
Q6
Q7
Q8
Q9
Q10
Q11
Q12
VCC
2MHz
2
1
1
1
2
2
22K
CLR
2
2
1
1
4K7
74'4040
CLK
GND
11
VCC+
16
10
8
1
2
3
4
5
6
7
I1
O1
I2
O2
I3
O3
GND
VCC
I6
O6
74'04
I5
O5
I4
O4
14
13
12
11
10
9
8
VCC+
VCC+
RB2
RB6
RB7
1
2
3
4
5
6
7
E1
VCC
D1
E4
O1 74'126 D4
E2
O4
D2
E3
O2
D3
GND
O3
14
13
12
11
10
9
8
VCC+
RB5
12K
1
VCC+
2
1
S2
12K
2
1
12K
2
1
2
3
4
8
7
6
5
SW DIP-4
FILTRADO.-

Eliminamos las componentes de baja frecuencia: configuración paso alto.

Su frecuencia de corte es proporcional a la frecuencia seleccionada.

Se diseña con ganancia unidad para mantener el mayor ancho de banda
posible.

Máximo orden (4) mediante dos etapas en cascada, para mayor pendiente
de caída.

Butterworth para banda de paso máximamente plana.
83
UMBRAL.
Generación mediante un divisor con un potenciómetro variable.

Selección de precisión mediante un interruptor de dos posiciones:

Rango hasta 20%.

Rango hasta 50%.
CONEXIONADO DEL MICROCONTROLADOR-
84
PLACAS DE CIRCUITO IMPRESO.-
SOFTWARE.-
EL PROGRAMA:

Limitado a 1k de memoria.

Tareas:

Controlar y leer el ADC.

Leer la selección de frecuencia.

Permitir y atender la interrupción.

Tratar los datos.

Controlar el LCD y mostrar los datos.
85
EL CIRCUITO Y UN EJEMPLO DE DETECCIÓN.-
LINEAS FUTURAS DE ACCION.
Bajar los límites de detección y eliminar el error para porcentajes de ruido
menores del 8%:

Amplificación antes de la conversión.

Ganancia mayor de filtrado (menor ancho).

Adaptar para terminales trifásicos.

Comunicación con el PC.

Mejorar prestaciones:

Filtro más potente (LTC1068, LMF100).

Microcontrolador más avanzado (PIC16F87,...).
86
4.2.- DESARROLLO DE UN CIRCUITO PARA PWM
En esta sección hablaremos sobre PWM y sus antecedentes básicos
para una mejor comprensión.
Con PAM, las muestras de una señal mensaje son utilizadas para modular la
amplitud de un tren de pulsos. El resultado es una señal consistente en pulsos de
ancho constante regularmente espaciados, cuyas amplitudes varían en proporción
a la señal mensaje. (Figura 1(a)).
Otro tipo de modulación de pulsos es la modulación por tiempo de pulsos
(PTM). Con PTM, las muestras de la señal mensaje son utilizadas para variar un
parámetro de la sincronización de los pulsos (un parámetro directamente
relacionado con el tiempo, tal como la duración o la posición de los pulsos).
Un parámetro de tiempo que puede variarse es la duración o ancho del
pulso. Con PWM (o PDM) las muestras de la señal mensaje son utilizadas para
modular el ancho o duración del pulso. El resultado es la señal consistente de
pulsos de amplitud constante cuyo ancho varia en proporción a la señal mensaje
(ver Figura 1(b)). PWM también es llamada modulación por duración de pulsos:
PDM.
87
La posición de los pulsos es otro parámetro de tiempo que puede ser
utilizado en PTM. Con PPM, las muestras de la señal mensaje se utilizan para
modular las posiciones de pulsos de ancho y amplitud constantes (ver Figura 1(c)).
PWM y PPM están estrechamente relacionadas. Las señales PPM son
usualmente generadas a partir de señales PWM como lo muestra la Figura 1(b) y
(c).
La señales PTM tienen algunas características en común con señales PAM.
Ambas requieren que la tasa de muestreo sea más grande que la tasa Nyquist.
Aunque los espectros de señales PTM son complejos, estos contienen el espectro
de la señal mensaje origina, tal como las señales PAM.
88
Sin embargo, hay importantes diferencias entre señales PTM y señales PAM.
La información en las señales PTM es llevada en el sincronismo de los pulsos (en
las posiciones de los flancos de los pulsos), en lugar de las amplitudes como en
PAM. Cuando el ancho de banda de canal es grande, los flancos de los pulsos son
casi verticales. Como resultado de esto, las señales PTM son menos sensitivas al
ruido que las señales PAM. Reduciendo el ancho de banda del canal se
incrementa el tiempo de subida (Tr) de los pulsos y el ruido tiene efecto en la
precisión del sincronismo de los pulsos.
PWM se utiliza a menudo donde se requiere un control remoto proporcional a
una posición. El valor promedio de señales PWM varia directamente con la señal
mensaje y puede, por ejemplo, ser usado para controlar la velocidad de un motor.
Debido a que los pulsos en señales PPM pueden ser muy estrechos, y por lo
tanto se requiere muy baja potencia para transmitirlos, la transmisión PPM puede
ser muy eficiente. PPM es frecuentemente utilizada en sistemas ópticos de
comunicación.
La Figura 2 muestra la forma de generar señales PWM y PPT. La Figura 2
(b) muestra las formas de onda en el generador PWM/PPM.
La señal mensaje es comparada con una señal rampa (señal de muestreo)
para producir la salida PWM. Si el nivel de voltaje de la señal mensaje es mayor
que el de la señal rampa, la salida del comparador es alta (TTL, 5V). Si la señal
mensaje es menor que la señal rampa, la salida del comparador es baja (TTL, 0V).
La salida del comparador es por tanto una señal PWM, puesto que el ancho de los
pulsos depende del nivel de la señal mensaje.
La señal PWM es aplicada a un circuito generador de pulsos, el cual general
un pulso de ancho y amplitud fijos con cada flanco de caída de los pulsos de la
señal PWM. La salida del generador de pulsos es por tanto la señal PPM, puesto
89
que la posición de los pulsos con respecto a una señal de reloj (una señal
cuadrada de igual frecuencia que la señal rampa) depende del nivel de la señal
mensaje.
Tanto PWM como PPM pueden ser demoduladas directamente utilizando un
filtro pasabajo, como se muestra en la Figura 3 (a). Sin embargo, el filtro es
incapaz de detectar el sincronismo de los pulsos y por lo tanto promedia la señal
con ruido incluido, para demodularla. Por lo tanto, antes del filtrar se suele utilizar
un limitador que reconstruye los pulsos; así la demodulación es más eficaz (ver
Figura 3(b)).
90
Las señales PPM demoduladas sólo por filtrado pasabajo, pueden producir
una señal reconstruida de muy baja amplitud, si los pulsos son muy estrechos.
Por tanto, se suele recuperar el sincronismo antes del filtrado, como se ve en
la Figura 3(c). El biestable (FLIP-FLOP) entrega una señal PWM la cual es
demodulada según se dijo anteriormente.
91
La Figura 4, finalmente muestra las señales en un receptor PPM.
4.3.- PROYECTOS CON EL PIC 16F84
Si bien el clásico de todos los tiempos es el PONG, el TETRIS es clásico,
pero es contemporáneo al mismo tiempo. Hoy día se lo puede encontrar en
versiones 3D para potentes PC's, versiones para Macintosh, reducidas versiones
para Palm Pilots e incluso en sistemas del tipo GameBoy. Todo un pionero de la
multiplataforma.
92
El juego funciona en un PIC16F84 a 12MHz, generando el vídeo en tiempo
real con sólo dos resistencias. La única diferencia electrónica, comparado con el
PONG, es que PONG puede correr en un µC PIC16C84, pero TETRIS requiere
mas memoria RAM (68 bytes, adicionales a los disponibles) por lo que sólo
funciona en un µC PIC16F84. EL circuito electrónico en si es el mismo, por lo que
puede emplearse la misma placa que para el PONG. El joystick 2 no actual en
este juego.
El juego es muy simple. Es posible desplazar el bloque hacia los costados
usando para ello las teclas IZQUIERDA y DERECHA, puede hacer caer el bloque
bruscamente presionando la tecla ABAJO. Presionando el botón FUEGO hará
rotar el bloque. Los bloques están cayendo todo el tiempo, primero parece lento,
pero, mientras pasa el tiempo de juego, la velocidad de caída de los bloques se
acelera. Y la música se acelera al ritmo de los bloques, SI!!!, escucho bien, hay
música en el juego !, pero no espere gran cosa, porque no hay tanto tiempo de
CPU para dedicar al sonido. Un amigo, Carl Henrik Grunditz, me ha ayudado
93
mucho con el audio del juego. Actualmente él está pensando hacer el juego
"Boulder Dash" con la misma electrónica del tetris y el pong. La música es una
vieja melodía Rusa llamada "Karaboschka", que es una de las que sonaban en el
tetris del gameboy.
El puntaje es mostrado en el ángulo inferior derecho de la pantalla, y el
próximo bloque que vendrá se ve en el ángulo superior izquierdo. Sólo es posible
obtener 999 puntos, luego de ello el juego termina. Es posible que hayan algunos
"bugs" en el sistema, pero los iremos corrigiendo al tiempo.
list p=16F84,r=hex
w
equ
0
f
equ
1
pcl
equ
0x02
status
equ
0x03
porta
equ
0x05
portb
equ
0x06
indf
equ
0x00
fsr
equ
0x04
eedata
equ
0x08
eeadr
equ
0x09
eecon1
equ
0x08
rd
equ
0
rp0
equ
5
startspeed equ
0x18
movespeed equ
0x06
94
up1b
equ
3
down1b
equ
2
left1b
equ
5
right1b
equ
4
fire1b
equ
1
up2b
equ
7
down2b
equ
6
left2b
equ
2
right2b
equ
3
fire2b
equ
1
up1p
equ
portb
down1p
equ
portb
left1p
equ
portb
right1p
equ
portb
fire1p
equ
portb
up2p
equ
portb
down2p
equ
portb
left2p
equ
porta
right2p
equ
porta
fire2p
equ
porta
counter0
equ
0x0C
counter1
equ
0x0D
counter2
equ
0x0E
counter3
equ
0x0F
nextblocktyp
equ
0x10
blockx
equ
0x11
blocky
equ
0x12
blocktyp
equ
line
x
0x13
equ
equ
0x14
0x15
95
y
equ
0x16
delaycnt
equ
0x17
angle
blockstuff
equ
equ
0x18
0x19
fallcnt
equ
0x1A
points
equ
0x1B
random
equ
0x1E
stuff
equ
0x1F
m_freq
equ
0x20
m_cnt
equ
0x21
m_songcnt equ
0x22
buffer
equ
0x24
currbl
equ
0x44
x0
equ
0x4C
y0
equ
0x4D
movecnt
equ
0x4E
remline
equ
0x4F
hsfall
equ
0
rotate
equ
1
goleft
equ
2
goright
equ
3
drop
equ
4
rotat
equ
5
gameover equ
5
delay
MACRO
LOCAL label
movwf delaycnt
label
decfsz delaycnt
goto label
96
ENDM
dnop
MACRO
LOCAL label
label
goto
label+1
ENDM
org 0x000
goto inittetris
;------------ This table contains the 3 note lengthes for the 5 speeds --------
getlength
addwf
pcl
retlw
0x0B
retlw
0x16
retlw
0x1D
retlw
0x09
retlw
0x12
retlw
0x19
retlw
0x07
retlw
0x0D
retlw
0x11
retlw
0x04
retlw
0x08
retlw
0x0C
retlw
0x02
retlw
0x04
retlw
0x06
;------------------------ set bit in the gamefield ----------------------------
97
setbit
call
getbit
iorwf
indf
;get bitbyte and bitmask 20 cycles
;set bit
return
;----------------------- clear bit in the gamefield ---------------------------
clrbit
call
getbit
;get bitbyte and bitmask 21 cycles
xorlw
0xff
;invert bitmask
andwf
indf
;clear bit
return
;-------------------- point at byte, and return bitmask -----------------------
getbit
movlw buffer
btfsc
;15 cycles
x,3
movlw buffer+1
clrc
rlf
y
addwf
y,w
movwf fsr
;fsr = 2*y + x<
Contador de 4 dígitos con PIC
Quizás una de las aplicaciones mas usual para un micro controlador sea la
elaboración de un contador de turnos o de personas atendidas. En este caso
decidimos diseñar un circuito que requiera la menor cantidad posible de
componentes y que cumpla con las prestaciones típicas de estas aplicaciones.
98
Como se ve en el diagrama el circuito está estructurado alrededor del
PICmicro el cual en su interior lleva la cuenta de las pulsaciones sobre el pulsador
'I' y, a su vez, genera los dígitos a ser mostrados sobre los displays de 7
segmentos de LED's.
Para reducir la cantidad de circuitos integrados a sólo uno hemos optado por
generar los dígitos por soft dentro del mismo micro, evitando así tener que recurrir
a decodificadores de BCD, que si bien no representan costo alguno para
adquirirlos, el hecho de colocarlos en el circuito impreso implica mayor tamaño,
mayor cantidad de pistas y perforaciones.
El funcionamiento es por demás simple. Los cuatro dígitos del display se
encuentran en paralelo. Esto significa que el segmento A del primero está
cableado junto con el del segundo, el tercero y el cuarto. Y lo mismo sucede con
los demás segmentos. Para que no se encienda sobre los cuatro dígitos el mismo
número se multiplexa el encendido por medio de los cuatro transistores. Para que
el display se ilumine no solo tiene que haber un uno lógico en el segmento a
encender, sino que también se requiere que el transistor este en conducción para
lograr la masa. De esta forma, conmutando los transistores secuencialmente y a
velocidad suficiente se logra hacer parecer al ojo humano que los cuatro displays
99
están iluminados simultáneamente, cuando en realidad sólo uno se ilumina por
vez. Por ejemplo, para hacer aparecer en los displays la secuencia 1 2 3 4 habría
que hacer la siguiente rutina:
1.
Generar el dígito 1
2.
Encender el primer display
3.
Generar el dígito 2
4.
Encender el segundo display
5.
Generar el dígito 3
6.
Encender el tercer display
7.
Generar el dígito 4
8.
Encender el cuarto display
9.
Repetir la secuencia a velocidad suficiente.
Esto es el concepto básico. Para entender mejor el sistema será necesario
consultar el archivo en assembler que contiene el código fuente del programa a
cargar en el micro, que lo puede obtener del link de mas abajo.
Para evitar que la velocidad del micro haga avanzar el conteo a mas de una
unidad por pulsación se ha implementado un retardo de 100mS luego de la
pulsación del interruptor marcado como 'I'. Si se quiere hacer avanzar el conteo
hasta una posición no es necesario presionar y soltar el pulsador repetitivamente,
bastará con mantenerlo presionado y el conteo avanzará rápidamente. Para volver
la cuenta a cero basta con resetear el micro, presionando la tecla marcada como
'R'.
Si bien nosotros empleamos un cristal de 4MHz para el generador de reloj,
también se puede emplear una red RC, porque en este proyecto no se requiere
gran precisión de clock.
100
Los transistores pueden ser reemplazados sin problema por cualquiera de
uso general como el BC548 o similar.
Los displays utilizados son de LED's con cátodo común. Se pueden emplear
displays pequeños y medianos sin problema. Para el uso de displays grandes
deberá emplear algún driver de corriente como el ULN2803A o similar. La
alimentación puede ser tanto 5 como 6 voltios. No se requiere que esté
estabilizada y se puede emplear un adaptador universal, siempre que sea de
calidad aceptable. La corriente requerida es de 300mA.
;Contador de 4 digitos.
indo
equ
00h
;registro de indireccion
pc
equ
02h
;contador de programa
status equ
fsr
equ
03h
04h
;registro de estado
;registro de seleccion
ptoa
equ
05h
;puerto a
ptob
equ
06h
;puerto b
rota
equ
0fh
;variable para desplazamiento de display
trisa equ
85h
;configuracion puerto a
trisb equ
86h
;configuracion puerto b
dig1
equ
10h
;acumulador miles
dig2
equ
11h
;acumulador centenas
dig3
equ
12h
;acumulador decenas
dig4
equ
13h
;acumulador unidades
loops equ
1dh
;variables usadas en retardos
loops2 equ
1eh
z
ram
equ
equ
02h
05h
;flag de cero
;bit de seleccion de pagina de memoria
c
equ
00h
;flag de acarreo
w
equ
00h
;bit de destino a variable de trabajo
101
reset org
00
goto
inicio
org
05h
retardo
;subrutina de retardo
movwf loops
top2
movlw d'110'
;la variable de trabajo contiene la cant.
;de ms a demorar
movwf loops2
top
nop
nop
nop
nop
nop
nop
decfsz loops2
goto
;controla si termina 1mS
top
decfsz loops
goto
;controla si termina el retardo completo
top2
retlw 0
s1000
;rutina de incremento x 1000
clrf
dig2
;pone a cero las centenas
incf
dig1
;incrementa el contador de miles
movf
dig1, w
;carga en work el conteo de los miles
xorlw 0ah
;si work era 10, entonces quedara en cero
btfsc status, z
;si es cero, el flag z queda alto
clrf
dig1
;inicializa los miles
return
s100
;rutina de incremento x 100
clrf
dig3
;pone a cero las decenas
102
incf
dig2
movf
;incrementa el contador de centenas
dig2, w
;carga en work el conteo de las centenas
xorlw 0ah
;si work era 10, entonces quedara en cero
btfsc status, z
;si es cero, el flag z queda alto
call
;incrementa los miles
s1000
return
s10
;rutina de incremento x 10
clrf
dig4
;pone a cero las unidades
incf
dig3
;incrementa el contador de decenas
movf
dig3, w
;carga en work el conteo de las decenas
xorlw 0ah
;si work era 10, entonces quedara en cero
btfsc status, z
;si es cero, el flag z queda alto
call
s100
;incrementa las centenas
return
subir
;rutina de incremento
incf
dig4
movf
;incrementa el contador de unidades
dig4, w
;carga en work el conteo de las unidades
xorlw 0ah
;si work era 10, entonces quedara en cero
btfsc status, z
;si es cero, el flag z queda alto
call
s10
;incrementa las decenas
movlw d'250'
;retardo de 100ms
call
retardo
return
tabla
;genera los numeros sobre el display
addwf pc
;agrega al cont. programa el valor de work
retlw b'00111111'
;genera el 0
retlw b'00011000'
;genera el 1
retlw b'01110110'
;genera el 2
103
retlw b'01111100'
;genera el 3
retlw b'01011001'
;genera el 4
retlw b'01101101'
;genera el 5
retlw b'01101111'
;genera el 6
retlw b'00111000'
;genera el 7
retlw b'01111111'
;genera el 8
retlw b'01111101'
;genera el 9
inicio
;programa principal
bsf
status, ram
;selecciona el banco de memoria alto
movlw b'00010000'
;configura el puerto a
movwf trisa
;bit 4 entrada, demas bits salidas.
movlw 00h
;configura el puerto b
movwf trisb
;como salidas
bcf
status, ram
clrf
dig1
clrf
dig2
clrf
dig3
clrf
dig4
movlw 00
movwf ptoa
empe
btfss ptoa, 4
call
subir
movlw 08h
;selecciona el banco de memoria bajo
;inicializa acumuladores
;envia ceros a los transistores para apagar
;todos los displays
;chequea el pulsador
;llama la rutina de incremento
;iniciar un 1 en el registro de rotacion
movwf rota
movlw dig1
movwf fsr
disp
movlw 00h
;con el registro selector (fsr) se apunta
;al primer dato que se va a mostrar
;colocar en cero el dato del display
movwf ptob
;para apagarlos
movf
;pasa rotacion del 1 a la variable work
rota, w
104
movwf ptoa
;enciende el transistor (display)
movf
;lee el dato del registro apuntado por fsr
call
indo, w
tabla
;genera el digito de 7 segmentos
movwf ptob
;envia el digito al puerto b
movlw 03h
;retardo de 3ms para visualizacion
call
retardo
btfsc rota, 0
goto
bcf
rrf
incf
goto
empe
status, c
rota
fsr
disp
;controla si terminaron las cuatro rotaciones
;si termino, vuelve desde el comienzo
;carry en cero para no afectar las rotaciones
;desplaza el 1 que enciende los displays
;incrementa el puntero. Apunta el proximo
;digito a mostrar
end
105