Está en la página 1de 90

PROYECTO DE INGENIERA

ELECTRNICA
Movimiento de cmara controlado
por Joystick
DIVISIN DE CIENCIAS BSICAS E INGENIERA
DEPARTAMENTO DE INGENIERA ELCTRICA
REPORTE DE PROYECTO DE LIC. INGENIERA EN
ELECTRNICA
Movimiento de cmara controlado por Joystick
Alumno: Cesar Augusto Renteria Ortega
Asesor: Alejandro Martnez Gonzlez
Iztapalapa, Mxico, DF, Junio de 2005
INDICE
OBJETIVOS 1
JUSTIFICACIN ....1
INTRODUCCIN 2
ESTADO DEL ARTE ......................................................................................3
DESARROLLO .....8
Diagrama a bloques del sistema ..9
METODOLOGA ...11
Caractersticas del PIC ....................................................................................12
Motores a Pasos ..14
Motores unipolares ..15
Control de los motores a pasos ...17
Fase de Potencia ..18
El PIC1 (obtencin de datos) ...19
Bloques del programa ........................................................................23
El PIC de los motores (PIC 2 ) .32
Bloques del programa 35
ETAPA DE POTENCIA ..47
RESULTADOS DE LABORATORIO .49
CONCLUSIONES .52
REFERENCIAS BIBLIOGRFICAS .54
APENDICE .55
Comunicacin Serial (Modulo USART) 55
Protocolo estndar ...56
Registro de configuracin del Hardware 56
Generador de Baudios 56
Transmisor Asncrono ...57
Receptor Asncrono 57
Modulo de Conversin Analgica/ Digital 58
Registro ADCON0 ..................................................................................58
Registro ADCON1 ..59
Configurando los pins del puerto analgico ...63
Los registros de resultado del A/D ...............................................63
Set de Instrucciones ..65
Despliegue del programa para el PIC 1 69
Despliegue del programa para el PIC 2 ............................................................74
Bloques de declaracin de Variables y Macros ................................................83
HOJAS DE DATOS 85
1
OBJETIVOS
Realizar una plataforma motorizada controlada por un Joystick para mover una
cmara.
Dividir el sistema de manera que una parte sea la interfaz con el usuario y otra la
mecnica (plataforma); con el fin de que si se requiere se pueda hacer inalmbrico
el sistema.
JUSTIFICACIN
Mover una cmara por medio de un joystick no es algo innovador, puesto que este
sistema ya existe. La motivacin para realizar este proyecto es: por un lado, desarrollar un
sistema de automatizacin para vigilancia que sea de menor costo que los que actualmente
se comercializan, pero no por eso de menor calidad; y por otro lado esta, su desarrollo que
implicara varias de las reas de la electrnica como son: la digital, la analgica, potencia,
etc.
En la actualidad vivimos en un pas en el cual estamos dependiendo de la tecnologa
extranjera, incluso la mayora de las compaas Mexicanas no desarrollan tecnologa sino
que por el contrario utilizan equipo ya desarrollado y manufacturado; extranjero, para sus
necesidades. Es por ello que nosotros como estudiantes tenemos la inquietud de realmente
realizar ingeniera y desarrollar productos que aunque ya existan en el mercado, y sobre
todo poner en claro que no por ser un producto nacional no es de buena calidad, al contrario
puede alcanzar todas las expectativas que se requieren para el mercado competitivo de esta
una sociedad Capitalista.
2
INTRODUCCIN
En la actualidad los avances tecnolgicos crecen a gran escala, y nuestra labor como
Ingenieros es la de realizar avances en pro de la humanidad. En una sociedad capitalista
como, en la que, vivimos debemos ser cada da mas competitivos y aplicar los
conocimientos de nuestra formacin acadmica. Es as como el nombre de nuestra carrera
lo indica; -Ingeniera- debemos utilizar y manipular los fenmenos fsicos para resolver
nuestras necesidades.
Es as como en la bsqueda de la solucin a una necesidad, la de automatizar una
cmara; es decir que por medio de un sistema se pueda mover esta para enfocar un objeto
en movimiento, como lo hara una persona que estuviera video grabando, -poniendo un
ejemplo- a un cachorro, el cual no esta en un estado esttico sino por el contrario, esta en
constante movimiento.
Ahora imaginemos que tenemos un vehculo de reconocimiento, como los
utilizados por la NASA para el exploramiento de superficies en el espacio, o no nos
vayamos tan lejos vehculos que sirven para explorar terrenos peligrosos o de acceso
limitado para los seres humanos; desearamos que pudiramos controlar una cmara a
distancia para ir observando el terreno; con dos movimientos primordiales: los de azimut y
elevacin. Es as como surge la idea de nuestro proyecto: La automatizacin de una
plataforma de movimiento para una cmara, pero adems nos falta detallarla, como
lograramos controlar el movimiento?, cual seria la interfaz con el usuario?; pues nuestra
propuesta es un Joystick. Y Cmo lograramos que si se requiere, nuestro sistema sea
inalmbrico?, una posible solucin seria utilizar un radio modem.
Es as como podemos enunciar nuestro Proyecto, en forma: Control de una cmara
por medio de un Joytick, y hacerlo de tal forma que si se requiere sea un sistema
inalmbrico, es decir que se divida en dos subsistemas: la parte de control (Joystick) y la
plataforma en si. Los requisitos anteriores invitan al requerimiento de microcontroladores,
debido a su orientacin a puertos. De stos debemos escoger los ms adecuados en cuanto a
versatilidad y tamao, y son los microcontroladores de la empresa Microchip los PIC, los
cumplen a la perfeccin con lo anterior.
3
ESTADO DEL ARTE
En la fase de investigacin sobre todo lo relacionado con nuestro proyecto y sobre
todo, de sistemas semejantes al nuestro, encontramos los siguientes sistemas que nos
sirvieron de referencia para el desarrollo del proyecto.
CONTROL DE SOBREMESA
CONTROL DE UNA CAMARA
POSICION PARA AUTO-PAN
CONTROL POR MULTICABLE
CONTROL POR JOYSTICK
El CPM-Z es un controlador de sobremesa para una cmara, y controla directamente los motores
del posicionador (220 Vca) y la ptica (12Vcc).
A travs de este equipo podemos controlar los movimientos del posicionador (arriba, abajo,
derecha e izquierda) a travs del joystick integrado en el panel frontal, donde tambin podemos
encontrar el switch de Auto-pan.
Tambin en el panel frontal se hallan los controles de zoom, foco e iris para el control de pticas.
Es especialmente indicado en instalaciones con poca distancia al punto de control. En distancias
largas debe tenerse muy calculada la perdida de tensin, pues es baja tensin (6-12 Vcc)
4
Cmara Trmica IRTV 445L
Fabricante: Inframetrics
Caractersticas:
Prestaciones: deteccin de barcos hasta 38 km, aeronaves hasta 17 km, vehculos
hasta 11 km y personas hasta 6 km
Historial:
La BRIMAR ha diseado recientemente dos cmaras trmicas de largo alcance
Inframetrics IRTV 445L de tipo infrarrojo, para la compaa de inteligencia. Las dos
cmaras trmicas son del tipo infrarrojo, son capaces de detectar a soldados a
una distancia de 6 Km, vehculos a 11 Km, aeronaves a 17 Km y barcos a 38 Km.
El sistema se compone de dos elementos, la propia cmara que va montada sobre
un trpode con la posibilidad de ser instalada sobre un mstil elevador en un
vehculo, y del mdulo de mando con un monitor de 12" para la observacin del
objetivo y un mando tipo joystick para el movimiento de la cmara y un panel de
control. Estas cmaras funcionan con bateras que le proporcionan una autonoma
de 12 horas de observacin.
5
CONTROLADORES SAMSUNG
Cont r olador de Pan- Tilt - Zoom con palanca ( Joyst ick)
* Cont rol de Foco e I ris.
* Emul ador de Mult iplexor SYSCOM
* Hast a 4 prot ocolos de cont rol
* Pant all a de 4" TFT LCD
HI D2404 CDN. Cont rolador para Fast rax I I . ....$720.00 Dl s
Mini pant all a LCD de 4" TFT para ver la imagen del domo seleccionado.
* Cont rol de palanca ( Joyst ick)
* 32 dir ecci ones para cmaras programables.
* 8 t eclas de funcin programables.
* Teclas alfanumricas.
* Reloj t iempo real.
* Cont r ol de vel ocidad de Pan- Tilt .
* Programaci n de preset .
* Cont r ol de Zoom / Foco.
HI D2406CDN.Cont rolador para Fast rax I ......... ..$699 .00 Dl s.
6
CAMARA NIGHTSIGHT 4000B
Una vez ms, se presenta un reto a la oscuridad para la aplicacin de la ley tanto en
tierra como en navegacin martima. La Cmara NightSight 4000B es la ltima solucin en
imagen trmica para aplicacin de la ley, seguridad y operaciones especiales de vigilancia.
Como sucesor de la cmara Nightsight 200, la cmara Nightsight 4000B consta de una
cmara de vdeo infrarroja y un posicionador. La cmara y el posicionador funcionan por
medio de un controlador joystick permitiendo al operador orientar la cmara modificando el
azimuth y la elevacin. La imagen de vdeo infrarroja y la informacin del posicionador se
muestran en un monitor de vdeo. El sistema est diseado interna y externamente para
utilizarse como una unidad mvil y para resistir condiciones climatolgicas adversas. Su
arquitectura est diseada para permitir futuras actualizaciones opcionales tales como
posibilidad de grabacin en vdeo y escaneo.
INFORMACION TECNICA:
ptica :
Profundidad de campo :
Campo de visin :
Control de vdeo y contraste :
Polaridad infrarroja :
Salida de vdeo :
Dimensiones de la cmara :
Peso de la cmara :
Inicio para imagen de vdeo IR :
Distancia de deteccin :
Resolucin de imagen :
Voltaje de funcionamiento :
Rotacin :
Abatibilidad :
Interfaces de funcionamiento (desde el joystick) :
Informacin del posicionador :
Temperatura de funcionamiento :
Soporte de cmara para techo :
Dimensiones :
Peso:
F/1.0
25pies hasta el infinito
12 x 9
Automtico
Blanco-Caliente
EIA RS-170
28 cm(ancho) x 23 cm (altura) x 23 cm (profundidad)
< 4,5 kg.
60 segundos (normal)
Detecta una persona hasta 1500 pies
160 x 120 pixels
De 9 a 16 VDC (12 VDC nominal)
360 de forma continua controlado por joystick
-16/+40 desde la horizontal controlado por joystick
ON/OFF, control de posicionamiento
Indicacin grfica en el monitor
Desde -40 hasta 55C
8,2 cm (altura) x 23 cm (profundidad)
Ancho adaptable al vehculo
5 kg.
7
Comparacin De Equipos:
Controlador
CPM-Z de
Videotec
Electrnica
Cmara
Trmica
IRTV 445L
De
Inframetrics
Controlador
Samsung
HID2404CDN
Controlador
Samsung
HID2406CDN
Cmara
Nightsight
4000B
Control/
Movimientos
(arriba, abajo,
izquierda,
derecha)
AutoPan (on-
off)
Mando tipo
joystick
Controlador de
Pan-Tilt-Zoom
con palanca
(Joystick)
Control de
palanca
(Joystick)
Control de
azimut y la
elevacin
Control
ptico
Zoom, Foco
Iris.
* Foco e Iris. Zoom y Foco. *
Deteccin
automtica
de objetos
*
Deteccin con
un alcance de
hasta 16 Km.
* * *
Tipo de
Cmara
Estndar Infrarroja Estndar Estndar Infrarroja
Monitor Sin Monitor
Monitor de
12
Pant all a de 4"
TFT LCD
Pant all a de 4"
TFT LCD
Monitor
Precio USD 500.00 * USD 720.00 USD 690.00 USD 320.00
*= No Disponible
8
DESARROLLO
El proyecto se dividir en cuatro fases principalmente, que son: La interfaz con el
usuario o Joystick, El primer microcontrolador PIC 1, que se encargara de la
obtencin de datos, Un segundo microcontrolador PIC 2, que se encargara del
procesamiento de los datos, y por ultimo el sistema de movimiento de la cmara
Plataforma motorizada.
Por consiguiente lo primero que debemos comprender es el funcionamiento del
Joystick; que relacin existe entre la posicin de la palanca y su consecuencia elctrica
(observando al Joystick como un sistema que tiene una entrada -posicin de la palanca- y
una salida), ya que esta salida ser el punto de partida para controlar la plataforma que
mover la cmara.
Cabe mencionar que as como hemos planteado nuestro sistema tendremos un
sistema de comunicacin, en este caso comunicacin Bidireccional entre PICs como se
podr entender con mas detalle mas adelante. El PIC 1 se encargara de recibir esta
informacin y mandarla de forma serial (con el fin que mas adelante se pueda incorporar
Telemetra: comunicacin de datos inalmbrica); el PIC 2 se encargara de recibir esta
informacin y codificarla para el sistema de movimiento de la cmara, es decir de acuerdo a
cierta informacin mandara las instrucciones para que la plataforma se mueva a la
izquierda, a la derecha, hacia arriba o hacia abajo.
La ultima fase: el sistema de movimiento de la cmara se realizara con motores a
pasos, para poder ser manejados de forma directa por el PIC 2.
9
Joystick
PIC 1
1
6
F
8
7
4
PIC 2
1
6
F
6
2
8
POT
POT
MOTOR
MOTOR
En la siguiente figura se muestra el diagrama a bloques del sistema:
FIGURA 1: DIAGRAMA A BLOQUES DEL SISTEMA
Voltaje
Relacionado con Referencia X
Y
Botn R
X
Bit de Botn
Referencia Y
T
X
Voltaje
Relacionado con
X
Los motores a pasos que se utilizaron fueron un modelo de 200 pasos por
revolucin, es decir 1.8 grados por paso, que fue: un punto medio entre precisin y costo;
ya que 1.8 grados podra decirse que es un nivel bueno de precisin pero existen motores
con aun ms precisin que este, pero por consiguiente de mayor precio.
Al utilizar este tipo de motores, con un gran consumo de corriente, se tiene que
utilizar una fase de potencia y este ser nuestro caso ya que los motores utilizados son de
gran tamao y de gran consumo de corriente pero con la ventaja de tener buen torque.
Pero parece que nos estamos olvidando de una parte importante de este sistema la
interfaz con el usuario; el Joystick; al desarmar uno y observar su modo de operacin, no
es ms, que un par de potencimetros (uno por cada eje de movimiento de la palanca) que
cambian su valor resistivo segn la posicin del Joystick.
10
As que de ah partimos para plantear un modo de obtencin de datos: que ser el de
utilizar un divisor de voltaje; para crear un voltaje por cada posicin de la palanca en cada
eje por supuesto- y este voltaje procesarlo en una palabra binaria, mediante un convertidor
Analgico/Digital que se encuentra en los PICs de la serie 16F874 (PIC 1, de nuestro
sistema), y que cuenta tambin con su modulo USART para la comunicacin serial.
En la segunda parte del sistema tendremos un PIC de la serie 16F628, de menor
tamao y con menos atributos, pero con las caractersticas suficientes para nuestros
propsitos, como lo son, tambin contar con un modulo USART y un set reducido de
instrucciones, que nos servirn para realizar un programa el cual procesara la informacin
recabada por el PIC 1 y la convertir en la secuencia para mover los motores a pasos.
Hablando de ellos; resulta que en el proceso nos dimos cuenta de que cada vez que se
encenda el sistema este empezaba en un posicin diferente; es por ello que nos dimos
cuenta de la necesidad de una posicin de inicio, ya que al estar la palanca inerte (es decir
en la posicin totalmente perpendicular) se deseara que la cmara estuviera siempre en
una misma posicin cada vez que se encienda el sistema asociada con esta posicin de la
palanca. Es por esto que una solucin que encontramos fue la de utilizar un modulo ms,
que se encargara de proporcionarnos esta posicin de referencia y que fue implementada
con 2 fotosensores, de los cuales hablaremos en con mas detalle mas adelante.
Al ver la funcionalidad que nos otorgan los PICs y su orientacin a puertos,
podemos plantear un modulo adicional a nuestro sistema que se tratara de la transmisin de
un bit de activacin, es decir utilizaremos un botn del joystick, como activacin de una
funcin extra, como podra ser la de un disparador.
11
METODOLOGA
En la seccion anterior mencionamos los componentes que se utilizaron en este
proyecto, que son los PICs y los motores a pasos y a continuacion en esta seccion
mencionaremos algunas de sus carateristicas.
Las razones del porque de esta eleccin se debe en parte al segundo objetivo a
cumplir que es: el de que al final del desarrollo de este proyecto si as se requiere se pueda
hacer inalmbrico (Telemetra). Y esto es mas que viable con el uso de microcontroladores
PICs; ya que se puede implementar (como ya lo mencionamos anteriormente)
comunicacin entre dispositivos (entre PICs) por medio de su modulo serial (USART)
dando paso as a la implementacin de la telemetra. Por otro lado el control de motores a
pasos tambin es mas que viable con el uso de los PICs gracias a su orientacin a puertos.
Como hasta ahora hemos hablado de los microcontroladores de Microchip PICs a
continuacin enunciaremos algunas de sus caractersticas que los hacen verstiles en la
electrnica digital; y las funciones o modulos especificos que se utilizaron en la realizacin
de este proyecto, podran consultarse en el apndice.
12
Caractersticas del PIC
Esta familia de microcontroladores PIC se destaca por las siguientes prestaciones:
Slo se necesitan 35 instrucciones de una sola palabra para usarlo.
Todas las instrucciones son de un solo ciclo con excepcin de las ramificaciones del
programa que son de dos ciclos.
La velocidad de funcionamiento es de DC a 20MHz a la entrada del reloj y de DC a
200ns (nanosegundos) en el ciclo de instrucciones.
La memoria del programa generalmente tiene capacidad 1024 palabras (1kB).
La memoria RAM de datos es de 224 bytes.
La memoria de datos EEPROM es de 128 bytes.
Las palabras de instrucciones tienen una extensin de 14 bits.
Los bytes de datos tienen una extensin de 8 bits.
Posee 16 registros de hardware de funciones especiales.
Tiene una pila de hardware de 8 niveles.
Procesa modos de acceso directo, indirecto y relativo.
Tiene por lo menos cuatro fuentes de interrupciones.
- Pata externa RB0/INT.
- Exceso del temporizador TMR0.
- Interrupcin al cambio PORTB<7:4>.
- Al completar la escritura del EEPROM de datos.
Fuente de alta corriente para excitacin directa de LEDs.
Watchdog Timer (WDT).
Modo SLEEP para economizar consumo.
NOTA: Los valores aqu mencionados son caractersticas del PIC16F62X y pueden
cambiar dependiendo el modelo de PIC.
En la figura 2 se muestra el diagrama a bloques de las caractersticas fsicas
(Hardware) de el PIC16F87X.
13
FIGURA 2: DIAGRAMA A BLOQUES DEL PIC16F87X
14
MOTORES A PASOS
En la fase de investigacin y de planeacin, encontramos que existen un tipo
particular de motores, los MOTORES A PASOS (o, paso a paso) que sern los que vamos
a utilizar para motorizar la plataforma de movimiento.
Los motores paso a paso (PaP) difieren en gran medida de los motores que todos
conocemos de CC (corriente continua). Al aplicar a sus bobinas un conjunto adecuado de
impulsos elctricos stos giran sobre su eje un ngulo fijo, este ngulo recorrido que
depende de las caractersticas del motor, se le llama paso, de forma que se puede controlar,
mediante un circuito electrnico, la cantidad, velocidad y sentido de los pasos.
El motor realiza un paso en cuanto se da la secuencia adecuada, misma que se
transfiere a los bobinados. Despus de cuatro pasos, se conectan nuevamente los dos
primeros bobinados, repitindose la secuencia. Se llama ngulo de paso al ngulo que gira
el eje del motor cada vez que se cambia la polaridad de los bobinados, siendo una funcin
del nmero de dientes del rotor y de la secuencia aplicada. La velocidad del motor es
proporcional a la frecuencia con la que envan los impulsos de excitacin a los devanados.
Hay dos tipos bsicos de motores PaP, los bipolares que se componen de dos
bobinas y los unipolares que tiene cuatro bobinas. Externamente se diferencian entre s por
el nmero de cables. Los bipolares solo tienen cuatro conexiones dos para cada bobina y los
unipolares que normalmente presentan seis cables, dos para cada bobina y otro para
alimentacin de cada par de stas, aunque en algunos casos podemos encontrar motores
unipolares con cinco cables, bsicamente es lo mismo, solo que el cable de alimentacin es
comn para los dos pares de bobinas.
Esquema Motor UNIPOLAR
Esquema Motor BIPOLAR
FIGURA 3: MOTORES UNIPOLARES Y BIPOLARES
15
Otra caracterstica son los pasos que da el motor para girar una vuelta completa, los
ms comunes son de 48, 100 y 200 pasos, depende del tipo de husillo y la precisin que
queramos obtener elegiremos un motor u otro.
Un problema que se nos puede plantear es como saber cual es cada polo de la
bobina, ya que los colores no estn estandarizados. As que tomamos el tester y leemos el
valor (resistencia) de todos los polos (supongamos que las bobinas son de 30 Ohm.), el
comn (alimentacin) con cada polo de bobina leer 30 Ohm y entre polos de la misma
bobina 60 Ohm., por eliminacin nos ser fcil encontrar los polos de las bobinas. Si nos
equivocamos no pasa nada, solo que el motor no girar. Cambiando el orden de dos de los
polos de una bobina cambiamos el sentido de giro. Si el motor solo tiene cinco cables, el
comn de alimentacin se puede conectar a cualquiera de los lados.
Motores unipolares
Son relativamente fciles de controlar. Su caracterstica principal es tener un tap
central, de manera que el esquema de cableado es tomar el o los taps centrales y
conectarlos a la fuente de alimentacin positiva. El circuito controlador se encargar de
poner cada bobina a tierra para energizarla de manera secuencial. El nmero de fases es el
doble al nmero de bobinas, ya que cada bobina es dividida en dos por medio del tap
central.
FIGURA 4: Paso estndar de un motor a pasos
16
La tabla siguiente muestra con ms claridad el funcionamiento del motor al ser excitado
mediante la secuencia anterior
FIGURA 5: Polarizacin de las bobinas del motor a pasos mediante la secuencia estndar
En adicin a la secuencia de manejo estndar, una secuencia de manejo a medio
paso y otra de gran torque son posibles. En la secuencia de gran torque, 2 bobinados estn
activados al mismo tiempo para cada paso del motor. En este caso el torque es 1.5 veces
mas que el entregado en una secuencia estndar, pero maneja el doble de corriente. La
secuencia de manejo a medio paso es la combinacin de las 2 anteriores. Primero una
bobina es activada, luego dos bobinas, luego una, etc. Esto hace que le nmero de pasos por
revolucin sea el doble y el ngulo por paso se reduzca a la mitad.
Paso bobina 4 bobina 3 bobina 2 bobina 1
1 on off off Off
2 off on off off
3 off off on off
4 off off off on
17
FIGURA 6: Secuencia con ms torque (izquierda) y medio paso (derecha) para un motor a pasos
Control de los motores a pasos
Como ya se ha explicado en la seccin anterior los motores a pasos se manejan
mediante seales digitales, que en el caso de nuestro proyecto son generadas por un PIC y
con este controlaremos si va en sentido de las manecillas del reloj o en sentido
contrario(observando el rotor o eje del motor desde arriba); pero por la naturaleza de la
construccin de los motores a pasos debe existir una fase de acoplamiento entre las seales
digitales y el motor propio y esta es una fase de potencia en el caso de motores muy
grandes y de gran consumo de corriente(como ser el caso de este proyecto) o tambin
existen circuitos integrados ya diseados para este propsito como lo son el C.I. LB1845
que es un controlador(Driver) de motores a pasos; utilizando modulacin PWM o el C.I.
L298 Driver de bobinas utilizadas como Relays, Selenoides y motores a pasos; utilizando
niveles lgicos TTL(seales digitales); estos son solo 2 ejemplos, ya que existen muchos
mas controladores con distintas caractersticas.
18
Fase de potencia
La fase de potencia o interfaz entre las seales lgicas y el motor a pasos es un
circuito el cual proporcionara la corriente necesaria para encender cada bobina del motor
a pasos. Un posible circuito, de interfaz podra ser el mostrado en la siguiente figura:
FIGURA 7: Circuito de manejo de motores unipolares con tap
Este circuito se colocara por cada bobina en el motor de pasos: Un transistor
Darlington, un diodo, una resistencia y uno de los 6 buffers del integrado TTL 7406.
Si el motor tiene 4 (3) bobinas, generalmente presenta 5 (4) cables porque un cable
es comn a las dems bobinas y puede ser de reluctancia variable. El cable comn va a la
fuente de alimentacin.
Si el motor tiene dos bobinas con tap central y 6 cables, es probable que se trate de
un motor de imn permanente, donde el tap central va conectado a la fuente de
alimentacin (a veces a travs de un limitador de corriente).
El manejo de los motores de imn permanente bipolares que tienen 2 bobinas sin tap
central es ms complicado.
Segn el siguiente circuito, las entradas A y B pueden ser manejadas por salidas
TTL de colector abierto. La bobina del motor se energizar si una de las entradas esta en
alta y la otra en baja. Si ambas entradas estn en baja, los transistores pull-down Q1 y
Q4 estarn en corte, si ambas entradas estn en alta, ambos transistores pull up Q2 y Q3
estarn abiertos. Se puede notar los 4 diodos que conectan los terminales de la bobina del
19
motor hacia la alimentacin y tierra. Normalmente estn inversamente polarizados, pero al
apagarse la bobina o al cambiar el sentido de la tensin, se polarizan directamente mientras
demore extinguir la corriente de la bobina.
FIGURA 8: Circuito de manejo de motores bipolares sin tap (circuito H-bridge)
EL PIC 1: OBTENCION DE DATOS
El movimiento de la palanca provocara una variacin en el valor de la resistencia en
los potencimetros que conforman al Joystick, uno por cada eje. Esta variacin en el valor
de los potencimetros la debemos de traducir en una palabra binaria y la opcin por la que
optamos es la de hacer un divisor de voltaje con los potencimetros y con una resistencia
fija de un valor tal que se apreciara el cambio de voltaje por mnimo que sea el movimiento
en la palanca.
Pero una vez ms en la fase de pruebas y correcciones nos encontramos con que el
protoboard y la calidad mnima de los potencimetros nos propiciaban ruido en nuestra
seal (niveles de voltaje), as que se implemento una fase ms, que se trata de un filtro de
20
segundo orden, obviamente realizado con un Amplificador Operacional (op-amp); con una
frecuencia de corte de 5 Hz, un valor simblico, es decir que lo que se trata es de eliminar
ruido por frecuencias parsitas. Una vez que se empez a investigar sobre cual seria el
circuito a implementar nos dimos cuenta que se poda implementar toda una fase con op-
amps para buscar disminuir aun mas el ruido en el voltaje; as que ya no se utilizo un
simple divisor de voltaje para generar nuestra seal, sino que se trata de toda una fase
implementada con Op-Amps y el diagrama del circuito se muestra en la siguiente figura:
FIGURA 9: DIAGRAMA DE LA FASE PREVIA AL CONVERTIDOR ANALOGICO DIGITAL
En donde el voltaje de salida Vout esta dado por la expresin:
V
K
K
K
K
K
R
V
POT
out
5
47
7 . 4
1
470
470
100

