Académique Documents
Professionnel Documents
Culture Documents
iÍNDICE
1. INTRODUCCIÓN ................................................................................................... 4
1.1. ANTECEDENTES ............................................................................................ 4
1.2. OBJETIVOS ..................................................................................................... 4
1.3. ESPECIFICACIONES ...................................................................................... 5
1.4. HERRAMIENTAS DE DESARROLLO ............................................................. 5
4. CONCLUSIONES ................................................................................................... 39
5. PRESUPUESTO ..................................................................................................... 40
6. BIBLIOGRAFÍA ...................................................................................................... 43
7. ANEXOS ................................................................................................................. 44
7.1. ANEXO 1. COMUNICACIÓN RS-232 .............................................................. 44
7.1.1. FUNCIONAMIENTO DEL INTERFACE RS-232 ....................................... 44
7.1.2. COMUNICACIÓN RS-232 CON VISUAL BASIC ...................................... 47
7.1.3. COMUNICACIÓN RS-232 CON PIC 16F873 ........................................... 47
7.1.4. CONEXIONADO ....................................................................................... 49
-2-
BRAZO DE ROBOT INDICE
-3-
BRAZO DE ROBOT INTRODUCCION
1. Introducción
1.1. Antecedentes
1.2. Objetivos
1.3. Especificaciones
Para desarrollar las diferentes partes que corresponden al brazo robot, se han
utilizado una serie de herramientas de trabajo. El motivo de utilizar estas herramientas
se explica a continuación:
-5-
BRAZO DE ROBOT INTRODUCCION
-6-
BRAZO DE ROBOT INTRODUCCION
-7-
BRAZO DE ROBOT MEMORIA TECNICA
2. Memoria Técnica
-9-
BRAZO DE ROBOT MEMORIA TECNICA
2.2.1. Especificaciones
BRAZO ROBOT
Estructura mecánica: Articulado
Número de ejes: 3
Radio máximo de operación: 160 mm
Mano: 20 mm
Movimiento de los ejes: Rango Velocidad máxima
Eje 1: base: 0º -- 180º 36º/seg.
Eje 2: hombro: 0º -- 180º 36º/seg.
Eje 3: codo: 0º -- 180º 36º/seg.
Referencia (sincronismo): Posición fija en todos los ejes en 0º
Exactitud: +/- 1º
Actuadores: 3 servos controlados con PWM
Consumo máximo: 300 mA
Alimentación: Batería NiMH, 4´8 V y 650 mAh
Capacidad de carga: 75 g. (Carga útil)
Peso: 1 Kg
Rango de temperatura: 0ºC – 85ºC
Tabla 2.2. Características técnicas del brazo robot.
- 10 -
BRAZO DE ROBOT MEMORIA TECNICA
Los motores utilizados en este robot son los que se denominan “servos” y se
explican en detalle en el punto en el punto 2.3.
Dimensiones:
Eje 2
80 80 20
40
40
Eje 3
Eje 1
30 CONTROL
130
- 11 -
BRAZO DE ROBOT MEMORIA TECNICA
Campo de trabajo:
Las funciones del controlador son gestionar que el brazo de robot realice todas las
funciones para las que fue construido, es decir:
1
Memoria de solo lectura programable electricamente.
2
Ver anexo 1.
- 12 -
BRAZO DE ROBOT MEMORIA TECNICA
Para conseguir que el brazo de robot pueda realizar con éxito todas las funciones
para las que la unidad de control se ha implementado, esta dispone de:
2.2.6. Alimentación
- 13 -
BRAZO DE ROBOT MEMORIA TECNICA
La instalación y manejo del robot está sujeta a una serie de normas de seguridad.
Estas normas hacen referencia a peligros de tipo eléctrico, a colisiones del robot con
objetos próximos a él e incluso a la colisión con personas que permanezcan cerca del
campo de acción.
Existen una serie de requisitos previos que afectan al modo en que se va a utilizar
el robot antes de su propia instalación. Estos requisitos tienen que cumplirse en la
medida de lo posible, si se quiere que la utilización del robot sea lo más provechosa y
segura posible. Tales factores hacen referencia al estudio previo de las tareas que se
quiere automatizar.
- 14 -
BRAZO DE ROBOT MEMORIA TECNICA
2.3. Servos
4 cm 4 cm 4 cm 5 cm
- 15 -
BRAZO DE ROBOT MEMORIA TECNICA
4
Par motor base = ( peso × longitud palanca )
1
Si miramos las características del servo cuando está alimentado con la tensión más
baja de funcionamiento, vemos que a 4´8 V puede dar 3´3 Kg*cm.
- 16 -
BRAZO DE ROBOT MEMORIA TECNICA
Características técnicas
Hitec HS-325BB
Tensión de alimentación: 4´8 V – 6 V
Par a 6 V: 3´7 Kg / cm
Par a 4´8 V: 3´3 Kg / cm
Velocidad máxima: 60º /seg
Medidas (longitud x anchura x altura): 41 x 20 x 37 mm
Peso: 44´5 gramos
Tipo de rodamiento: Bolas
Tabla 2.8. Características técnicas del servo utilizado.
♦ Carcasa exterior.
♦ Engranajes reductores.
♦ Motor eléctrico.
♦ Potenciómetro solidario al
eje.
♦ Control electrónico de
control.
Fotografía 2.9. Servo desmontado.
- 17 -
BRAZO DE ROBOT MEMORIA TECNICA
2.3.3. Funcionamiento
1
Pulse Width Modulate. Señal Modulada en Anchura
- 18 -
BRAZO DE ROBOT MEMORIA TECNICA
2.3.4. Conexionado
Todos los servos disponen de tres cables, dos para la alimentación Vcc y Gnd y
otro cable para aplicar el tren de pulsos de
control, con este tren de pulsos se conseguirá
que el circuito interno de control ponga el servo
en la posición indicada por la anchura de pulso.
F
F
i
Figura 2.12. Detalle del conector.
2.4. Cerebro
En este punto se trata en detalle la unidad de control y todas las funciones que
debe realizar:
Es el hardware necesario, para poder tener un control exacto del brazo de robot:
- 19 -
BRAZO DE ROBOT MEMORIA TECNICA
- 20 -
BRAZO DE ROBOT MEMORIA TECNICA
Cada vez existen más productos que incorporan un microcontrolador, por todas las
prestaciones que añaden a un diseño, algunas de estas aplicaciones se muestran en
la tabla siguiente:
Aplicaciones
Consumo Automoción Ofimática Telecomunicac. Industria
Equipo de TV Alarma antirrobo Mouse Teléfono Control de motores
Receptor de radio Detector de radar Teclado Módem Compresor
Reproductor de CD ABS Escáner Termostatos
Control remoto Velocímetro Impresora Robótica
Consola de juegos Climatizador Plóter Lector de tarjetas
Microondas Inyección Fotocopiadora Detector de humo
Lavadora Airbag
Aparatos de cocina
Aspiradora
Tabla 2.14. Tabla de aplicaciones que requieren microcontroladores.
- 21 -
BRAZO DE ROBOT MEMORIA TECNICA
♦ Alternativa 1:
RS 232
PC m icrocontrolador 1
I2C
♦ Alternativa 2:
PC
RS 232
I2C
microcontrolador 1 EEPROM
- 22 -
BRAZO DE ROBOT MEMORIA TECNICA
1
Ver anexo 2.
- 23 -
BRAZO DE ROBOT MEMORIA TECNICA
- 24 -
BRAZO DE ROBOT MEMORIA TECNICA
1
Tiempo de bit = = 1´041667 x 10 − 4 segundos = 104´1667 µS
9600
Se pensó que entre cada escritura del buffer se necesitaría ejecutar 1.500
instrucciones aproximadamente, por lo tanto:
Tiempo disponible
Tiempo de ejecución de cada instrucción =
Número de instrucciones
1041´667 µS
Tiempo de ejecución de cada instrucción = = 0´695 µS
1500
La relación entre la frecuencia del cristal de cuarzo y el tiempo de instrucción del pic
viene determinada por:
1 1
Frecuencia de cristal = x4= × 4 = 5´759 MHz
Tc 0´695µS
1
Se refiere a la velocidad de transmisión. Esta se realiza a 9.600 bits por segundo.
- 25 -
BRAZO DE ROBOT MEMORIA TECNICA
Entonces se deduce que el cristal que se elija debe ser de una frecuencia de 5´759
MHz o superior, mientras más rápido sea menos tardará en ejecutar las instrucciones,
es decir, menor será el tiempo de ejecución.
4 4 4
Frecuenciade cristal = Tc = Tc = = 0´4067µS
Tc Frecuenciade cristal 9´8340 MHz
Como:
2.4.1.6. MAX232
- 26 -
BRAZO DE ROBOT MEMORIA TECNICA
2.4.1.7. EEPROM
- 27 -
BRAZO DE ROBOT MEMORIA TECNICA
Movimiento 1 00h
Nº Pasos 1
01h
Destino 1
02h
Nº Pasos 2
03h
Destino 2
04h
Nº Pasos 3
05h
Destino 3
Movimiento 2 06h
Nº Pasos 1
07h
Destino 1
08h
Nº Pasos 2
09h
Destino 2
0Ah
Nº Pasos 3
0Bh
Destino 3
Movimiento 3 0Ch
Nº Pasos 1
0Dh
Movimiento 42 F6h
Nº Pasos 1
F7h
Destino 1
F8h
Nº Pasos 2
F9h
Destino 2
FAh
Nº Pasos 3
FBh
Destino 3
FCh
Total movimientos
FDh
Posición actual
FEh
Libre
FFh
Libre
256 bytes
Número de movimientos = = 42´66 movimientos
6 bytes
- 28 -
BRAZO DE ROBOT MEMORIA TECNICA
Bytes usados para guardar movimientos = Número de movimientos × Bytes por movimiento
Bytes libres en el banco de memoria = 256 Bytes − 252 Bytes = 4 Bytes libres en el banco
De estos 4 bytes que libres, se utilizan 2 para los apuntadores que se necesitan
para realizar correctamente las operaciones de lectura y escritura.
Un byte, dirección “FCh” guarda el número total de movimientos que tiene la
secuencia y puede variar desde 0 hasta 42. Si el número grabado es 0, el robot no
ejecutará movimiento alguno.
El segundo byte es decir, el de la dirección “FDh”, apunta donde debe seguir con la
lectura o escritura.
Cuando se realiza una operación de borrado, lo que se hace, es poner el número
total de movimientos y la posición actual a 0. Entonces todas las posiciones para
grabar movimientos sé reescribiran desde la posición “00h” cuando se realice la
operación de grabación.
Para grabar, lo que se hace es ir escribiendo los movimientos en el punto de
memoria que va indicando posición actual, que con cada movimiento que se graba
aumenta de valor 6 unidades (6 bytes consta el movimiento) como se explicó
anteriormente.
Cuando se tiene que leer, lo que se hace es ir leyendo donde indica la posición
actual, se leen 6 bytes cada vez (1 movimiento), se va leyendo así hasta que se llega
a igualar el número total de movimientos, instante en el que el puntero, “posición
actual” se reinicia a “0” y vuelve a leer desde la posición de memoria “00h”.
- 29 -
BRAZO DE ROBOT MEMORIA TECNICA
En este punto se va a tratar, como se generan las señales de control para los
servos. Para controlar los servos se necesita además de las tensiones de alimentación
y GND, la señal PWM tal como se explicó en el punto 2.3.3.
La señal PWM para controlar los servos, tiene un periodo de 20 mS y un tiempo en
estado lógico “1” que varía desde 0´9 mS hasta 2´1 mS, posición de 0º y 180º
respectivamente.
El microcontrolador Pic 16F873, dispone de varias fuentes de interrupción, pero las
que se utilizan para generar la señal PWM son dos, provocadas por dos
temporizadores configurados para esta finalidad.
La señal PWM se genera a través de pines de entrada/salida generales
configurados como salida, correspondiendo cada pin de salida a un servo, por eso se
utilizan temporizadores que provocan interrupción, para tener un control exacto del
tiempo.
Al provocarse la interrupción, el microcontrolador finaliza la instrucción que se está
ejecutando y atiende la rutina de interrupción, que en este caso solo se ha programado
para actuar sobre las señales PWM de los servos.
Una característica primordial que se debe tener en cuenta al generar la señal PWM
es, que la señal de cada servo no puede interferir con la de otros, ya que si se está
atendiendo una interrupción y se provoca otra, esta última no se atenderá, estando los
tiempos de la señal PWM desajustados y actuando el servo de manera incontrolada.
Para evitar interferencias entre señales utilizamos una variable que tendrá 4
posibles valores, es decir, se decrementará desde 3 hasta 0, al llegar a 0 se vuelve a
inicializar con el valor 3.
Se configura un temporizador para provocar una interrupción cada 5 mS. En el
servicio de atención de interrupción, se mira el valor que tiene la variable en ese
momento, actuando sobre el pin de salida correspondiente y por lo tanto sobre el
servo. Como la variable puede tener 4 valores diferentes, se obtiene el periodo de la
señal PWM de control, es decir, 20 mS.
Cuando se atiende esta primera interrupción denominada INT1, el programa decide
sobre que servo tiene que actuar, a continuación lee la posición a la que debe ir ese
- 30 -
BRAZO DE ROBOT MEMORIA TECNICA
servo, esta posición leída estará comprendida entre 0º y 180º que es el recorrido que
tiene el servo, se lee una tabla con esa posición, que carga un valor en un registro
especial de la segunda interrupción, con este valor se conseguirá que según la
posición, el tiempo de la segunda interrupción denominada INT2, provocada por el otro
temporizador, varíe desde 0´9 mS hasta 2´1 mS según la posición a la que tiene que ir
el servo, y que recordemos que es 0º hasta 180º respectivamente.
Se muestra a continuación una tabla en la que se observa lo explicado en los
párrafos anteriores:
PW M
Servos
Servo 3
Servo 2
Servo 1
0 5 10 15 20 ms
- 31 -
BRAZO DE ROBOT MEMORIA TECNICA
En la figura se pueden ver las señales de cada servo. En el servo 1 se aprecia una
señal con nivel lógico “1” de 0´9 mS, es decir, el servo está en la posición 0º. En el
servo 2 tenemos un nivel lógico “1” de duración 1´5 mS, el servo 2 está en posición
90º y en el servo número 3 tenemos 2´1 mS que corresponde a la posición de 180º,
según la figura 2.11.
Según el ejemplo se puede ver que el más rápido es el de mayor recorrido, por lo
tanto, tendrá el tiempo de espera entre grados más pequeño, en este caso
corresponde a la articulación de la base.
El número de pasos lo calcula el interfície de programación.
Para realizar este cálculo, se ordena el recorrido de cada articulación de menor a
mayor, con el método de la burbuja, que consiste en comparar pares de elementos
adyacentes e intercambiarlos en caso que no estén en el orden correcto. Después se
divide el desplazamiento del servo de mayor recorrido entre el desplazamiento de
todos los servos.
Siguiendo con el ejemplo:
- 32 -
BRAZO DE ROBOT MEMORIA TECNICA
El significado es el siguiente:
♦ Sincronismo: Son tres bytes que se han de enviar al inicio de cada trama
para sincronizar el emisor y el receptor. Se envía el valor decimal “255”.
♦ Tarea: Consta de un byte, con el cuál el cerebro del brazo de robot, sabe
que función debe realizar y a continuación se detalla:
Tarea = 0: Aplicar el destino a los servos.
Tarea = 1: Grabar coordenada en la EEPROM.
Tarea = 2: Borrar memoria.
Tarea = 3: Reset. Inicializa servos a posición 0º y borra la memoria.
♦ Nº de pasos 1: Son tres bytes, centena, decena y unidad y corresponde al
tiempo que debe esperar el servo 1 en incrementar o decrementar cada
grado para conseguir el movimiento lineal.
♦ Destino 1: Es el destino al que debe ir el servo 1. Consta de 3 bytes,
centena, decena y unidad.
♦ Los otros números de pasos y destino, son iguales que los dos anteriores
pero correspondientes al servo 2 y 3 respectivamente.
- 33 -
BRAZO DE ROBOT MEMORIA TECNICA
Una parte muy importante del proyecto es la alimentación, sin ella no es posible que
el brazo de robot funcione de manera alguna, por esto hay que tener cuidado a la hora
de elegir el modo de alimentación. Lo que está claro es que la mejor forma de
alimentación, es con una batería recargable. Con este tipo de batería podemos tener
el brazo de robot disponible para colocarlo en una plataforma móvil y además
respetamos el medio ambiente al no desechar tantas baterías no recargables.
- 34 -
BRAZO DE ROBOT MEMORIA TECNICA
♦ Baterías de níquel metal hidruro (NiMH): Son más caras que las anteriores
porque usan metales como titanio, zirconio o vanadio, pero proporcionan
aproximadamente un 50% más de energía a igualdad del peso. Además
estas no tienen efecto memoria.
♦ Baterías de litio-ion (LiIon): Con mayor capacidad que las de NiMH, no
tienen efecto memoria y apenas se observa efecto autodescarga.
Se muestra una tabla con las ventajas y desventajas de diversos tipos de baterías:
2.5.3. Autonomía
- 35 -
BRAZO DE ROBOT MEMORIA TECNICA
6
Tensión (V)
4
Gráfica
2 teórica
0 Gráfica real
0
0
0
30
60
90
0
12
15
18
Tiempo (minutos)
- 36 -
BRAZO DE ROBOT MEMORIA TECNICA
6
Gráfica
Tensión (V)
4 Teórica
2 Gráfica Real
0
10
13
16
1
- 37 -
BRAZO DE ROBOT MEMORIA TECNICA
♦ Hay un gran tipo de pilas, desde el punto de vista químico, por lo que se
multiplica enormemente la cantidad de contaminantes que se generan.
♦ Algunos de los constituyentes peligrosos de las pilas son: mercurio, cadmio y
plomo. Estos elementos son los más peligrosos.
Idealmente las pilas y baterías, deberían volver al fabricante para que éste se
encargue de reciclar y reutilizar lo que le sea útil mediante la implementación de
tecnologías adecuadas a tal fin. En términos prácticos, la gestión de las pilas usadas
comienza por la recolección en forma separada y continua, enviándolas a continuación
a plantas donde se realice su reciclado.
- 38 -
BRAZO DE ROBOT INSTALACION
3.1. Requerimientos
3.2. Instalación
4. Conclusiones
En este punto del proyecto, debo decir, que estoy muy satisfecho con el trabajo
realizado, ya que he conseguido llevar a la realidad gran parte de los objetivos que
inicialmente me había planteado.
Para poder realizar mecánicamente este proyecto, se ha conseguido reciclar un
viejo disco duro de 40 Mb sin utilidad alguna en los tiempos actuales, así como
poder reutilizar también la batería de un teléfono móvil ya en desuso. Al reutilizar
estos elementos se ha conseguido respetar el medio ambiente, si no estos
elementos hubiesen ido a la basura.
También he podido aprender el funcionamiento de algunos protocolos de
comunicación serie como son, el RS-232 y el I2C. Respecto al RS-232 su
utilización es conocida por todas las personas que utilizamos el ordenador
personal, ya que está implementado para la comunicación con el ratón como cosa
más significativa, aunque tiene muchas más aplicaciones. Dado que no siempre se
requiere alta velocidad de transferencia de datos, el bus I2C es ideal para sistemas
donde es necesario manejar información entre muchos dispositivos, al mismo
tiempo se requiere poco espacio y líneas de circuito impreso.
Tengo que destacar la sencillez del interfície de programación para que
cualquier persona inexperta pueda programar y manejar el brazo robot en un corto
espacio de tiempo, acercando este proyecto de esta manera a un gran número de
personas de todas las edades.
Otro punto que no quiero dejar de comentar, es la posibilidad de poder
comercializar el producto, realizando algunas mejoras, como añadirle una pinza
que pueda coger objetos como si de una mano se tratase.
Finalmente puedo concluir que el proyecto ha cubierto todas las expectativas
que inicialmente me había planteado, alcanzando así los objetivos educativos
requeridos al plantearse el reto de realizar un proyecto fin de carrera.
BRAZO DE ROBOT PRESUPUESTO
5. Presupuesto
Para realizar el presupuesto del proyecto, se han separado los diferentes conceptos
de la siguiente forma: El material electrónico, el mecánico y las horas empleadas en la
elaboración, si sumamos estos tres conceptos obtendremos el coste total del un brazo
robot, como puede verse a continuación. Si fabricamos en serie los costes se
disminuyen mucho. En las siguientes páginas se desglosa cada concepto. La moneda
utilizada para calcular los importes es el euro.
Si se pide más de una unidad, los gastos relativos a los profesionales se reducirían
mucho, como ejemplo, se estudiará un pedido de 5 unidades, para otra cantidad
habría que estudiar el coste de forma similar.
Material electrónico:
- 42 -
BRAZO DE ROBOT PRESUPUESTO
Material mecánico:
Trabajo profesionales:
- 43 -
BRAZO DE ROBOT BIBLIOGRAFIA
6. Bibliografía
♦ Libros:
♦ Recursos en línea:
http://www.maxim-ic.com
http://www.microchip.com
http://www.google.com
http://www.lynxmotion.com
http://www.microcontroladores.es
BRAZO DE ROBOT ANEXO 1. RS-232
7. Anexos
♦ Frecuencia de transmisión.
♦ Características eléctricas.
♦ Definición y características de la línea.
La transmisión serie se realiza enviando bit a bit por lo que se necesita un interfaz
que pase la información de paralelo, que es el formato en el que trabaja la CPU, al
formato serie requerido por el dispositivo.
Las señales disponibles en un conector RS-232 están pensadas únicamente para
asegurar la correcta transmisión y recepción de datos, desde un equipo DTE1 a un
equipo DCE2. El tipo DCE más conocido es el módem y el DTE es generalmente un
ordenador.
El estándar RS-232 cuenta con una serie de señales de datos y control. Entre las
más importantes están:
1
Data Terminal Equipment. Normalmente un ordenador.
2
Data Comunication Equipment. El más conocido es el modem.
BRAZO DE ROBOT ANEXO 1. RS-232
Configurar puerta
serie
N
¿Terminar?
Salir
- 46 -
BRAZO DE ROBOT ANEXO 1. RS-232
- 47 -
BRAZO DE ROBOT ANEXO 1. RS-232
En Visual Basic existe un control denominado MSCOMM que se utiliza para poder
realizar la comunicación serie. En este control hay que configurar varios parámentros
como son:
♦ La velocidad de comunicación.
♦ La paridad.
♦ El número de bits.
♦ El número de bits de STOP.
Este microcontrolador contiene un módulo llamado MSSP con dos puertas para la
comunicación serie asíncrona. Además dispone de un módulo USART capaz de
soportar la comunicación serie síncrona y asíncrona.
La USART, llamado SCI1 puede funcionar como un sistema de comunicación full
dúplex o bidireccional asíncrono, adaptándose a multitud de periféricos. También
puede trabajar en modo síncrono unidireccional o half dúplex para soportar periféricos
como memorias, conversores, etc. En resumen, la USART puede trabajar de tres
maneras:
♦ Asíncrona (full dúplex, bidireccional).
♦ Síncrona - maestro (half dúplex, unidireccional).
♦ Síncrona – esclavo (half dúplex, unidireccional).
A continuación se muestra un esquema del comportamiento de la USART en modo
asíncrono, donde las transferencias de información se realizan sobre dos líneas Tx
(transmisión) y Rx (recepción), saliendo y entrando los bits por dichas líneas al ritmo
de una frecuencia controlada internamente por la USART.
- 48 -
BRAZO DE ROBOT ANEXO 1. RS-232
- 49 -
BRAZO DE ROBOT ANEXO 1. RS-232
- 50 -
BRAZO DE ROBOT ANEXO 1. RS-232
- 51 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
Diseñado por Philips, este intercambio de información a través de tan solo dos
cables permite a circuitos integrados y módulos OEM interactuar entre sí a velocidades
relativamente lentas. Emplea comunicación serie, utilizando un conductor para
manejar los pulsos de reloj que actúan de sincronismo y otro para intercambiar datos.
Las líneas SDA y SCL son del tipo drenador abierto, similares a las de colector
abierto pero asociadas a un transistor de efecto de campo1. Se deben poner en estado
alto2 para construir una estructura de bus tal que se permita conectar en paralelo
múltiples entradas y salidas.
En la figura se puede observar la configuración eléctrica básica del bus. Las dos
líneas de comunicación disponen de niveles lógicos altos cuando están inactivas, de
eso se encargan las resistencias de pull-up Rp, Rs son las impedáncias de las líneas
de conexión. Inicialmente el número de dispositivos que se puede conectar al bus es
limitado, pero obsérvese que las líneas tienen una especificación máxima de 400 pF
en lo que respecta a capacidad de carga. La máxima velocidad de transmisión de
datos que se puede obtener es de aproximadamente 100 Kbits por segundo.
Las definiciones o términos utilizados en relación con las funciones del bus I2C son
las siguientes:
♦ Master: Dispositivo que determina la temporización y la dirección del tráfico
de datos en el bus. Es el único que aplica los pulsos de reloj en la línea
- 53 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 54 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
7.2.2. Protocolo
Como es lógico, para iniciar una comunicación entre dispositivos conectados al bus
I2C se debe respetar un protocolo. Tan pronto como el bus esté libre, un dispositivo
maestro puede ocuparlo generando una condición de inicio. El primer byte transmitido
después de la condición de inicio contiene los siete bits que componen la dirección del
dispositivo destino seleccionado y un octavo bit correspondiente a la operación
deseada (lectura y escritura). Si el dispositivo cuya dirección se apuntó en los siete bits
está presente en el bus, éste responde enviando el pulso de reconocimiento ACK.
Seguidamente puede comenzar el intercambio de información entre los dispositivos.
1
Acknowledge. Reconocimiento.
2
Low Significative Bit. Bit de menos peso.
- 55 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
Cuando la señal R/W está previamente a nivel lógico bajo, el dispositivo maestro
envía datos al dispositivo esclavo hasta que deja de recibir los pulsos de
reconocimiento, o hasta que se hayan transmitido todos los datos.
En el caso contrario, es decir, cuando la señal R/W estaba a nivel lógico alto, el
dispositivo maestro genera pulsos de reloj durante los cuales el dispositivo esclavo
puede enviar datos. Luego de cada byte recibido, el dispositivo maestro (que en este
momento está recibiendo datos) genera un pulso de reconocimiento.
El dispositivo maestro puede dejar libre el bus, generando una condición de STOP.
Si se desea seguir transmitiendo, el dispositivo maestro puede generar otra condición
de START, en lugar del STOP. Esta nueva condición de START se denomina “inicio
repetitivo” y se puede emplear para direccionar un dispositivo esclavo diferente o para
alterar el estado del bit de lectura/escritura (R/W).
7.2.3. Aplicaciones
Tanto Philips como otros fabricantes de dispositivos compatibles con I2C disponen
de una amplia gama de circuitos integrados, incluyendo memorias RAM y EEPROM,
microcontroladores, puertos de E/S, codificadores DTMF, transceptores IR,
conversores A/D y D/A, relojes de tiempo real y calendarios.
Dado que no siempre se requiere alta velocidad de transferencia de datos, este bus
es ideal para sistemas donde es necesario interconectar muchos dispositivos.
- 56 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
los bits van entrando al ritmo del reloj por una patita y se van desplazando en el
SSPSR hasta que lo llenan, en cuyo momento la información se traspasa al SSPBUF,
donde queda lista para su lectura. Este doble almacenamiento del dato recibido
permite iniciar la recepción de un nuevo dato antes de que se haya leído el último.
Cuando se han recibido 8 bits durante la recepción en SSPSR, se traspasa dicha
información a SSPBUF y entonces el bit señalizador BF (Buffer Full) se pone a “1”, al
igual que el flag de interrupción SSPIF. Cualquier escritura en el SSPBUF se ignora
durante una transferencia de información y se señaliza poniendo a “1” el bit WCOL,
que advierte de este tipo de colisiones. Recae en la responsabilidad del programador
pasar el bit WCOL a “0” una vez completada la escritura en SSPBUF.
En la siguiente figura se muestra un esquema básico sobre la estructura interna del
módulo MSSP.
7.2.5. EEPROM
Una memoria del tipo EEPROM1 es un tipo de memoria que una vez se le quita la
corriente eléctrica mantiene la información de forma indefinida y además puede
reprogramarse borrando su contenido de forma eléctrica.
Después del START se envía un byte de control, este consiste en 8 bits, de los
cuáles los 4 primeros (mayor peso) indican la operación que se quiere realizar, en el
caso de la memoria es 1010, los tres siguientes (A2,A1,A0), indican el número de
- 57 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 58 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
Este tipo de escritura es del tipo secuencial, es decir, se pueden escribir más de un
byte sin tener que mandar un START y STOP para cada byte.
Este tipo de lectura, lee la posición actual de la memoria, esta posición está
apuntada por un puntero interno que la incrementa cada vez.
- 59 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
En este tipo de lectura se indica la posición de donde debe leer la información, hay
que destacar que primero se ha de enviar la dirección y después se recibe el dato.
En este tipo de lectura, se leen varias posiciones, hay que darle la dirección a partir
de la cual queremos leer y a continuación se leen los bytes que se necesiten leer en
la aplicación. Para conseguirlo debemos implementar la trama que se muestra en la
figura siguiente:
- 60 -
BRAZO DE ROBOT ANEXO 3. METODO DE LA BURBUJA
BURBUJA
I= 0
I =I+ 1
Aux = V(I)
S
V(I) > V(I+1) V(I) = V(I+1)
V(I+1) = Aux
N
I= 3
FIN
7.4.1. Esquema
7.4.2. PCB
- 63 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 64 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 65 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 66 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 67 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
INTERFICIE DE PROGRAMACION:
Interfície de programación
¿Cambio de posición S
para servo 1?
¿Cambio de posición S
Tarea a Realizar = 0
para servo 2?
¿Cambio de posición S
para servo 3?
S
¿Grabar Memoria? Tarea a Realizar = 1
S
¿Reset? Tarea a Realizar = 2
N S
¿Borrar Memoria? Tarea a Realizar = 3
Fin Interfície
- 68 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
CALCULO
PASOS
I= 0
V(I) = Grados_Base
V(I+1) = Grados_Hombro
V(I+2) = Grados_Codo
I= 0
I= I+ 1
Aux = V(I)
S
V(I) > V(I+1) V(I) = V(I+1)
V(I+1) = Aux
N
I= 3
FIN PASOS
Organigrama 7.18. Cálculo del número de pasos que debe esperar cada servo.
- 69 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
Formulario Principal:
- 70 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
Private Sub Borrar_Click() ‘Rutina para borrar la memoria I2C. Para ello se manda como
Tarea_Realizar = "3" ‘Tarea a realizar el número 3.
Mov_Text1.Text = 0
Mov_Text2.Text = 42
Grados_Base_Anterior = 255
Grados_Hombro_Anterior = 255
Grados_Codo_Anterior = 255
Call enviar
End Sub
Private Sub RutinaGrabar_Click() ‘Esta rutina sirve para grabar una secuencia de movimientos
‘en la memoria I2C.
If (Grados_Base <> Grados_Base_Anterior Or Grados_Hombro <>
Grados_Hombro_Anterior Or Grados_Codo <> Grados_Codo_Anterior) And (Mov_Text1.Text <
42) Then
Mov_Text1 = Mov_Text1 + 1
Mov_Text2 = Mov_Text2 - 1
Grados_Base_Anterior = Grados_Base
Grados_Hombro_Anterior = Grados_Hombro
Grados_Codo_Anterior = Grados_Codo
Tarea_Realizar = "1" ‘Para dar la orden de grabación de la posición actual del brazo.
Call enviar
End If
End Sub
- 71 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
End Sub
Sub enviar()
If Grados_Base >= 0 And Grados_Base <= 180 Then ‘Se prepara la centena, decena y unidad
If Grados_Base >= 0 And Grados_Base < 10 Then ‘Base < 10
Centena(0) = "0"
Decena(0) = "0"
Unidad(0) = Grados_Base
End If
If Grados_Base >= 10 And Grados_Base < 100 Then ‘Base <100
Centena(0) = "0" '
_Base = "0"
Decena(0) = Left(Grados_Base, 1)
Unidad(0) = Right(Grados_Base, 1)
End If
If Grados_Base >= 100 Then ‘Base > 100
Centena(0) = Left(Grados_Base, 1)
Decena(0) = Mid(Grados_Base, 2, 1)
Unidad(0) = Right(Grados_Base, 1)
End If
End If
- 72 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
Unidad(1) = Right(Grados_Hombro, 1)
End If
If Grados_Hombro >= 100 Then ‘Hombro > 99
Centena(1) = Left(Grados_Hombro, 1)
Decena(1) = Mid(Grados_Hombro, 2, 1)
Unidad(1) = Right(Grados_Hombro, 1)
End If
End If
'Rutina de ordenacion del valor de grado de cada servo, según la diferencia entre el valor
‘siguiente y el anterior, para así saber el mayor desplazamiento y calcular el número de
‘pasos.
Grados_Base_Anter = Grados_Base
Grados_Hombro_Anter = Grados_Hombro
Grados_Codo_Anter = Grados_Codo
- 73 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
Ordenados(0) = Grados_Base_Resta
Ordenados(1) = Grados_Hombro_Resta
Ordenados(2) = Grados_Codo_Resta
'calculo del número de paso de cada servo dividiendo el mayor desplazamiento entre los
‘los otros.
'
Evita la division por cero
Grados_Base_Paso = Grados_Base_Resta
Grados_Hombro_Paso = Grados_Hombro_Resta
Grados_Codo_Paso = Grados_Codo_Resta
If Grados_Base_Paso = 0 Then
Grados_Base_Paso = Grados_Base_Paso + 1
End If
If Grados_Hombro_Paso = 0 Then
Grados_Hombro_Paso = Grados_Hombro_Paso + 1
End If
If Grados_Codo_Paso = 0 Then
Grados_Codo_Paso = Grados_Codo_Paso + 1
End If
'
Cuidado que Str mete un signo a la izda, caracter blanco si es positivo
'
- si es negativo.
'
Aqui elimino el signo de la izquierda que se coloca con Str()
- 74 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
CommSerie.CommPort = Numero_Puerto
CommSerie.Settings = "9600,N,8,1"
CommSerie.PortOpen = True
CommSerie.Output = Inicio_Transmision_Centena
CommSerie.Output = Inicio_Transmision_Decena
CommSerie.Output = Inicio_Transmision_Unidad
CommSerie.Output = Tarea_Realizar
For x = 0 To 2 '
3
CommSerie.Output = Pasos_Servo_Centena(x)
CommSerie.Output = Pasos_Servo_Decena(x)
CommSerie.Output = Pasos_Servo_Unidad(x)
CommSerie.Output = Centena(x)
CommSerie.Output = Decena(x)
CommSerie.Output = Unidad(x)
Next x
- 75 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
CommSerie.PortOpen = False
Tarea_Realizar = "0"
End Sub
- 76 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
Programa principal
N ¿Modo S
Autonómo?
S ¿Tarea a
Grabar memoria
Realizar = 1?
Posicionar servos
S ¿Tarea a
en posicion 0º y
Realizar = 2?
borrar memoria
S ¿Tarea a
Borrar memoria
Realizar = 3?
- 77 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
S
¿Memoria llena?
Grabar:
Posición servo1 y nº de pasos 1
Posición servo2 y nº de pasos 2
Posición servo3 y nº de pasos 3
- 78 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
Leer en EEPROM:
Posición servo1 y nº de pasos1
Posición servo2 y nº de pasos2
Posición servo3 y nº de pasos3
Incrementar número de
movimiento actual
¿Número de movimiento
S
actual > número total de
movimientos?
¿Número de movimiento
N
actual = número total de
movimientos?
Inicializar:
Número de movimiento actual
- 79 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
RSI
S ¿Interrupcion por N
TMR1?
¿Interrupcion por N
TMR0?
N N
N N
Desactivar TMR1
Variable = Variable - 1
Fin RSI
- 80 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
;Programa para realizar las siguientes operaciones pertenecientes al brazo de robot con 3
;servos, estas acciones son: Controlar servos, borrar, grabar y leer la EEPROM I2C.
;Los 3 servos incrementan y decrementan grados según una tabla, de aproximadamente 1
;grado. El duty-cycle sera una interrupcion provocada por TMR1. El resto del periodo será una
;interrupcion provocada por el TMR0. El TMR0 provoca interrupcion cada 5 milisegundos, por lo
; que se necesitara una variable contador que cada 4 veces que se produzca una TMR0
;interrupción actuará sobre cada servo, con intervalo de 5 mS. Dejando así tiempo de sobra
;para para que no se afecte el PWM de los demás servos.
;Además se le pasaran las posiciones a la que debe ir cada servo desde el PC, por el puerto
;serie, desde el programa hecho en VB para tal tarea.
;Variables
N_SERVO EQU 20h ;Nº de servo para actuar el PWM, en cada INT.
Leido EQU 21h ;Leido de RCREG, después de restar 30h ASCI I.
GRADOS_SERVO1 EQU 22h ;Grado al que debe ir el servo 1.
GRADOS_SERVO2 EQU 23h ;Grado al que debe ir el servo 2.
GRADOS_SERVO3 EQU 24h ;Grado al que debe ir el servo 3.
GRADO_LECTURA EQU 26h ;Grado para leer tabla.
Tarea_Realizar EQU 27h ;Tarea a realizar.
- 81 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
;********** Programa.
- 82 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
;****Rutina Principal
Modo_Programacion ;En este bucle leeremos continuamente si llega algo por el puerto
;serie, en este orden:
;1º,2º y 3º byte, de start, si es 255 se sigue la lectura sino a esperar que
;llegue.
;4º , tarea a realizar, 0 es mover servo
;5º, 6º y 7º byte, numero de pasos que debe esperar el Servo1
;8º, 9º y 10º numero de grado al que debe ir el servo1 (0...180º)
;11º, 12º y 13º byte, numero de pasos que debe esperar el Servo2
;14º, 15º y 16º numero de grado al que debe ir el servo2 (0...180º)
;17º, 18º y 19º byte, numero de pasos que debe esperar el Servo3
;20º, 21º y 22º numero de grado al que debe ir el servo3 (0...180º)
BCF STATUS,Z
CALL Obtiene_Cifra_3bytes
MOVLW .255
- 83 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
SUBWF Cifra_Leida,w
BTFSC STATUS,Z
GOTO Leer_Tarea
GOTO Principal
- 84 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
ADDWF Cifra_Leida,f
BCF PCLATH,1
RETURN
MOVLW .0
MOVWF GR_DEST_SERVO1
MOVWF GR_DEST_SERVO2
MOVWF GR_DEST_SERVO3
MOVWF GRADOS_SERVO1
MOVWF GRADOS_SERVO2
MOVWF GRADOS_SERVO3
BSF PCLATH,2
CALL Reset_Total_Mov
GOTO Principal
- 85 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
GOTO BAJAR_SER3
GOTO BAJAR_SER2
GOTO BAJAR_SER1
GOTO FIN_RSI ;Si hay alguna cosa incontrolada
- 86 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
ORG 100h
DUTY_LOW ADDWF PCL,F ;Carga en TMR1 la parte baja, "LOW" del duty
;del pwm correspondiente. TMR1 es de 16 bits.
RETLW low .65259 ;0º
RETLW low .65257 ;1º
RETLW low .65255 ;2º
RETLW low .65253 ;3º
RETLW low .65251 ;4º
RETLW low .65249 ;5º
RETLW low .65247 ;6º
RETLW low .65245 ;7º
RETLW low .65243 ;8º
RETLW low .65241 ;9º
RETLW low .65239 ;10º
RETLW low .65237 ;11º
RETLW low .65235 ;12º
RETLW low .65233 ;13º
RETLW low .65231 ;14º
RETLW low .65229 ;15º
RETLW low .65227 ;16º
RETLW low .65225 ;17º
RETLW low .65223 ;18º
RETLW low .65221 ;19º
RETLW low .65219 ;20º
RETLW low .65217 ;21º
RETLW low .65215 ;22º
RETLW low .65213 ;23º
RETLW low .65211 ;24º
RETLW low .65209 ;25º
RETLW low .65207 ;26º
RETLW low .65205 ;27º
RETLW low .65203 ;28º
RETLW low .65201 ;29º
RETLW low .65199 ;30º
RETLW low .65197 ;31º
RETLW low .65195 ;32º
RETLW low .65193 ;33º
RETLW low .65191 ;34º
RETLW low .65189 ;35º
RETLW low .65187 ;36º
RETLW low .65185 ;37º
RETLW low .65183 ;38º
RETLW low .65181 ;39º
RETLW low .65179 ;40º
RETLW low .65177 ;41º
RETLW low .65175 ;42º
RETLW low .65173 ;43º
RETLW low .65171 ;44º
RETLW low .65169 ;45º
RETLW low .65167 ;46º
RETLW low .65165 ;47º
RETLW low .65163 ;48º
RETLW low .65161 ;49º
RETLW low .65159 ;50º
RETLW low .65157 ;51º
RETLW low .65155 ;52º
RETLW low .65153 ;53º
RETLW low .65151 ;54º
- 87 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 88 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 89 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
ORG 200h
DUTY_HIGH ADDWF PCL,F ;Carga en TMR1 la parte alta, "HIGH" del duty
;del PWM correspondiente.
RETLW high .65259 ;0º
RETLW high .65257 ;1º
RETLW high .65255 ;2º
RETLW high .65253 ;3º
RETLW high .65251 ;4º
RETLW high .65249 ;5º
RETLW high .65247 ;6º
RETLW high .65245 ;7º
RETLW high .65243 ;8º
RETLW high .65241 ;9º
RETLW high .65239 ;10º
RETLW high .65237 ;11º
RETLW high .65235 ;12º
RETLW high .65233 ;13º
RETLW high .65231 ;14º
RETLW high .65229 ;15º
RETLW high .65227 ;16º
RETLW high .65225 ;17º
RETLW high .65223 ;18º
RETLW high .65221 ;19º
RETLW high .65219 ;20º
RETLW high .65217 ;21º
RETLW high .65215 ;22º
RETLW high .65213 ;23º
RETLW high .65211 ;24º
RETLW high .65209 ;25º
RETLW high .65207 ;26º
RETLW high .65205 ;27º
RETLW high .65203 ;28º
RETLW high .65201 ;29º
RETLW high .65199 ;30º
RETLW high .65197 ;31º
RETLW high .65195 ;32º
RETLW high .65193 ;33º
RETLW high .65191 ;34º
RETLW high .65189 ;35º
RETLW high .65187 ;36º
RETLW high .65185 ;37º
RETLW high .65183 ;38º
RETLW high .65181 ;39º
RETLW high .65179 ;40º
RETLW high .65177 ;41º
RETLW high .65175 ;42º
RETLW high .65173 ;43º
RETLW high .65171 ;44º
RETLW high .65169 ;45º
RETLW high .65167 ;46º
RETLW high .65165 ;47º
- 90 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 91 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
- 92 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
ORG 300h
- 93 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
INCREMENTAR_GRADO
INCF GRADOS_SERVO,f
MOVLW .1
MOVWF Pas_act_Servo
GOTO Guardar_Servo
- 94 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
DECREMENTAR_GRADO
DECF GRADOS_SERVO,f
MOVLW .1
MOVWF Pas_act_Servo
GOTO Guardar_Servo
- 95 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
INCF Total_Mov,f
CALL Delay_I2C
BSF PCLATH,0
CALL START_GRABACION
MOVLW .252
CALL I2C_ENVIAR ;Manda la WORD ADDRESS de la posicion de
;grabación
MOVF Total_Mov,w
CALL I2C_ENVIAR ;Manda la el Total de movimientos de la
;secuencia actual del movimiento
CALL STOP
;'
PAGE WRITE'
CALL Delay_I2C
BSF PCLATH,0
CALL START_GRABACION
MOVF WORD_ADDRESS,w
CALL I2C_ENVIAR
MOVF Pasos_Servo1,w
CALL I2C_ENVIAR
INCF WORD_ADDRESS,f
MOVF GRADOS_SERVO1,w
CALL I2C_ENVIAR
INCF WORD_ADDRESS,f
call STOP
bsf PCLATH,0
call START_GRABACION
movf WORD_ADDRESS,w
call I2C_ENVIAR
MOVF Pasos_Servo2,w
CALL I2C_ENVIAR
INCF WORD_ADDRESS,f
MOVF GRADOS_SERVO2,w
CALL I2C_ENVIAR
INCF WORD_ADDRESS,f
call STOP
- 96 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
bsf PCLATH,0
call START_GRABACION
movf WORD_ADDRESS,w
call I2C_ENVIAR
MOVF Pasos_Servo3,w
CALL I2C_ENVIAR
INCF WORD_ADDRESS,f
MOVF GRADOS_SERVO3,w
CALL I2C_ENVIAR
INCF WORD_ADDRESS,f
CALL STOP
bsf PCLATH,1
BCF STATUS,Z
MOVLW .0
SUBWF Total_Mov,w
BTFSC STATUS,Z
GOTO Fin_Leer_Mem
- 97 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
CALL Delay_I2C
CALL START
MOVLW b'10100001'
CALL I2C_ENVIAR
CALL I2C_LEER
MOVWF GR_DEST_SERVO1
INCF WORD_ADDRESS,f
CALL I2C_MAN_ACK
CALL I2C_LEER
MOVWF Pasos_Servo2
INCF WORD_ADDRESS,f
CALL I2C_MAN_ACK
CALL I2C_LEER
MOVWF GR_DEST_SERVO2
INCF WORD_ADDRESS,f
CALL I2C_MAN_ACK
CALL I2C_LEER
MOVWF Pasos_Servo3
INCF WORD_ADDRESS,f
CALL I2C_MAN_ACK
CALL I2C_LEER
MOVWF GR_DEST_SERVO3
INCF WORD_ADDRESS,f
CALL I2C_MAN_NO_ACK
CALL STOP
INCF N_Mov_Act,f
BCF STATUS,Z
MOVF Total_Mov,w
SUBWF N_Mov_Act,w
BTFSC STATUS,Z
GOTO Iniciar_WORD_ADDRESS
GOTO Fin_Leer_Mem
Iniciar_WORD_ADDRESS MOVLW .0
MOVWF WORD_ADDRESS
MOVWF N_Mov_Act
CALL Delay_I2C
CALL START
MOVLW b'10100000'
CALL I2C_ENVIAR
MOVLW .252
- 98 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
CALL I2C_ENVIAR
MOVLW .0
CALL I2C_ENVIAR ;Graba Total_Mov = 0
CALL STOP
MOVLW .0
MOVWF Tarea_Realizar
MOVWF N_Mov_Act
movwf Total_Mov
call Delay_I2C
call START
movlw b'10100000'
call I2C_ENVIAR
movlw .252
call I2C_ENVIAR
call RESTART
movlw b'10100001'
call I2C_ENVIAR
call I2C_LEER
movwf kk
call I2C_MAN_NO_ACK
call STOP
BCF PCLATH,2
RETURN
Delay_I2C movlw .10 ;Retardo que necesita estar como minimo a nivel 0, las
;lineas I2C
Movwf Retardo_1
Delay_1 movlw 0xFF
movwf Retardo_2
Bcf STATUS,Z
Delay_2 nop
nop
DECFSZ Retardo_2,f
goto Delay_2
bcf STATUS,Z
DECFSZ Retardo_1,f
goto Delay_1
Return
- 99 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
I2C_MAN_NO_ACK
BSF STATUS,RP0
BCF STATUS,RP1
BSF SSPCON2,ACKDT
BSF SSPCON2,ACKEN
BTFSC SSPCON2,ACKEN
GOTO $-1
BCF STATUS,RP0
RETURN
- 100 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
ORG 0x500
BCF STATUS,Z
MOVF GR_DEST_SERVO1,w
SUBWF GRADOS_SERVO1,w
BTFSC STATUS,Z
GOTO SEGUIR_LEER_1
GOTO Fin_Modo_Aut_1
org 0x600
decf WORD_ADDRESS,f
decf WORD_ADDRESS,f
decf WORD_ADDRESS,f
call Delay_I2C
call START
movlw b'10100000'
call I2C_ENVIAR
movf WORD_ADDRESS,w
- 101 -
BRAZO DE ROBOT ANEXO 2. BUS I2C
call I2C_ENVIAR
call RESTART
movlw b'10100001'
call I2C_ENVIAR
call I2C_LEER
call I2C_MAN_NO_ACK
call STOP
incf WORD_ADDRESS,f
incf WORD_ADDRESS,f
incf WORD_ADDRESS,f
bcf PCLATH,1
return
END
- 102 -