=
Cada parntesis es la ganancia de cada etapa, la primera y la segunda etapas son
inversores, la tercera es la ganancia del filtro pasabajas de segundo orden; pero talvez solo
vean 3 parntesis y hay 4 etapas eso es por que en la ltima etapa: la entrada es igual a la
salida es decir se trata de un cto. Seguidor.
Las expresiones que definen el filtro pasa bajas de segundo orden son las siguientes:
21
Funcin de Transferencia:
2 2
2
2 2
1 3
) (
C R
S
RC
k
S
C R
k
S H
+


+
=
Frecuencia de corte:
RC
c
1
=
Ganancia de:

+ =
G
F
R
R
k 1
Factor de calidad:
k
Q

=
3
1
Con R = 330O, C = 100F, R
F
= 4.7 KO y R
G
= 47 KO.
Valores que, como se puede comprobar sustituyendo en las ecuaciones nos dan una
frecuencia de corte de 5Hz y una ganancia de 0.1; que dada la expresin del Vout de toda la
fase de op-amps nos de un valor lo mas aproximado al mximo valor que debe existir en
nuestra seal a la entrada del PIC; es decir que en el caso cuando el potencimetro del
Joystick registre su mximo valor 100KO (aprox.) despus de la fase de op-amps nos de
un valor a lo mas de 5.1 V (que este caso es difcil de presentarse dado que tanto el
potencimetro como la resistencia a la entrada de los 5V rara vez tendrn un valor exacto).
El voltaje de salida de esta etapa es ahora nuestra seal a digitalizar, es decir esta
seal se capturara por los bits RA0 y RA1 del puerto A del PIC16F874 utilizando claro el
modulo de conversin Analgica-Digital, el resultado de la conversin es el dato a enviar
por el puerto serie (USART) y que el PIC 2 codificara en la secuencia de movimiento
respectiva para los motores a pasos.
El modo de operacin de la comunicacin Bi-direccional entre el PIC 1 (16F874)y
el PIC 2 (16F628) se define de la siguiente manera el PIC 2 despus de realizar su proceso
de inicializacin, mandara una peticin de comunicacin despus este recibir un dato y
mandara otra peticin de comunicacin (que de ahora en adelante llamaremos request). De
igual manera el PIC 2 despus de haber completado la digitalizacin de la seal esperara la
peticin de comunicacin para poder enviar el primer dato, as sucesivamente no envira
nada hasta haber recibido un request.
El siguiente diagrama de flujo mostrara el proceso que realizara el PIC 1:
22
INICIO
Inicio Macros
Declaro variables
Hay request?
Realiza conversin
para eje X
Realiza conversin
para eje Y
cuentaX->TXREG
cuentaY->TXREG
NO
SI
Resultado cuentaX
Resultado cuentaY
request?
NO
SI
disparo? 00->boton FF->boton
SI NO
boton->TXREG
23
Bloques del programa
En esta seccin se explicara el programa del PIC 1, es decir es la traduccin del
diagrama de flujo al lenguaje ensamblador.
Para mejor entendimiento del programa se ha cambiado de color las lneas que son
comentarios (conjunto de caracteres que el compilador no toma en cuenta y que son
utilizadas para la documentacin del programa); y son todas aquellas que comienzan con
punto y coma; es decir a partir de un punto y coma, el compilador no tomara en cuenta los
caracteres siguientes sino hasta la siguiente lnea.
A continuacin se explicara que funcin realiza cada bloque:
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-PROGRAMA PRINCIPAL*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
ORG 0X00 ; Vector de reset
goto Main
ORG 0X04 ; Vector de interrupcion
goto intflag
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Main
call Inicializa_Puertos
call Recepcion
INI_TMR0
Al inicio del programa, el PIC debe situarse en el origen, es decir, en la direccin
00h, que es tambin la direccin donde el contador de programa debe dirigirse si se
presentara un reset por encendido (que es el nico caso que contemplara este programa ya
que no utilizamos ni el watchdog, ni la funcin de sleep).
Es necesario especificar en el programa que cuando ocurre una interrupcin (en
nuestro caso una interrupcin por Recepcin; la recepcin de peticin de comunicacin
REQUEST) El apuntador de instrucciones debe ir a la direccin 04h, donde se encuentra el
bloque reservado para la atencin a interrupciones.
Main es como comienza el programa y lo hace llamando a las subrutinas inicializa
puertos, que donde se especifican los patas que sern entradas y las que sern salidas para
cada puerto como se vera mas adelante cuando hablamos de ella; as como la subrutina de
Recepcin; y por ultimo se inicializa el TIMER.
24
inicio BANCO_0
clrw
clrf cuentaX ; Limpia la variable cuentaX
clrf cuentaY ; Limpia la variable cuentaY
clrf boton ; Pone en ceros boton
call botonver
Espera_com
clrf ADRESL ; Limpia el registro ADRESL
clrf datoX ; Limpia la variable datox
BANCO_0
movlw 0x41 ; Selecciona el canal 0 para la conversion
movwf canal
call Conversion ; Llama a la rutina de conversion
movf ADRESH,0 ; Guarda el resultado de la conversion en datoX
movwf datoX
bcf STATUS,C
rrf datoX,1 ; Acomoda el valor con una rotacion a la derecha
bcf datoX,0 ; Pone a cero los bits 0,1 y 2 para evitar movimientos
bcf datoX,1 ; indeseados
bcf datoX,2
movf datoX,0
movwf cuentaX ; El valor definitivo es copiado a la variable cuentaX
Inicio es la etiqueta que como observamos en el diagrama de flujo nos sirve de
referencia para regresar una vez que se ha realizado las conversiones A/D y se ha
transmitido los datos.
Primero mandamos llamar a la subrutina botonver para ver si se ha activado el
boton del joystick.
Despus comenzamos con la conversin A/D de la seal analgica correspondiente
al eje X; cuentaX y cuentaY sern las variables donde se guardara el valor final a transmitir,
as que comenzamos limpiando estas variables.
Para realizar una conversin sin tener alguna duda de que si el valor obtenido sea
correcto o no; limpiamos primero el registro de resultado ADRESL, igualmente limpiamos
datos, seleccionamos el Banco0 que donde se encuentran los registros a utilizar.
Ahora seleccionamos el canal en el que tomaremos la seal para X, canal 0
colocando un 41 en hexa en la variable canal que es la que se le pasara a la subrutina
conversin. El resultado de la conversin que esta en el registro ADRESH es copiado en la
variable datoX. Las siguientes instrucciones son para acomodar el valor obtenido es decir
en la fase de pruebas observamos que si utilizbamos los bits menos significativos del
resultado de la conversin (ADRESL) y algunos bits de ADRESH nos generaban
25
movimientos indeseados es decir era demasiado sensible as que despus varias pruebas
dimos con que la forma en que trabajara mejor seria quitando algunos bits.
Por ultimo ya manipulado al valor obtenido de la conversin es copiado en la
variable cuentaX. Que ser el dato a transmitir.
;-*-*-*-*-*-*-* A CONTINUACION SE HACE LO MISMO PARA EL EJE Y :
BANCO_1
clrf ADRESL
clrf datoY
BANCO_0
movlw 0x49 ; Canal 1
movwf canal
call Conversion
movf ADRESH,0
movwf datoY
bcf STATUS,C
rrf datoY,1
bcf datoY,0
bcf datoY,1
bcf datoY,2
movf datoY,0
movwf cuentaY
Y como dice el comentario en este bloque se hace lo mismo para el eje Y selecciono
el canal 1 para la conversin, el resultado es guardado en datoY y despus de los
respectivos ajustes es copiado a cuentaY
;-*-*-* EL SIGUIENTE BLOQUE CONSTA DE RETARDOS PARA LA SINCRONIZACION ENTRE PIC'S :
call retardo
bcf INTCON,T0IF
movlw 0x89
movwf TMR0
delay btfss INTCON,T0IF
goto delay
En este bloque hacemos uso del TIMER0 que es un modulo con el que cuentan los
PICs y se trata de:
Un temporizador/contador de 8 bits.
Legible y escribible.
Selector de reloj interno o externo.
26
Prescalador de 8 bits programable por software.
Interrupt por exceso de FFh a 00h.
As que este modulo se utiliza para que durante algunos ciclos de reloj el
microcontrolador no haga nada, hasta terminada la cuenta decreciente de TIMER0; que de
no comenzar en numero en especifico esta empieza en FFh hasta 00h creando un
desbordamiento despus de este numero y modificando la bandera de interrupcin TOIF del
registro INTCON.
Este modulo es tambin utilizado en la subrutina a la que se hace un llamado:
retardo; despus se habilita la interrupcin por desbordamiento (TOIF) y se comienza la
cuenta en 89h, poniendo este nmero en TIMER0, as espera a que termine la cuenta (hasta
que se presente la bandera TOIF puesta en 1).
nofull btfss bandera,4 ; Verifica que la interrupcion haya ocurrido
goto nofull ; No? espera a que ocurra
clrf bandera ; Si? Limpia la variable bandera
call retardo ; Hace un retardo
goto inicio ; Regresa a Inicio
El comando btfss dice: brinca una lnea si el bit 4(en este caso) de bandera esta en
1; es as como en este bloque se espera a que haya ocurrido la interrupcin por recepcin.
El loop nofull espera a que el registro bandera sea puesto en alto; claro que por
comodidad solamente nos fijamos en el estado del bit 4.
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* BLOQUE DE SUBRUTINAS -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
; COMO SU NOMBRE LO DICE ESTA SUBRUTINA ES UN RETARDO:
retardo
BANCO_0
bcf INTCON,T0IF ; Pone en cero la bandera de interupcion por TIMER
clrf TMR0 ; Limpia el registro TIMER
loop btfss INTCON,T0IF ; Ha ocurrido un desborde del TIMER?
goto loop ; NO? regresa a loop
bcf INTCON,T0IF ; Si? Limpia la bandera de interrupcion por TIMER
return
Bueno como ya mencionamos hace poco en esta subrutina se crea un retardo un
conjunto de ciclos de reloj sin actividad, con ayuda del TIMER0 y no es mas que una
cuenta como la que se explico anteriormente solo que de FFh a 00h.
27
; ESTA SUBRUTINA TRANSMITE LOS DATOS POR EL PUERTO SERIE:
Transmision
BANCO_0
movf dato,0 ; Copia el valor a transmitir a W Antes de llamar esta
; subrutina el valor a transmitir debe ser guardado en "dato"
movwf TXREG ; Mueve el dato al buffer de transmisin, reg. TXREG
BANCO_1
movlw D'51' ; Selecciona el Baud Rate=4800 bps (Registro SPBRG=51)
movwf SPBRG
bcf TXSTA,SYNC ; Selecciona el modo asincrono para la transmision
bsf TXSTA,BRGH ; Habilita el HIGH BAUD RATE
BANCO_0
bsf RCSTA,SPEN ; Habilita el puerto serie
BANCO_1
bsf TXSTA,TXEN ; Habilita la transmisin
BANCO_0
return
Esta rutina es llamada dentro de la rutina intflag, que es cuando es atendida la
peticin de comunicacin request-. Aqu es habilitada la transmisin y el baud rate,
adems de transferir el contenido del registro dato (ya sea el valor asociado a X o el valor
asociado a Y); al registro TXREG, que es el responsable de mandar bit a bit su contenido.
El manual del PIC explica la forma de calcular el valor del SPBRG (que ser el
valor a programar para obtener el Baud Rate requerido), sabiendo la frecuencia de
oscilacin, el baud rate requerido y el modo de transmisin (sncrona o asncrona). La
frmula se obtiene de la siguiente tabla:
SYNC BRGH = 0 (Low Speed) BRGH = 1 (High Speed)
0 (Asynchronous) Baud Rate = Fosc/(64(X+1) (Asynchronous) Baud Rate = Fosc/(16(X+1)
1 (Synchronous) Baud Rate = Fosc/(4(X+1) NA
Donde X es el valor del SPBRG.
Para nuestro caso, los datos son: F
osc
= 4 MHz, Baud Rate = 4600 bps, que es el
valor convencional o mas comn utilizado para telemetra, as como el tipo de
comunicacin que debe ser asncrona y de alta velocidad (High Baud Rate).
Despejando X de la ec. correspondiente nos queda:
1
16

=
BaudRate
F
X
OSC
28
Sustituyendo valores tenemos:
51 1
4600 16
4

=
Bps
Mhz
X
Obtenido esto solo resta habilitar las banderas indicadas y en el orden indicado,
como lo explica las hojas de especificaciones del PIC para concluir la transmisin.
; -*-*-*-*- ESTA SUBRUTINA RECIBE LOS DATOS POR EL PUERTO SERIE :
Recepcion
BANCO_1
movlw D'51' ; Valor del Baud Rate=4800 bps (Registro SPBRG=51)
movwf SPBRG
bcf TXSTA,SYNC ; Selecciona el modo asincrono para la recepcin
bsf TXSTA,BRGH ; Habilita el HIGH BAUD RATE
BANCO_0
bsf RCSTA,SPEN ; Habilita el puerto serie
BANCO_1
bsf PIE1,RCIE ; Habilita la interrupcin por recepcin
BANCO_0
bsf RCSTA,CREN ; Habilita la recepcin
bsf INTCON,PEIE ; Habilita interrupcin por perifericos
bsf INTCON,GIE ; Habilitacion global de interrupciones
return
Para esta rutina sucede lo mismo que en la de transmisin, seleccionamos el Baud
Rate con el que se va a trabajar y se habilitan las banderas indicadas para la Recepcin de
datos por el puerto serie, igualmente como esta indicado en las hojas de especificaciones
del PIC.
; --*-*-*-*-*- ESTA SUBRUTINA REALIZA LA CONVERSION A / D :
Conversin
BANCO_0
movlw 0x32
movwf contador
BANCO_1
movlw 0x00 ; Palabra de configuracion: justificacion izquierda,
movwf ADCON1 ; 8 canales analogicos con ref. Vdd y Vss
BANCO_0
movf canal,0 ; El canal previamente cargado(antes de llamar a la
; subrutina)
movwf ADCON0 ; es selecionado para la conversion
decfsz contador,f ; Decrementa contador hasta que se acero
goto $-1
bsf Inicia_Conv ; Inicia la conversion
loop2
btfsc Inicia_Conv ; Espera a que finalice la conversion
29
goto loop2
bcf ADCON0,ADON
return
Lo primero que se debe de hacer para la conversin A/D es configurar el modulo,
que justificacin se usara, como estarn distribuidos los canales y los voltajes de referencia
(que en nuestro caso ser los 5V de alimentacin para V+ y tierra para V-), pasamos el
canal al que se le har la conversin, hacemos un retraso y empezamos la conversin
habilitando el bit 2 de ADCON0, esperamos a que termine la conversin, verificando el bit
de conversin ADCON0,2 y por ultimo limpiamos por software la bandera de encendido
del convertidor ADON,ADCON0.
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- CONFIGURACIN DE PUERTOS -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Inicializa_Puertos
clrf PORTC ; Seales desactivadas en el puerto C
clrf PORTA ; Seales desactivadas en el puerto A
BANCO_1
movlw 0xE0
movwf TRISC ; Configura los bits 7 y 6 del puerto C como entradas
movlw 0xC3
movwf TRISB ; Configura el puerto B como entradas y salidas
movlw 0x3F
movlw TRISA ; Configura el puerto A como canales de entrada
; para el A/D
BANCO_0
return
Este bloque se ocupa de configurar las entradas y las salidas a utilizar de cada
puerto. El puerto A se habilita como entradas para los canales del convertidor, Del puerto C
se habilitan como entrada los bits 7,6 y 5 para usarlos como Rx, Tx y el bit del boton;
respectivamente.
;*-*-*-*- SUBRUTINA QUE VERIFICA SI SE HA ACTIVADO EL BOTON :
botonver
movf boton,0 ;verifica si ya se ha activado
sublw HFF
btfss STATUS,Z
goto ceros ; NO? Ve a ceros
goto balderas ; SI? Ve a balderas
ceros
30
btfsc PORTC,5 ; verifica el puerto si esta en
goto balderas ; NO? Ve a balderas
comf boton,1 ; SI? Complementa boton
goto acaba
balderas
nop ; no hagas nada
nop ; no hagas nada
nop ; no hagas nada
nop ; no hagas nada
acaba
return
Esta subrutina se encarga de observar el bit 5 del puerto C, para ver si se ha activado
el botn del Joystick, esto se realiza con lgica negativa, es decir si hay un 0 en el puerto
se ha activado el botn. Si se ha activado se colocara en unos la variable botn para as
indicarlo, FF->boton.
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*--*- RUTINA DE INTERUPCION -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
intflag
BANCO_0
movf RCREG,0 ; Verifica que el valor recibido(RCREG)
movwf datoRx
bcf STATUS,Z ; Sea el requets "5" en decimal
sublw 0x05
btfss STATUS,Z
goto adios ; NO? sal de la rutina
;-*-*-*-*-*-*-*-*-*-*-*-*-*-VOY A MANDAR DATO DE REGISTRO X AL PUERTO SERIAL-*-*-*-*-*-*-*-*-*-
movf cuentaX,0
movwf dato
call Transmision
BANCO_1
toaviano btfss TXSTA,TRMT
goto toaviano
BANCO_0
clrw
clrf dato
;-*-*-*-*-*-*-*-*-*-*-*-*-*-VOY A MANDAR DATO DE REGISTRO Y AL PUERTO SERIAL-*-*-*-*-*-*-*-*-*-
movf cuentaY,0
movwf dato
call Transmision
BANCO_1
toaviano1 btfss TXSTA,TRMT
goto toaviano1
;-*-*-*-*-*-*-*-*-*-*-*-*-*- VOY A MANDAR DATO DE BOTON AL PUERTO SERIAL -*-*-*-*-*-*-*-*-*-*-*-
BANCO_0
movf boton,0
movwf dato
call Transmision
31
BANCO_1
toaviano2 btfss TXSTA,TRMT
goto toaviano2
BANCO_0
movlw 0xFF ; Pongo el valor FF en bandera que indica que
movwf bandera ; Se han transmitido los datos.
adios
retfie
end
Esta subrutina es una de las mas importantes dentro del programa ya que se puede
interrumpir en cualquier momento el curso del programa, para ejecutar esta subrutina, y
esto se logra en el momento que, en nuestro caso, se registre una interrupcin por recepcin
(peticin de comunicacin -request-). De este modo se guardara el contador de programa
dentro de la pila y este se posicionada en la direccin de interrupcin 0x04h y se ejecutara
esta subrutina.
Lo primero por hacer es verificar si el dato recibido es el esperado, es decir por
seguridad el request ser un carcter conocido (el numero 0x05) ya que puede presentarse
otro valor por inconveniencias elctricas.
Una vez verificado el request se prosigue a transmitir el primer valor (el
correspondiente al eje X), colocando el valor a transmitir en la variable dato y haciendo un
llamado a la subrutina Transmision explicada anteriormente, esperando despus de esto el
termino de la trasmisin deshabilitacin del bit TMRT del registro TXSTA - . Repitiendo
el proceso para el eje Y, y para la variable boton.
Por ultimo habilitamos una variable poner en unos, bandera- para constar a la
dems parte del programa que ya se produjo una interrupcin.
La instruccin retfie seala que la rutina es de interrupcin (que ejecuta el
regreso al programa principal y poner la direccin, de donde se quedo el programa, en el
contador de programa, guardado en la pila); y la otra instruccin end es el cierre de la rutina
main
.
32
El PIC de los motores (PIC2)
Como ya hemos mencionado antes este PIC se encargara de decodificar los datos
enviados por el PIC 1 palabras asociadas a cada posicin de la palanca del joystick- en, la
secuencia necesaria para mover los motores. Antes de realizar cualquier movimiento
generado por el joystick, se realizara un proceso para colocar los motores en una posicin
de referencia, de la que ya habamos platicado anteriormente; y el procedimiento consta de
mover los motores en contra de las manecillas del reloj hasta que se cierre el circuito de un
fotosensor, que como mencionamos antes ser parte de la plataforma en si, y que se
colocara uno por motor. As, despus de haber encontrado la referencia, los motores se
movern ahora en el sentido de las manecillas del reloj un cierto nmero de pasos para
ahora si colocarse en la posicin deseada como inicial y que ser asociada a la posicin de
reposo del joystick. El movimiento de los motores ser generado por la resta de dos
registros, un registro que llamaremos en el programa inicialX -que en un principio se le
asociara una palabra y ser la misma asociada a la posicin de reposo- y el registro cuentaX
que ser el valor enviado por el PIC 1, as despus de hacer la resta se generara la secuencia
respectiva, dependiendo del resultado de la resta hacia adelante si cuentaX es mayor que
inicialX, hacia atrs si cuentaX es menor que inicialX y ningn movimiento si son
iguales. La secuencia respectiva para mover los motores ser la rotacin de 2 bits ya
que se realizara una polarizacin de las bobinas de los motores, doble torque. La secuencia
saldr por los puertos A y B, donde asignamos los bits menos significativos del puerto A
como salidas al motor X, y los ms significativos del puerto B al motor Y (esto debido a la
multiplexacin del puerto B). Por ultimo cabe mencionar que esta salida ser negada debido
a la etapa siguiente: la etapa de potencia, que ser necesaria para polarizar las bobinas de
los motores que utilizaremos que son de gran demanda de corriente: 5V y 2.1 A por
devanado. De esta etapa hablaremos mas adelante. Resumiendo el procedimiento que
realizara el programa quedara de la siguiente manera: 1 realizara la secuencia de
referencia, 2 enviar request, 3 esperar los valores enviados por el PIC 1, 4 mandar el bit
de salida de activacin de disparo (botn activado en el joystick); si es el caso, 5 realizar la
resta para saber en que sentido se movern los motores, 6 enviar la secuencia necesaria a
los puertos de salida, 7 regresar a enviar request y realizar el procedimiento nuevamente,
como se podr observar en el siguiente diagrama de flujo:
33
INICIO
Inicio Macros
Declaro variables
RCREGcuentaX
NO
Buffer
lleno?
SI
Secuencia de referencia
Transmito request
Buffer
lleno?
NO
1
Buffer
lleno?
NO
RCREGcuentaY
SI
RCREGboton
SI
3
34
Paso para atrs
motorX
inicialXinicialX-1
SI
NO
Z=1?
C=1?
SI NO
Paso para atrs
motorX
inicialXinicialX-1
WcuentaY-inicialY
cuentaX=inicialX
y
cuentaY=inicialY
1 2
SI NO
WcuentaX-inicialX
Paso para atrs
motorX
inicialXinicialX-1
SI
NO
Z=1?
C=1?
SI NO
Paso para atrs
motorX
inicialXinicialX-1
2
3
35
Bloques del Programa
A continuacin se explicara el funcionamiento de cada bloque del programa, para
un mejor entendimiento de este:
;-*-*-*-*-*-*-*-*-*-*-*-PROGRAMA PRINCIPAL*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
ORG 0X00 ;vector de reset
goto Main
ORG 0X04 ;vector de interrupcion
goto intflag
Main
BANK1
movlw B'10010000' ;se carga w para habilitar
movwf TRISA ;salidas en el puerto A
movlw B'00001110' ;se carga w para habilitar
movwf TRISB ;salidas en el puerto B
;bit5=0,bit3=0,bits2-1=0,bit0=1:prescaler rate
movlw B'00000100'
movwf OPTION_REG ;para activar timer 0
;Periodo de 1.024ms
Se inicia el programa principal declarando las direcciones de reset y del vector de
interrupcin y sus respectivas direcciones para el PC, para los casos respectivos: 00h para
un reset de encendido o 04h en caso de una interrupcin.
El bloque main comienza configurando los puertos de salida y entrada: del puerto
A se configuraran los bits 0,1,2,3,5,6 como salidas (que sern la seales que movern al
motor que corresponde al eje X ); del puerto B se configuran como salidas los bits 4,5,6,7
como salidas (que sern la seales que movern al motor que corresponde al eje Y );
tambin se configura el OPTION REG en una preescalacin de 1:32 o 1.024ms para el
TIMER.
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
inicio
;Este bloque limpia -pone en ceros- las variables a utilizar
BANK0
clrw
clrf bandera
clrf contint
clrf PORTA
clrf PORTB
clrf corridoX
clrf corridoY
clrf val
clrf RCREG
movlw H'06'
movwf corridoX ; Colocamos un 06h 00001100 en la variables
36
movlw H'60' ;que pondremos como salida hacia los motores
movwf corridoY ; y un 60h para Y 11000000
movlw H'00'
movwf contint
Este bloque es solamente la inicializacin de variables del programa, decir se ponen
en ceros para evitar algn error por un contenido indeseado. la instruccin movlw a los
registros corridoX y corridoY, ponen en uno los bits centrales que se enviaran a los
motores: 0000 0110 para el motor de X, 0110 0000 para el motor de Y; por ultimo
ponemos en ceros la variable contint que nos servir para identificar los valores enviados
por el PIC 1; ya que cuando contint sea 1 se tratara del valor asociado a X y cuando contint
sea 2 se tratara del valor asociado a Y.
;-*- El siguiente bloque mandara la secuencia de referencia a los motores
;------------------------- Secuencia para X ----------------------------
refX
btfsc PORTA,4 ;Verifica si la referenia de X esta activada
goto regresaX ; Si? ve a regresaX
call Xrewind ; No? ve a Xrewind
bcf INTCON,T0IF ; Retardo con TMR0
clrf TMR0
aqui30 btfss INTCON,T0IF
goto aqui30
bcf INTCON,T0IF ; Retardo con TMR0
clrf TMR0
aqui3a btfss INTCON,T0IF
goto aqui3a
comf corridoX,0 ; Complementa y Manda corridoX al motor de X
movwf PORTA
goto refX ;Regresa para verificar si ya esta activada la
;referencia de x, si no se repite el proceso
Comenzamos con los bloques que se encargaran de poner la plataforma en la
posicin inicial o de referencia. El bit 4 del puerto A esta configurado como entrada, en el
programa ser utilizado como un bandera que nos indicara en que momento el motor ha
girado hasta el punto donde se encuentra al fotosensor; este caso para el eje X.
Este bloque de eso se encarga de verificar el que momento en que se ha cerrado el
circuito fotosensor; es decir el fotosensor todo el tiempo estar entregando un 1, hasta
que sea cerrado y en esta caso entregara un 0. As existen dos casos cuando el puertoA,4
esta en 1 el programa se dirige a regresaX, si esta en 0, llama a la subrutina Xrewind que
se explicara mas adelante. Estas opciones generaran la secuencia que se deber enviar al
motor X, as que despus de haber guardado el valor que se enviara en la variable corridoX
37
se realizan un par de retrasos con el TIMER0 para dar tiempo de acoplamiento entre cada
paso al motor y la secuencia.
Despus de los retardos se enva la secuencia respectiva al motor no sin antes
complementar la salida esto debido a la fase de potencia que utilizara lgica negada como
observaremos mas adelante.
Este proceso se encuentra en un loop que se repite hasta que el puertoA, 4 este
desactivado; por ello la ultima instruccin de regresar a refX.
;-- Este bloque Mueve el motor en el sentido de las manecillas del reloj
;-- Una vez que ya se activo la referencia de X:
regresaX
clrf inicialX
agX
call Xforward ; llama a la subrutina Xfoward
bcf INTCON,T0IF ; Retardo con TMR0
clrf TMR0
aqui3 btfss INTCON,T0IF
goto aqui3
bcf INTCON,T0IF ; Retardo con TMR0
clrf TMR0
aqui3b btfss INTCON,T0IF
goto aqui3b
comf corridoX,0 ; Complmenta y Manda corridoX al motor de X
movwf PORTA
bcf STATUS,Z
movf inicialX,0
sublw D'100'
btfss STATUS,Z ; Verifica si inicialX es 100
goto agX ; No? regresa a agx y se repite el proceso
Como el comentario con el que comienza este bloque lo dice su funcin es generara
la secuencia respectiva para mover el motor en el sentido de las manecillas del reloj-hacia
adelante-, una vez que se ha puesto en 0 la bandera de referencia para el motor X
(puertoA,4); y es en la subrutina Xfoward donde se generara la secuencia es por eso que se
le hace un llamado; y una vez de haber sido modificado el registro corridoX por la
subrutina se generan los retraso de acoplamiento; y por ultimo se enva la secuencia.
Este bloque tambin se trata de un loop que se repetir 100 veces. Es decir que una
vez encontrada la referencia, el motor realizara 100 pasos (que es un valor modificable con
el fin de colocar el motor en la posicin deseada; es decir que si la posicin deseada se
encuentra cuando solo se han realizado 10 pasos, este es el nmero que se deber colocar
en la instruccin sublw). Los 100 pasos se harn hacia delante en el sentido de las
38
manecillas del reloj-; hasta que la variable inicialX contenga un 100d; y que es modificada
en la subrutina Xfoward.
Los siguientes dos bloques:
;------------------------- Secuencia para Y ----------------------------
refY
btfsc PORTA,7 ; Verifica si la referenia de Y esta activada
goto regresaY ; Si? ve a regresaY
call Yrewind ; No? ve a Yrewind
bcf INTCON,T0IF ; Retardo
movlw 0x45
movwf TMR0
aqui31 btfss INTCON,T0IF
goto aqui31
bcf INTCON,T0IF
movlw 0x45 ; Retardo
movwf TMR0
aqui3c btfss INTCON,T0IF
goto aqui3c
comf corridoY,0 ; Complmenta y Manda corridoY al motor de Y
movwf PORTB
goto refY ; Regresa para verificar si ya esta activada
; la referncia de Y, si no se repite el proceso
;------ Este bloque Mueve el motor en el sentido de las manecillas del reloj
;------ una vez que ya se activo la referencia de Y
regresaY
clrf inicialY
agY
call Yforward ; llama a la subrutina Yfoward
bcf INTCON,T0IF ; Retardo
movlw 0x45
movwf TMR0
aqui33 btfss INTCON,T0IF
goto aqui33
bcf INTCON,T0IF ; Retardo
movlw 0x45
movwf TMR0
aqui34 btfss INTCON,T0IF
goto aqui34
comf corridoY,0 ; Complmenta y Manda corridoY al motor de Y
movwf PORTB
bcf STATUS,Z
movf inicialY,0
sublw D'100'
btfss STATUS,Z ; Verifica si inicialY es 100
goto agY ; No? regresa a agY y se repite el proceso
39
Harn lo mismo para la referencia del motor del eje Y.
;------- Una vez posicionado los motores en la posicion referencia------
; asociamos una palabra a esta posicion:
clrf inicialX ; 63 decimal a inicialX
movlw D'63'
movwf inicialX
clrf inicialY ; 63 decimal a inicialY
movlw D'63'
movwf inicialY
Como se ha explicado anteriormente una vez encendido el sistema a cada posicin
de los motores esta asociada una palabra binaria, es por ello que para la posicin de
referencia tanto para el eje X, como par el eje Y se le ha asociado la palabra 63 en
decimal, y que ser la palabra asociada con la posicin de reposo del joystick; y por ende
tambin la palabra inicial que contendrn los registros inicialX e inicialY.
;--- En el siguiente bloque se genera la interrupcion transmitiendo ----
; el request y por consiguiente esperar la respuesta del PIC 1:
otropasoX clrw
bcf STATUS,Z
bcf STATUS,C
bcf INTCON,T0IF
clrf contint ; Limpio contint
movlw H'05'
movwf dato ; Coloca un 05h (request) en dato
call Transmision ; Manda request
call Recepcion ; Llama a la subritina Racepcion
quenoX btfss bandera,4 ;Espera a que se haya generado una recepcion
goto quenoX ; para el valor asociado a X
clrf bandera ; Limpia la bandera de recepcion
call Recepcion ; Llama a la subritina Racepcion
quenoY btfss bandera,4 ;Espera a que se haya generado una recepcion
goto quenoY ; para el valor asociado a Y
clrf bandera ; Limpia la bandera de recepcion
call Recepcion ; Llama a la subritina Racepcion
quenoB btfss bandera,4 ;Espera a que se haya generado una recepcion
goto quenoB ; para el valor asociado a boton
clrf bandera ; Limpia la bandera de recepcion
En este momento nos encontramos en la seccin del programa en la que se ha
inicializado el sistema es decir se han colocado los motores en la posicin de referencia y lo
siguiente es mover la plataforma de acuerdo al movimiento que sufra el joystick.
Desde el punto de vista del programa esto se realiza mandando la peticin de
comunicacin, osea le pedimos al PIC 1 que nos envi la 1er palabra para generar el
40
movimiento respectivo. Como ya habamos comentado la peticin de comunicacin o
request ser un 05h que ser enviado con la ayuda de la subrutina Transmision.
Es as como comenzamos la comunicacin entre PICs: el PIC 2 enva la peticin de
comunicacin y el PIC 1, contestara enviando tres palabras la 1 asociada con el eje X, la
segunda con el eje Y, y la 3 con el botn de disparo. es por eso que una vez llamado a la
subrutina Transmision se hace un llamado tambin a la subrutina Recepcion; verificando
con un loop el termino de la recepcin del valor de X de Y, y despus para boton.
;---- Se hace la resta del valor guardado en inicialX y el valor recibido
; cuentaX para ver si son: iguales, menor o es mayor:
verX
bcf STATUS,Z
movf inicialX,0
subwf cuentaX,0
btfss STATUS,Z ; Verifica si son iguales
goto dirX ; No? ve a dirX
goto verY ; Si? ve a verY
dirX
bcf STATUS,C
movf inicialX,0
subwf cuentaX,0
btfss STATUS,C ; Verifica si cuentaX es mayor
goto patrasX ; No? ve a patrasX
call Xforward ; Si? llama a Xfoward
goto verY
patrasX
call Xrewind ; Es menor. ve a Xrewind
Una vez que llamamos a Recepcion se genera una interrupcin que se encargara-
como observaremos mas adelante- de guardar el valor para el eje X en cuentaX y en
cuentaY el valor para el eje Y.
Tendiendo la palabra nueva -enviada por el PIC 1-, proseguimos a hacer la
comparacin con el valor actual contenido en las variable inicialX; para decidir en que
sentido se mover el motor. Restamos el valor actual inicialX con el nuevo valor cuentaX y
observamos si la bandera C ( Carry ), del registro STATUS se ha puesto o no en 1; en el
caso de haberse puesto en 1 nos indica que cuentaX es > inicialX, y por lo tanto el
movimiento se har hacia adelante por ello se llama a la subrutina Xfowrad. En el caso
contrario C=0, cuentaX es < inicialX, por lo que el motor deber moverse hacia atrs
llamando a la subrutina Xrewind. Y en el caso de que se han iguales no se har ningn
moviendo y pasamos a ver que pasa con el eje Y goto verY-.
41
;---- Se hace la resta del valor guardado en inicialY y el valor recibido
; cuentaY para ver si son: iguales, menor o es mayor
verY
bcf STATUS,Z
movf inicialY,0
subwf cuentaY,0
btfss STATUS,Z ; Verifica si son iguales
goto dirY ; No? ve a dirY
goto salida ; Si? ve a salida
dirY
bcf STATUS,C
movf inicialY,0
subwf cuentaY,0
btfss STATUS,C ; Verifica si cuentaY es mayor
goto patrasY ; No? ve a patrasY
call Yforward ; Si? llama a Yfoward
goto salida
patrasY
call Yrewind ; Es menor. ve a Yrewind
Que como se puede observar es la misma rutina de comparacin que explicamos
para el eje X. Una vez que hemos hecho la comparacin y que se ha generado la secuencia
siguiente que debern seguir los motores X y Y; el programa va a salida:
;-------- Una vez que se sabe la proxima secuencia de los motores se
; mandan al puerto respectivo:
salida
comf corridoY,0 ; Complementa y Manda la secuencia
movwf PORTB ; del motor Y
comf corridoX,0 ; Complementa y Manda la secuencia
movwf PORTA ; del motor X
bcf INTCON,T0IF ; Creamos un retardo
movlw 0x45
movwf TMR0
aq3 btfss INTCON,T0IF
goto aq3
btfss boton,4 ;verifica si esta habilitada la variable boton
goto bo ;NO? ve a bo
bsf PORTB,0 ;SI? pon un "1" en el bit 0 del puerto B
goto ton
bo
bcf PORTB,0 ; pon un "0" en el bit 0 del puerto B
ton
goto otropasoX ; Regresa a otropasoX
Salida es el bloque donde se mandara la secuencia respectiva a los motores,
complementado primero la palabra. Despus como en cada parte del programa colocamos
un retraso para el acoplamiento del movimiento de los motores con la obtencin de la
42
siguiente secuencia de movimiento. Y por ultimo regresamos a realizar todo el proceso con
los nuevos valores enviados por el PIC 1-goto otropasoX-.
Con este bloque terminamos con la estructura del programa principal y comenzamos
con las subrutinas:
;--------- Subrutina que genera la siguiente secuencia del motorX ------
; en caso de que se requiera mover en sentido contrario
; a las manecillas del reloj:
Xrewind
bcf STATUS,Z
movf corridoX,0
sublw H'0C'
btfss STATUS,Z ; CorridoX contiene un 0Ch?
goto resetX1 ; No? ve a resetX1
movlw H'09' ; Si? coloca un 09h
movwf corridoX ; en corridoX
goto yastuvoX1 ; ve a yastuvoX1
resetX1
bcf STATUS,Z
movf corridoX,0
sublw H'09'
btfss STATUS,Z ; CorridoX contiene un 09h?
goto resetX2 ; No? va a resetX2
movlw H'03' ; Si? coloca un 03h
movwf corridoX ; en corridoX
goto yastuvoX1 ; ve a yastuvoX1
resetX2
bcf STATUS,C ; Limpia el bit de acarreo
rlf corridoX,1 ; Rota el valor de corridoX
yastuvoX1
decf inicialX,1 ; Decrementa inicialX
return
Esta subrutina es la encargada de generar un paso hacia atrs, -en sentido
contrario a las manecillas del reloj-.
Y es aqu donde nos detendremos a explicar en que consiste generar la secuencia
siguiente o el paso siguiente: como mencionamos anteriormente las variables corridoX y
corridoY al principio del programa se les coloco una palabra que polarizara las bobinas
centrales de cada motor, 0000 0110 para el eje X y 0110 0000 para el eje Y; y de aqu
partimos para generar un paso con un corrimiento de esta palabra hacia la derecha para
generar un paso hacia adelante o un corrimiento hacia la izquierda para generar un paso
hacia atrs. Pero al ocupar solo 4 bits de todo el registro es que no podemos usar
simplemente la instruccin rrf o rlf para realizar este corrimiento, y por ello cambiamos el
valor de la palabra en los casos necesarios, observemos la siguiente figura para entender
mejor esto:
43
FIGURA 10: Movimiento del los registros corridoX y corridoY.
X X
Cambios en el registro corridoX Cambios en el registro corridoX
y la instruccin necesaria, y la instruccin necesaria,
para dar un paso hacia delante para dar un paso hacia atras
Y Y
Cambios en el registro corridoY Cambios en el registro corridoY
y la instruccin necesaria, y la instruccin necesaria,
para dar un paso hacia delante para dar un paso hacia atras
En esta tabla se muestran las secuencias que deben seguir los registros de salida de los motores;
corridoX y corridoY para mover los motores hacia delante o hacia atrs, -en el sentido de las
manecillas del reloj o en sentido contrario a las manecillas-.
La subrutina Xrewind realiza un corrimiento a la izquierda de la variable corridoX
verificando el contenido de esta para as poder determinar que valor que tendr al final de
la subrutina. Este valor se obtiene de la siguiente forma: si corridoX contiene un 0Ch lo
cambiara por un 09h, si corridoX contiene un 09h lo cambiara por un 03h y en caso
contrario realizara un corrimiento a la izquierda; es decir en los casos que corridoX
contenga un 03h o un 06h.
rrf
0000 0110
0000 0011
movlw
0000 1001
0000 1100
movlw
rrf
0000 0110
0000 0011
0000 1001
0000 1100
rlf
movlw
movlw
rlf
rrf
0110 0000
0011 0000
movlw
1001 0000
1100 0000
movlw
rrf
0110 0000
0011 0000
1001 0000
1100 0000
rlf
movlw
movlw
rlf
44
Por ultimo decrementamos la variable que contiene la palabra asociada a la posicin
en que nos encontramos inicialX.
Yrewind realiza el mismo procedimiento para el eje Y, la nica diferencia se
encuentra en que para el eje Y, los bits a modificar se encuentran en la parte alta del
registro corridoY:
;-------- Subrutina que genera la siguiente secuencia del motorY -------
; en caso de que se requiera mover en sentido contrario
; a las manecillas del reloj:
Yrewind
bcf STATUS,Z
movf corridoY,0
sublw H'C0'
btfss STATUS,Z ; CorridoX contiene un C0h?
goto resetY1 ; No? ve a resetY1
movlw H'90' ; Si? coloca un 90h
movwf corridoY ; en corridoY
goto yastuvoY1 ; ve a yastuvoY1
resetY1
bcf STATUS,Z
movf corridoY,0
sublw H'90'
btfss STATUS,Z ; CorridoX contiene un 90h?
goto resetY2 ; No? ve a resetY2
movlw H'30' ; Si? coloca un 30h
movwf corridoY ; en corridoY
goto yastuvoY1 ; ve a yastuvoY1
resetY2
bcf STATUS,C ; Limpia el bit de acarreo
rlf corridoY,1 ; Rota el valor de corridoY
yastuvoY1
decf inicialY,1 ; Decrementa inicialY
return
Y por ultimo se decrementa la variable asociada al eje Y, inicialY.
;-------- Subrutina que genera la siguiente secuencia del motorX -------
; en caso de que se requiera mover en el sentido de las
; manecillas del reloj:
Xforward
bcf STATUS,Z
movf corridoX,0
sublw H'03'
btfss STATUS,Z ; CorridoX contiene un 03h?
goto resetX3 ; No? ve a resetX3
movlw H'09' ; Si? coloca un 09h
movwf corridoX ; en corridoX
goto yastuvoX3 ; ve a yastuvoX3
resetX3
bcf STATUS,Z
movf corridoX,0
sublw H'09'
btfss STATUS,Z ; CorridoX contiene un 09h?
45
goto resetX4 ; No? ve a resetX4
movlw H'0C' ; Si? coloca un 0Ch
movwf corridoX ; en corridoX
goto yastuvoX3 ; ve a yastuvoX3
resetX4
bcf STATUS,C ; Limpia el bit de acarreo
rrf corridoX,1 ; Rota el valor de corridoX
yastuvoX3
incf inicialX,1 ; Incrementa inicialY
return
La subrutina Xfoward har el cambio necesario para realizar un paso hacia
delante. Cambiando el contenido de corridoX por un 09h, en caso de tener un 03h,
cambiando por un 0Ch en caso de tener un 09h y realizando un corrimiento a la derecha en
los casos contrarios (0Ch y 03h). Por ltimo por tratarse de un movimiento hacia delante
incrementamos inicialX.
;--------- Subrutina que genera la siguiente secuencia del motorY ------
; en caso de que se requiera mover en el sentido de las
; manecillas del reloj:
Yforward
bcf STATUS,Z
movf corridoY,0
sublw H'30'
btfss STATUS,Z ; CorridoX contiene un 30h?
goto resetY3 ; No? ve a resetY3
movlw H'90' ; Si? coloca un 90h
movwf corridoY ; en corridoY
goto yastuvoY3 ; ve a yastuvoY3
resetY3
bcf STATUS,Z
movf corridoY,0
sublw H'90'
btfss STATUS,Z ; CorridoY contiene un 90h?
goto resetY4 ; No? ve a resetY4
movlw H'C0' ; Si? coloca un C0h
movwf corridoY ; en corridoY
goto yastuvoY3 ; ve a yastuvoY3
resetY4
bcf STATUS,C ; Limpia el bit de acarreo
rrf corridoY,1 ; Rota el valor de corridoY
yastuvoY3
incf inicialY,1 ; Incrementa inicialY
return
Yfoward realiza lo mismo para Y. Cambiando el contenido de corridoY por un 90h,
en caso de tener un 30h, cambiando por un C0h en caso de tener un 90h y realizando un
corrimiento a la derecha en los casos contrarios (C0h y 30h).E incrementamos inicialY.
46
Las subrutinas Transmision y Recepcion ya han sido explicadas en los bloques del
programa del PIC1, que como podr observarse son idnticas. As que por ultimo
explicaremos la subrutina de interrupcin, y que como hemos explicado, se llamara en el
caso de existir una interrupcin por recepcin:
;---------------- Rutina de Interrupcion -------------------------------
; - Se ha generado una Recepcion-
intflag
BANK0
bcf STATUS,Z
movf contint,0
sublw H'00'
btfss STATUS,Z ; Verifica si contint es 00h
goto pasalas ; No? ve a pasalas
movf RCREG,0 ; Si? el valor recibido -RCREG-
movwf cuentaX ; guardalo en cuentaX
incf contint,1 ; Incrementa contint
goto fin ; Ve a fin
pasalas
bcf STATUS,Z
movf contint,0
sublw H'01'
btfss STATUS,Z ; Verifica si contint es 01h
goto botones ; No? ve a botones
movf RCREG,0 ; Si? el valor recibido -RCREG-
movwf cuentaY ; guardalo en cuentaY
incf contint,1 ; Incrementa contint
goto fin ; Ve a fin
botones
bcf STATUS,Z
movf contint,0
sublw H'02'
btfss STATUS,Z ; Verifica si contint es 02h
goto fin ; No? ve a fin
movf RCREG,0 ; Si? el valor recibido -RCREG-
movwf boton ; guardalo en boton
movlw H'00'
movwf contint ; Coloca un 00h en contint
fin movlw 0xFF
movwf bandera ; Coloca un FFh en bandera
bcf RCSTA,CREN ; Deshabilita la recepcin
retfie
end
La variable contint nos ayudara a llevar un control sobre los datos recibidos, as al
ser el valor asociado a X el primer dato recibido contint debe valer 1 para este caso, 2 en el
caso del segundo dato recibido asociado con Y-; y por ultimo 3 para el tercer dato
asociado con el boton de disparo-. Es por ello que se verifica el valor contenido en contint,
47
si es 1,el valor en el buffer de recepcin RCREG es guardado en cuentaX, si contint es 2,
RCREG es copiado en cuentaY y si contint es 3, RCREG es copiado en boton. Por ultimo
ponemos en unos la variable bandera para constar que se ha generado una interrupcin.
Para mayor detalle sobre los programas de los PIC1 y PIC2 favor de consultar el
apndice donde se encontrara el listado completo, asi como los bloques de declaracin de
variables y macros.
Etapa de potencia
La interfaz entre las seales generadas por el PIC 2 y los motores es una, etapa de
potencia; que como su nombre lo indica esta conformada de un circuito capaz de polarizar
cada bobina de los motores un circuito por bobina- para el correcto funcionamiento de
estos. Como ya mencionamos los motores con los que se trabajaran son de tipo bipolar de
2.5V a 2.1A.
Al usar una polarizacin de doble torque polarizacin de dos bobinas en cada paso-
, el consumo de los motores ser de 4A aproximadamente por motor; 8A en total -al ser 2
motores-, y es por ende que deber alimentarse con una fuente capaz de soporta dicha
demanda de corriente; y que mejor opcion que las que encontramos en los modelos viejos
de las computadoras, que son capaces de soportar hasta 20A.
Con un flujo tal de corriente debemos de separarla, de forma tal que solo fluya en el
sentido de los motores y que no regrese hacia nuestra etapa logica, es decir el PIC 2; Por
que de no ser as daaramos al integrado.
Y la forma de solucionar este problema es a travs de un opto acoplador; que es un
circuito conformado por un fotoemisor (foto diodo) y de un fotorreceptor (fototransisitor),
el transistor que es excitado mediante luz emitida por el fotodiodo al ser aplicada una seal
en el nodo; y su objetivo principal es aislar sus etapas, es decir que separa fsicamente el
flujo de corriente provocando que no exista un flujo hacia la entrada. El optoacoplador que
utilizamos fue el 4N27.
48
FIGURA 11: Esquema elctrico del AN27.
Una vez aislada la etapa de potencia, proseguimos a describir esta. Para alimentar
las bobinas de los motores es necesario un circuito que nos eleve la corriente de las seales
enviadas por el PIC 2; y para solucionarlo que mejor eleccin que utilizar un cto. Darligton
de potencia, capaz de levantar esta corriente.
La amplificacin de corriente se deber a un Darligton capaz de soportar una
corriente mayor a 4A en su base que es donde tendr la bobina como carga.
El voltaje colector-emisor del Darlington es alrededor de 2.5V en modo de
saturacin; entonces agregando el voltaje que el motor necesita. Es necesario saber la beta
del transistor, porque de sta depende el valor de la resistencia, cuando el optoacoplador se
encuentre en corte, prcticamente toda la corriente que pasa por la resistencia va hacia la
base del Darlington. Sabiendo la corriente necesaria para el motor y la beta, la corriente de
base es obtenida. Por otro lado, por una ecuacin sencilla de malla obtenemos la corriente
de base que depende de la resistencia; recordando que el voltaje base-colector de un
Darlington es alrededor de 1.4V.
49
El Darligton que utilizamos es el de matrcula 2N6039, que soporta hasta 4A de corriente
de colector. Realizando las operaciones respectivas encontramos que la resistencia debe
tener un valor de 6.8KO y el diodo es un 1N4001, que sirven tambin de proteccin para el
flujo de corriente.
RESULTADOS DE LABORATORIO
La decisin de obtener los datos generados por el joystick, por medio del modulo de
conversin Analgica-Digital del PIC16F874 fue por razones de tener una mayor precisin
en la obtencin de palabras asociadas con el valor de la resistencia.
Al utilizar una fase de disminucin de ruido incorporada por operacionales se busco
que esta fuera de forma lineal y estos fueron los mejores resultados obtenidos:
Puede observarse en la anterior grfica que el mximo valor donde la curva puede
considerarse lineal es 55k.
Tomando en cuenta la linealidad de los primeros valores, la pendiente obtenida para
ese segmento es de 5/2, as que aproximadamente el valor de cada palabra aumentaba
respecto a la anterior en 3, por cada 1k incrementado. La utilidad de este experimento
radica en asumir una relacin lineal entre el joystick y la palabra asociada, adems de
corroborar que no haba dificultades con los valores que salan al puerto. Es importante
recalcar que estos valores no muestran la relacin entre el ngulo del joystick y el ngulo de
Palabra vs. Resistencia
0,00
0,50
1,00
1,50
2,00
2,50
3,00
0,00 20,00 40,00 60,00 80,00
Resistencia (kOhms)
P
a
l
a
b
r
a

d
e
c
i
m
a
l

(
/
1
0
0
)
50
los motores. Sin embargo por este medio es fcil hallar lo anterior realizando una tabla de
medicin ngulo del joystick vs resistencia del joystick.
La grfica siguiente muestra un ejemplo de los problemas obtenidos a la salida del puerto
debido a la mala lectura de un bit.
An con el error puede observarse la tendencia lineal de la relacin. La tarea
siguiente fue una rutina para mover un motor hasta un determinado ngulo; con palabras
fijas programadas en el PIC, con el propsito de observar tanto la velocidad mxima del
motor y el control de la posicin. Pudimos observar que el reloj deba estar preescalado
mnimo a 1:16 para que el motor respondiera de forma adecuada, adems agregamos unos
retardos por cada cambio de posicin del motor.
Tomando como premisa que al poder controlar un motor podamos controlar dos,
duplicamos lo hecho para un motor, con la diferencia que la salida para el otro motor sera
en otro puerto. Sin embargo un problema que surgi (y que no pudimos resolver) fue que
en un intervalo pequeo, al mover uno de los potencimetros influa en la palabra
controlada por el otro. En las simulaciones observamos que, cuando una palabra de la
posicin actual haba alcanzado ya su correspondiente deseada, mientras que la del otro
motor an no. Un problema anterior a ste fue el hecho de no percatarnos que cuando un
registro lo rotamos, el valor de la bandera de acarreo es aadida a tal registro, y para tal
situacin optamos por limpiar la bandera de acarreo antes de rotar cualquier registro.
Palabra vs. Resistencia
0,00
0,50
1,00
1,50
2,00
2,50
0,00 20,00 40,00 60,00 80,00 100,00
Resistencia (kOhms)
P
a
l
a
b
r
a

e
n

d
e
c
i
m
a
l

(
/
1
0
0
)
51
La mayor dificultad que tuvimos fue lo concerniente a la transmisin y recepcin
serial. La primera prueba fue mover un motor mandando por va serial a otro PIC la palabra
del ngulo deseado, y en ste caso no hubo mayor problema; pero al mandar ms de dos
palabras, se generaba una confusin en los ejes. Por ejemplo, al mover el potencimetro
que controlaba el motor vertical se mova el horizontal y viceversa, pero no siempre.
Entonces intentamos aadir en la trama de las palabras transmitidas, un header, el cual si
no era el adecuado, desechaba el byte y lea el otro, as hasta hallar el header. ste es un
proceso tardado tomando en cuenta que la transmisin serial es mucho ms lenta que el
ciclo de lectura. Previamente hicimos variantes agregando un noveno bit; obteniendo el
mismo resultado.
Fue entonces cuando, para sincronizar los PICs optamos por generar en el segundo
PIC una seal de request, mandada va serial al primero. Significaba que el segundo PIC
estaba listo para recibir la trama y se iba a quedar esperando en un loop hasta que la
interrupcin por recepcin se activara. Este procedimiento dio resultado satisfactorio.
52
CONCLUSIONES
Al tener conocimiento de la versatilidad que los PICs proporcionan, es inevitable
compararlos con otros microcontroladores. Nos lleva a apreciar y concluir que disponemos
de una herramienta verdaderamente accesible; tanto en manejabilidad como en recursos
econmicos se refiere.
En el transcurso del proyecto nos dimos cuenta que no hubiese sido posible realizar
el proyecto de esta forma, relativamente fcil con otro microcontrolador, sino que
hubisemos estado limitados en memoria y registros de propsito general, como es
acostumbrado en los controladores habituales. Adems, el modo en que son habilitados los
mdulos y las interrupciones en los PICs son realmente fciles, tomando en cuenta que,
por ejemplo en los microcontroladores Intel, este proceso resulta verdaderamente
engorroso.
Controlar una cmara de video por telemetra mediante un joystick no es nuevo.
Comnmente hemos podido observar varias aplicaciones; principalmente en vehculos de
rastreo y mdulos de vigilancia.
Aunque la etapa de telemetra no es implementada en este proyecto, todos los dems
elementos necesarios son incluidos; facilitando la adaptacin de mdems entre las
conexiones de transmisin y recepcin de los PICs, porque sin esta etapa, el proyecto
prcticamente no tiene sentido. En caso contrario se hubiera optado por utilizar un solo
microcontrolador.
Una etapa esencial que, sin embargo no es a menudo mencionada, es la de potencia.
No hubiera sido posible mover los motores con la potencia proporcionada por los puertos, y
con ayuda de los optoacopladores, los diodos y los transistores Darligton; se evita que los
PICs sean arruinados por la corriente de retorno. La etapa de potencia debe ser exacta.
Adems de mantener la diferencia de tensin adecuada para no daar los motores, no se
permite un exceso o falta de corriente porque esto alterara el movimiento del dispositivo.
Cuando se habla de un proyecto de este tipo, inmediatamente se asocia a una o
varias aplicaciones, tales como cmaras espas, de vigilancia o de caza. De hecho, el
proyecto en cuestin pretende ser montado a un vehculo de reconocimiento y as poder
53
observar todo lo acontecido a su alrededor obviamente de forma remota. En general, el
proyecto es un modelo inicial de las posibilidades de control inalmbrica por telemetra, y
aunque el proyecto fue terminado con algunos errores, que asociamos a la falta de un
anlisis de fuerza inercial ya que en un sentido fue ventajoso usar motores grandes por el
hecho de que no solo se podra mover una cmara sino que alguna otra aplicacin donde se
tuviera que mover algn objeto de mayor peso, por ejemplo un Telescopio; pero la
desventaja fue la fuerza inercial que se genera por el peso de motor de eje Y; que nos
provocaba movimientos indeseados, despus de haber movido la cmara por un lapso
significante es decir por un numero considerable de pasos-.
Desgraciadamente el tiempo fue nuestro enemigo en el desarrollo del proyecto y no
alcanzamos a eliminar por completo este error, que bien si se disminuyo bastante a los
primeros resultados obtenidos.
Es por ello que de tener algn inters en este proyecto; recomendamos hacer un
buen anlisis del sistema Motor-Carga, para modelarlo de forma adecuada y asi poder
elminar los problemas de inercia.
Y por ultimo para concluir y dar un resultado a uno de los objetivos sobre costo del
proyecto podemos decir que un costo aproximado del sistema es de: entre $1000 y $1500
pesos; que se podra considerar un precio bastante accesible y razonable a comparacin de
los sistemas vistos en la seccion del estado del arte.
54
REFERENCIAS BIBLIOGRFICAS
Motores de pasos, tema de la revista ElectroElectrnica de la Pontificia Universidad
Catlica del Per. 2do. semestre 1998, N 10
Jones on Stepper Motors
http://www.cs.uiowa.edu/~jones/step/circuits.html
Stepper Motors, by Ian Harris
http://www.doc.ic.ac.uk/~ih/doc/stepper/control2/connect.html
http://www.doc.ic.ac.uk/~ih/doc/stepper/control2/sequence.html
PIC16F62X Data Sheet
http://www.microchip.com
PIC16F87X Data Sheet
http://www.microchip.com
Todo sobre PICs, Ing. Horacio Daniel Vallejo
Stepping Motors, Douglas W. Jones, Departamento de ciencias de la computacin
de la Universidad de Iowa.
http://www.uiowa.edu
http://www.cenece.com/faq.htm
55
APENDICE
Comunicacin Serial (modulo USART)
Los PIC16F62X y PIC16F87X (que son los modelos con los que trabajaremos),
disponen de un mdulo USART capaz de soportar la comunicacin serie sncrona y
asncrona; de los dos modos de funcionamiento del USART, la comunicacin serie
asncrona es la ms utilizada.
El USART, llamado SCI (Serial Comunications Interface), puede funcionar como
un sistema de comunicacin full duplex o bidireccional asncrono, adaptndose a multitud
de perifricos y dispositivos que transfieren informacin de esta forma. Tambin puede
trabajar en modo sncrono unidireccional o half duplex para soportar perifricos como
memorias, conversores, etc. Es decir el USART puede trabajar de tres maneras:
Asncrona (Full duplex, bidireccional).
Sincrona-maestro (Half duplex, unidireccional).
Sincrona-Esclavo (Half duplex, unidireccional).
La transferencia de informaciones se realiza sobre dos lneas TX (transmisin) y RX
(recepcin), saliendo y entrando los bits por dichas lneas al ritmo de una frecuencia
controlada internamente por el USART.
En la forma de comunicacin serie es comn usar la norma RS-232-C, donde cada
palabra de informacin o dato, se enva independientemente de los dems. Suele constar de
8 o 9 bits y van precedidos por un bit de START (bit de inicio) y detrs de ellos se coloca
un bit de STOP (bit de paro), de acuerdo con las normas del formato estndar NRZ
(NonReturn-to-Zero). Los bits se transfieren a una frecuencia fija y normalizada.
Los cuatro mdulos que configuran la arquitectura USART, modo asncrono, son:
Circuito de muestreo.
Generador de Baudios.
Transmisor Asncrono.
Receptor Asncrono.
56
Protocolo estndar
En el protocolo estndar se transfieren 10 bits, un bit de inicio, 8 bits de datos y un
bit de paro, formando una palabra de 10 bits.
Para saber si hubo errores en la transmisin puede utilizarse un bit de paridad el cual
indica el error. Por ejemplo: en el byte 00111100 se tienen 4 unos por lo que al bit de
paridad se le asigna un 0 y se dice que tiene paridad par y en el byte 10111100 se tienen 5
unos por lo que al bit de paridad se le asigna un 1 y se dice que tiene paridad impar.
Registro de configuracin del hardware
TXSTA. Registro de configuracin de la transmisin serial.
RCSTA. Registro de configuracin de la recepcin serial.
SPBRG. Contador programable digitalmente que configura la velocidad de
transmisin.
Generador de baudios
En el protocolo asncrono RS-232-C, la frecuencia en baudios (bits por segundo) a
la que se realiza la transferencia se debe efectuar a un valor normalizado: 330, 600, 1200,
2400, 4800, 9600, 19200, 38400, etc. Para generar esta frecuencia, el USART dispone de
un Generador de Frecuencia en Baudios, BRG, cuyo valor es controlado por el contenido
grabado en el registro SPBRG.
Adems del valor X cargado en el registro SPBRG, la frecuencia en baudios del
generador depende del bit BRGH del registro TXSTA<2>. En el caso de que BRGH = 0 se
trabaje en baja velocidad y si BRGH = 1 se trabaja en alta velocidad. Segn este bit se
obtendr el valor de una constante K necesaria en la determinacin de la frecuencia de
funcionamiento.
Frecuencia en Baudios = FOSC / ( K * (X + 1) ).
X es el valor cargado en el registro SPBRG (valor expresado en decimal y que debe
ser un nmero entero entre 0 y 255).
Si BRGH = 0, baja velocidad y K = 64.
Si BRGH = 1, baja velocidad y K = 16.
57
Transmisor asncrono
El dato que se debe transmitir por el USART transmisor se deposita en el registro
TXREG y a continuacin se traspasa al registro de desplazamiento TSR, que va sacando los
bits secuencialmente y a la frecuencia establecida. Adems, antes de los bits del dato de
informacin incluye un bit de inicio y despus de sacar todos los bits aade un bit de
parada. El USART receptor recibe, uno a uno, los bits, elimina los dos de control y los de
informacin una vez que han llenado el registro de desplazamiento RSR los traslada
automticamente al registro RCREG, donde quedan disponibles para su posterior
procesamiento.
Receptor asncrono
Los datos se reciben en serie, bit a bit, por la patita RX y se van introduciendo
secuencialmente en el registro desplazamiento RSR, que funciona 16 veces ms rpida que
la de trabajo.
Cuando un procesador maestro intenta enviar informacin a uno de los esclavos,
primero enva un byte de direccin que identifica al destinatario. El byte de direccin se
identifica porque el bit RX9D que llega vale 1. Si el bit ADDEN = 1 en el esclavo se ignora
todos los bytes de datos. Pero si el noveno bit que recibe vale 1, quiere decir que se trata de
una direccin y el esclavo provocar una interrupcin, y se transferir el contenido del
registro RSR al buffer de recepcin. Tras la interrupcin, el esclavo deber examinar la
direccin y si coincide con la suya poner ADDEN = 0 para poder recibir datos del maestro.
Si ADDEN = 1 como los datos son ignorados, el bit de parada no se carga en RSR,
por lo que este hecho no produce interrupcin.
58
Modulo de Conversin Analgico/Digital
Los PIC16F87X tienen entre sus cualidades un modulo de Conversin
Analgico/Digital de 10 bits de resolucin; que puede ser utilizado por 8 canales
multiplexados, El encargado de las entradas analgicas es un capacitor de retencin y
muestro; la salida de este capacitor de retencin y muetreo es la entrada a nuestro
convertidor. El convertidor genera entonces un resultado digital de los niveles analgicos
va aproximaciones sucesivas. La conversin A/D de la seal analgica de entrada da
como resultado una palabra digital de 10 bits. El Modulo de conversin A/D tiene una serie
de voltajes de referencia selecionables por programacin, de una combinacin de VDD,
VSS, RA2 o RA3 (Bits 2 y 3 del puerto A del PIC).
El Modulo de Conversin A/D utiliza 4 registros, estos registros son:
Registro Alto del resultado del A/D (ADRESH)
Registro Bajo del resultado del A/D (ADRESL)
Registro 0 de control del A/D (ADCON0)
Registro 1 de control del A/D (ADCON1)
El registro de control ADCON0, controla el modo de operacin del modulo de
conversin A/D. El Registro ADCON1 configura los pines de los puertos. Los pines
de los puertos pueden ser configurados como entradas analgicas (RA3 del
PIC16F87X- tambin puede ser utilizado como voltaje de referencia), como puerto de
entrada-salida.
REGISTRO ADCON0 (DIRECCION 1Fh)
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W -0
ADCS1 ADCS0 CHS2 CHS1 CHS0
GO/ DONE
____________
______ ADON
Bit 7 Bit 0
bit 7-6 ADCS1:ADCS0: Bits de Seleccion de Reloj de conversion A/D
00 = FOSC/2
01 = FOSC/8
10 = FOSC/32
59
11 = FRC (Reloj derivado del oscilador interno del modulo A/D)
bit 5-3 CHS2:CHS0: Bits de seleccin del canal analgico
000 = canal 0, (RA0/AN0)
001 = canal 1, (RA1/AN1)
010 = canal 2, (RA2/AN2)
011 = canal 3, (RA3/AN3)
100 = canal 4, (RA5/AN4)
101 = canal 5, (RE0/AN5)
(1)
110 = canal 6, (RE1/AN6)
(1)
111 = canal 7, (RE2/AN7)
(1)
bit 2 GO/DONE: Bit del estado de la conversin A/D
Si ADON = 1:
1 = Conversin A/D en progreso (Habilitando estos bits la conversin A/D comienza)
0 = Conversin A/D detenida (Estos bits son limpiados por hardware cuando la conversin
esta completa).
bit 1 Sin Implementar: se lee como 0
bit 0 ADON: Bit de encendido del A/D
1 = El modulo de conversin A/D esta operando
0 = El modulo de conversin A/D esta apagado
Nota 1: Estos canales no son disponibles en los PIC16F873/876
Significados:
R = Bit legible W = Bit escribible U = Bit sin implementar se lee como 0
- n = Valores en un Reset POR 1= Bit habilitado 0 = Bit limpio x = Valor desconocido
REGISTRO ADCON1 (DIRECCION 9Fh)
U-0 U-0 R/W-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0
ADFM ______ ______ ______ PCFG3 PCFG2 PCFG1 PCFG0
Bit 7 bit 0
bit 7 ADFM: bit de seleccin de formato de resultados de la conversin A/D
1 = Justificacion Derecha. Los 6 bits mas significativos de ADRESH se leen como 0.
0 = Justificacin Izquierda. Los bits menos significativos de ADRESL se leen como 0
bit 6-4 Sin implementar se leen como 0.
bit 3-0 PCFG3:PCFG0: Bits de Control para la configuracin de los puertos del A/D:
60
PCFG3:
PCFG0
AN7
(1)
RE2
AN6
(1)
RE1
AN5
(1)
RE0
AN4
RA5
AN3
RA3
AN2
RA2
AN1
RA1
AN0
RA0
V
REF+
V
REF-
C
HAN
/
Refs
(2)
0000 A A A A A A A A V
DD
V
SS
8/0
0001 A A A A V
REF+
A A A RA3 V
SS
7/1
0010 D D D A A A A A V
DD
V
SS
5/0
0011 D D D A V
REF+
A A A RA3 V
SS
4/1
0100 D D D D A D A A V
DD
V
SS
3/0
0101 D D D D V
REF+
D A A RA3 V
SS
2/1
011x D D D D D D D D V
DD
V
SS
0/0
1000 A A A A V
REF+
V
REF-
A A RA3 RA2 6/2
1001 D D A A A A A A V
DD
V
SS
6/0
1010 D D A A V
REF+
A A A RA3 V
SS
5/1
1011 D D A A V
REF+
V
REF-
A A RA3 RA2 4/2
1100 D D D A V
REF+
V
REF-
A A RA3 RA2 3/2
1101 D D D D V
REF+
V
REF-
A A RA3 RA2 2/2
1110 D D D D D D D A V
DD
V
SS
1/0
1111 D D D D V
REF+
V
REF-
D A RA3 RA2
A = Entrada Analgica D = Digital de entrada-salida
Notas 1: Estos canales no estn disponibles en los PIC16F873/876
2: Esta Columna indica el nmero de canales disponibles como entradas para el A/D y el numero de
canales analgicos usados como entradas de voltaje de referencia.
Los registros ADRESH:ADRESL contienen los 10 bits que resultan de la
conversin A/D. Cuando la conversin esta completa. Los resultados son cargados en este
par de registros, el bit GO/DONE (ADCON0<2>) es limpiado y el bit bandera de
interrupcin ADIF es habilitado El diagrama a bloques del modulo de conversin A/D es
mostrado en la figura 1. Despus de haber sido configurado el modulo A/D como deseado,
la seleccin de canales debe ser indicada antes de que la conversin sea iniciada. Las
entradas analgicas deben de tener su correspondiente registro TRIS (registros de control
de puertos) seleccionado como entradas. Despus se debe determinar el tiempo de muestreo
(como a continuacin explicaremos), ya determinado el tiempo de muestreo la conversin
A/D puede comenzar.
61
Los siguientes pasos se deben de seguir para realizar una conversin A/D:
1. Configurar el modulo de conversin A/D:
Configurar los pins analgicos/voltaje de referencia y las entradas-salidas digitales
(ADCON1)
Seleccionar los canales de entrada A/D (ADCON0)
2. Configurar las interrupciones del A/D (si as se desea):
Poner en 0 el bit ADIF
Poner en 1 el bit ADIE
Poner en 1 el bit PEIE
Poner en 1 el bit GIE
3. Esperar el tiempo de adquisicin requerido.
4. Comenzar conversin:
Poner en 1 el bit GO/DONE (ADCON0)
5. Esperar a que la conversin este completa, para despus:
Verificar si el bit GO/DONE se ha puesto en 0 (con las interrupciones habilitadas)
Esperar la interrupcin A/D
6. Leer los registros de resultado del modulo A/D (ADRESH:ADRESL), poner en 0 el
bit ADIF si se requiere.
7. Para la prxima conversin, ir al paso 1 o 2 si se requiere. El tiempo de conversin
A/D por bit esta definido por T
AD.
Una mnima espera de 2 T
AD
es requerida antes
de la siguiente adquisicin.
62
FIGURA 12: DIAGRAMAS A BLOQUES DEL A/D
Seleccionando el Reloj del modulo de conversin A/D
El tiempo de conversin A/D por bit esta definido como T
AD
. La conversin A/D
requiere de un mnimo de 12 T
AD
por cada 10 bits de conversin. El reloj del modulo de
conversin A/D es seleccionado por software. Las cuatros posibles opciones para T
AD
son:
2T
osc
8 T
osc
32T
osc
Oscilador interno RC del modulo de conversin A/D(2-6 s)
Para una conversin optima, el reloj de conversin (T
AD
) debe ser seleccionado
garantizando un tiempo T
AD
mnimo de 1.6s.
63
La tabla 1 muestra el T
AD
resultante derivado de la operacin de frecuencias y del reloj del
A/D seleccionado.
TABLA 1: T
AD
vs. MAXIMA FRECUENCIA DE OPERACIN DEL PIC
Reloj seleccionado en el AD (T
AD
) MAXIMA FRECUENCIA DEL PIC
Operacin ADCS1:ADCS0 Max.
2T
osc
00 1.25 MHz
8T
osc
01 5 MHz
32T
osc
10 20 MHz
RC
(1,2,3)
11 (Nota 1)
Nota 1: El oscilador RC tiene un tiempo T
AD
tpico de 4s, y puede variar 2-6s
2: Cuando la frecuencia del dispositivo es mas grande que 1 MHz, el oscilador interno RC del A/D solo
recomendado en modo SLEEP.
3: Para PICs de voltaje extendido (LC), Favor de observar la referencia de caractersticas elctricas (Secciones
15.1 y 15.2 del manual de uso).
Configurando los Pins del puerto analgico
Los registros ADCON0 y TRIS control el modo de operacin de los pins del A/D.
Los pins que se deseen como entradas analgicas deben de tener su correspondiente
registro TRIS habilitndolas como tal. Si el TRIS es puesto en 0 (seleccionndolas como
salidas). El nivel digital de salida (VOH o VOL) ser convertido. La operacin del A/D es
independiente del estado de los bits CHS2:CHS0 del TRIS.
Los registros de resultado del A/D
Los registros ADRESH:ADRESL son el lugar donde son cargados los 10 bits de resultado
de la conversin. Juntos forman una palabra de 16 bits. El modulo de conversin A/D tiene
la flexibilidad de justificar a la derecha o a la izquierda los 10 bits de resultado de la
conversin. El bit de seleccin de formato A/D (ADFM) controla dicha justificacin. La
figura 3 muestra el modo de operacin de la justificacin del resultado de A/D. Los bits
extras son puestos en 0. Cuando un resultado del A/D no puede ser sobrescrito estas
locaciones (A/D no disponible). Estos registros pueden ser usados como registros de 8 bits
de propsito general.
64
FIGURA 13: JUSTIFICACIN DE LOS RESULTADOS DEL A/D
ADFM=1 ADFM=0
7 2 1 0 7 0 7 0 7 6 5 0
0000 00
ADREH ADRESL ADREH ADRESL
10 bits de resultado 10 bits de resultado
Justificacin Derecha Justificacin Izquierda
Resultado de 10 bits
0000 00
65
SET DE INSTRUCCIONES
Para este ejemplo hablaremos del set de instrucciones de PIC16F87X. Cada
instruccin de PIC16F87X es una palabra del 14-bits, dividida, en un OPCODE (conjunto
de bits que el PIC reconoce como una instruccin cdigo de operacin-) que especifica el
tipo de la instruccin y uno o ms operandos que ms all especifican el funcionamiento de
la instruccin. El set de instrucciones del PIC16F87X se resume en la tabla 3; ah se
enlistan las instrucciones por orientacin a registros, orientacin a bit y instrucciones
con literales y de control. La tabla 2 muestra las descripciones de los opcodes.
Para instrucciones orientacin a registros, f un designador para el registro
operando y d representa un designador de destino de la operacin. El designador de
registro especifica que registro va a ser utilizado por la instruccin. El designador de
destino, especfica donde ser guardado el resultado de la operacin. Si d es cero, el
resultado es guardado en el registro W. Si d es uno, el resultado es guardado en el registro
especificado en la instruccin.
Para instrucciones orientadas a bit, b representa el designador para el bit
operando, el cual ser modificado por la operacin, Mientras que f representa la direccin
del registro en el cual se encuentra el bit a modificar.
Para instrucciones con literales y de control, k representa un valor constante o
literal de 8 o 11 bits. Todas las instrucciones son ejecutadas dentro de un solo ciclo de
instruccin. A menos que un test condicional sea verdadero o el contador de programa sea
modificado como resultado de una instruccin. En este caso, la ejecucin toma 2 ciclos de
instruccin con una operacin NOP (no hacer nada) en el segundo ciclo. Un ciclo de
instrucciones consiste de 4 periodos del oscilador. As, para una frecuencia de oscilador de
4Mhz, el tiempo normal de ejecucin de una instruccin es 1s. Si un test condicional es
verdadero, o el contador de programa es modificado como resultado de una instruccin, el
tiempo de ejecucin de la instruccin es de 2s.
La tabla 3 enlista las instrucciones reconocidas por el ensamblador MPASM
La figura 4 muestra el formato general que las instrucciones deben de tener.
NOTA: Para mantener la compatibilidad actualizada con futuros productos del
PIC16F87X, no usar las instrucciones OPTION y TRIS.
66
Todos los ejemplos usan el siguiente formato para representar nmeros hexadecimales:
0xhh, donde h significa un digito en hexadecimal.
TABLA 2: DESCRIPCION DEL OPCODE (Cdigo de Operacin )
Campo Descripcin
f Direccin del registro (0x00 a 0x7F )
w Registro de trabajo (acumulador)
b Direccin de bit dentro de un registro de 8 bits
k Literal, constante o etiqueta
x
No importa la situacin (=0 o 1).
El ensamblador va a generar cdigo con x=0.
Esta forma es recomendada usar para la compatibilidad con todas las
herramientas de software de Microchip.
d
Selecciona el destino del resultado, d = 0 :el resultado es guardado en W,
d = 1 : el resultado es guardado en el registro f.
Por default d = 0.
PC Contador de Programa
TO Bit de tiempo terminado
PD Bit de apagado
El set de instrucciones es altamente ortogonal y es agrupado en 3 categoras bsicas:
Instrucciones orientadas a registros.
Instrucciones orientadas a bit.
Instrucciones literales y de control.
67
TABLA 3: SET DE INSTRUCCIONES DEL PIC 16F87X
CODIGO DE OPERACION Mnemonico,
operandos
DESCRIPCION ciclo
s
MSB LSB
STATUS
afectado
Notas
INSTRUCCIONES ORIENTADA A REGISTROS
ADDWF
ANDWF
CLRF
CLRW
COMF
DECF
DECFSZ
INCF
INCFSZ
IORWF
MOVF
MOVWF
NOP
RLF
RRF
SUBWF
SWAPF
XORWF
f, d
f, d
f
-
f, d
f, d
f, d
f, d
f, d
f, d
f, d
f
-
f, d
f, d
f, d
f, d
f, d
(W) + ( f ) (destino)
(W) AND ( f ) (destino)
00 ( f )
00 ( W )
complemento de f (#f) (destino )
(f)-1 destino
(f)-1 destino y si resultado es 0 salta
(f)+1 destino
(f)+1 destino y si resultado es 0 salta
(W) OR (f) destino
mueve f destino
(W) (f)
No operacin
Rota f a la izquierda a travs del carry destino
Rota f a la derecha a travs del carry destino
(f) (W) (destino)
Intercambia los niveles de f destino
( W ) XOR ( f ) (destino)
1
1
1
1
1
1
1(2)
1
1(2)
1
1
1
1
1
1
1
1
1
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
0111
0101
0001
0001
1001
0011
1011
1010
1111
0100
1000
0000
0000
1101
1100
0010
1110
0110
dfff
dfff
lfff
0xxx
dfff
dfff
dfff
dfff
dfff
dfff
dfff
lfff
0xx0
dfff
dfff
dfff
dfff
dfff
ffff
ffff
ffff
xxxx
ffff
ffff
ffff
ffff
ffff
ffff
ffff
ffff
0000
ffff
ffff
ffff
ffff
ffff
C,DC,Z
Z
Z
Z
Z
Z
Z
Z
Z
C
C
C,DC,Z
Z
1,2
1,2
2
1,2
1,2
1,2,3
1,2
1,2,3
1,2
1,2
1,2
1,2
1,2
1,2
1,2
INSTRUCCIONES ORIENTADAS A BIT
BCF
BSF
BTFSC
BTFSS
f, b
f, b
f, b
f, b
Pone a 0 el bit b del registro f
Pone a 1 el bit b del registro f
Salta si el bit b del registro f es 0
Salta si el bit b del registro f es 1
1
1
1 (2)
1 (2)
01
01
01
01
00bb
01bb
10bb
11bb
bfff
bfff
bfff
bfff
ffff
ffff
ffff
ffff
1,2
1,2
3
3
INSTRUCCIONES CON LITERALES Y DE CONTROL
ADDLW
ANDLW
CALL
CLRWDT
GOTO
IORLW
MOVLW
RETFIE
RETLW
RETURN
SLEEP
SUBLW
XORLW
k
k
k
-
k
k
k
-
k
-
-
k
k
(W) + ( K ) ( W )
(W) AND ( K ) ( W )
Llamada a subrutina
Clear del temporizador del WD
Go To direccin
(W) OR K ( W )
K ( W )
Retorno de una interrupcin
Retorno con una literal en W
Retorno de una subrutina
Modo Standby
K ( W ) W
( w ) XOR K ( W )
1
1
2
1
2
1
1
2
2
2
1
1
1
11
11
10
00
10
11
11
00
11
00
00
11
11
111x
1001
0kkk
0000
1kkk
1000
00xx
0000
01xx
0000
0000
110x
1010
kkkk
kkkk
kkkk
0110
kkkk
kkkk
kkkk
0000
kkkk
0000
0110
kkkk
kkkk
kkkk
kkkk
kkkk
0100
kkkk
kkkk
kkkk
1001
kkkk
1000
0011
kkkk
kkkk
C,DC,Z
Z
TO,PD
Z
TO,PD
C,DC,Z
Z
NOTAS:
1: Al modificar un registro de entrada/salida (E/S) con una operacin sobre el mismo (por
68
ejemplo MOV PORTB, 1), el valor utilizado es el que se encuentre presente en las patas del
PORTB. Por ejemplo, si el biestable tiene un 1 para la pata configurada como entrada y se pone a
nivel bajo desde el exterior, el dato se volver a escribir como un 0.
2: Si se ejecuta esta instruccin sobre el TMR0 y d=1, ser borrado el divisor de frecuencia (preescaler),
si esta asignado al TMR0.
3: Si se modifica el Contador de Programa (PC o CP) o es verdadera un test de condicin, la instruccin
requiere dos ciclos de maquina. El segundo ciclo se ejecuta como un NOP.
FIGURA 14: FORMATO GENERAL PARA INSTRUCCIONES
Registro de instrucciones orientadas a registros
13 8 7 6 0
OPCODE d f (FILE #)
d = 0 para W como destino
d = 1 para f como destino
f = direccin de registro de 7 bits
Registro de instrucciones orientadas a bit
13 10 9 7 6 0
OPCODE b (BIT #) f (FILE #)
b = direccin de bit de 3 bits
f = direccin de registro de 7 bits
Instrucciones con literales y de control
General
13 8 7 0
OPCODE k (literal)
k = Valor inmediato de 8 bits
Solo instrucciones CALL y GOTO
13 11 10 0
OPCODE k (literal)
b = Valor inmediato de 11 bits
69
Despliegue del programa para el PIC 1
En esta seccin se despliega el programa de funcionamiento del PIC 1.
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;
; PROYECTO DE INGENIERIA ELECTRONICA
; ENRIQUE GARCIA CARBAJAL y CESAR AUGUSTO RENTERIA ORTEGA
; PROGRAMA PIC 1
;
;-*-*-*-*-*-*-*-*-*-DECLARANDO Y CONFIGURANDO EL MICROCONTROLADOR-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
PROCESSOR 16F877
include <p16f877.inc>
errorlevel -302
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-DECLARANDO VARIABLES*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
#define Inicia_Conv ADCON0,2
dato equ 20h
canal equ 21h
interrupcion equ 22h
contador equ 23h
cuentaX equ 24h
bandera equ 25h
datoRx equ 26h
boton equ 27h
cuentaY equ 28h
datoX equ 29h
datoY equ 2Ah
bufer equ 2Bh
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* INICIO MACROS *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
BANCO_0 macro
bcf STATUS, RP0
bcf STATUS, RP1
Endm
BANCO_1 macro
bsf STATUS, RP0
bcf STATUS, RP1
Endm
INI_TMR0 macro
clrw
movwf TMR0 ; Limpia el TIMER
clrf INTCON
bsf INTCON,PEIE ; Habilita interrupcin por perifericos
bsf INTCON,GIE
bsf STATUS, RP0 ; Banco 1
bcf STATUS, RP1
movlw B'00000110' ; Preescalacion a 1:256
movwf OPTION_REG
bcf STATUS, RP0 ; Banco 0
Endm
70
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-PROGRAMA PRINCIPAL*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
ORG 0X00 ; Vector de reset
goto Main
ORG 0X04 ; Vector de interrupcion
goto intflag
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Main
call Inicializa_Puertos
call Recepcion
INI_TMR0
inicio BANCO_0
clrw
clrf cuentaX ; Limpia la variable cuentaX
clrf cuentaY ; Limpia la variable cuentaY
clrf boton ; Pone en ceros boton
call botonver
Espera_com
clrf ADRESL ; Limpia el registro ADRESL
clrf datoX ; Limpia la variable datox
BANCO_0
movlw 0x41 ; Selecciona el canal 0 para la conversion
movwf canal
call Conversion ; Llama a la rutina de conversion
movf ADRESH,0 ; Guarda el resultado de la conversion en datoX
movwf datoX
bcf STATUS,C
rrf datoX,1 ; Acomoda el valor con una rotacion a la derecha
bcf datoX,0 ; Pone a cero los bits 0,1 y 2 para evitar movimientos
bcf datoX,1 ; indeseados
bcf datoX,2
movf datoX,0
movwf cuentaX ; El valor definitivo es copiado a la variable cuentaX
;-*-*-*-*-*-*-* A CONTINUACION SE HACE LO MISMO PARA EL EJE Y :
BANCO_1
clrf ADRESL
clrf datoY
BANCO_0
movlw 0x49 ; Canal 1
movwf canal
call Conversion
movf ADRESH,0
movwf datoY
bcf STATUS,C
rrf datoY,1
bcf datoY,0
bcf datoY,1
bcf datoY,2
movf datoY,0
movwf cuentaY
71
;-*-*-* EL SIGUIENTE BLOQUE CONSTA DE RETARDOS PARA LA SINCRONIZACION ENTRE PIC'S :
call retardo
bcf INTCON,T0IF
movlw 0x89
movwf TMR0
delay btfss INTCON,T0IF
goto delay
nofull btfss bandera,4 ; Verifica que la interrupcion haya ocurrido
goto nofull ; No? espera a que ocurra
clrf bandera ; Si? Limpia la variable bandera
call retardo ; Hace un retardo
goto inicio ; Regresa a Inicio
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* BLOQUE DE SUBRUTINAS -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
; COMO SU NOMBRE LO DICE ESTA SUBRUTINA ES UN RETARDO:
retardo
BANCO_0
bcf INTCON,T0IF ; Pone en cero la bandera de interupcion por TIMER
clrf TMR0 ; Limpia el registro TIMER
loop btfss INTCON,T0IF ; Ha ocurrido un desborde del TIMER?
goto loop ; NO? regresa a loop
bcf INTCON,T0IF ; Si? Limpia la bandera de interrupcion por TIMER
return
; ESTA SUBRUTINA TRANSMITE LOS DATOS POR EL PUERTO SERIE:
Transmision
BANCO_0
movf dato,0 ; Copia el valor a transmitir a W Antes de llamar esta
; subrutina el valor a transmitir debe ser guardado en "dato"
movwf TXREG ; Mueve el dato al buffer de transmisin, reg. TXREG
BANCO_1
movlw D'51' ; Selecciona el Baud Rate=4800 bps (Registro SPBRG=51)
movwf SPBRG
bcf TXSTA,SYNC ; Selecciona el modo asincrono para la transmision
bsf TXSTA,BRGH ; Habilita el HIGH BAUD RATE
BANCO_0
bsf RCSTA,SPEN ; Habilita el puerto serie
BANCO_1
bsf TXSTA,TXEN ; Habilita la transmisin
BANCO_0
return
; -*-*-*-*- ESTA SUBRUTINA RECIBE LOS DATOS POR EL PUERTO SERIE :
Recepcion
BANCO_1
movlw D'51' ; Valor del Baud Rate=4800 bps (Registro SPBRG=51)
movwf SPBRG
bcf TXSTA,SYNC ; Selecciona el modo asincrono para la recepcin
bsf TXSTA,BRGH ; Habilita el HIGH BAUD RATE
BANCO_0
bsf RCSTA,SPEN ; Habilita el puerto serie
72
BANCO_1
bsf PIE1,RCIE ; Habilita la interrupcin por recepcin
BANCO_0
bsf RCSTA,CREN ; Habilita la recepcin
bsf INTCON,PEIE ; Habilita interrupcin por perifericos
bsf INTCON,GIE ; Habilitacion global de interrupciones
return
; --*-*-*-*-*- ESTA SUBRUTINA REALIZA LA CONVERSION A / D :
Conversin
BANCO_0
movlw 0x32
movwf contador
BANCO_1
movlw 0x00 ; Palabra de configuracion: justificacion izquierda,
movwf ADCON1 ; 8 canales analogicos con ref. Vdd y Vss
BANCO_0
movf canal,0 ; El canal previamente cargado(antes de llamar a la
; subrutina)
movwf ADCON0 ; es selecionado para la conversion
decfsz contador,f ; Decrementa contador hasta que se acero
goto $-1
bsf Inicia_Conv ; Inicia la conversion
loop2
btfsc Inicia_Conv ; Espera a que finalice la conversion
goto loop2
bcf ADCON0,ADON
return
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- CONFIGURACIN DE PUERTOS -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Inicializa_Puertos
clrf PORTC ; Seales desactivadas en el puerto C
clrf PORTA ; Seales desactivadas en el puerto A
BANCO_1
movlw 0xE0
movwf TRISC ; Configura los bits 7 y 6 del puerto C como entradas
movlw 0xC3
movwf TRISB ; Configura el puerto B como entradas y salidas
movlw 0x3F
movlw TRISA ; Configura el puerto A como canales de entrada
; para el A/D
BANCO_0
return
;*-*-*-*- SUBRUTINA QUE VERIFICA SI SE HA ACTIVADO EL BOTON :
botonver
movf boton,0 ;verifica si ya se ha activado
sublw HFF
btfss STATUS,Z
goto ceros ; NO? Ve a ceros
goto balderas ; SI? Ve a balderas
ceros
btfsc PORTC,5 ; verifica el puerto si esta en
goto balderas ; NO? Ve a balderas
73
comf boton,1 ; SI? Complementa boton
goto acaba
balderas
nop ; no hagas nada
nop ; no hagas nada
nop ; no hagas nada
nop ; no hagas nada
acaba
return
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*--*- RUTINA DE INTERUPCION -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
intflag
BANCO_0
movf RCREG,0 ; Verifica que el valor recibido(RCREG)
movwf datoRx
bcf STATUS,Z ; Sea el requets "5" en decimal
sublw 0x05
btfss STATUS,Z
goto adios ; NO? sal de la rutina
;-*-*-*-*-*-*-*-*-*-*-*-*-*-VOY A MANDAR DATO DE REGISTRO X AL PUERTO SERIAL-*-*-*-*-*-*-*-*-*-
movf cuentaX,0
movwf dato
call Transmision
BANCO_1
toaviano btfss TXSTA,TRMT
goto toaviano
BANCO_0
clrw
clrf dato
;-*-*-*-*-*-*-*-*-*-*-*-*-*-VOY A MANDAR DATO DE REGISTRO Y AL PUERTO SERIAL-*-*-*-*-*-*-*-*-*-
movf cuentaY,0
movwf dato
call Transmision
BANCO_1
toaviano1 btfss TXSTA,TRMT
goto toaviano1
;-*-*-*-*-*-*-*-*-*-*-*-*-*- VOY A MANDAR DATO DE BOTON AL PUERTO SERIAL -*-*-*-*-*-*-*-*-*-*-*-
BANCO_0
movf boton,0
movwf dato
call Transmision
BANCO_1
toaviano2 btfss TXSTA,TRMT
goto toaviano2
BANCO_0
movlw 0xFF ; Pongo el valor FF en bandera que indica que
movwf bandera ; Se han transmitido los datos.
adios
retfie
end
74
Despliegue del programa para el PIC 2
A continuacin presentaremos el despliegue del programa que como podrn
observar solo se trata de la traduccin del diagrama de flujo a ensamblador:
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
; PROYECTO DE INGENIERIA ELECTRONICA
; ENRIQUE GARCIA CARBAJAL y CESAR AUGUSTO RENTERIA ORTEGA
; PROGRAMA PIC 2
;
;-*-*-*-*-*-*-DECLARANDO Y CONFIGURANDO EL MICROCONTROLADOR-*-*-*-*-*-*-*
PROCESSOR 16F627
#INCLUDE <p16f627.inc>
errorlevel -302
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;-*-*--*-*-*-*-*-*-*-*-*-DECLARANDO MACROS-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
BANK0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
BANK1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
BANK2 MACRO
BSF STATUS,RP1
BCF STATUS,RP0
ENDM
BANK3 MACRO
BSF STATUS,RP1
BSF STATUS,RP0
ENDM
;-*-*-*-*-*-*-*-*-*-*-DECLARANDO VARIABLES*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
inicialX equ 20h
inicialY equ 21h
corridoX equ 22h
corridoY equ 23h
cuentaX equ 24h
cuentaY equ 25h
bandera equ 26h
REG equ 27h
datoRx equ 28h
auxiliar equ 29h
dato equ 2Ah
contint equ 2Bh
val equ 2Ch
boton equ 2Dh
timer equ 2Eh
;-*-*-*-*-*-*-*-*-*-*-*-PROGRAMA PRINCIPAL*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
ORG 0X00 ;vector de reset
75
goto Main
ORG 0X04 ;vector de interrupcion
goto intflag
Main
BANK1
movlw B'10010000' ;se carga w para habilitar
movwf TRISA ;salidas en el puerto A
movlw B'00001110' ;se carga w para habilitar
movwf TRISB ;salidas en el puerto B
;bit5=0,bit3=0,bits2-1=0,bit0=1:prescaler rate
movlw B'00000100'
movwf OPTION_REG ;para activar timer 0
;Periodo de 1.024ms
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
inicio
;Este bloque limpia -pone en ceros- las variables a utilizar
BANK0
clrw
clrf bandera
clrf contint
clrf PORTA
clrf PORTB
clrf corridoX
clrf corridoY
clrf val
clrf RCREG
movlw H'06'
movwf corridoX ; Colocamos un 06h 00001100 en la variables
movlw H'60' ;que pondremos como salida hacia los motores
movwf corridoY ; y un 60h para Y 11000000
movlw H'00'
movwf contint
;-*- El siguiente bloque mandara la secuencia de referencia a los motores
;------------------------- Secuencia para X ----------------------------
refX
btfsc PORTA,4 ;Verifica si la referenia de X esta activada
goto regresaX ; Si? ve a regresaX
call Xrewind ; No? ve a Xrewind
bcf INTCON,T0IF ; Retardo con TMR0
clrf TMR0
aqui30 btfss INTCON,T0IF
goto aqui30
bcf INTCON,T0IF ; Retardo con TMR0
clrf TMR0
aqui3a btfss INTCON,T0IF
goto aqui3a
comf corridoX,0 ; Complementa y Manda corridoX al motor de X
movwf PORTA
goto refX ;Regresa para verificar si ya esta activada la
;referencia de x, si no se repite el proceso
76
;-- Este bloque Mueve el motor en el sentido de las manecillas del reloj
;-- Una vez que ya se activo la referencia de X:
regresaX
clrf inicialX
agX
call Xforward ; llama a la subrutina Xfoward
bcf INTCON,T0IF ; Retardo con TMR0
clrf TMR0
aqui3 btfss INTCON,T0IF
goto aqui3
bcf INTCON,T0IF ; Retardo con TMR0
clrf TMR0
aqui3b btfss INTCON,T0IF
goto aqui3b
comf corridoX,0 ; Complmenta y Manda corridoX al motor de X
movwf PORTA
bcf STATUS,Z
movf inicialX,0
sublw D'100'
btfss STATUS,Z ; Verifica si inicialX es 100
goto agX ; No? regresa a agx y se repite el proceso
;------------------------- Secuencia para Y ----------------------------
refY
btfsc PORTA,7 ; Verifica si la referenia de Y esta activada
goto regresaY ; Si? ve a regresaY
call Yrewind ; No? ve a Yrewind
bcf INTCON,T0IF ; Retardo
movlw 0x45
movwf TMR0
aqui31 btfss INTCON,T0IF
goto aqui31
bcf INTCON,T0IF
movlw 0x45 ; Retardo
movwf TMR0
aqui3c btfss INTCON,T0IF
goto aqui3c
comf corridoY,0 ; Complmenta y Manda corridoY al motor de Y
movwf PORTB
goto refY ; Regresa para verificar si ya esta activada
; la referncia de Y, si no se repite el proceso
;------ Este bloque Mueve el motor en el sentido de las manecillas del reloj
;------ una vez que ya se activo la referencia de Y
regresaY
clrf inicialY
agY
call Yforward ; llama a la subrutina Yfoward
bcf INTCON,T0IF ; Retardo
movlw 0x45
77
movwf TMR0
aqui33 btfss INTCON,T0IF
goto aqui33
bcf INTCON,T0IF ; Retardo
movlw 0x45
movwf TMR0
aqui34 btfss INTCON,T0IF
goto aqui34
comf corridoY,0 ; Complmenta y Manda corridoY al motor de Y
movwf PORTB
bcf STATUS,Z
movf inicialY,0
sublw D'100'
btfss STATUS,Z ; Verifica si inicialY es 100
goto agY ; No? regresa a agY y se repite el proceso
;------- Una vez posicionado los motores en la posicion referencia------
; asociamos una palabra a esta posicion:
clrf inicialX ; 63 decimal a inicialX
movlw D'63'
movwf inicialX
clrf inicialY ; 63 decimal a inicialY
movlw D'63'
movwf inicialY
;--- En el siguiente bloque se genera la interrupcion transmitiendo ----
; el request y por consiguiente esperar la respuesta del PIC 1:
otropasoX clrw
bcf STATUS,Z
bcf STATUS,C
bcf INTCON,T0IF
clrf contint ; Limpio contint
movlw H'05'
movwf dato ; Coloca un 05h (request) en dato
call Transmision ; Manda request
call Recepcion ; Llama a la subritina Racepcion
quenoX btfss bandera,4 ;Espera a que se haya generado una recepcion
goto quenoX ; para el valor asociado a X
clrf bandera ; Limpia la bandera de recepcion
call Recepcion ; Llama a la subritina Racepcion
quenoY btfss bandera,4 ;Espera a que se haya generado una recepcion
goto quenoY ; para el valor asociado a Y
clrf bandera ; Limpia la bandera de recepcion
call Recepcion ; Llama a la subritina Racepcion
quenoB btfss bandera,4 ;Espera a que se haya generado una recepcion
goto quenoB ; para el valor asociado a boton
clrf bandera ; Limpia la bandera de recepcion
;---- Se hace la resta del valor guardado en inicialX y el valor recibido
; cuentaX para ver si son: iguales, menor o es mayor:
verX
78
bcf STATUS,Z
movf inicialX,0
subwf cuentaX,0
btfss STATUS,Z ; Verifica si son iguales
goto dirX ; No? ve a dirX
goto verY ; Si? ve a verY
dirX
bcf STATUS,C
movf inicialX,0
subwf cuentaX,0
btfss STATUS,C ; Verifica si cuentaX es mayor
goto patrasX ; No? ve a patrasX
call Xforward ; Si? llama a Xfoward
goto verY
patrasX
call Xrewind ; Es menor. ve a Xrewind
;---- Se hace la resta del valor guardado en inicialY y el valor recibido
; cuentaY para ver si son: iguales, menor o es mayor
verY
bcf STATUS,Z
movf inicialY,0
subwf cuentaY,0
btfss STATUS,Z ; Verifica si son iguales
goto dirY ; No? ve a dirY
goto salida ; Si? ve a salida
dirY
bcf STATUS,C
movf inicialY,0
subwf cuentaY,0
btfss STATUS,C ; Verifica si cuentaY es mayor
goto patrasY ; No? ve a patrasY
call Yforward ; Si? llama a Yfoward
goto salida
patrasY
call Yrewind ; Es menor. ve a Yrewind
;-------- Una vez que se sabe la proxima secuencia de los motores se
; mandan al puerto respectivo:
salida
comf corridoY,0 ; Complementa y Manda la secuencia
movwf PORTB ; del motor Y
comf corridoX,0 ; Complementa y Manda la secuencia
movwf PORTA ; del motor X
bcf INTCON,T0IF ; Creamos un retardo
movlw 0x45
movwf TMR0
aq3 btfss INTCON,T0IF
goto aq3
btfss boton,4 ;verifica si esta habilitada la variable boton
goto bo ;NO? ve a bo
bsf PORTB,0 ;SI? pon un "1" en el bit 0 del puerto B
goto ton
bo
79
bcf PORTB,0 ; pon un "0" en el bit 0 del puerto B
ton
goto otropasoX ; Regresa a otropasoX
;--------- Subrutina que genera la siguiente secuencia del motorX ------
; en caso de que se requiera mover en sentido contrario
; a las manecillas del reloj:
Xrewind
bcf STATUS,Z
movf corridoX,0
sublw H'0C'
btfss STATUS,Z ; CorridoX contiene un 0Ch?
goto resetX1 ; No? ve a resetX1
movlw H'09' ; Si? coloca un 09h
movwf corridoX ; en corridoX
goto yastuvoX1 ; ve a yastuvoX1
resetX1
bcf STATUS,Z
movf corridoX,0
sublw H'09'
btfss STATUS,Z ; CorridoX contiene un 09h?
goto resetX2 ; No? va a resetX2
movlw H'03' ; Si? coloca un 03h
movwf corridoX ; en corridoX
goto yastuvoX1 ; ve a yastuvoX1
resetX2
bcf STATUS,C ; Limpia el bit de acarreo
rlf corridoX,1 ; Rota el valor de corridoX
yastuvoX1
decf inicialX,1 ; Decrementa inicialX
return
;-------- Subrutina que genera la siguiente secuencia del motorY -------
; en caso de que se requiera mover en sentido contrario
; a las manecillas del reloj:
Yrewind
bcf STATUS,Z
movf corridoY,0
sublw H'C0'
btfss STATUS,Z ; CorridoX contiene un C0h?
goto resetY1 ; No? ve a resetY1
movlw H'90' ; Si? coloca un 90h
movwf corridoY ; en corridoY
goto yastuvoY1 ; ve a yastuvoY1
resetY1
bcf STATUS,Z
movf corridoY,0
sublw H'90'
btfss STATUS,Z ; CorridoX contiene un 90h?
goto resetY2 ; No? ve a resetY2
movlw H'30' ; Si? coloca un 30h
movwf corridoY ; en corridoY
goto yastuvoY1 ; ve a yastuvoY1
resetY2
bcf STATUS,C ; Limpia el bit de acarreo
rlf corridoY,1 ; Rota el valor de corridoY
yastuvoY1
80
decf inicialY,1 ; Decrementa inicialY
return
;-------- Subrutina que genera la siguiente secuencia del motorX -------
; en caso de que se requiera mover en el sentido de las
; manecillas del reloj:
Xforward
bcf STATUS,Z
movf corridoX,0
sublw H'03'
btfss STATUS,Z ; CorridoX contiene un 03h?
goto resetX3 ; No? ve a resetX3
movlw H'09' ; Si? coloca un 09h
movwf corridoX ; en corridoX
goto yastuvoX3 ; ve a yastuvoX3
resetX3
bcf STATUS,Z
movf corridoX,0
sublw H'09'
btfss STATUS,Z ; CorridoX contiene un 09h?
goto resetX4 ; No? ve a resetX4
movlw H'0C' ; Si? coloca un 0Ch
movwf corridoX ; en corridoX
goto yastuvoX3 ; ve a yastuvoX3
resetX4
bcf STATUS,C ; Limpia el bit de acarreo
rrf corridoX,1 ; Rota el valor de corridoX
yastuvoX3
incf inicialX,1 ; Incrementa inicialY
return
;--------- Subrutina que genera la siguiente secuencia del motorY ------
; en caso de que se requiera mover en el sentido de las
; manecillas del reloj:
Yforward
bcf STATUS,Z
movf corridoY,0
sublw H'30'
btfss STATUS,Z ; CorridoX contiene un 30h?
goto resetY3 ; No? ve a resetY3
movlw H'90' ; Si? coloca un 90h
movwf corridoY ; en corridoY
goto yastuvoY3 ; ve a yastuvoY3
resetY3
bcf STATUS,Z
movf corridoY,0
sublw H'90'
btfss STATUS,Z ; CorridoY contiene un 90h?
goto resetY4 ; No? ve a resetY4
movlw H'C0' ; Si? coloca un C0h
movwf corridoY ; en corridoY
goto yastuvoY3 ; ve a yastuvoY3
resetY4
bcf STATUS,C ; Limpia el bit de acarreo
rrf corridoY,1 ; Rota el valor de corridoY
yastuvoY3
incf inicialY,1 ; Incrementa inicialY
return
;------ ESTA SUBRUTINA TRANSMITE LOS DATOS POR EL PUERTO SERIE --------
81
Transmision
BANCO_0
; Copia el valor a transmitir a W Antes de llamar esta subrutina
; el valor a transmitir debe ser guardado en "dato":
movf dato,0
; Mueve el dato al buffer de transmision, reg. TXREG:
movwf TXREG
BANCO_1
movlw D'51' ;Selecciona el Baud Rate=4800 bps (Registro SPBRG=51)
movwf SPBRG
bcf TXSTA,SYNC ;Selecciona el modo asincrono para la transmision
bsf TXSTA,BRGH ;Habilita el HIGH BAUD RATE
BANCO_0
bsf RCSTA,SPEN ;Habilita el puerto serie
BANCO_1
bsf TXSTA,TXEN ;Habilita la transmision
BANCO_0
return
;-------- ESTA SUBRUTINA RECIBE DATOS POR EL PUERTO SERIE ------------
Recepcion
BANCO_1
movlw D'51' ;Valor del Baud Rate=4800 bps (Registro SPBRG=51)
movwf SPBRG
bcf TXSTA,SYNC ;Selecciona el modo asincrono para la recepcion
bsf TXSTA,BRGH ;Habilita el HIGH BAUD RATE
BANCO_0
bsf RCSTA,SPEN ;Habilita el puerto serie
BANCO_1
bsf PIE1,RCIE ;Habilita la interrupcin por recepcin
BANCO_0
bsf RCSTA,CREN ;Habilita la recepcin
bsf INTCON,PEIE ;Habilita interrupcin por perifericos
bsf INTCON,GIE ;Habilitacion global de interrupciones
return
;---------------- Rutina de Interrupcion -------------------------------
; - Se ha generado una Recepcion-
intflag
BANK0
bcf STATUS,Z
movf contint,0
sublw H'00'
btfss STATUS,Z ; Verifica si contint es 00h
goto pasalas ; No? ve a pasalas
movf RCREG,0 ; Si? el valor recibido -RCREG-
movwf cuentaX ; guardalo en cuentaX
incf contint,1 ; Incrementa contint
goto fin ; Ve a fin
pasalas
bcf STATUS,Z
movf contint,0
sublw H'01'
btfss STATUS,Z ; Verifica si contint es 01h
goto botones ; No? ve a botones
movf RCREG,0 ; Si? el valor recibido -RCREG-
movwf cuentaY ; guardalo en cuentaY
82
incf contint,1 ; Incrementa contint
goto fin ; Ve a fin
botones
bcf STATUS,Z
movf contint,0
sublw H'02'
btfss STATUS,Z ; Verifica si contint es 02h
goto fin ; No? ve a fin
movf RCREG,0 ; Si? el valor recibido -RCREG-
movwf boton ; guardalo en boton
movlw H'00'
movwf contint ; Coloca un 00h en contint
fin movlw 0xFF
movwf bandera ; Coloca un FFh en bandera
bcf RCSTA,CREN ; Deshabilita la recepcin
retfie
end
83
Bloques de declaracin de Variables y Macros:
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;
; PROYECTO DE INGENIERIA ELECTRONICA
; ENRIQUE GARCIA CARBAJAL y CESAR AUGUSTO RENTERIA ORTEGA
; PROGRAMA PIC 1
;
;-*-*-*-*-*-*-*-*-*-DECLARANDO Y CONFIGURANDO EL MICROCONTROLADOR-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
PROCESSOR 16F877
include <p16f877.inc>
errorlevel -302
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
Las lneas anteriores son en 1 instancia un titulo para el programa y los comandos
siguientes son las lneas de configuracin del PIC, que son proporcionadas al compilador
para saber con que modelo de PIC de va a trabajar, tanto para las libreras como para el
archivo proyecto. La lnea errorlevel 302 evita que al compilar se generen warnings. En
la siguiente lnea se deshabilita el watchdog timer y se aclara la configuracin con oscilador
de cristal.
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-DECLARANDO VARIABLES*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
#define Inicia_Conv ADCON0,2
dato equ 20h
canal equ 21h
interrupcion equ 22h
contador equ 23h
cuentaX equ 24h
bandera equ 25h
datoRx equ 26h
boton equ 27h
cuentaY equ 28h
datoX equ 29h
datoY equ 2Ah
bufer equ 2Bh
Las variables que necesitamos utilizar deben situarse en el bloque de memoria
reservada para registros de propsito general. En ste caso, este bloque comienza en la
direccin 20h.
84
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* INICIO MACROS *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
BANCO_0 macro
bcf STATUS, RP0
bcf STATUS, RP1
Endm
BANCO_1 macro
bsf STATUS, RP0
bcf STATUS, RP1
Endm
INI_TMR0 macro
clrw
movwf TMR0 ; Limpia el TIMER
clrf INTCON
bsf INTCON,PEIE ; Habilita interrupcin por perifericos
bsf INTCON,GIE
bsf STATUS, RP0 ; Banco 1
bcf STATUS, RP1
movlw B'00000110' ; Preescalacion a 1:256
movwf OPTION_REG
bcf STATUS, RP0 ; Banco 0
Endm
Todo macro tiene la misma forma: El nombre en la primera columna; en la segunda la
etiqueta MACRO y al final del macro, la palabra reservada ENDM.
Los bits RP0 y RP1 del registro STATUS son los responsables de seleccionar el
banco, segn el registro que vaya a emplearse; mediante la combinacin de stos.
La palabra reservada BCF pone a 0 un bit de un registro; mientras que BSF lo
pone a 1.
La macro INI_TMRO sirve para inicializar el funcionamiento del TIMER,
habilitando las interrupciones por perifricos, habilitando las interrupciones en general y
seleccionando la preescalacion a la que trabajara el TIMER.
85
HOJAS DE DATOS

También podría gustarte