Sie sind auf Seite 1von 146

Curso de Robtica y aplicaciones a el Aula de Tecnologa

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

Pedro Alonso Sanz IES Joan Mir Enero 2009

IES Joan Mir

Pgina 1

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


1.- MANEJO DEL LABORATORIO ELECTRNICO VIRTUAL PROTEUS. ............................ 4 1.1.- ISIS (CAPTURA Y SIMULACIN DE CIRCUITOS ELECTRNICOS). ............................................. 4 1.1.1.- Introduccin. ............................................................................................................................. 4 1.1.2.- Captura Electrnica: Entorno Grfico (ISIS) .............................................................................. 5 1.1.3.- Depuracin de programas. ....................................................................................................... 9 1.2.- ARES (DISEO DE PLACAS). .............................................................................................. 17 1.2.1.- Diseo de un esquema con ISIS. .............................................................................................. 17 1.2.2.- Generacin del listado de conexiones Netlis to Ares. .......................................................... 21
1.2.2.1.- Entorno de Trabajo .......................................................................................................................... 22

1.2.3.- Creacin del tamao de la placa de PCB. ............................................................................... 22 1.2.4.- Posicionamiento de los componentes dentro de la placa. ...................................................... 25
1.2.4.1.- Posicionamiento Automtico. ......................................................................................................... 25 1.2.4.2.- Posicionamiento Manual. ................................................................................................................ 26

1.2.5.- Rutado de la pistas. ................................................................................................................ 27


1.2.5.1.- Rutado Automtico. ........................................................................................................................ 28 1.2.5.2.- Rutado manual. ............................................................................................................................... 29

1.3.- CREACIN DE SMBOLOS EN ISIS Y ENCAPSULADOS EN ARES. .......................................... 34 1.3.1.- Creacin de una biblioteca de encapsulados en ARES. ........................................................... 34 1.3.2.- Creacin de un encapsulado en ARES. ................................................................................... 36 1.3.3.- Creacin de una biblioteca de smbolos en ISIS. ..................................................................... 39 1.3.4.- Creacin de un smbolo en ISIS. ............................................................................................. 41 2.- PRINCIPIOS DE FUNCIONAMIENTO DE UN MICROCONTROLADOR PIC. ...................... 47 2.1.- DIAGRAMA EN BLOQUES. ................................................................................................... 49 2.2.- M APA DE MEMORIA. ........................................................................................................... 50 2.2.1.- Memoria de Programa. .......................................................................................................... 50 2.2.2.- Memoria de Datos. ................................................................................................................. 50 3.- INICIACIN A LA PROGRAMACIN EN C EN UC PIC. ........................................................ 51 3.1.- COMPILADOR CCS................................................................................................................ 51 3.1.1.- Introduccin. ........................................................................................................................... 51 3.1.2.- Estructura de un programa. ................................................................................................... 51 3.1.3.- Constantes. ............................................................................................................................. 53 3.1.4.- Tipo de variables. .................................................................................................................... 54 3.1.5.- Operadores. ............................................................................................................................ 55
a) Asignacin. ................................................................................................................................................ 55 b) Aritmticos. ............................................................................................................................................... 55 c) Relacionales. .............................................................................................................................................. 55 d) Lgicos. ...................................................................................................................................................... 55 e) De Bits. ...................................................................................................................................................... 56 f) Punteros. .................................................................................................................................................... 56

3.1.6.- Funciones. ............................................................................................................................... 56 3.2.- M ANEJO DE LAS DECLARACIONES DE CONTROL. ................................................................ 59 3.2.1.- If-Else. .................................................................................................................................. 60 3.2.2.- Switch-Case. ....................................................................................................................... 63 3.2.3.- For. ........................................................................................................................................ 66 3.2.4.- While. .................................................................................................................................... 70 3.2.5.- Do-While. ............................................................................................................................. 72 3.3.- CREACIN DE FUNCIONES. ................................................................................................ 74 3.4.- M ANEJO Y CREACIN DE DRIVER O LIBRERAS..................................................................... 80

IES Joan Mir

Pgina 2

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.- EJEMPLOS PRCTICOS. ......................................................................................................... 82 4.1.- INTERFACE OPTOACOPLADA ENTRE DISPOSITIVOS DIGITALES Y ANALGICOS ...................... 82 4.1.1.- Control con Rels. ................................................................................................................... 82 4.1.2.- Control con Optotransistores. ................................................................................................. 84 4.1.3.- Control con Optotriac. ............................................................................................................ 86 4.2.- CONTROL DE UNA PANTALLA LCD. .................................................................................... 88 4.2.1.- LCD_ejemplo1.c ...................................................................................................................... 91 4.2.2.- LCD_ejemplo2.c ...................................................................................................................... 92 4.2.3.- LCD_ejemplo3.c ...................................................................................................................... 93 4.2.4.- LCD_ejemplo4.c ...................................................................................................................... 94 4.2.5.- LCD_ejemplo5.c ...................................................................................................................... 95 4.2.6.- LCD_ejemplo6.c ...................................................................................................................... 96 4.2.7.- LCD_ejemplo7.c ...................................................................................................................... 97 4.3.- DIGITALIZACIN DE UNA SEAL ANALGICA CON EL SISTEMA DE ADQUISICIN DE DATOS...... 99 4.3.1.- Conversin_A/D_D/A.c ......................................................................................................... 101 4.3.2.- Conversin_A-D1.c................................................................................................................ 104 4.3.3.- Conversin_A-D2.c ............................................................................................................... 106 4.3.4.- Conversin_A-D3.c................................................................................................................ 107 4.4.- CONTROL DE VELOCIDAD Y SENTIDO DE GIRO DE MOTORES DE CORRIENTE CONTINUA. ...... 109 4.4.1.- PWM1.c ................................................................................................................................ 110 4.4.2.- PWM2.c ................................................................................................................................ 111 4.4.3.- PWM3.c ................................................................................................................................ 115 4.5.- CONTROL DE UN SERVO DE POSICIN. ............................................................................. 117 4.5.1.- Control_2_Servos_Posicin.c ................................................................................................ 118 4.6.- DISEO DE MANDOS TRANSMISORES Y RECEPTORES DE RADIO FRECUENCIA. ................... 123 4.6.1.- Introduccin. ......................................................................................................................... 123
4.6.1.1.- Transmisin serie asncrona. ......................................................................................................... 123 4.6.1.2.- Modulacin en AM. ....................................................................................................................... 124 4.6.1.3.- Protocolo de Comunicaciones entre el Mando y el Receptor. ...................................................... 124

4.6.2.- Ejemplo 1 (Transmisin Simple). ........................................................................................... 126 4.6.3.- Ejemplo2 (Transmisin Compleja). ....................................................................................... 131 4.6.4.- Apertura de una puerta. ....................................................................................................... 140 4.7.- DISEO Y CREACIN DE UN ROBOT RASTREADOR Y COCHE TELEDIRIGIDO. ....................... 146

IES Joan Mir

Pgina 3

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa 1.- Manejo del laboratorio electrnico virtual Proteus. 1.1.- ISIS (Captura y Simulacin de circuitos electrnicos).
1.1.1.- Introduccin.
El laboratorio virtual electrnico PROTEUS VSM de LABCENTER ELECTRONICS, nos permite simular circuitos electrnicos analgicos/ digitales y microprocesados. Es capaz de realizar simultneamente una simulacin hardware y software (Lenguaje de bajo y alto nivel Ensamblador y C respectivamente) en un mismo entorno grfico. Tambin enlaza con una herramienta que nos permite desarrollar las placas para realizar los prototipos. Para ello suministra tres potentes herramientas:
ISIS (Diseo Grfico) VSM(Virtual System Modelling) Simulacin de Componentes. ARES (Diseo de Placas).

Las herramientas tradicionales de diseo seguan el siguiente proceso:


Diseo esquemtico del prototipo Diseo de la Placa Fabricacin de la Placa Creacin del Prototipo Desarrollo del software Pruebas del Prototipo

En caso de error en el prototipo se tiene que repetir el proceso

Con las herramientas de diseo tradicionales, el desarrollo del software y la comprobacin del prototipo, no puede realizarse hasta que este no se desarrolla. Esto puede suponer semanas de retraso. Si se localiza un error hardware, la totalidad del proceso se debe repetir.
Desarrollo del software Fabricacin del Prototipo

Diseo esquemtico del prototipo

Simulacin del Circuito

Diseo de la Placa

Fabricacin de la Placa

En caso de error se depura hasta obtener los resultados adecuados

Usando Proteus VSM, el desarrollo del software puede comenzar tan pronto como el diseo esquemtico este acabado y la combinacin del hardware y el software nos permite testear el prototipo y ver si funciona.

IES Joan Mir

Pgina 4

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


1.1.2.- Captura Electrnica: Entorno Grfico (ISIS)
Isis es un programa de diseo electrnico que permite realizar esquemas que pueden simularse en el entorno VMS y/o pasarlos a un circuito impreso a travs del entorno de ARES. Posee una coleccin de bibliotecas de componentes. Permite crear nuevos componentes y su modelizacin para la simulacin. Sin entrar profundamente en este entorno (Requerira un libro solo para el entorno de ISIS), se va a explicar cmo dibujar cualquier circuito electrnico. El programa de ISIS posee un entorno de trabajo formado por una ventana de trabajo y barras de herramientas.

Comandos de Fichero e Impresin

Comandos de Edicin

Comandos de Visualizacin

Herramientas de Diseo

Barra de Mens

Ventana de Edicin Comandos de rotacin y reflexin Ventana de componentes y Biblioteca Modos de Trabajo

Ventana de Trabajo

Herramientas de Diseo Electrnico Comandos de dibujo Barra de estado Barra de simulacin

Para dibujar el circuito electrnico se deben primero seleccionar el modo componentes Component. y seleccionar el botn P de bsqueda de componentes Pick Devices en las bibliotecas.

Component. Pick Devices

IES Joan Mir

Pgina 5

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Se abre un men asociado a la bsqueda de componentes. Se busca el componente de dos maneras diferentes por categoras o poniendo el nombre o palabra clave en la ventana Keywords (Ejemplo: DAC0808_JOAN)

Permite localiza los componentes por nombre

Represente el smbolo del Componente en ISIS y si est simulado

Permite localiza los componentes por categora, clase y fabricante

Muestra el resultado de la bsqueda de los componentes a que bibliotecas pertenecen y una descripcin breve de cada uno de ellos

Represente el encapsulado del Componente en ARES es decir su encapsulado

Ventana de Edicin

Al localizar el componente adecuado se realiza una doble pulsacin y aparecer en la columna de dispositivos DEVICE. Se puede realizar esta accin tantas veces como componentes se quiera incorporar al esquema. Una vez finalizado el proceso se cierra la ventana de Comandos de Edicin bsqueda de componentes. Antes de situar los componentes en la Ventana de trabajo se pude comprobar la orientacin en la Ventana de Edicin y rotarlos con los Comandos de Edicin.
Columna de Dispositivos DEVICE Una vez seleccionado el componente en la Columna de Dispositivos se pincha sobre la Ventana de Trabajo y este se posiciona. Si pulsamos ms veces sobre dicha ventana se insertaran componentes con una referencia automtica. (Tiene que estar activa para ello seleccionar TOOLS Real Time Anotation).

Si pasamos el ratn por encima del componente, aparece una X en la patilla del componente, esto nos indica que podemos tirar hilo hasta la siguiente pata de otro o el mismo componente.

Recorrido del Ratn

IES Joan Mir

Pgina 6

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Una vez situado los componentes en la Ventana de Trabajo se pueden mover, rotar, copiar, borrar. Para ello se seleccionan con el botn derecho del ratn (Se ponen en rojo) y se seleccionan los Comandos de Edicin en Herramientas de Grupo Comandos de rotacin y reflexin para un solo elemento.

Rotar un solo componente

Rotar un conjunto de componentes

Cada componente electrnico se puede editar, se selecciona con el botn derecho del ratn (Se pone en rojo) y con el botn izquierdo se abre.
Se puede cambiar su referencia y valor Se puede ocultar referencias, Valores, etc.

Se puede cambiar de encapsulado

Se puede excluir de la simulacin

Se puede excluir del diseo de la placa

IES Joan Mir

Pgina 7

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Para la unin de diferentes componentes Sin Cables se pueden utilizar el Icono Inter-sheetTerminal de la caja de Herramientas de Diseo. Este abrir una ventana donde aparecen los diferentes terminales.

Terminal por defecto Terminal de entrada Terminal de salida Terminal Bidireccional Terminal de Alimentacin Terminal de masa Terminal bus

Terminal de entrada Terminal de Alimentacin

Terminal de masa

Terminal de salida

Si queremos unir cables en forma de bus se utiliza el Icono Diseo y etiquetarlos con el icono del Modo de Trabajo
Etiquetado de Cable

de la caja de Herramientas de .
Etiquetado de bus

IES Joan Mir

Pgina 8

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Se pueden introducir Generadores de seal, Voltmetros, Osciloscopios, etc. Utilizando los iconos de las Herramientas de Diseo.

Inter-sheet-Terminal (Terminales)

Device Pin (Patillas de Componentes)

Simulation Graph (Simulacin Grfica)

Tape Recorder (Grabadora)

Generator (Generador)

Voltaje Probe (Sondas de Tensin)

Current Probe (Sondas de Corriente)

Virtual Instruments (Instrumentos Virtuales)

Osciloscopio

Voltmetro (CA)

Generador de Tensin Sinusoidal

1.1.3.- Depuracin de programas.


Una de las caractersticas importantes del PROTEUS VSM es la capacidad de depurar programas fuentes de distintos lenguajes de programacin (Lenguajes ensamblador, C , Basic, etc). La herramienta que se utiliza est en la barra de tareas llamada Source

IES Joan Mir

Pgina 9

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Con la opcin aadir o remover ficheros fuentes Add/Remove Source files introducimos los fichero fuentes que queremos aadir a nuestro hardware y elegimos la herramienta de compilacin (Programa que traduce un lenguaje de programacin a cdigo Binario)

Ficheros Fuente

Cambiar el Fichero Fuente

Herramienta de Compilacin

Nuevos Ficheros Fuente

Quitar Ficheros Fuente

Con la opcin Define Code Generation Tools podemos introducir nuevos compiladores y depuradores de programas.

Se introduce el Compilador C de CCSC para uC PIC dentro del Proteus

Generador de Ficheros

Se introduce el Depurador de Programas en el Proteus

IES Joan Mir

Pgina 10

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Con la opcin Setup External Text Editor podemos elegir el Editor de Texto.
Editor de texto del Compilador CCSC Editor de texto del Proteus

La opcin Build All compila el programa fuente ejecuta el programa que traduce un lenguaje de programacin a cdigo Binario. Si hemos utilizado el editor de texto del Compilador CCSC este nos permite depurar el programa y ver los errores. Abrimos el Fichero Dec_Hex_Bin.c y ejecutamos el Icono Compile
Compila un fichero no un proyecto

Al compilar se genera varios ficheros (ERR, HEX, SYM, LST, COF, PJT, TREE, STA) . El fichero con Dec_Hex_Bin.COF, nos permite depurar el Programa en el Proteus y el fichero Dec_Hex_Bin.HEX es el cdigo binario que se introduce de forma real al uC PIC. IES Joan Mir Pgina 11

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


La forma de introducir el fichero Dec_Hex_Bin.COF en un microcontrolador uC PIC es seleccionar lo con el botn derecho del ratn (El uC PIC se pondr en color rojo) y pulsar el botn izquierdo. Se abrir una ventana contextual e introduciremos el fichero.COF.

Pulsar con el botn derecho del ratn y despus con el botn izquierdo

Pulsar con el botn Izquierdo del ratn y buscar el fichero.COF deseado

La frecuencia del reloj se fija aqu independientemente del hardware que se utilice externamente (Cristal de Cuarzo)

Una vez cargado del microcontrolador con el programa fuente Dec_Hex_Bin.COF , se puede proceder a la simulacin del circuito empleando la Barra de Simulacin.

Marcha

Paso a Paso

Pausa

Stop

IES Joan Mir

Pgina 12

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Con la opcin Marcha la simulacin se inicia (el botn se vuelve verde) y funciona en modo continuo. La simulacin no es en tiempo real. Con la opcin Stop la simulacin se para. Con la opcin Paso a Paso permite trabajar en tramos de tiempo predefinidos, permitiendo utilizar herramientas de depuracin. Esta opcin est asociada a la configuracin de Animacin, que est en la Barra de Mens en SYSTEM Set Animation Options.
Tiempo de simulacin por cada uno de los Frames (Suele ser el valor inverso a Frames per Second) Se muestra las corrientes y tensiones de las puntas de prueba que tengamos en el circuito

Nmero de veces que la pantalla de ISIS se refresca en 1 Segundo

Se muestra en las patillas de circuitos de Lgica Digital unos cuadrito de color rojo 1 o azul 0

Los cables de los esquemas toman diferentes colores en funcin de la intensidad que pasen por ellos.

Incremento de tiempo que se desea cada vez que se pulsa la tecla Paso a Paso

Si los valores en la simulacin son inferiores a estos valores, no se visualizan los efectos de Animation Options

Se muestran en los cables de los esquemas el sentido de las Intensidades.

La opcin SPICE Options define las caractersticas de simulacin del sistema. Son parmetros que podemos manipular para obtener ms precisin en la simulacin (No se aconseja tocar si se desconocen) Si disminuimos los parmetros RELTOL, GMIN y PIVTOL el sistema converge antes, pero es menos preciso. Aqu , ya se puede simular (Animar) un sistema con microcontroladores .Lo ms interesante de una simulacin es la utilizacin de las herramientas de depuracin que contiene este sistema de desarrollo. A estas herramientas se accede pulsando primero Pausa de la Barra de Tareas y despus Debug de la Barra de Mens.

IES Joan Mir

Pgina 13

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

Barra de Simulacin

Ejecucin de un programa sin puntos de ruptura.

Ejecucin de un programa hasta un tiempo determinado

Herramientas de Ejecucin de un programa Paso a Paso

Visualizacin de las variables creadas por el usuario y las propias del microcontrolador, con la simulacin en marcha.

Visualizacin del programa fuente para poder utilizar las herramientas de ejecucin paso a paso.

Visualizacin de las variables del sistema mientras se estn utilizando las herramientas de ejecucin paso a paso.

Visualizacin de los registros del uC utilizando las herramientas de ejecucin paso a paso.

Visualizacin de la memoria de datos del uC utilizando las herramientas de ejecucin paso a paso.

Visualizacin de la memoria de Programa del uC utilizando las herramientas de ejecucin paso a paso.

Visualizacin de la memoria Pila del uC utilizando las herramientas de ejecucin paso a paso.

Visualizacin de la memoria EPROM del uC utilizando las herramientas de ejecucin paso a paso.

La ventana Watch Window es la ms verstil se pueden aadir variables propias y del uC y visualizarlas en plena simulacin.

IES Joan Mir

Pgina 14

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Si se pincha con el botn derecho del ratn sobre la ventana Watch Window aparece un men contextual siguiente:
Permite aadir variables del uC PIC

Permite aadir variables propias

Permite poner puntos de ruptura al programa en funcin de determinadas variables

Permite seleccionar todas las variables

Buscar variables

Indica el Tipo de variables (Tiene que estar seleccionada la variable)

Muestra el formato de la variables Binario, Decimal, Hexadecimal, etc. (Tiene que estar seleccionada la variable)

IES Joan Mir

Pgina 15

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Si queremos ejecutar un programa en modo depuracin, tenemos que realizar los siguientes pasos: 1.- Crear una carpeta para contener el hardware y el software Representacin en Binario, BCD, Hexadecimal 2.- Crear un Sistema Microprocesado con PIC en la ventana de trabajo de ISIS 3.- Generamos un programa en C Dec_Hex_Bin.c desde Source ADD/Remove Source filesNew. 4.- Compilamos el Programa desde CCSC. (Se genera el fichero. COF Dec_Hex_Bin.COF) 5.- Introducimos el fichero.COF Dec_Hex_Bin.COF dentro del uC PIC. 6.- Ejecutamos Paso a Paso Pause de la Barra de Simulacin. 7.- Pinchamos Debug y abrimos las ventanas siguientes:
Watch Windows PIC CPU Source Code - U1 PIC CPU Variables - U1 PIC CPU Registers - U1

8.- Ejecutamos paso a paso el programa desde PIC CPU Source Code - U1 utilizando las Herramientas de Ejecucin y visualizamos como varan las variables y el hardware. Es conveniente poner puntos de ruptura y ejecutar de golpe el programa hasta dicho punto.

El triangulo indica la instruccin que se va a ejecutar

IES Joan Mir

Pgina 16

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Simulacin en modo continuo, no permite ver las ventanas de depuracin a excepcin de Watch Window Permite ejecutar una instruccin. Si es una subrutina o una funcin entra dentro de ella.

Habilita o deshabilita los punto de ruptura.

Ejecuta una instruccin, subrutina funcin de golpe

Trabaja de modo continuo hasta que encuentra un retorno de cualquier subrutina o funcin y sale de ella.

Trabaja de modo continuo hasta que encuentra un punto de ruptura.

1.2.- Ares (Diseo de Placas).


En este manual de ARES se mostrar los pasos bsicos para realizar el rutado de una placa PCB, no se pretende ensear de forma precisa el manejo del programa pero s las funciones principales del mismo. Pasos a seguir:

1.2.1.- Diseo de un esquema con ISIS.


Buscar componentes que tengan el encapsulado o huella (PCB)

Componente a buscar

Encapsulado(PCB)

IES Joan Mir

Pgina 17

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Dibujamos el esquema.

Antes de realizar la placa comprobar si algn componente tiene pines o patillas ocultas. Los Circuitos Integrados ocultan los pines de masa GND, VSS y alimentacin VCC , VDD.

Editamos el Componente

Si est la pestaa Hidden Pins indica que existen patillas ocultas

IES Joan Mir

Pgina 18

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

Vemos que patillas estn ocultas pinchando sobre las pestana Hidden Pin

Patillas ocultas

Para que estas patillas GND VCC se conecten en un circuito real, se tienen que etiquetar los cables donde queremos unir. Seleccionamos de la barra Modos de Trabajo el icono etiquetado de cable Wire Label
Etiquetado de Cable

Wire Label

Modos de Trabajo

Buscamos una Masa Tierra GROUND. Seleccionamos el cable que est unido a ella con el botn derecho del ratn (Se pone rojo) y pulsamos el botn izquierdo. Se abre un men contextual y escribimos GND. E Buscamos una masa GND y seleccionamos el cable con el botn derecho del ratn.

Se abre el men contextual y escribimos GND.

IES Joan Mir

Pgina 19

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Buscamos el positivo de la Pila de 5V. Seleccionamos el cable que est unido a ella con el botn derecho del ratn (Se pone rojo) y pulsamos el botn izquierdo. Se abre un men contextual y escribimos VCC.
Buscamos el positivo de la pila de 5V y seleccionamos el cable con el botn derecho del ratn.

Se abre el men contextual y escribimos VCC.

El resultado es el siguiente:
Todos los componentes tienen que tener nombre (Ejemplo: R1, E2, etc ), si no lo tuvieran no apareceran en el diseo de la placa.

Nota: Cuando etiquetamos


con VCC el cable la simulacin no funciona

IES Joan Mir

Pgina 20

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

1.2.2.- Generacin del listado de conexiones Netlis to Ares.


Pulsamos el icono de Herramientas de Diseo ARES
Herramientas de Diseo

Herramienta de diseo de placas PCB

ARES
Si algn componente no tuviera mscara te pedira que la insertaras, aparece un men contextual: Dentro de una Biblioteca de
Seleccionamos el Encapsulado componentes Componente sin encapsulado

Pulsamos con el botn izquierdo del ratn y aparecer aqu

Despus de asignar las mscaras a los componentes que no las tenan aparece la Aplicacin ARES

Aparecen todos los componentes que tienen encapsulado para el diseo de placas

IES Joan Mir

Pgina 21

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


1.2.2.1.- Entorno de Trabajo
Comandos de archivos y de Impresin Comandos de Visualizacin

File/Print Commands

Display Commands

Barra de Mens

Ventana de Edicin

Comandos de Edicin

Herramientas de Diseo

Editing Commands
Herramientas de Posicionamiento y Rutado

Layout Tools

Placing & Routing


Herramientas de emplazamientos de PAD

Pad Placement
Herramientas de diseo grfico

2D Graphics

Selector de Objetos

Ventana de Trabajo

Object Selector

Herramientas de Rotacin y Reflexin

Selector de Caras

Rotation & Reflection

Layer Selector

Barra de Estado

Test de errores

1.2.3.- Creacin del tamao de la placa de PCB.


Una vez situados los componentes en el Selector de objetos Object Selector con las Herramientas de diseo grfico 2D Graphics seleccionamos la cuadrado 2D Graphics box
Cuadrado

2D Graphics box
Herramientas de diseo grfico

2D Graphics

IES Joan Mir

Pgina 22

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Con el Selector de Caras Layer Selector seleccionamos borde de placa Board Edge

Borde de placa

Board Edge

Selector de Caras

Layer Selector

Con el ratn nos situamos en la Ventana de Trabajo y dibujamos el tamao de la placa. Ponemos las cotas y los agujeros para sujetar la placa a un soporte.

Borde de placa

Board Edge
Cotas Agujeros para sujetar la placa a un soporte

Para poner los agujeros para sujetar la placa a un soporte buscamos en Herramientas de diseo grfico 2D Graphics seleccionamos el circulo 2D Graphics circle

Cuadrado

2D Graphics circle
Herramientas de diseo grfico

2D Graphics

Con el Selector de Caras Layer Selector seleccionamos borde de placa Board Edge

Borde de placa

Board Edge

Selector de Caras

Layer Selector

Con el ratn nos situamos en la Ventana de Trabajo y dibujamos el circulo. IES Joan Mir Pgina 23

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Para poner las Cotas, elegiremos si queremos trabajar en pulgadas o en milmetros. Si queremos milmetros vamos a los Comandos de Visualizacin y pinchamos sobre el icono Select Metric/ Imperial Coordinates
Comandos de Visualizacin

Display Commands

Milmetros/Pulgadas

Select Metric/ Imperial Coordinates

Se visualiza en la parte baja derecha de la Ventana de trabajo.

Coordenadas X/Y en mm

Estas coordenadas X/Y son con respecto a el punto de origen que est en el centro de la Ventana de trabajo Si queremos resolucin a la hora de dibujar (Pistas, Cotas, Tamaos de Placa, etc.), tenemos que cambiarla, para ello vamos a la Barra de Mens y seleccionamos VIEW y cambiamos dicha resolucin. Una vez realizado los ajustes adecuados, procedemos a poner las cotas. Para ello, buscamos en Herramientas de diseo grfico 2D Graphics y seleccionamos Cotas Dimension object placement

Herramientas de diseo grfico

2D Graphics
Cotas

Dinension object placement

Con el Selector de Caras Layer Selector seleccionamos borde de placa Board Edge

Borde de placa

Board Edge

Selector de Caras

Layer Selector

Con el ratn nos situamos en la Ventana de Trabajo y dibujamos las Cotas.

IES Joan Mir

Pgina 24

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa 1.2.4.- Posicionamiento de los componentes dentro de la placa.
Existen dos posibilidades a la hora de situar los componentes.

1.2.4.1.- Posicionamiento Automtico.


Seleccionar en las Herramientas de Diseo Layout Tools el icono Posicionamiento Automtico dentro de la Placa Autoplace the components onto the board.

Herramientas de Diseo

Layout Tools

Posicionamiento Automtico dentro de la Placa

Autoplace the components onto the board

Se abre este men contextual marcamos las reglas de diseo y seleccionamos los componentes que queremos posicionar de forma automtica.
Reglas de Diseo y Peso

Marcamos que componentes queremos posicionar de forma automtica

Restaurar valores

No obstante se puede posicionar determinados componentes de forma manual y el resto de forma automtica.

IES Joan Mir

Pgina 25

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa 1.2.4.2.- Posicionamiento Manual.


Seleccionamos el icono de Edicin y situacin de componentes Component placement and editing de Herramientas de Posicionamiento y Rutado Placing & Routing y aparecen los componentes de diseo de la placa en ISIS.
Edicin y situacin de componentes

Component placement and editing

Herramientas de Posicionamiento y Rutado

Placing & Routing

Componentes de diseo de la placa en ISIS

Selector de Objetos

Object Selector

Situamos los componentes en la placa, para ello posicionamos el ratn sobre la placa y pulsamos el botn izquierdo del ratn y el componente que este marcado en azul en el Selector de Objetos Object Selector se insertara en la placa.

Uniones entre componentes

Netlis

IES Joan Mir

Pgina 26

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Los componentes puestos en la placa se pueden mover, cortar, copiar, etc con los Comandos de Edicin (Conjunto de componentes) y las Herramientas de Rotacin y Reflexin (Un solo componente). Se seleccionan el los componentes con el botn derecho del ratn (Se ponen en rojo) y despus se selecciona la herramienta que queremos utilizar (Rotar, mover, etc).
Rotacin a Derecha de un componente (90) Rotacin a Izquierda de un componente (-90) Reflexin a Derechas de un componente Reflexin a Izquierda de un componente

Herramientas de Rotacin y Reflexin

Rotation & Reflection

Deshacer o rehacer operaciones realizadas

Comandos de Edicin

Editing Commands
Borrar un conjunto de componente Rotacin de un conjunto de componente

Copiar un conjunto de componente Mover un conjunto de componente

1.2.5.- Rutado de la pistas.


Existen dos posibilidades a la hora de realizar el ruteado. Pero antes de rutar, podemos marcar las estrategias de diseo. Para realizarlo nos vamos a la Barra de Men y seleccionamos System Set_Strategies Marcamos las estrategias para pistas de potencia y para pistas de seal.

Pistas de Potencia Tipo de prioridad Tamao de las Pistas Tamao de las Vas Tamao de las Vas Tipo cuello Pistas Horizontales y Verticales. Se trazan por las Capas Superiores Optimizar las esquinas

Tcticas de rutado

Tipo de Vas Normales Ciegas Superiores Ciegas Inferiores Ocultas

Reglas de diseo Distancia mnima entre PADs . Distancia mnima entre PAD y Pista . Distancia mnima entre Pista . Distancia mnima a Grficos. Distancia mnima al Borde de la Placa o Ranuras.

IES Joan Mir

Pgina 27

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

Pistas de Seal

Pistas Horizontales y Verticales. Se trazan por las Capas Inferiores

1.2.5.1.- Rutado Automtico.


Seleccionar en las Herramientas de Diseo Layout Tools el icono Diseo automtico de pistas Autorouter the conections specified by de ratsnest.

Herramientas de Diseo

Layout Tools

Diseo automtico de pistas especificadas por las conexiones

Autorouter the conections specified by de ratsnest

Se abre este men contextual marcamos las reglas de diseo y seleccionamos los componentes que queremos posicionar de forma automtica.

Son las estrategias de la Barra de Men seleccionando System y Set_Strategies

Opciones de Rutado Permiso de rutado Permiso de Ordenamiento Proteccin manual de las pistas trazadas manualmente

IES Joan Mir

Pgina 28

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


El diseo quedara:

1.2.5.2.- Rutado manual.


Para el rutado manual tenemos las Herramientas de Posicionamiento y Rutado Placing & Routing

Edicin y situacin de componentes

Component placement and editing (Componentes del Diseo)

Edicin y situacin de las mascaras

Package placement and editing (Nos permite editar los encapsulados y aadir otros tipos de encapsulados que no son del proyecto). (Abre el director de Biblioteca de encapsulados)

Herramientas de Posicionamiento

Placing & Routing

Selecciona el Tipo de Pistas

Track placement and editing

Selecciona el Tipo de Vas

Via placement and editing

Planos de Masa o Alimentacin

Zone placement and editing

IES Joan Mir

Pgina 29

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Si queremos tirar pistas por la cara de abajo de la placa procedemos de la siguiente manera: Seleccionamos el Tipo de Pistas Track placement and editing

Selecciona el Tipo de Pistas

Track placement and editing


Herramientas de Posicionamiento

Placing & Routing

Con el Selector de Caras Layer Selector seleccionamos pistas de tipo Bottom Cooper

Tipo de Pista

Selector de Caras

Botton Cooper

Layer Selector

Con el ratn nos situamos en la Ventana de Trabajo y dibujamos la pista de una patilla a otra siguiendo las uniones entre componentes Netlis.

IES Joan Mir

Pgina 30

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Si queremos tirar pistas por la cara de abajo, pasar por una va y tirar pistas por la capa de arriba procedemos de la siguiente manera: Seleccionamos el Tipo de Pistas Track placement and editing

Selecciona el Tipo de Pistas

Track placement and editing

Herramientas de Posicionamiento

Placing & Routing

Con el Selector de Caras Layer Selector seleccionamos pistas de tipo Bottom Cooper

Tipo de Pista

Bottom Cooper

Selector de Caras

Layer Selector

Con el ratn nos situamos en la Ventana de Trabajo y dibujamos la pista Bottom Cooper de una patilla a otra siguiendo las uniones entre componentes Netlis, pulsas dos veces con el botn izquierdo del ratn segn estas trazando la pista, sale una VA y las pistas pasan a ser Top Cooper, seguimos trazando la pista y si pulsas otras dos veces con el botn izquierdo del ratn sale una VA y las pistas pasan a ser Bottom Cooper. Otra forma ms fcil es poner VA y trazar las pistas con Bottom Top Cooper . Selecciona el Tipo de Vias
Via placement and editing

Pista Bottom Cooper

VIA Pista Bottom Cooper

Tamao de la VIA

IES Joan Mir

Pgina 31

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Si queremos que una determinada zona de una cara sea un plano de masa o alimentacin podemos utilizar Zone placement and editing de las Herramientas de Posicionamiento y Rutado Placing & Routing

Herramientas de Posicionamiento Planos de Masa o Alimentacin

Placing & Routing

Zone placement and editing

Con el Selector de Caras Layer Selector seleccionamos pistas de tipo Bottom Cooper

Tipo de Zona

Top Cooper
Selector de Caras

Layer Selector

Con el ratn nos situamos en la Ventana de Trabajo y dibujamos la Zona que queremos de cobre. Aparece un men contextual donde decimos tamao de la zona de cobre, Zonas de clareo, etc.

Tamao de las Zona de Cobre

Clareo

La placa queda:

IES Joan Mir

Pgina 32

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

Si queremos cambiar el tamao o la forma de los PAD de un determinado componente utilizar herramientas de emplazamientos de PAD Pad Placement
PAD Redondo PAD Cuadrado PAD tipo DIL Herramientas de emplazamientos de PAD

Pad Placement

Seleccionamos el tipo de PAD.

Tipo de PAP Tamao del PAP

Pinchamos el PAD de un componente de nuestro circuito y este se sustituye.


Tamao del PAP Tamao del PAP

S50-25

S90-50

IES Joan Mir

Pgina 33

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Utilizando las herramientas de diseo de placas que nos proporciona ARES tenemos como resultado el siguiente circuito:

1.3.- Creacin de smbolos en ISIS y encapsulados en ARES.


1.3.1.- Creacin de una biblioteca de encapsulados en ARES.
Para crear una Biblioteca propia en ARES, se deben primero seleccionar el modo de edicin y situacin de componentes Package placement and editing. y seleccionar el botn L de manejo de Bibliotecas Manage Libraries.

Edicin y situacin de los Encapsulados

Package placement and editing

Herramientas de Posicionamiento y Rutado

Placing & Routing

Manejo de Bibliotecas

Manage Libraries

Se abre un men contextual, donde podemos crearnos nuestra propia Biblioteca, aadir encapsulados de otra Biblioteca, borrar encapsulados, etc.

IES Joan Mir

Pgina 34

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

Creacin de una Biblioteca

Cuando pulsamos Create Library tenemos que dar un nombre a la biblioteca Robtica_ARES y donde queremos crear la biblioteca C:\Archivos de Programa\Labcenter Electronic\Proteus 6 Professional\Library.

Nos pedir un nmero mximo de Encapsulados.

Mximo 4000

Pulsamos OK y la biblioteca se crea. En la biblioteca nueva Robtica_ARES, podemos copiar componentes CONN-DIL8 de otras bibliotecas CONNECTORS. Seleccionamos el encapsulado y damos al icono de copiar Copy Items

IES Joan Mir

Pgina 35

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

Biblioteca Robtica_ARES

Confirmacin de copia

1.3.2.- Creacin de un encapsulado en ARES.


a) Dibujamos el componente sin PAD. Abrimos el ARES y seleccionamos Herramientas de diseo grfico 2D Graphics. Con el Selector de Caras Layer Selector seleccionamos borde de encapsulado Top Silk y dibujamos el encapsulado.
Borde de Encapsulado

Top Silk

Herramientas de diseo grfico

2D Graphics

Selector de Caras

Layer Selector

IES Joan Mir

Pgina 36

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


b) Le aadimos los PAD. Seleccionamos PAD Redondo de las Herramientas de emplazamiento de PAD Pad Placement los insertamos en el encapsulado dibujado.

PAD Redondo

Herramientas de emplazamientos de PAD

Pad Placement

Tamao del PAP

c) Editamos el PAD (Poner un nmero) Seleccionamos el PAD con el botn derecho del ratn del ratn El PAD se pone blanco y pulsamos el izquierdo. Numeramos el PAP U con 1.

Numeramos el PAP

d) Hacer el encapsulado y almacenarlo. Seleccionamos el encapsulado con el botn derecho del ratn (se pone en blanco), pinchamos sobre el icono de realizar un encapsulado Make Package de los Comandos de edicin
Comandos de Edicin

Editing Commands

Hacer el encapsulado

Make Package

IES Joan Mir

Pgina 37

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Aparece un men contextual y escribimos el nombre de la huella MOTOR-TRI_ROBOTICA su categora Connectors, tipo de agujero de PAD agujero pasante Through Hole y la biblioteca donde se almacena Robtica_ARES

Nombre del Encapsulado

Categora

Tipo de agujero del PAD

e) Deshacer el encapsulado y almacenarlo.

Biblioteca donde se almacena

Seleccionamos el encapsulado con el botn derecho del ratn (se pone en blanco), pinchamos sobre el icono de deshacer encapsulados. Decompose de los Comandos de edicin
Comandos de Edicin

Editing Commands

Deshacer el Encapsulado

Decompose

Variamos el encapsulado, lo seleccionamos con el botn derecho del ratn y volvemos almacenarlo pulsando Make Package

IES Joan Mir

Pgina 38

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


1.3.3.- Creacin de una biblioteca de smbolos en ISIS.
Para crear una biblioteca propia en ISIS, se deben primero seleccionar el modo componentes Component. y seleccionar el botn L de manejo de bibliotecas Manage Device Libraries.
Component. Manage Device Libraries

Se abre un men contextual , donde podemos crearnos nuestra propia biblioteca, aadir smbolos de otra biblioteca, borrar smbolos, etc.
Creacin de una Biblioteca

Cuando pulsamos Create Library tenemos que dar un nombre a la biblioteca Robtica_ISIS y donde queremos crear la biblioteca C:\Archivos de Programa\Labcenter Electronic\Proteus 6 Professional\Library.

Nos pedir un nmero mximo de simbolos.

Mximo 4000

IES Joan Mir

Pgina 39

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Pulsamos OK y la biblioteca se crea. En la biblioteca nueva Robtica_ISIS, podemos copiar componentes 2N2907 de otras bibliotecas Bipolar. Seleccionamos el encapsulado y damos al icono de copiar Copy Items

Biblioteca Robtica_ISIS

Confirmacin de copia

IES Joan Mir

Pgina 40

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


1.3.4.- Creacin de un smbolo en ISIS.
a) Dibujamos el componente sin patillas. Abrimos el ISIS y seleccionamos Comandos de Dibujo

Comandos de Dibujo

b) Le aadimos pines patillas. Seleccionamos Patillas de Componentes Device Pin de las Herramientas de Diseo

Tipo de Pin

Patillas de Componentes Device Pin

Herramientas de Diseo

Ponemos los pines en el dibujo realizado, teniendo en cuenta lo siguiente:


Que los caracteres no estn excesivamente prximos al pin (El pin no conectar con el hilo si esto ocurre y habra que descomponer el componente y modificarlo). Que el tipo de de rejilla sea mayor de Snap 50th (Ver View de la Barra de Mens), para poder insertar el hilo de forma ms cmoda.

c) Editamos el pin (Poner el nombre y nmero) Seleccionamos el pin con el botn derecho del ratn del ratn El pin se pone rojo y pulsamos el izquierdo. Nombramos al Pin U y lo numeramos 1.

IES Joan Mir

Pgina 41

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Nombre Nmero

d) Hacer el smbolo y almacenarlo. Seleccionamos el smbolo con el botn derecho del ratn (se pone en rojo), pinchamos sobre el icono de realizar un dispositivo Make device de los Comandos de edicin
Comandos de Edicin

Make device Aparece un men contextual y escribimos el nombre del componente MOTOR-TRI_ROBOTICA y un parmetro de referencia M.

IES Joan Mir

Pgina 42

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Pulsamos Next aparece otra ventana donde podemos asignarle el encapsulado fsico (Si esta creado lo asignamos, se puede no asignar y pasar a la siguiente ventana contextual). Pulsamos aadir encapsulado Add/Edit .

Aadir Encapsulado

Aparece un men contextual donde pulsamos aadir el encapsulado

Aadir Encapsulado

IES Joan Mir

Pgina 43

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Aparece otro men contextual que abre el ARES y elegimos el encapsulado adecuado.

Elegimos el encapsulado adecuado MOTOR-TRI_ROBOTICA Ponemos la palabra clave MOTOR y aparecen diferentes motores

Vista del encapsulado

Aparece otro men contextual en el que podemos aadir pines y poner este encapsulado como principal.

Encapsulado por defecto

Aadir Pines

Usar Bibliotecas de ARES

IES Joan Mir

Pgina 44

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Si pulsamos asignacin de huella Assign Package(s) esta queda asignada al smbolo de ISIS

Se abre otro men contextual donde se puede introducir el modelo de componte simulado

IES Joan Mir

Pgina 45

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Se abre otro men contextual donde se puede introducir un documento donde se especifique sus caractersticas Data Sheet

Introduccin del Documento

Se abre otro men contextual donde se le asigna categora, Biblioteca.

Categora

Biblioteca

IES Joan Mir

Pgina 46

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


e) Deshacer el smbolo y almacenarlo. Seleccionamos el smbolo con el botn derecho del ratn (se pone en rojo), pinchamos sobre el icono de deshacer un dispositivo Decompose de los Comandos de edicin
Comandos de Edicin

Deshacer el smbolo

Decompose

Variamos el simbolo, lo seleccionamos con el botn derecho del ratn y la volvemos almacenarlo pulsando Make Device

2.- Principios de funcionamiento de un Microcontrolador PIC.


Antes de definir un sistema digital basado en microcontroladores habra que definir un sistema basado en microprocesadores. Un microprocesador es bsicamente un chip que contiene la CPU (Central Proccesing Unit) que se encarga de controlar todo un sistema. Un sistema digital basado en un microcontrolador es un sistema abierto ya que su configuracin difiere segn a la aplicacin a la que se destine. Se pueden acoplar los mdulos necesarios para configurarlo con las caractersticas que se desee. Para ello se saca al exterior las lneas de sus buses de datos, direcciones y control de modo que permita su conexin con la memoria y los mdulos de entrada/ salida. Finalmente resulta un sistema implementado por varios circuitos integrados dentro de una misma placa de un circuito impreso.

IES Joan Mir

Pgina 47

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Un microcontrolador es un sistema cerrado, lo que quiere decir que en un solo circuito integrado, se disea un sistema digital programable completo. Este dispositivo, se destina a gobernar una sola tarea que no se puede modificar. Disponen de los bloques esenciales como CPU, memorias de datos y de programa, reloj, perifricos de entrada/salida, etc. Existen multitud de fabricantes de microcontroladores Intel, Motorola, Microchip, etc. Los microcontroladores PIC de la casa Microchip se caracterizan por ser baratos, por proporcionar un entorno de desarrollo integrado gratuito MPLAB . Este entorno permite editar un el archivo fuente del proyecto, ensamblarlo, simularlo en un Ordenador Personal y comprobar la evolucin de las variables en la memoria RAM, registros, etc. Los microcontroladores PIC se caracterizan por lo siguiente:
Tienen una arquitectura Hardvard utiliza dos tipos de memorias (Datos y Programa) con buses independientes.
Memoria de Programa y de Datos Memoria de Programa Buses (EEPROM) Memoria de Datos (RAM) Buses

CPU
Buses

CPU

Arquitectura Von Neumann

Arquitectura Hardvard

Utilizan un procesamiento segmentado o Pipeline que permiten realizar dos procesos simultneamente a la vez (lectura y ejecucin de instrucciones).

PROGRAMA
1. BSF STATUS,RP0 2. CLRF TRISB 3. MOVLW 0XFF 4. MOVWF TRISA

1 Ciclo Bsqueda 1

2 Ciclo Ejecuta 1 Bsqueda 2

3 Ciclo

4 Ciclo

5 Ciclo

Ejecuta 2 Bsqueda 3 Ejecuta 3 Bsqueda 4 Ejecuta 4

Tiene un reducido grupo de instrucciones (RISC Reduced Instruction Set Computer). Son instrucciones simples que se ejecutan en un solo ciclo mquina (4 ciclos de reloj). El microcontrolador PIC16F876A tiene 35 instrucciones.

Tiene una estructura Ortogonal es decir que una instruccin puede utilizar cualquier elemento de la arquitectura como fuente o destino de datos.

IES Joan Mir

Pgina 48

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


El microcontrolador PIC 16F876A es un CHIP de 28 patillas, que se caracteriza por lo siguiente:
Tiene 35 Instrucciones Tiene una Memoria de Programa de 8192 palabras FLASH 368 byte de Memoria de Datos RAM 256 byte de EEPROM 22 Patillas de entradas/salidas. Sistema de Adquisicin de datos (5 Entradas Analgicas) 2 mdulos de CCP y PWM. (Comparacin y captura de datos y generadores de seal por Modulacin de Anchura de Pulsos). Un mdulo de comunicacin serie SPI (Serial Peripheral Interface) I2C (Inter-Integrated Circuit). Un transmisor-receptor asncrono serie universal USART. 3 Timer (Temporizadores/Contadores). 2 Comparadores de seales analgicas.

2.1.- Diagrama en bloques.

IES Joan Mir

Pgina 49

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa 2.2.- Mapa de memoria.


2.2.1.- Memoria de Programa.
Es una memoria tipo FLASH, los programas son almacenados en este tipo de memoria, cuando se desconecta la alimentacin la informacin almacenada no se pierde.(La memoria flash es una
forma desarrollada de la memoria EEPROM que permite que mltiples posiciones de memoria sean escritas o borradas en una misma operacin de programacin mediante impulsos elctricos, frente a las anteriores que slo permite escribir o borrar una nica celda cada vez. Por ello, flash permite funcionar a velocidades muy superiores cuando los sistemas emplean lectura y escritura en diferentes puntos de esta memoria al mismo tiempo.), est compuesta por:

8192 palabras de 14bit. (Cada instruccin ocupa solo una palabra). Una pila de 8 niveles. Un solo vector de Interrupcin. Vector de Reset (Direccin 0000h) 4 zonas de memoria.

2.2.2.- Memoria de Datos.


Es una memoria de tipo RAM (Memoria de Acceso Aleatorio), se pierde la informacin cuando se desconecta la alimentacin Est compuesta por 4 bancos de trabajo. Contiene registros (Tipo Byte) de 2 tipos:
Registros de funciones especiales SFR que sirven para comunicarnos con el hardware interno del PIC. Registro de Propsito General que nos sirven para almacenar nuestras variables de nuestro programas.

IES Joan Mir

Pgina 50

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa 3.- Iniciacin a la programacin en C en uC PIC. 3.1.- Compilador CCS.
3.1.1.- Introduccin.
Un compilador convierte el lenguaje de alto nivel a instrucciones en cdigo mquina. El compilador CCS C es un compilador cruzado cross-compiler realizado para un determinado grupo de microcontroladores PIC (Se desarrolla un lenguaje de alto nivel C partiendo de instrucciones de bajo nivel Ensamblador de los microcontroladores PIC). El Compilador C de CCS ha sido desarrollado especficamente para PIC. Dispone de una amplia librera de funciones predefinidas, comandos de preprocesado y ejemplos. Adems, suministra los controladores (driver) para diversos dispositivos como LCD, convertidores AD, relojes de tiempo real, EEPROM serie, etc. Las caractersticas generales de este compilador se pueden encontrar en la direccin www.ccsinfo.com. Los programas son editados y compilados a instrucciones mquina en el entorno de trabajo del PC. Estos programas pueden ser depurados con diferentes sistemas de desarrollo MPLAB , Proteus, etc. El cdigo mquina puede ser cargado desde el PC al microcontrolador PIC mediante cualquier programador (ICD2, Bootloader, etc.). El Lenguaje C de CCS C es estndar que incluye las directivas (#include, etc.), suministra unas directivas especificas para PIC (#DEVICE,ETC.); adems incluye funciones especficas (bit-self(), etc.) . (Mirar el manual de CCS C). Se suministra con editor que permite controlar la sintaxis del programa.

3.1.2.- Estructura de un programa.


Para escribir un programa en C con el CCS C se deben tener en cuenta los elementos bsicos de su estructura.
Directivas de Preprocesado: Controlan la conversin del programa al cdigo mquina por parte del compilador. Declaracin de las Funciones: Indicamos que tipo de funcin es. Programas o Funciones: Conjunto de Instrucciones. Pueden existir varios. Tiene que existir uno como principal llamado void main(). Instruciones: Indican cmo debe comportarse el uC PIC.

Comentarios: Permiten describir lo que significa cada lnea del programa

IES Joan Mir

Pgina 51

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


/* El Puerto C puede tomar valores comprendidos entre 0 y 255 Si el Puerto C es 0 realizar la funcin de mostrar por el Display de 7 segmentos los nmeros del 0 al 9 con una cadencia de 1 segundo. Despus de este proceso apagar el Display. Si el Puerto C es 1 realizar la funcin de simulacin de las luces del coche fantstico. Nombre despus de este proceso apagar los Led. Si el Puerto C es distinto de 0 y 1 realizar una funcin de la raz cuadrada del dato ledo y devolverlo en una variable llamada resultado y mostrarlo en el Puerto B */

del Programa

/* ***************************** Directivas de Preprocesado************************************************* */ // (Controlan la conversin del programa a cdigo maquina por parte del compilador) #include <16F877A.h> // Incluye el fichero 16F877A al programa tiene que estar en la misma // carpeta del programa. Define funciones, patillas y registros. // Define la palabra de configuracin del microcontrolador PIC // Trabaja con un reloj tipo XT y no utiliza perro guardin Wathdog // Define la frecuencia del reloj de 4 MHz // Libreras de funciones matemticas. // Libreras de simulacin Luces del Coche Fantstico. // Libreras de simulacin representacin de los nmeros en el Display 7Seg. // TRISC en 87h. // PORTC en 07h. // TRISB en 86h. // PORTB en 06h. // TRISA en 85h. // PORTA en 05h. // RC0 en 0x07 patilla 0. // RC1 en 0x07 patilla 1.

#fuses XT,NOWDT #use delay( clock = 4000000 ) #include <math.h> #include <LUCES-COCHE-FANTASTICO.h> #include <REPR-NUMEROS-DISPL.h> #BYTE TRISC = 0x87 #BYTE portC = 0x07 #BYTE TRISB = 0x86 #BYTE portB = 0x06 #BYTE TRISD= 0x85 #BYTE portD = 0x05 #BIT rc0 = 0x07.0 #BIT rc1 = 0x07.1

Directivas de Preprocesado

/* ************************************** Declaracin de funciones ****************************************** */ void VariasCosas (int8); int8 Raiz (int8); // Generacin de la seal cuadrada. // Realiza la raz cuadrada.

Declaracin de Funciones

// ***************************** Funcin principal o programa principal ******************************************* void main() { int8 muestra1; TRISB = 0B00000000; TRISC= 0B11111111; TRISD = 0B00000000; portB = 0B00000000; portD = 0B00000000; while (1) { muestra1 = portC; VariasCosas(muestra1); } } // Leemos el Puerto C. // Ejecuta la funcin VariasCosas definida por la variable muestra1. // Variable muestra1 definida como un entero de 8 bit // Defines Puerto B como SALIDA de datos. // Defines Puerto C como ENTRADA de datos. // Defines Puerto D como SALIDA de datos. // Reseteamos el Puerto B. // Reseteamos el Puerto D. // Ejecuta indefinidamente lo que est entre corchetes.

Indica programa principal

Programa Principal

IES Joan Mir

Pgina 52

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

//******************************** Funcin VariasCosas ****************************************************** void VariasCosas (int8 muestra2) { switch (muestra2) { case 0: LucesFantastico(); break; case 1: NumerosDisplay(); break; default: { portB = Raiz(muestra2); delay_ms(50); } } } //******************************* Funcin Raz *************************************************************** int8 Raiz (int8 muestra3) { int8 resultado; resultado = SQRT (muestra3); return(resultado); } // Llamamos a la funcin LucesFantastico // Preguntamos por la variable muestra2 si es 0 ejecuta el case 0, si es 3 el case 3, // si es distinto de 0 y 3 ejecuta Raz

// Llamamos a la funcin NumerosDisplay

Funcin VariasCosas
// Ejecuta la funcin Raz definida por la variable muestra2. // Temporizamos 50 mS.

Funcin Raz

3.1.3.- Constantes.
Son nmeros, caracteres, etc Las constantes se pueden especificar en decimal, octal, hexadecimal o en binario, etc 123 0123 0b01011011 X Decimal Octal Binario Caracter

IES Joan Mir

Pgina 53

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


3.1.4.- Tipo de variables.
Los programas tienen variables y se ubican en la memoria RAM. Se deben declarar obligatoriamente antes de usarlas. Para ello se debe de indicar el nombre y el tipo de dato que manejar. Se define de la siguiente forma: Tipo Nombre de la Variable = Valor Inicial Tipo de datos: Tipo Int1 Short Int Int8 Int16 Long Int32 Float Char Signed Int8 Signed Int16 Signed Int32 Tamao 1 bit 8 bit 16 bit 32 bit 32 bit 8 bit 8 bit 16 bit 32 bit Rango 0a1 0 a 255 0 a 65535 0 a 4.294.967.295 3,4E 38 (7 dgitos) 0 a 255
-128 a 127 -32.768 a 32.767

Descripcin Entero de 1 bit Entero de 8 bit Entero de 16 bit Entero de 32 bit Coma flotante Carcter Entero con signo Entero largo con signo Entero de 32 bit con signo

-231 a +(231-1)

Ejemplo: Int8 dato=34; // Es una variable de tipo entero de 8 bit (Valores comprendidos entre 0y 255) que se la inicializa con 34. Las variables pueden ser locales es decir solo son validas dentro de la funcin o globales que son validas para todo el programa.

IES Joan Mir

Pgina 54

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


3.1.5.- Operadores.
a) Asignacin. Transfieren datos de una expresin, una constante o una variable, a una variable. Operador = += -= *= /= %= <<= >>= &= |= ^= Ejemplo a=c c+=4 c=4 c*=4 c/=4 c%=4 c <<= 4 c >>= 4 c&=4 c|=4 c^=4 Significado
Asignacin simple. El contenido de c se introduce en a Incrementa c en 4 unidades. Decrementa c en 4 unidades. Modifica c multiplicndolo por 4. Ahora c contendr el cociente de dividir c entre 4. Ahora c contendr el resto de dividir c entre 4. Ahora c contendr el resultado de desplazar 4 bits a la izquierda a la propia variable c. Ahora c contendr el resultado de desplazar 4 bits a la derecha a la propia variable c. Se hace la operacin AND entre los bits de c y los del valor 4. El resultado se almacena en c. Se hace la operacin OR entre los bits de c y los del valor 4. El resultado se almacena en c. Se hace la operacin XOR entre los bits de c y los del valor 4. El resultado se almacena en c.

b) Aritmticos. Sirven para operar con datos numricos. Operador + * / % -++ sizeof Significado
Suma Resta Multiplicacin Divisin Mdulo, resto de una divisin entera Incremento Decremento Determina el tamao en byte, de un operando

c) Relacionales. Sirven para comparar nmeros o caracteres.

Operador < > >= <= == != ?:

Significado Menor que Mayor que Mayor o igual que Menor o igual que Igual Distinto Expresin condicional

d) Lgicos. Permiten crear expresiones lgicas, es decir, basadas en el lgebra de Boole. Una expresin lgica es aquella que da como resultado cierto o falso.

IES Joan Mir

Pgina 55

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Por ejemplo: numero < 5 es una expresin lgica, pues puede ser cierto o falso, dependiendo del valor que tenga la variable numero en el momento de evaluar esa expresin. Los operadores lgicos sirven para concatenar dos o ms expresiones lgicas. El resultado final de evaluar el conjunto de esas expresiones tambin ser verdadero o falso; por lo tanto, esas expresiones juntas tambin formarn una expresin lgica. Ejemplo: (numero < 5) && (nivel >= 2) Tenemos dos expresiones lgicas unidas por un operador lgico, lo que forma otra expresin lgica ms compleja. Si cumple la expresin ser cierta Operador ! && || Significado Negacin (No) Conjuncin (Y) Disyuncin (O)

e) De Bits. Realiza operaciones lgicas a nivel de bits independientes, son vlidos con datos de los tipos char, int, long. Operador ~ & ^ | >> << Significado Negacin de bits (No) Conjuncin de bits (Y) Disyuncin de bits (O) O exclusiva (XOR) Desplazamiento de bits a la izquierda Desplazamiento de bits a la derecha

f) Punteros. Permiten conocer la direccin de memoria en la que est almacenada una variable o una funcin. Tambin sirven para conocer el valor del dato almacenado en una direccin dada. Operador & * -> Significado Direccin Indireccin Puntero a estructura

3.1.6.- Funciones.
Son bloques de sentencias. Al igual que las variables, las funciones deben definirse y declararse antes de utilizarlas. Una funcin puede ser llamada desde una sentencia de otra funcin. Una funcin puede devolver un valor a la sentencia que la ha llamado. Una funcin puede recibir parmetros o argumentos.

IES Joan Mir

Pgina 56

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


/* El Puerto C puede tomar valores comprendidos entre 0 y 255 Si el Puerto C es 0 realizar la funcin de mostrar por el Display de 7 segmentos los nmeros del 0 al 9 con una cadencia de 1 segundo. Despus de este proceso apagar el Display. Si el Puerto C es 1 realizar la funcin de simulacin de las luces del coche fantstico. despus de este proceso apagar los Led. Si el Puerto C si es distinto de 0 y 1 realizar una funcin de la raz cuadrada del dato ledo y devolverlo en una variable llamada resultado y mostrarlo en el Puerto B */
/* ***************************** Directivas de Preprocesado************************************************* */ // (Controlan la conversin del programa a cdigo maquina por parte del compilador) #include <16F877A.h> // Incluye el fichero 16F877A al programa tiene que estar en la misma // carpeta del programa. Define funciones, patillas y registros. // Define la palabra de configuracin del microcontrolador PIC // Trabaja con un reloj tipo XT y no utiliza perro guardin Wathdog // Define la frecuencia del reloj de 4 MHz // Libreras de funciones matemticas. // Libreras de simulacin Luces del Coche Fantstico. // Libreras de simulacin representacin de los nmeros en el Display 7Seg. // TRISC en 87h. // PORTC en 07h. // TRISB en 86h. // PORTB en 06h. // TRISA en 88h. // PORTA en 08h.

#fuses XT,NOWDT #use delay( clock = 4000000 ) #include <math.h> #include <LUCES-COCHE-FANTASTICO.h> #include <REPR-NUMEROS-DISPL.h> #BYTE TRISC = 0x87 #BYTE portC = 0x07 #BYTE TRISB = 0x86 #BYTE portB = 0x06 #BYTE TRISD = 0x88 #BYTE portD = 0x08

Definicin de la Funcin VariasCosas

Definicin de la Funcin Raiz Devuelve un valor entero de 8 bit int8 Recibe una variable entera de 8 bit int8

#BIT rc0 = 0x07.0 // RC0 en 0x07 patilla 0. /* ************************************** Declaracin de funciones ****************************************** */ void VariasCosas (int8); int8 Raiz (int8); // Generacin de la seal cuadrada. // Realiza la raz cuadrada.

Declaracin de Funciones

// ***************************** Funcin principal o programa principal ******************************************* void main()

Funcin Principal
{ int8 muestra1; TRISB = 0B00000000; TRISC = 0B11111111; TRISD = 0B00000000; portB = 0B00000000; portD = 0B00000000; while (1) { muestra1 = portC; VariasCosas(muestra1); } } // Leemos el Puerto C. // Ejecuta la funcin VariasCosas definida por la variable muestra1. // Variable muestra1 definida como un entero de 8 bit // Defines Puerto B como SALIDA de datos. // Defines Puerto C como ENTRADA de datos. // Defines Puerto D como SALIDA de datos. // Reseteamos el Puerto B. // Reseteamos el Puerto D. // Ejecuta indefinidamente lo que est entre corchetes.

LLamada de la Funcin VariasCosas lleva implcita la variable muestra1

IES Joan Mir

Pgina 57

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


//******************************** Funcion VariasCosas ****************************************************** void VariasCosas (int8 muestra2) { switch (muestra2) { case 0: LucesFantastico(); break; case 1: NumerosDisplay(); break; default: { // Preguntamos por la variable muestra2 si es 0 ejecuta el case 0, si es 3 el case 3, // si es distinto de 0 y 3 ejecuta Raz

Funcin VariasCosas lleva implcita la variable muestra2 muestra2 muestra1

Llamada a la Funcin Luces Fantastico


// Llamamos a la funcin LucesFantastico

Llamada a la Funcin NumerosDisplay


// Llamamos a la funcin NumerosDisplay

Llamada a la Funcin Raiz y lleva


implcita la variable muestra2

devuelve un valor de 8bit portB resultado


portB = Raiz(muestra2); delay_ms(50); // Ejecuta la funcin Raz definida por la variable muestra. // Temporizamos 50 mS.

Llamada de una sentencia a otra funcin


} }

LLamada de la Funcin delay_ms lleva implcita el parametro 50

//******************************* Funcion Raiz *************************************************************** int8 Raiz (int8 muestra3) { int8 resultado; resultado = SQRT (muestra3); return(resultado); }

Funcin Raiz lleva implcita la variable muestra3 Muestra3 muestra2

Llamada a la Funcin SQRT y lleva implcita la variable muestra3devuelve un valor de 8bit a resultado

Llamada de una sentencia a otra funcin

Funcin Raiz devuelve el valor de la variable resultado

IES Joan Mir

Pgina 58

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


3.2.- Manejo de las Declaraciones de Control.
Son sentencias lneas de cdigo usadas para controlar el proceso de ejecucin del programa. Antes de ver las sentencias bsicas de un programa vamos a explicar que se entiende por flujo de programa. Se entiende por flujo de un programa el modo en que se avanza de una instruccin a la siguiente dentro de ese programa. Tambin podramos decir que es la forma en que fluyen las instrucciones por el microcontrolador. Existen tres estructuras de control del flujo:

Instruccin 1

Instruccin 1

Instruccin 1

Instruccin 2

no
Condicin

Instruccin 2

Instruccin 3

si
Opcin 1 Opcin 2

Instruccin 3

Instruccin 4

si
Condicin

no
Estructura Secuencial Estructura de seleccin
Instruccin 4

Estructura de repeticin

Estructura secuencial: la siguiente instruccin que se ejecuta es la que est justo a continuacin en el listado del cdigo fuente del programa, y que estar en la siguiente posicin de memoria cuando se compile Estructura de seleccin: dependiendo del resultado de la evaluacin de una condicin, seguidamente se ejecutar una instruccin u otra. De este modo el flujo de instrucciones se divide en dos o ms caminos, aunque si la condicin decide avanzar por un camino se abandonarn los otros (no se puede avanzar por ms de un camino a la vez). Estructura de iteracin o repeticin: la siguiente instruccin que se ejecuta se encuentra antes que la que se acaba de ejecutar, pues ya se ha pasado por ella anteriormente. Diremos que se ha formado un lazo o bucle en el flujo del programa. Normalmente hay que evitar los bucles infinitos, dando la posibilidad de que en algn momento (mediante una condicin) se dejen de repetir las mismas instrucciones.

IES Joan Mir

Pgina 59

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Para entender mejor las declaraciones de control, los ejemplos se van a desarrollar en un entrenador realizado en ISIS.

3.2.1.- If-Else.
La sentencia if-else nos ayuda a tomar decisiones. Se define de la siguiente manera:

if (expresin)
{ Instruccin_1; Instruccin_n; } Instruccin_1 Instruccin _n; Instruccin_a; Incinstruc_z; } Instruccin _a Instruccin _z;

si
Condicin

no

else
{

IES Joan Mir

Pgina 60

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

Programa_1:
Leer la Patilla RC0 = 1 (RB0=0 y RB1=1), RC0 = 0 (RB0=1 y RB1=0)

Diagrama de Flujo:

RC0 = 1 (RB0=0 y RB1=1) RC0 = 0 (RB0=1 y RB1=0)

// Configuracin TRISB 0B00000000 TRISC 0B11111111

// Defines Puerto B como SALIDA de datos. // Defines Puerto C como ENTRADA de datos.

// Reseteamos el Puerto B. portB 0B00000000

si
rc0=1?

no

rb0 0 // Apagar D9 rb1 1 // Encender D10

rb0 1 // Encender D9 rb1 0 // Apagar D10

IES Joan Mir

Pgina 61

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Programa_1.c: ( Mirar el punto 1.1.3.- Depuracin de programas.)
/* Leer la Patilla RC0 si es 1 (RB0=0 y RB1=1) y si es 0 (RB0=1 y RB1=0)(Utilizando directamente la RAM) */

// ********************************* Directivas de Preprocesado************************************ // (Controlan la conversin del programa a cdigo mquina por parte del compilador) #include <16F877.h> #fuses XT,NOWDT #use delay( clock = 4000000 ) #BYTE TRISB = 0x86 #BYTE portB = 0x06 #BYTE TRISC = 0x87 #BYTE portC = 0x07 #BIT rb0 = 0x06.0 #BIT rb1 = 0x06.1 #BIT rc0 = 0x07.0 // Incluye el fichero 16F877 al programa tiene que estar en la misma // carpeta del programa define funciones, patillas y registros. // Define la palabra de configuracin del microcontrolador PIC // Trabaja con un reloj tipo XT y no utiliza perro guardin Wathdog // Define la frecuencia del reloj de 4 MHz y el tipo de reloj que vamos a // utilizar en las funciones de retardo delay // TRISB en 86h. // PORTB en 06h. // TRISC en 87h. // PORTC en 07h. // RB0 en 0x06 patilla 0. // RB1 en 0x06 patilla 1. // RC0 en 0x07 patilla 0.

// **************************** Funcin principal o programa principal ******************************* // Se define con un void main, void main() { TRISB = 0B00000000; TRISC = 0B11111111; portB = 0B00000000; while (1) { if (rc0 == 1 ) { rb0 = 0; rb1 = 1; } else { rb0 = 1; rb1 = 0; } } } // Apagar D9 // Encender D10 // Si RC0=0 ejecuta lo que viene a continuacin. // Encender D9 // Apagar D10 // Preguntamos si RC0=1 // Si RC0=1 ejecuta lo que viene a continuacin.

// Defines Puerto B como SALIDA de datos. // Defines Puerto C como ENTRADA de datos. // Reseteamos el Puerto B. // Ejecuta indefinidamente lo que est entre corchetes.

IES Joan Mir

Pgina 62

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


3.2.2.- Switch-Case.
La sentencia switch-case nos ayuda a tomar decisiones mltiples. Se define de la siguiente manera:

switch (expresin)
{

case constante1
Instruccin_1; Instruccin_n;

Expresin= constante1?

si

Instruccin_1 Instruccin _n

no
break?

si no
Instruccin_1

break; case constante2


Instruccin_1; Instruccin_n;
Expresin= Constante2?

si
Instruccin _n

no

si
break?

break; case constanteN


Instruccin_1; Instruccin_n;
Expresin= ConstanteN?

no
Instruccin_1

si
Instruccin _n

break; default:
Instruccin_1; Instruccin_n; }

no

no
break?

si

Instruccin_1 Instruccin _n;

Programa_2:
Leer el Puerto C
Si PC7..PC2= 0, PC1= 0 y PC0= 0 cargar en el Puerto B= 0b00000011, esperar 1sg, Puerto B= 0b00000000, esperar 1sg. Si PC7..PC2= 0, PC1= 0 y PC0= 1 cargar en el Puerto B= 0b00001100, esperar 1sg, Puerto B= 0b00000000, esperar 1sg. Si PC7..PC2= 0, PC1= 1 y PC0= 0 cargar en el Puerto B= 0b00110000, esperar 1sg, Puerto B= 0b00000000, esperar 1sg.

IES Joan Mir

Pgina 63

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Si PC7..PC2= 0, PC1= 1 y PC0= 1 cargar en el Puerto B= 0b11000000, esperar 1sg, Puerto B= 0b00000000, esperar 1sg. Si PC7..PC2 distinto de 0, PC1 = x y PC0 = x cargar en el Puerto B= 0b00000000.

Repetir el proceso cclicamente. Diagrama de Flujo:


Programa_2.c Ejemplo de Switch-Case

// Configuracin TRISB 0B00000000 TRISC 0B11111111;

// Defines Puerto B como SALIDA de datos. // Defines Puerto C como ENTRADA de datos.

// Reseteamos el Puerto B. portB 0B00000000

si
portC= 0?

portB 0B00000011

Retardo_1Seg

no

Retardo_1Seg

portB 0B00000000

si
portC= 1?

portB 0B00001100

Retardo_1Seg

no

Retardo_1Seg

portB 0B00000000

si
portC= 2?

portB 0B00110000

Retardo_1Seg

no si
portC=3?

Retardo_1Seg

portB 0B00000000

portB 0B00110000

Retardo_1Seg

no

Retardo_1Seg

portB 0B00000000

portB0B00000000

IES Joan Mir

Pgina 64

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Programa_2.c:
// Leer el Puerto C
// Si PC7..PC2= 0, PC1= 0 y PC0= 0 cargar en el Puerto B= 0b00000011, esperar 1sg, Puerto B= 0b00000000, esperar 1sg. // Si PC7..PC2= 0, PC1= 0 y PC0= 1 cargar en el Puerto B= 0b00001100, esperar 1sg, Puerto B= 0b00000000, esperar 1sg. // Si PC7..PC2= 0, PC1= 1 y PC0= 0 cargar en el Puerto B= 0b00110000, esperar 1sg, Puerto B= 0b00000000, esperar 1sg. // Si PC7..PC2= 0, PC1= 1 y PC0= 1 cargar en el Puerto B= 0b11000000, esperar 1sg, Puerto B= 0b00000000, esperar 1sg. // Si PC7..PC2 distinto de 0, PC1 = x y PC0 = x cargar en el Puerto B= 0b00000000. // Repetir el proceso cclicamente.

// ************************************ Directivas de Preprocesado ********************************* // (Controlan la conversin del programa a cdigo mquina por parte del compilador) #include <16F877.h> // Incluye el filchero 16F877 al programa tiene que estar en la misma // carpeta del programa define funciones, patillas y registros. // Define la palabra de configuarcin del microcontrolador PIC // Trabaja con un reloj tipo XT y no utiliza perro guardian Wathdog#use // Define la frecuencia del reloj de 4 MHz // TRISC en 87h. // PORTC en 07h. // TRISB en 86h. // PORTB en 06h.

#fuses XT,NOWDT

delay( clock = 4000000 ) #BYTE TRISC = 0x87 #BYTE PORTC = 0x07 #BYTE TRISB = 0x86 #BYTE PORTB = 0x06

// **************************** Funcin principal o programa principal ******************************* void main() { TRISB = 0B00000000; TRISC = 0B11111111; PORTB = 0B00000000; while (1) { switch (PORTC) { case 0: PORTB = 0B00000011; delay_ms(1000); PORTB = 0B00000000; delay_ms(1000); break; case 1: PORTB = 0B00001100; delay_ms(1000); PORTB = 0B00000000; delay_ms(1000); break; case 2: PORTB = 0B00110000; delay_ms(1000); PORTB = 0B00000000; delay_ms(1000); break; // Defines Puerto B como SALIDA de datos. // Defines Puerto C como ENTRADA de datos. // Reseteamos el Puerto B. // Ejecuta indefinidamente lo que est entre corchetes.

IES Joan Mir

Pgina 65

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


case 3: PORTB = 0B11000000; delay_ms(1000); PORTB = 0B00000000; delay_ms(1000); break; default: PORTB = 0B00000000; } } }

3.2.3.- For.
Se usa para repetir sentencias. En las expresiones del FOR la inicializacin es una variable a la cual se le asigna un valor inicial. La condicin de finalizacin sirve para evaluar la variable de control antes de ejecutar la sentencia. Si es cierta se ejecuta las sentencias que estn entre corchetes. La expresin de Incremento decremento modifica la variable de control despus de ejecutar el bucle. Se define de la siguiente manera: for (inicializacin; condicin de finalizacin; incremento) { Instruccin_1; Instruccin_n; }
// Inicializacin de la variable

n1

// Condicin de finalizacin

no

n<=10? si
Instruccin_1 Instruccin _n;

// Expresin de Incremento decremento

nn+1

IES Joan Mir

Pgina 66

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa Programa_3:


Mostrar los nmeros desde 0 al 9 en un display de 7 Segmentos. Un display de 7 segmentos son diodos LED encapsulados con una determinada configuracin. Si queremos que aparezcan los nmeros decimales sobre el display es necesario realizar una conversin de nmero decimal a 7 segmentos. Dicha conversin depender de la conexin del display al microcontrolador

Tabla de conversin de Nmero Decimal a Binario de 7 segmentos Puerto D D7 D6 D5 D4 D3 D2 D1 D0 g f e d c b a 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 Nmero Hexadecimal 3F 06 5B 4F 66 6D 7D 07 7F 6F


1 Dgito en Hexadecimal

Nmero Decimal 0 1 2 3 4 5 6 7 8 9

2 Dgito en Hexadecimal

1 Dgito en Hexadecimal

2 Dgito en Hexadecimal

IES Joan Mir

Pgina 67

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Diagrama de Flujo:

Programa_3.c For Mostrar nmeros en un Display

// Directivas de Preprocesado Numero_Maximo 9 // Numero_Maximo equivale a 9 DISPLAY[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F} //Crear una tabla de 10 datos

// Configuracin TRISD 0B00000000

// Defines Puerto D como SALIDA de datos.

// Reseteamos el Puerto D. portD 0B00000000;

// Inicializacin de la variable

n0

// Condicin de finalizacin

no

n<=Numero_Maximo? si
portD DISPLAY[n]

Retardo_1Seg

// Expresin de Incremento decremento

nn+1

IES Joan Mir

Pgina 68

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Programa_3.c:
// Mostrar los nmeros desde 0 al 9 en un display de 7 Segmentos. // ***************************** Directivas de Preprocesado**************************************** // (Controlan la conversin del programa a cdigo mquina por parte del compilador) #include <16F877.h> #fuses XT,NOWDT #use delay( clock = 4000000 ) #define Numero_Maximo 9 #BYTE TRISD = 0x88 #BYTE portD = 0x08 int8 n= 0; // Incluye el fichero 16F877 al programa tiene que estar en la misma carpeta // del programa define funciones, patillas y registros. // Define la palabra de configuracin del microcontrolador PIC // Trabaja con un reloj tipo XT y no utiliza perro guardin Wathdog // Define la frecuencia del reloj de 4 MHz // Numero mximo que se representa. // TRISD en 88h. // PORTD en 08h. // Defines la variable N como entera de 8bit y se carga con valor 0. // Variable Global afecta a todo el programa.

byte CONST DISPLAY[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // Tabla de 10 datos. // ****************************** Funcin principal o programa principal ***************************** void main() { TRISD = 0B00000000; portD = 0B00000000; while (1) { for (n=0; n<=Numero_Maximo; n++) // Se ejecuta un bucle desde n=0 hasta // n<=Numero_Maximo en orden // ascendente de uno en uno // Mostramos en el Puerto D el valor que tiene // DISPLAY[n] // Defines Puerto D como SALIDA de datos. // Reseteamos el Puerto D. // Ejecuta indefinidamente lo que est entre corchetes.

{ portD = DISPLAY[n]; delay_ms(1000); } } }

IES Joan Mir

Pgina 69

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


3.2.4.- While.
La sentencia while se utiliza para repetir procesos. Si cumple la expresin ejecuta las instrucciones que estn entre corchetes. Se define de la siguiente manera:

no
while (expresin) { Instruccin_1; Instruccin_n; }
Instruccin _n;
Cumple la expresin?

si
Instruccin_1

Programa_4:
Encender la Lmpara y activar el motor mientras el Puerto C sea igual a cero, si es distinto de cero apagar la lmpara y parar el motor.
Diagrama de Flujo:
Programa_4.c while Activar Motor y Lmpara

// Configuracin TRISE 0B00000000 TRISA 0B00000000 TRISC 0B11111111

// Defines Puerto E como SALIDA de datos. // Defines Puerto A como SALIDA de datos. // Defines Puerto C como ENTRADA de datos.

portE 0B00000000 portA 0B00000000

// Reseteamos el Puerto E. // Reseteamos el Puerto A.

no portC= 0? si
lmpara 1 motor 1 // Encender Lmpara. // Activar Motor. lmpara 0 motor 0 // Apagar Lmpara. // Parar Motor.

IES Joan Mir

Pgina 70

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Programa_4.c:
/* Encender la Lmpara y activar el motor mientras el Puerto C sea igual a cero, si es distinto de cero apagar la lmpara y parar el motor. */ // ************************************ Directivas de Preprocesado********************************* // (Controlan la conversin del programa a cdigo mquina por parte del compilador) #include <16F877.h> #fuses XT,NOWDT #use delay( clock = 4000000 ) #BYTE TRISE = 0x89 #BYTE portE = 0x09 #BYTE TRISC = 0x87 #BYTE portC = 0x07 #BYTE TRISA = 0x85 #BYTE portA = 0x05 #BIT lampara = 0x09.0 #BIT motor = 0x05.5 // Incluye el fichero 16F877 al programa tiene que estar en la misma carpeta // del programa define funciones, patillas y registros. // Define la palabra de configuracin del microcontrolador PIC // Trabaja con un reloj tipo XT y no utiliza perro guardin Wathdog // Define la frecuencia del reloj de 4 MHz // TRISE en 89h. // PORTE en 09h. // TRISC en 87h. // PORTC en 07h. // TRISA en 85h. // PORTA en 05h. // RE0 en 0x09 patilla 0. // RE0 en 0x09 patilla 0.

// **************************** Funcin principal o programa principal ******************************* void main() { TRISE = 0B00000000; TRISA = 0B00000000; TRISC = 0B11111111; portE = 0B00000000; portA = 0B00000000; while (true) { while (portC==0) { lampara = 1; motor = 1; } lampara = 0; motor = 0; } // Apagar Lmpara. // Parar Motor. // Encender Lmpara. // Activar Motor. // Defines Puerto E como SALIDA de datos. // Defines Puerto A como SALIDA de datos. // Defines Puerto C como ENTRADA de datos. // Reseteamos el Puerto E. // Reseteamos el Puerto A.

// Ejecuta lo que est entre corchetes mientras cumpla la // condicin.

IES Joan Mir

Pgina 71

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


3.2.5.- Do-While.
La sentencia do-while se utiliza para repetir procesos. Ejecuta primero las instrucciones que estn entre corchetes luego pregunta si se cumple la expresin. Las instrucciones entre corchetes se ejecutan al menos una vez. do { Instruccin_1; Instruccin_n; } while (expresin);

Instruccin_1 Instruccin _n;

Cumple la expresin?

si

no

Programa_5:
Si PC0 =1 parpadean los led del puerto B con una cadencia de 1 segundo. Si PC7 =1 parpadean los led del puerto D con una cadencia de 1 segundo.
Diagrama de Flujo:
1

portB 0B11111111 Programa_5.c do-while Parpadeo Led y Display

// Encender LED

Retardo _1Seg

portB 0B00000000 // Configuracin


TRISB 0B00000000 TRISD 0B00000000 TRISC 0B11111111 // Defines Puerto B como SALIDA de datos. // Defines Puerto D como SALIDA de datos. // Defines Puerto C como ENTRADA de datos.

// Apagar LED

Retardo _1Seg

rc0= 1?
portB 0B00000000; portD 0B00000000 // Reseteamos el Puerto B. // Reseteamos el Puerto D.

si

no
portD 0B11111111 // Encender DISPLAY

Retardo _1Seg

portD 0B00000000

// Apagar DISPLAY

Retardo _1Seg

no rc7= 1?
IES Joan Mir

si

Pgina 72

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Programa_5.c:
// Utilizacin de la sentencia Do-Wlile // Si PC0 =1 parpadean los led del puerto B con una cadencia de 1 segundo. // Si PC7 =1 parpadean los led del puerto D con una cadencia de 1 segundo. // ******************************** Directivas de Preprocesado ************************************* // (Controlan la conversin del programa a cdigo mquina por parte del compilador) #include <16F877.h> #fuses XT,NOWDT #use delay( clock = 4000000 ) #BYTE TRISD = 0x88 #BYTE portD = 0x08 #BYTE TRISC = 0x87 #BYTE portC = 0x07 #BYTE TRISB = 0x86 #BYTE portB = 0x06 #BIT rc0 = 0x07.0 #BIT rc7 = 0x07.7 // Incluye el fichero 16F877 al programa tiene que estar en la // misma carpeta del programa define funciones, patillas y registros. // Define la palabra de configuracin del microcontrolador PIC // Trabaja con un reloj tipo XT y no utiliza perro guardin Wathdog // Define la frecuencia del reloj de 4 MHz

// TRISD en 88h. // PORTD en 08h. // TRISC en 87h. // PORTC en 07h. // TRISB en 86h. // PORTB en 06h. // RC0 en 0x07 patilla 0. // RC7 en 0x07 patilla 7.

// *************************** Funcin principal o programa principal ******************************** void main() { TRISB = 0B00000000; // Defines Puerto B como SALIDA de datos. TRISC = 0B11111111; // Defines Puerto C como ENTRADA de datos. TRISD = 0B00000000; // Defines Puerto D como SALIDA de datos. portB = 0B00000000; // Reseteamos el Puerto B. portD = 0B00000000; // Reseteamos el Puerto D. while (1) { Do { // Ejecuta indefinidamente lo que est entre corchetes. // Ejecuta las instrucciones que estan entre corchetes mientras PC0 = 1. portB = 0B11111111; delay_ms(1000); portB = 0B00000000; delay_ms(1000); } while (rc0 == 1); Do { // Ejecuta las instrucciones que estan entre corchetes mientras PC7 = 1. portD = 0B11111111; delay_ms(1000); portD = 0B00000000; delay_ms(1000); } while (rc7 == 1); } }

IES Joan Mir

Pgina 73

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


3.3.- Creacin de funciones.
El compilador CCS C suministra una serie de funciones predefinidas para acceder y utilizar el uC PIC y sus perifricos. Estas funciones facilitan la configuracin del PIC sin necesidad de entrar en un estudio profundo de sus registros de funciones especiales SFR. Las funciones se clasifican por bloques funcionales:

IES Joan Mir

Pgina 74

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

IES Joan Mir

Pgina 75

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

IES Joan Mir

Pgina 76

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

Para mayor informacin, podemos ver el Manual compilador C CCS. Algunas de estas funciones las utilizaremos en el captulo de Ejemplos prcticos La forma de crear nuestras propias funciones es: a) Declarar las funciones despus de las Directivas de Preprocesado y antes del Programa Principal
#BIT rc0 = 0x07.0 // RC0 en 0x07 patilla 0.

Directivas de Preprocesado

/* ************************************** Declaracin de funciones ****************************************** */ void VariasCosas (int8); int8 Raiz (int8); // Generacin de la seal cuadrada. // Realiza la raz cuadrada.

Declaracin de las Funciones

// ***************************** Funcin principal o programa principal ******************************************* void main() Programa Principal { int8 muestra1; // Variable muestra1 definida como un entero de 8 bit TRISB = 0B00000000

IES Joan Mir

Pgina 77

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


b) Crear las funciones despus del Programa Principal
while (1) { muestra1 = portC; VariasCosas(muestra1); } } // Ejecuta indefinidamente lo que est entre corchetes. // Leemos el Puerto C. // Ejecuta la funcin VariasCosas definida por la variable muestra1.

Programa Principal

//******************************** Funcion VariasCosas ****************************************************** void VariasCosas (int8 muestra2) { switch (muestra2) // Preguntamos por la variable muestra2 si es 0 ejecuta el case 0, si es 3 el case 3, // si es distinto de 0 y 3 ejecuta Raz { Funcin Varias_Cosas case 0: LucesFantastico(); // Llamamos a la funcin LucesFantastico break; case 1: NumerosDisplay(); break; default: { portB = Raiz(muestra2); delay_ms(50); } } } // Ejecuta la funcin Raz definida por la variable muestra. // Temporizamos 50 mS.

// Llamamos a la funcin NumerosDisplay

Programa_6.c:
// El Puerto C puede tomar valores comprendidos entre 0 y 255 // Si Puerto C si es 0 realizar la funcin de mostrar por el Display de 7 segmentos los nmeros // del 0 al 9 con una cadencia de 1 segundo. Despus de este proceso apagar el Display. // Si Puerto C si es 1 realizar la funcin de simulacin de las luces del coche fantstico. // despus de este proceso apagar los Led. // Si Puerto C si es distinto de 0 y 1 realizar una funcin de la raz cuadrada del dato ledo // y devolverlo en una variable llamada resultado y mostrarlo en el Puerto B // ******************************** Directivas de Preprocesado************************************* // (Controlan la conversin del programa a cdigo maquina por parte del compilador) #include <16F877A.h> #fuses XT,NOWDT #use delay( clock = 4000000 ) // Incluye el fichero 16F877A al programa tiene que estar en la misma //carpeta del programa define funciones, patillas y registros. // Define la palabra de configuracin del microcontrolador PIC // Trabaja con un reloj tipo XT y no utiliza perro guardin Wathdog // Define la frecuencia del reloj de 4 MHz // Librera de funciones matemticas. // Librera de simulacin Luces del Coche Fantstico. // Librera de simulacin representacin de los nmeros // en el Display 7Seg. // TRISC en 87h. // PORTC en 07h.

#include <math.h> #include <LUCES-COCHE-FANTASTICO.h> #include <REPR-NUMEROS-DISPL.h> #BYTE TRISC = 0x87 #BYTE portC = 0x07

IES Joan Mir

Pgina 78

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


#BYTE TRISB = 0x86 #BYTE portB = 0x06 #BYTE TRISD = 0x88 #BYTE portD = 0x08 #BIT rc0 = 0x07.0 // TRISB en 86h. // PORTB en 06h. // TRISD en 88h. // PORTD en 08h. // RC0 en 0x07 patilla 0.

/* **************************** Declaracin de funciones **************************************** */ void VariasCosas (int8); int8 Raiz (int8); // Generacin de la seal cuadrada. // Realiza la raz cuadrada.

// ************************ Funcin principal o programa principal *********************************** void main() { int8 muestra1; TRISB = 0B00000000; TRISC = 0B11111111; TRISD = 0B00000000; portB = 0B00000000; portD = 0B00000000; while (1) { muestra1 = portC; VariasCosas(muestra1); // Variable muestra de un entero de 8 bit // Defines Puerto B como SALIDA de datos. // Defines Puerto C como ENTRADA de datos. // Defines Puerto D como SALIDA de datos. // Reseteamos el Puerto B. // Reseteamos el Puerto D. // Ejecuta indefinidamente lo que est entre corchetes. // Leemos el Puerto C // Ejecuta la funcin VariasCosas definida por la variable // muestra1.

} } //*************************** Funcin VariasCosas ************************************************ void VariasCosas (int8 muestra2) { switch (muestra2) // Preguntamos por la variable muestra2 si es 0 ejecuta el case 0, si // es 3 el case 3, si es distinto de 0 y 3 ejecuta Raiz { case 0: LucesFantastico(); // Llamamos a la funcin LucesFantastico break; case 1: NumerosDisplay(); break; default: { portB = Raiz(muestra2); delay_ms(50); } } } // Ejecuta la funcin Raz definida por la variable muestra. // Temporizamos 50 mS. // Llamamos a la funcin NumerosDisplay

//******************************** Funcin Raz *************************************************

IES Joan Mir

Pgina 79

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


int8 Raiz (int8 muestra3) { int8 resultado; resultado = SQRT (muestra3); return(resultado); }

3.4.- Manejo y creacin de driver o libreras.


Una librera o driver es un programa que realiza una funcin determinada. Se la puede llamar desde cualquier otro programa. Debe estar bien documentada. Si se va a utilizar libreras o driver en un programa se la tiene que incluir en las Directivas de Preprocesado
// ******************************** Directivas de Preprocesado************************************* // (Controlan la conversin del programa a cdigo maquina por parte del compilador) #include <16F877A.h> #fuses XT,NOWDT #use delay( clock = 4000000 ) // Incluye el fichero 16F877A al programa tiene que estar en la misma //carpeta del programa define funciones, patillas y registros. // Define la palabra de configuracin del microcontrolador PIC // Trabaja con un reloj tipo XT yo driver perro guardin Wathdog Libreras no utiliza // Define la frecuencia del reloj de 4 MHz // Librera de funciones matemticas. // Librera de simulacin Luces del Coche Fantstico. // Librera de simulacin representacin de los nmeros // en el Display 7Seg. // TRISC en 87h. // PORTC en 07h.

#include <math.h> #include <LUCES-COCHE-FANTASTICO.h> #include <REPR-NUMEROS-DISPL.h> #BYTE TRISC = 0x87 #BYTE portC = 0x07

Las libreras del Programa_6.c son las siguientes: LUCES-COCHE-FANTASTICO.H


// Realizar la funcin de simulacin de las Luces del Coche Fantstico. // Despus de este proceso apagar los Led. //******************************** Directivas de Preprocesado ************************************* #BYTE portB = 0x06 // PORTB en 06h.

//************** Funcin de Simulacin de las Luces del Coche Fantstico. ******************************* void LucesFantastico (void) { int8 i,luces; // Definimos las variable como enteras de 8bit. luces = 0B00000001; // Inicializamos la variable luces. for (i=0;i<8;i++) { portB = luces; delay_ms(200); // Mostramos en el Puerto B el valor que tiene luces // Temporizamos 200 mS. // Se ejecuta un bucle desde 0 hasta 8 en orden ascendente de uno // en uno

IES Joan Mir

Pgina 80

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


luces = luces << 1; } luces = 0B10000000; for (i=0;i<7;i++) { luces = luces >> 1; portB = luces; delay_ms(200); } portB = 0B00000000; } // Reseteamos el Puerto B. // Rotamos el contenido de la variable luces una posicin hacia la // Derecha. // Mostramos en el Puerto B el valor que tiene luces // Temporizamos 200 mS. // Inicializamos la variable luces. // Se ejecuta un bucle desde 0 hasta 7 en orden ascendente de uno // en uno // Rotamos el contenido de la variable luces una posicin hacia la // izquierda.

LUCES-COCHE-FANTASTICO.H
// Mostrar por el Display de 7 segmentos los nmeros del 0 al 9 con una cadencia de 1 segundo. // Despus de este proceso apagar el Display. // *************************** Directivas de Preprocesado ****************************************** #BYTE portD = 0x08 // PORTD en 08h. // Tabla de 10 datos.

byte CONST DISPLAY[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

//******************** Funcin de Mostrar los Nmeros en el Display de 7 Segmentos.********************

void NumerosDisplay (void) { int8 i; for (i=0;i<10;i++) { portD = DISPLAY[i]; delay_ms(500); } portD = 0B00000000; } // Reseteamos el Puerto D. // Mostramos en el Puerto D el valor que tiene DISPLAY[i] // Definimos la variable como entera de 8bit. // Se ejecuta un bucle desde 0 hasta 9 en orden ascendente de // uno en uno

La librera MATCH.H est en la carpeta PICC/DRIVER

IES Joan Mir

Pgina 81

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.- Ejemplos prcticos. 4.1.- Interface optoacoplada entre dispositivos Digitales y Analgicos
Es importante poder controlar dispositivos de potencia con dispositivos electrnicos (Ordenadores, uC, Dispositivos Lgicos) sin que estos corran peligro. Existen bsicamente dos tipos de dispositivos (Control ON/OFF): Dispositivos electromecnicos (Reles, Contactores, etc.) y electrnicos (Optotransistores, Optotriac, etc.)

4.1.1.- Control con Rels.


El rel es un dispositivo electromecnico, que funciona como un interruptor controlado por un circuito elctrico en el que, por medio de un electroimn, se acciona un juego de uno o varios contactos que permiten abrir o cerrar otros circuitos elctricos independientes.

IES Joan Mir

Pgina 82

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Un ejemplo prctico sera el control de una electrovlvula de 24V/0,45A con un circuito Lgico que funciona a 5v. El Transistor funciona como un interruptor controlado por la puerta inversora.

Control de una electrovlvula con una puerta lgica utilizando un Rel


E1
2

Clindro de doble efecto

5V
1

E2 24V
1 2

IL
5V/115 Ohm
A K

ID1
D2
K

RELE

D3
A

1N4007_JOAN

RL
A

D1
K

ID2

R4
220

50

IR

R1
220

IC IB
U1:A
1 74LS04 2

R3
10k

Q2
BC547BP_JOAN

Vlvula 5/2 activada electricamente y retorno com muelle Caracterstica de la Electrovlvula: (24V/450mA)

SW1

Control

Potencia

IES Joan Mir

Pgina 83

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.1.2.- Control con Optotransistores.
Estos dispositivos digitales son optoacoplados y permiten realizar este proceso con suma facilidad, tienen la ventaja de que no tiene elementos mecnicos, que con el paso del tiempo se deterioran. Se comportan como circuitos seguidores de seal o inversores . Aslan elctricamente la parte de potencia de la de control a travs de una barrera de luz infrarroja que aguanta hasta 1200v Su funcionamiento sera el siguiente: Si no pasa intensidad por el diodo emisor, no emite luz infrarroja y el Fototransistor est cortado (Se comporta como un circuito abierto)

Si dejamos pasar intensidad por el diodo emisor, este emite una luz infrarroja que saturara el Fototransistor (Se comporta como un Interruptor cerrado)

IES Joan Mir

Pgina 84

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Un ejemplo prctico sera el control de una electrovlvula de 24V/0,45A con un circuito Lgico que funciona a 5v. Se necesita un montaje Darlington con Transistores, ya que el optoacoplador no ser capaz de absorber la intensidad IC1

IES Joan Mir

Pgina 85

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.1.3.- Control con Optotriac.
Si queremos controlar cargas en corriente alterna con elementos electrnicos el elemento ideal es el Optotriac. Un modelo sera el MOC3041 cuyas caractersticas ms significativas son:
Tensin de aislamiento de 7500V, garantiza un perfecto aislamiento entre la red elctrica y los dispositivos lgicos. Es capaz de proporcionar hasta 100 mA, pudiendo alimentar cargas has 20W. Su Fototriac interno permite el control de casi todos los grandes Triacs. Cuenta de un Detector de paso por cero interno, que ahorra poner hardware externo.

Su funcionamiento es el siguiente si hacemos pasar una corriente por Diodo Emisor de infrarrojos este activa el Fototriac (Interruptor cerrado) dejando pasar la corriente por el. La red serie del condensador de 10 nF y la resistencia de 100, conectada en paralelo con el Fotoriac evita que se dispare, por los picos brscos de la tensin de red, que se pueden presentar aleatoriamente. Esta red R-C es responsable de que el circuito tenga un cierto consumo de 0,1W, aunque est desactivado. El condensador C1 debe ser capaz de soportar al menos 400V.

IES Joan Mir

Pgina 86

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Un ejemplo prctico sera el control de una electrovlvula de 220V/0,45A en corriente alterna con un circuito Lgico que funciona a 5v. Se necesita un Triac adicional para atacar la electrovlvula ya que esta necesita una corriente de 450 mA.

Control de una electrovlvula con una puerta lgica utilizando Optotriac


Control Potencia Vlvula 5/2 activada electricamente y retorno com muelle Caracterstica de la Electrovlvula: (220V/50Hz /450mA)
2

Clindro de doble efecto

E1
5V
1

L1
220V +88.8
AC Volts

VL

RL
500

ID1
A

ID

R2
220

I2

IL1

IL2

D1
K

R1
220
1

U2
1 6

R5
360

I3
IC=0

ID
2 3 2
Zero Crossing

IT IR
U3
TRIAC

IG
4

R4

U1:A
74126
2

I1
+88.8
AC Volts

100

MOC3031M

SW1
1

R6
330

VT

ALT1
ALTERNADOR_JOAN 312.5V 50Hz

I4

C1
10nF

IES Joan Mir

Pgina 87

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.2.- Control de una Pantalla LCD.
La pantalla de cristal lquido o display LCD (Liquid Crystal Display) se utiliza para mostrar mensajes. Puede mostrar cualquier carcter alfanumrico. La pantalla consta de una matriz de de caracteres (Normalmente de 5x7 punto por carcter), distribuidos en una, dos, tres, cuatro lneas (Hasta 40 caracteres por lnea). El proceso de visualizacin es gobernado por un microcontrolador incorporado en la propia pantalla. El modelo ms utilizados es el Hitachi HD44780. Uno de los modelos utilizados es el LM16L cuyas caractersticas son:
Consumo reducido, del orden de 7,5 mW. Pantalla de caracteres ASCII, caracteres griegos, smbolos matemticos, etc. Desplaza los caracteres hacia la izquierda o a la derecha. Memoria de 40 caracteres por lnea de pantalla, visualizacin de 16 caracteres por lnea. Movimiento del cursor y cambio de su aspecto. Permite programas ocho caracteres. Puede ser gobernado de dos formas principales: Conexin con bus de 4 bits Conexin con un bus de 8 bits

El patillaje es el siguiente: La alimentacin es de 5V. La regulacin de contraste se realiza por la patilla VEE con un potencimetro de 10K. Si ponemos VEE a masa tiene el mximo contraste. Las lneas del bus de datos (D7..D0) son triestado y pasan a estado de alta impedancia cuando el LCD no se utiliza.

LCD1
LCD-16 X 2_JOAN

VSS VDD VEE

RS RW E 4 5 6

1 2 3

SEAL D7..D0 E R/W RS VEE VLC VDD VSS

DEFINICIN Data Bus Enable Read/Write Register Select Liquid Cristal driving Voltage Power Supply Voltage Ground

PINES 14..7 6 5 4 3 2 1

FUNCIN Bus de datos E=0 LCD no habilitado. E=1 LCD habilitado. R/W =0 escribe en LCD. R/W =1 lee del LCD. RS=0 Modo Comando RS=1 Modo Caracter Tensin para ajustar el contraste Tensin de Alimentacin +5V Masa.

IES Joan Mir

7 8 9 10 11 12 13 14

D0 D1 D2 D3 D4 D5 D6 D7

Pgina 88

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Utilizaremos el driver LCD.c creado por CCS, con las siguientes funciones: Lcd_init(); Inicializa el LCD. Borra el LCD y lo configura en el formato de 4 bits, con dos lneas de caracteres (5x7 puntos), en modo encendido, cursor apagado y sin parpadeo. Indica la posicin y lnea donde se posiciona el cursor. byte x es posicin del cursor y byte y el lnea.

Lcd_gotoxy (byte x, byte y);

Utilizamos funciones del compilador de C de CCS para escribir en el LCD.


PRINTF(function, string, values) La funcin de impresin formateada PRINTF saca una cadena de caracteres al estndar serie RS-232 o a una funcin especificada. El formato est relacionado con el argumento que ponemos dentro de la cadena (string).

function es una funcin. Ejemplo ( Lcd_putc) values es una lista de variables separadas por comas. Ejemplo V1,I1,DATO string es una cadena de caracteres, donde se indica, mensaje, nmero, tipo ,\c. mensaje nmero 1-9 01-09 1.1-9.9 t ipo c s u d Lu Ld x X Lx LX f g e w Texto a escribir en el LCD (nmero de caracteres) es opcional Cuantos caracteres se escriben. Indica cuantos ceros existen a la Izquierda. para coma flotante. (tipo de carcter) puede ser: Carcter. Cadena o Carcter. Entero sin signo. Entero con signo. Entero Largo sin signo. Entero Largo con signo. Entero Hexadecimal (minsculas). Entero Hexadecimal (maysculas). Entero largo Hexadecimal (minsculas). Entero largo Hexadecimal(maysculas). Flotante con truncado. Flotante con redondeo. Flotante en formato exponencial. Entero sin signo con decimales insertados. La 1 cifra indica el total de nmeros, la 2 cifra indica el nmero de decimales.

IES Joan Mir

Pgina 89

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


\c puede ser: \f \n \b Se limpia el LCD. El cursor va a la posicin (1,2) El cursor retrocede una posicin.

El driver utilizado para controlar el LCD creado por CCS es LCD.c est pensado para trabajar con el Puerto D y B. Por defecto est el Puerto D. Si queremos trabajar en diferentes puertos tenemos que modificar el driver LCD.c Driver LCD.c
// As defined in the following structure the pin connection is as follows: // D0 enable // D1 rs // D2 rw // D4 D4 // D5 D5 // D6 D6 // D7 D7 // // LCD pins D0-D3 are not used and PIC D3 is not used. // Un-comment the following define to use port B // #define use_portb_lcd TRUE

Trabaja con el Puerto D por defecto

Si queremos trabaja con el Puerto B habilitamos est instruccin

struct lcd_pin_map { BOOLEAN enable; BOOLEAN rs; BOOLEAN rw; BOOLEAN unused; int data : 4; } lcd;

// This structure is overlayed // on to an I/O port to gain // access to the LCD pins. // The bits are allocated from // low order up. ENABLE will // be pin B0.

#if defined use_portb_lcd #locate lcd = getenv("sfr:PORTB") #define set_tris_lcd(x) set_tris_b(x) #else #locate lcd = getenv("sfr:PORTD") #define set_tris_lcd(x) set_tris_d(x) #endif

// This puts the entire structure over the port

// This puts the entire structure over the port

IES Joan Mir

Pgina 90

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


Driver LCD2.c
// As defined in the following structure the pin connection is as follows: // D0 enable // D1 rs // D2 rw // D4 D4 // D5 D5 // D6 D6 // D7 D7 // // LCD pins D0-D3 are not used and PIC D3 is not used. // Un-comment the following define to use port B // #define use_portb_lcd TRUE

struct lcd_pin_map { BOOLEAN enable; BOOLEAN rs; BOOLEAN rw; BOOLEAN unused; int data : 4; } lcd;

// This structure is overlayed // on to an I/O port to gain // access to the LCD pins. // The bits are allocated from // low order up. ENABLE will // be pin B0.

Si queremos trabaja con el Puerto C modificamos estas instrucciones

#locate lcd = getenv("sfr:PORTC") #define set_tris_lcd(x) set_tris_c(x)

#if defined use_portb_lcd #locate lcd = getenv("sfr:PORTB") #define set_tris_lcd(x) set_tris_b(x) #else #locate lcd = getenv("sfr:PORTD") #define set_tris_lcd(x) set_tris_d(x) #endif

// This puts the entire structure over the port

// This puts the entire structure over the port

Para entender mejor el manejo del LCD hemos realizado un entrenador con ISIS. Simularemos diferentes ejemplos.

4.2.1.- LCD_ejemplo1.c

IES Joan Mir

Pgina 91

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

/* ************************* Mostrar mensajes en el LCD ******************************* */ // ************************* Directivas de Preprocesado********************************* #include <16F876A.h> #fuses XT,NOWDT #use delay( clock = 4000000 ) // Reloj de 4 MHz #include <LCD2.c> // Incluimos el driver LCD2.c que contiene las funciones de // control del LCD. // *********************** Funcin principal o programa principal ************************** void main() { lcd_init(); // Inicializamos el LCD. printf(lcd_putc, "I.E.S. Joan Miro\n"); // Escribimos I.E.S. Joan Miro y saltamos a la siguiente lnea. printf(lcd_putc, " f Proyectos"); // Escribimos Proyectos. while (1); // Ejecuta est instruccin indefinidamente. }

4.2.2.- LCD_ejemplo2.c
/* ****************** Mostrar nmeros en diferentes formatos en el LCD ******************** */ // *************************** Directivas de Preprocesado********************************* #include <16F876A.h> #fuses XT,NOWDT #use delay( clock = 4000000 ) // Reloj de 4 MHz #include <LCD2.c> // Incluimos el driver LCD2.c // *********************** Funcin principal o programa principal *************************** void main() { int8 p = 254; lcd_init(); // Inicializamos el LCD. lcd_gotoxy(1,1); printf(lcd_putc,"%3u",p); lcd_gotoxy(8,1); printf(lcd_putc,"%03d",p); lcd_gotoxy(1,2); printf(lcd_putc,"%4X",p); lcd_gotoxy(8,2); printf(lcd_putc,"%3.2w",p); // Posicionamos el Cursor del LCD en la posicin 1 lnea 1 . // Escribimos 3 dgitos de la variable "p" en formato entero y sin signo. // Posicionamos el Cursor del LCD en la posicin 8 lnea 1 . // Escribimos 3 dgitos de la variable "p" en formato entero con signo. // Posicionamos el Cursor del LCD en la posicin 1 lnea 2 . // Escribimos 4 dgitos de la variable "p" en formato entero // hexadecimal maysculas. // Posicionamos el Cursor del LCD en la posicin 8 lnea 2 . // Escribimos 3 dgitos de la variables "p" en formato entero // sin signo con decimales insertados. La 1 cifra indica el // total de dgitos y la 2 el nmero de decimales. // Fin.

while (1); }

IES Joan Mir

Pgina 92

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.2.3.- LCD_ejemplo3.c

/* ******* Mostrar mensajes y array de nmeros en formatos Decimal y Hexadecimal en el LCD *********** */ // **************************** Directivas de Preprocesado*************************************** #include <16F876A.h> #fuses XT,NOWDT #use delay( clock = 4000000 ) #include <LCD2.c>

// Reloj de 4 MHz // Incluimos el driver LCD2.c que contiene las funciones // de control del LCD. // Array de 10 nmeros tipo byte

byte CONST DIGIT_MAP[10]={162,5,64,100,245,11,255,16,217,5};

// ************************ Funcin principal o programa principal ********************************** void main() { int8 i=0; lcd_init(); lcd_gotoxy(5,1); printf(lcd_putc, "Decimal"); lcd_gotoxy(5,2); printf(lcd_putc, "Hexadecimal"); for(i = 0;i <= 9; ++i) { lcd_gotoxy(1,1); printf(lcd_putc,"%3u",DIGIT_MAP[i]); // Posicionamos el Cursor del LCD en la posicin 1 // lnea 1 . // Escribimos 3 dgitos del dato sacado del array // DIGITAL_MAP en formato entero y sin signo. // Posicionamos el Cursor del LCD en la posicin 2 // lnea 2 . // Escribimos 2 dgitos del nmero sacado del array // DIGITAL_MAP en formato entero hexadecimal // maysculas. // Retardo de 1 segundo.

// Inicializamos el LCD. // Posicionamos el Cursor del LCD en la posicin 5 lnea 1 . // Escribimos la palabra "Decimal". // Posicionamos el Cursor del LCD en la posicin 5 lnea 2 . // Escribimos la palabra "Hexadecimal". // Sacamos los diez nmeros del array uno a uno y los // representamos en el Display en diferentes formatos.

lcd_gotoxy(2,2); printf(lcd_putc,"%2X",DIGIT_MAP[i]);

delay_ms(1000); } while (1); }

// Fin.

IES Joan Mir

Pgina 93

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.2.4.- LCD_ejemplo4.c

/* ************ Mostrar mensajes y array de nmeros en formatos entero 16 bit en el LCD *************** */ // ****************************** Directivas de Preprocesado*************************************** #include <16F876A.h> #fuses XT,NOWDT #use delay( clock = 4000000 ) #include <LCD2.c>

// Reloj de 4 MHz // Incluimos el driver LCD2.c que contiene las funciones de control // del LCD. // Array de 10 nmeros tipo entero

int16 CONST NUMEROS[10]={267,456,856,23984,123,65535,65536,12,7,5}; de 16 bit.

// ************************* Funcin principal o programa principal ********************************* void main() { int8 i=0; lcd_init(); lcd_gotoxy(9,1); printf(lcd_putc, "int16"); for(i = 0;i <= 9; ++i) { lcd_gotoxy(1,1); printf(lcd_putc,"%5Lu",NUMEROS[i]); // Posicionamos el Cursor del LCD en la posicin 1 // lnea 1 // Escribimos 5 dgitos del dato sacado del array // NUMEROS en formato entero largo sin signo. // (No representa los ceros a la izquierda) // Retardo de 1 segundo. // Inicializamos el LCD. // Posicionamos el Cursor del LCD en la posicin 9 lnea 1 . // Escribimos la palabra "int16". // Sacamos los diez datos del array uno a uno y los representamos // en el Display.

delay_ms(1000); } while (1); }

// Fin.

IES Joan Mir

Pgina 94

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.2.5.- LCD_ejemplo5.c

/* ******** Mostrar mensajes y array de nmeros en formatos entero 32 bit con signo en el LCD *********** */ // ****************************** Directivas de Preprocesado*************************************** #include <16F876A.h> #fuses XT,NOWDT #use delay( clock = 4000000 ) #include <LCD2.c>

// Reloj de 4 MHz

// Incluimos el driver LCD2.c que contiene las funciones de control del // LCD. Signed Int32 CONST DATOS[10]={-26745,-456232,856323,234,123,235336,233,-12,-778,895}; // Array de 10 // nmeros tipo entero de 32 bit con signo. // ************************ Funcin principal o programa principal ********************************** void main() { int8 i=0; lcd_init(); lcd_gotoxy(9,2); printf(lcd_putc, "S_int32"); for(i = 0;i <= 9; ++i) { lcd_gotoxy(1,2); printf(lcd_putc,"%7Ld",DATOS[i]); // Posicionamos el Cursor del LCD en la posicin 1 // lnea 2. // Escribimos 7 dgitos del dato sacado del array // DATOS en formato entero largo con signo. (No // representa los ceros a la izquierda) // Retardo de 1 segundo. // Inicializamos el LCD. // Posicionamos el Cursor del LCD en la posicin 9 lnea 2. // Escribimos la palabra "S_int32". // Sacamos los diez datos del array uno a uno y los representamos // en el Display.

delay_ms(1000); } while (1); }

// Fin.

IES Joan Mir

Pgina 95

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.2.6.- LCD_ejemplo6.c

/* ***************** Mostrar mensajes y array de caracteres en el LCD ******************************* */ // **************************** Directivas de Preprocesado**************************************** #include <16F876A.h> #fuses XT,NOWDT #use delay( clock = 4000000 ) // Reloj de 4 MHz #include <LCD2.c> Char CONST CARACTER[17]={"arthgsupHF12erfj"}; // Incluimos el driver LCD2.c que contiene las // funciones de control del LCD. // Array tipo Char de 16 caracteres.

// ******************** Funcin principal o programa principal *************************************** void main() { int8 i=0; lcd_init(); lcd_gotoxy(3,1); printf(lcd_putc, "(Caracteres)"); lcd_gotoxy(8,2); for(i = 0;i <= 15; ++i) { printf(lcd_putc,"%1c\b",CARACTER[i]); // Escribimos 1 dgitos tipo caracter sacado del array // CARACTER. Posicionamos el cursor constantemente // en la posicin 8 lnea 2. // Retardo de 1 segundo.

// Inicializamos el LCD. // Posicionamos el Cursor del LCD en la posicin 3 lnea 1. // Escribimos la palabra "(Caracteres)". // Posicionamos el Cursor del LCD en la posicin 8 lnea 2. // Sacamos los 15 caracteres del array uno a uno y los // representamos en el Display.

delay_ms(1000); } while (1); } // Fin.

IES Joan Mir

Pgina 96

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.2.7.- LCD_ejemplo7.c
Realizar un programa que lea el Puerto B y represente en un Display LCD (2x20) el valor en decimal, hexadecimal y binario. Utilizamos el siguiente circuito:

Programa:

Dec_Hex_Bin.c

/* ***** Leer el Puerto B y mostrar sus valor en el LCD en decimal, hexadecimal y binario ******* */ // ************************* Directivas de Preprocesado********************************** #include <16F876A.h> #fuses XT,NOWDT #use delay( clock = 4000000 ) #include <LCD1.c> del LCD. #BYTE TRISB = 0x86 #BYTE PORTB = 0x06 #BIT RB0 = 0x06.0 #BIT RB1 = 0x06.1 #BIT RB2 = 0x06.2 #BIT RB3 = 0x06.3 #BIT RB4 = 0x06.4 #BIT RB5 = 0x06.5

// Reloj de 4 MHz // Incluimos el driver LCD1.c que contiene las funciones de control

// TRISB en 86h. // PORTB en 06h. // RB0 en 0x06 patilla 0. // RB1 en 0x06 patilla 1. // RB2 en 0x06 patilla 2. // RB3 en 0x06 patilla 3. // RB4 en 0x06 patilla 4. // RB5 en 0x06 patilla 5.

IES Joan Mir

Pgina 97

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


#BIT RB6 = 0x06.6 #BIT RB7 = 0x06.7 // RB6 en 0x06 patilla 6. // RB7 en 0x06 patilla 7.

// ******************* Funcin principal o programa principal ******************************* void main() { int8 dato=0; TRISB = 0B11111111; PORTB = 0B00000000; lcd_init(); lcd_gotoxy(5,1); printf(lcd_putc, "Decimal"); lcd_gotoxy(18,1); printf(lcd_putc, "Hex"); lcd_gotoxy(12,2); printf(lcd_putc, "Binario"); while (1) { dato=PORTB; lcd_gotoxy(1,1); printf(lcd_putc,"%3u",PORTB); lcd_gotoxy(15,1); printf(lcd_putc,"%2X",PORTB); // Posicionamos el Cursor del LCD en la // posicin 1 lnea 1. // Escribimos 3 dgitos del dato ledo del // Puerto B en formato entero y sin signo. // Posicionamos el Cursor del LCD en la // posicin 15 lnea 1. // Escribimos 2 dgitos del dato ledo del // Puerto B en formato entero // hexadecimal maysculas. // Posicionamos el Cursor del LCD en la // posicin 3 lnea 2 . // Defines Puerto B como ENTRADA de datos. // Reseteamos el Puerto B. // Inicializamos el LCD. // Posicionamos el Cursor del LCD en la posicin 5 lnea 1. // Escribimos la palabra "Decimal". // Posicionamos el Cursor del LCD en la posicin 18 lnea 1. // Escribimos la palabra "Hex". // Posicionamos el Cursor del LCD en la posicin 12 lnea 2. // Escribimos la palabra "Hexadecimal".

lcd_gotoxy(3,2);

printf(lcd_putc,"%u%u%u%u%u%u%u%u",RB7,RB6,RB5,RB4,RB3,RB2,RB1,RB0); // Escribimos 8 variables en formato // entero y sin signo. delay_ms(100); // Retardo de 100 mS. } }

IES Joan Mir

Pgina 98

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.3.- Digitalizacin de una seal analgica con el sistema de adquisicin de datos.
Los microcontroladores PIC llevan un sistema de adquisicin de datos. Est compuesto por :
Multiplexor Analgico (Selecciona la patilla a digitalizar). Circuito de muestreo y retencin (Sample & Hold) (Retiene la seal analgica un instante para poderla muestrear). Conversor Analgico/Digital de aproximaciones sucesivas (Convierte las seales analgicas en cdigos digitales).

Las caractersticas principales son:


Rango de Entrada. Simboliza que tensiones puede digitalizar (En los PIC de 0 .. 5V) Nmero de bits de salida del Conversor A/D. En los PIC de gama media es de 10 bits. Resolucin. (Indica que tensin mnima necesito para aumentar un cdigo digital) Resolucin = q = 1LSB =
V REF + V REF 1024

5V0V 1024

= 4,8 mV.

IES Joan Mir

Pgina 99

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


q= Intervalo de cuantificacin. LSB= Bit menos significativo

Si trabajamos con tensiones comprendidas entre Vref+ = 5V y Vref- =0V y con 10bits de salida obtenemos una resolucin de 4,8 mV.
Tempo de conversin (Tiempo que tarda el sistema de adquisicin de datos en obtener una muestra digital proporcional a la tensin analgica) En un uCPIC trabajando con un oscilador interno (RC) tarda entorno a 20uS Error de conversin.( Indica para que rango mnimo de tensiones se asigna un valor digital) En un uCPIC el Conversor A/D, trabaja con error por redondeo. Error = 1 2

LSB

Error = 2,4 mV.

La relacin existente entre tensiones de entrada Ve y cdigos digitales de salida D se refleja en la siguiente tabla.

Ve 0 < Ve 2,4 mV 2,4mV < Ve 7,2 mV 7,2mV < Ve 12 mV 12mV < Ve 16,8 mV 16,8mV < Ve 21,6 mV 16,8mV < Ve 4,9904mV 4,9904mV < Ve 4,9952 mV

Cdigo Digital de salida del Conversor Analgico/Digital D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0

D N Decimal 0 1 2 3 4 1022 1023

1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1

Una frmula vlida para trabajar sera: Ve =

+ + 1024

Ejemplo: (Trabajando con tensiones comprendidas entre VREF+ = 5V y Cunto vale Ve si D=512? : Ve = 512
5+0 1024

VREF+ = 0V )

= 2,5V

El sistema de adquisicin de datos te permite elegir el canal a digitalizar actuando sobre el Multiplexor Analgico (CHS2..CHS0) Te permite configurar las patillas actuando sobre un registro llamado (ADCON1) Indicando si son analgicas o digitales o si vas a utilizar Vref externas

IES Joan Mir

Pgina 100

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

PCFG(3..0) AN7 AN6 AN5 AN4 AN3 0000 0001 0010 0011 0100 0101 011X 1000 1001 1010 1011 1100 1101 1110 1111 A A D D D D D A D D D D D D D A A D D D D D A D D D D D D D A A D D D D D A A A A D D D D A A A A D D D A A A A A D D D A VREF+ A VREF+ A VREF+ D VREF+ A VREF+ VREF+ VREF+ VREF+ D VREF+

AN2 A A A A D D D VREFA A VREFVREFVREFD VREF-

AN1 A A A A A A D A A A A A A D D

AN0 A A A A A A D A A A A A A A A

VREF+ VDD AN3 VDD D AN3 VDD AN3 AN3 VDD AN3 AN3 AN3 AN3 VDD AN3

VREFGND GND GND GND GND GND AN2 GND GND AN2 AN2 AN2 GND AN2

Trabajando en C el compilador CCS maneja unas funciones propias para la conversin analgica-digital. Utilizamos los siguientes ejemplos para entenderlo mejor:

4.3.1.- Conversin_A/D_D/A.c

C1
15p

VDD 9 10 1

U1
OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD 21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18

X1 C2
15p CRYSTAL

4MHz

2 3 4 5 6 7

V entrada
+

RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4/SS RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT PIC16F876

CONVERSOR DIGITAL/ANALGICO
D0 D1 D2 D3 D4 D5 D6 D7 LE DAC_8 VDD VOUT VREF+ VREF-

V salida

R1
5k

R2
5k

AM FM

GENERADOR DE FUNCIONES
A

VDD

OSCILOSCOPIO
B

IES Joan Mir

Pgina 101

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


//****** Digitalizar la seal Analgica procedente de la patilla AN0 y sacarla por el Puerto C ******** // **************************** Directivas de Preprocesado******************************** #include <16F876A.h> #device adc=8 // Conversor Analgico/Digital de 10 bit el PIC 16F876A puede trabajar con 8 o 10 bit de resolucion. #FUSES XT,NOWDT #use delay(clock=4000000) #BYTE TRISC = 0x87 #BYTE portC = 0x07 // TRISC en 87h. // PORTC en 07h.

// ************************ Funcin principal o programa principal ************************** void main() { int16 q; TRISC = 0B00000000; portC = 0; setup_adc_ports(0); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); while(1) { delay_us(5); q = read_adc(); portC = q; } } // Defines Puerto C como SALIDA de datos.

// Seleccionamos el Puerto A como entradas // Analgicas. Mirar ADCON1. // Fuente de reloj RC interno. // Habilitacin canal 0 "AN0" // Bucle infinito. // Retardo de 20uS necesaria para respetar el // tiempo de Adquisicin Tad. // Lectura canal 0 "AN0"

Se observa que a medida que aumentamos la frecuencia de la seal a digitalizar las muestras son cada vez, ms visibles. Segn el criterio de Nyquist-Shannon la frecuencia de muestreo tiene que ser como mnimo 2 veces la frecuencia mxima de la seal.

Fr muestreo 2 x Frmxima de la seal.


Ejemplo:

Frmxima de la seal.= 1 KHz Fr muestreo 2 KHz Tmuestreo


IES Joan Mir

= 2 = 500 Seg

Pgina 102

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

V entrada
Vmax = 4V Frecuencia =60Hz Seal Sinusoidal Unipolar

V entrada

V salida

V entrada
Vmax = 4V Frecuencia =1200Hz Seal Sinusoidal Unipolar

V entrada

V salida

IES Joan Mir

Pgina 103

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


En los siguientes ejercicios de Conversin Analgica/Digital vamos a digitalizar seales, presentar su valor en un LCD y actuaremos sobre un motor de Corriente Continua.

4.3.2.- Conversin_A-D1.c

IES Joan Mir

Pgina 104

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

//*************************Conversin Analgica Digital de la Patilla AN0 ***************************** // ******************************* Directivas de Preprocesado************************************** #include <16F876A.h> #device adc=10 de resolucion. #FUSES XT,NOWDT #use delay(clock=4000000) #include <LCD1.c> // Incluimos el driver LCD1.c que contiene las funciones de control del LCD.

// Conversor Analgico Digital de 10 bit el PIC 16F876A puede trabajar con 8 o 10 bit

// ************************ Funcin principal o programa principal *********************************** void main() { int16 q; float p; lcd_init(); setup_adc_ports(0); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); for (;;) { delay_us(5); q = read_adc(); p = 5.0 * q / 1024.0; // Retardo de 20uS necesaria para respetar el tiempo de // Adquisicin Tad. // Lectura canal 0 "AN0" // Conversin a tensin del cdigo digital "q". // Inicializamos el LCD. // Seleccionamos el Puerto A como entradas Analgicas. Mirar // ADCON1. // Fuente de reloj RC interno. // Habilitacin canal 0 "AN0" // Bucle infinito.

lcd_gotoxy(1,1); // Posicionamos el Cursor en la posicin 1, lnea 1. printf(lcd_putc, "\ADC = %4lu", q); // Escribimos en el LCD "ADC =" y 4 dgitos de // "q" en formato largo sin signo. printf(lcd_putc, "\nVOLTAJE = %01.3fV", p); // Saltamos de lnea y escribimos en el LCD // "VOLTAJE =" y 4 dgitos de "P" // en formato truncado de 4 dgitos con // 3 decimales y el carcter "V". } }

IES Joan Mir

Pgina 105

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.3.3.- Conversin_A-D2.c
//************** Conversin Analgica Digital de la Patilla AN0, AN1, AN2 y AN3 ************************* // **************************** Directivas de Preprocesado***************************************** #include <16F876A.h> #device adc=10 // Conversor Analogico Digital de 10 bit el PIC 16F876A puede trabajar con 8 o 10 bit de resolucion.

#FUSES XT,NOWDT #use delay(clock=4000000) #include <LCD1.c> // Incluimos el driver LCD1.c que contiene las funciones de control del LCD.

// *************************** Funcin principal o programa principal ******************************** void main() { int16 q; float p; setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(0); lcd_init(); while (true) { set_adc_channel(0); delay_us(5); q = read_adc(); p = 5.0 * q / 1024.0; lcd_gotoxy(1,1); printf(lcd_putc, "V1=%01.3fv", p); // Fuente de reloj RC interno. // Seleccionamos el Puerto A como entradas // Analgicas. Mirar ADCON1. // Inicializamos el LCD. // Bucle infinito. // Habilitacin canal 0 "AN0" // Retardo de 20uS necesaria para respetar el Tiempo // de Adquisicin Tad. // Lectura canal 0 "AN0" // Conversin a tensin del cdigo digital "q". // Posicionamos el Cursor en la posicin 1, lnea 1. // Escribimos en el LCD "V1 =" y 4 dgitos de "P" en // formato truncado de 4 dgitos con 3 decimales y el // carcter "v". // Habilitacin canal 1 "AN1" // Retardo de 20uS necesaria para respetar el Tiempo // de Adquisicin Tad. // Lectura canal 1 "AN1" // Conversin a tensin del cdigo digital "q". // Posicionamos el Cursor en la posicin 12, lnea 1. // Escribimos en el LCD "V2 =" y 4 dgitos de "P" en // formato truncado de 4 dgitos con 3 decimales y el

set_adc_channel(1); delay_us(5); q = read_adc(); p = 5.0 * q / 1024.0; lcd_gotoxy(12,1); printf(lcd_putc, "V2=%01.3fv", p);

IES Joan Mir

Pgina 106

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


// carcter "v". set_adc_channel(2); delay_us(5); q = read_adc(); p = 5.0 * q / 1024.0; lcd_gotoxy(1,2); printf(lcd_putc, "V3=%01.3fv", p); // Habilitacin canal 2 "AN2" // Retardo de 20uS necesaria para respetar el Tiempo // de Adquisicin Tad. // Lectura canal 2 "AN2" // Conversin a tensin del cdigo digital "q". // Posicionamos el Cursor en la posicin 1, lnea 2. // Escribimos en el LCD "V3 =" y 4 dgitos de "P" en // formato truncado de 4 dgitos con 3 decimales y el // carcter "v". // Habilitacin canal 3 "AN3" // Retardo de 20uS necesaria para respetar el Tiempo // de Adquisicin Tad. // Lectura canal 3 "AN3" // Conversin a tensin del cdigo digital "q". // Posicionamos el Cursor en la posicin 12, lnea 2. // Escribimos en el LCD "V4 =" y 4 dgitos de "P" en // formato truncado de 4 dgitos con 3 decimales y el //carcter "v".

set_adc_channel(3); delay_us(5); q = read_adc(); p = 5.0 * q / 1024.0; lcd_gotoxy(12,2); printf(lcd_putc, "V4=%01.3fv", p);

} }

4.3.4.- Conversin_A-D3.c
//************* Leer la patilla RA0 si la tensin es superior a 2,5 V activar motor ************************ //*************************** Directivas de Preprocesado****************************************** #include <16F876A.h> #device adc=10

// Conversor Analgico Digital de 10 bit el PIC 16F876A puede trabajar // con 8 o 10 bit de resolucin.

#FUSES XT,NOWDT #use delay(clock=4000000) #include <LCD1.c> // Incluimos el driver LCD1.c que contiene las funciones de //control del LCD. // TRISC en 87h. // PORTC en 07h. // RC0 en 0x07 patilla 0.

#BYTE TRISC = 0x87 #BYTE portC = 0x07 #BIT rc0 = 0x07.0

IES Joan Mir

Pgina 107

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

// ************************** Funcin principal o programa principal ********************************* void main() { int16 q; float p; TRISC = 0B00000000; rc0 = 0; lcd_init(); setup_adc_ports(0); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); while(1) { delay_us(20); q = read_adc(); p = 5.0 * q / 1024.0; lcd_gotoxy(1,1); printf(lcd_putc, "VOLTAGE = %01.3fV", p); // Defines Puerto C como SALIDA de datos. // Paramos motor. // Inicializamos el LCD. // Seleccionamos el Puerto A como entradas Analgicas. // Mirar ADCON1. // Fuente de reloj RC interno. // Habilitacin canal 0 "AN0" // Bucle infinito. // Retardo de 20uS necesaria para respetar el Tiempo de // Adquisicin Tad. // Lectura canal 0 "AN0" // Conversin a tensin del cdigo digital "q". // Situamos el Cursor en la posicin 1, // lnea 1. // Escribimos en el LCD "VOLTAJE =" // y 4 dgitos de "P" en formato truncado de //4 dgitos con 3 decimales y el carcter "V". // Posicionamos el Cursor en la posicin 1, // lnea 2. // Preguntamos si p es mayor que 2.5 // Activamos Motor. // Escribimos en el LCD "Motor Activado".

lcd_gotoxy(1,2); if(p>2.5) { rc0 = 1; printf(lcd_putc,"Motor Activado"); } else { rc0 = 0; printf(lcd_putc," Motor Parado"); } }

// Paramos Motor. // Escribimos en el LCD "Motor Parado".

IES Joan Mir

Pgina 108

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.4.- Control de velocidad y sentido de giro de Motores de Corriente Continua.
La velocidad de un Motor de Corriente Continua depende del valor medio de la tensin aplicada en sus extremos. El sistema ms utilizado para controlar la velocidad de un motor DC de pequea potencia es mediante la modulacin por ancho de pulso PWM (Pulse Width Modulation) de una seal cuadrada TTL. El motor gira a una velocidad proporcional a la media del nivel de tensin de la seal cuadrada aplicada.

V motor Vmedia= 0% x 5v = 0v

TH (Motor Parado)
16 32

0%

CT =

TH T

x 100 =

0 mS 16 mS

= 0%

T
V motor

(mSeg)

Vmedia= 20% x 5v = 1v

5v

TH CT = 20%
3,2 16 32

TH T

x 100 =

3,2 mS 16 mS

= 20 %

T
V motor

(mSeg)

Vmedia= 50% x 5v = 2,5v

5v

TH 50% CT =

TH T

x 100 =

8 mS 16 mS

= 50 %

16

32

T
V motor

(mSeg)

Vmedia= 80% x 5v = 4v

5v TH
12,8 16 32

80%

CT =

TH T

x 100 =

12,8 mS 16 mS

= 80 %

T
V motor

(mSeg)

Vmedia= 100% x 5v = 5v

5v TH T
16 32

100% CT = (Velocidad Mxima)

TH T

x 100 =

16 mS 16 mS

= 100 %

(mSeg)

IES Joan Mir

Pgina 109

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


La tensin media aplicada al motor se controla aplicando una seal cuadrada de frecuencia constante (Periodo constante T) y variando el tiempo a nivel alto TH de la seal, es decir variando su ciclo de trabajo CT= TH/T. Si el CT es del 50% la tensin media aplicada al motor ser del 50%. A mayor tensin mayor velocidad. El microcontrolador PIC16F876A tiene incorporado dos circuito electrnicos que generan seal es PWM. Cada seal PWM sale por diferentes patillas RC1 y RC2. La frecuencia para ambas seales es la misma, ya que utilizan el mismo temporizador para generar dicha frecuencia (TIMER2). El compilador C de CCS nos proporciona unas funciones para trabajar con PWM. Para entender mejor lo explicado utilizaremos unos ejemplos.

4.4.1.- PWM1.c

//******************Control de velocidad con PWM a travs de un Potencimetro *********************** // ********************************* Directivas de Preprocesado************************************ #include <16F876A.h> #device adc=10 #FUSES XT,NOWDT #use delay(clock=1000000) // ***************************** Funcin principal o programa principal ****************************** void main() { int16 TH =0; setup_adc(ADC_CLOCK_INTERNAL); // Fuente de reloj RC interno. setup_adc_ports(0); // Seleccionamos el Puerto A como entradas // Analgicas. Mirar ADCON1.

// Conversor Analgico Digital de 10 bit el PIC 16F876A puede trabajar // con 8 o 10 bit de resolucin.

IES Joan Mir

Pgina 110

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


setup_timer_2(T2_DIV_BY_16,249,1); // setup_timer(Prescaler,PR2,Postscaler) // Configuracin timer2. Si el Periodo = 16mS ----> T = 16000uS // T = [PR2+1] x Tcm x Postscaler x Prescaler // PR2 puede valer de 0 a 255. // Tcm es el tiempo de Ciclo Maquina. // Tcm = 4/Fosc = 4/1.000.000 hz = 4uS. // Prescaler puede valer 1,4,16 // Postscaler puede valer 1. // 16000uS = [PR2+1] x 4 x 16 x 1 // PR2 =[T/(Tcm x Preescaler x Postscaler)]-1 // PR2 =[16000uS/(4uS x 16 x 1)]-1 = 249 (en C 249) // CCP2 en modo PWM (Salida por RC1) // Habilitacin canal 0 "AN0" // Bucle infinito.

setup_ccp2(CCP_PWM); set_adc_channel(0); while (true) { delay_us(20); TH = read_adc(); set_pwm2_duty(TH); delay_ms(5);

// Retardo de 20uS necesaria para respetar el tiempo de // Adquisicin Tad. // Lectura canal 0 "AN0" set_pwm2_duty(TH); // Refrescamos el Tiempo alto TH de la seal. // Tiene que transcurrir un tiempo mayor que el periodo de la // seal T =16000 uS, para refrescar el nivel alto de la seal. // Si utilizamos la funcin delay_ms(5) el tiempos de retardo // equivale al valor puesto multiplicado por 4 (Estamos // utilizando un cristal de 1 MHz). es decir 20ms.

} }

4.4.2.- PWM2.c
En este ejemplo se pretende controlar la velocidad y el sentido de giro de 2 motores de corriente continua. Se utiliza el C.I. L298N que sirve para invertir el paso de la corriente por los motores. Tienes dos circuitos electrnicos idnticos. Su tabla de la verdad sera: Entradas ENA IN1 IN2 0 x x 1 0 0 1 0 1 1 1 0 1 1 1 Salidas OUT1 OUT2 5v 5v 0v 0v 0v 9v 9v 0v 9v 0v Efectos sobre un Motor Parado Parado Giro a Derechas Giro a Izquierdas Parado

IES Joan Mir

Pgina 111

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

IES Joan Mir

Pgina 112

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


El circuito utilizado para realizar es el de la figura de arriba. Con el Potencimetro RV1 y el interruptor SW1 controlamos la velocidad y el sentido de giro del Motor MOT1 y con el Potencimetro RV2 y el interruptor SW2 controlamos la velocidad y el sentido de giro del Motor MOT2.
//**********Control de velocidad y sentido de giro de 2 motores de corriente continua *********** // **************************** Directivas de Preprocesado******************************** #include <16F876A.h> #device adc=10

// Conversor Analgico Digital de 10 bit el PIC 16F876A puede trabajar // con 8 o 10 bit de resolucin.

#FUSES XT,NOWDT #use delay(clock=1000000) #BYTE TRISB = 0x86 #BYTE portB = 0x06 #BIT rb0 = 0x06.0 #BIT rb1 = 0x06.1 #BIT rb2 = 0x06.2 #BIT rb3 = 0x06.3 #BIT rb4 = 0x06.4 #BIT rb5 = 0x06.5 int16 TH =0; // *********************** Funcin principal o programa principal *************************** void main() { TRISB = 0B00110000; // Defines PB7,6,4,3,2,1,0 como SALIDA de datos y // PB5,4 como entrada de datos. portB = 0B00000000; // Reseteamos el Puerto B. setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(0); setup_timer_2(T2_DIV_BY_16,249,1); // Fuente de reloj RC interno. // Seleccionamos el Puerto A como entradas // Analgicas. Mirar ADCON1. // setup_timer(Prescaler,PR2,Postscaler) // Configuracin timer2. // Si el Periodo = 16mS ----> T = 16000uS // T = [PR2+1] x Tcm x Postscaler x Prescaler // PR2 puede valer de 0 a 255. // Tcm es el tiempo de Ciclo Maquina. // Tcm = 4/Fosc = 4/1.000.000 hz = 4uS. // Prescaler puede valer 1,4,16 // Postscaler puede valer 1. // 16000uS = [PR2+1] x 4 x 16 x 1 // PR2 =[T/(Tcm x Preescaler x Postscaler)]-1 // PR2 =[16000uS/(4uS x 16 x 1)]-1 = 249 // TRISB en 86h. // PORTB en 06h. // RB0 en 0x06 patilla 0. // RB1 en 0x06 patilla 1. // RB0 en 0x06 patilla 2. // RB1 en 0x06 patilla 3. // RB0 en 0x06 patilla 4. // RB1 en 0x06 patilla 5.

IES Joan Mir

Pgina 113

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


setup_ccp2(CCP_PWM); setup_ccp1(CCP_PWM); while (true) { set_adc_channel(0); delay_us(20); TH = read_adc(); set_pwm2_duty(TH); if(rb4 == 1) { rb0 = 1; rb1 = 0; } Else { rb0 = 0; rb1 = 1; } set_adc_channel(1); delay_us(20); TH = read_adc(); set_pwm1_duty(TH); if(rb5 == 1) { rb2 = 1; rb3 = 0; } Else { rb2 = 0; rb3 = 1; } delay_ms(5); // CCP2 en modo PWM (Salida por RC1) // CCP1 en modo PWM (Salida por RC2) // Bucle infinito. // Habilitacin canal 0 "AN0" // Retardo de 20uS necesaria para respetar el // tiempo de Adquisicin Tad. // Lectura canal 0 "AN0" // Refrescamos el Tiempo alto TH de la seal.

// Motor 1. Giro a Derechas

// Motor 1. Giro a Izquierdas

// Habilitacin canal 1 "AN1" // Retardo de 20uS necesaria para respetar el // tiempo de Adquisicin Tad. // Lectura canal 1 "AN1" // Refrescamos el Tiempo alto TH de la seal.

// Motor 2. Giro a Derechas

// Motor 2. Giro a Izquierdas

// Tiene que transcurrir un tiempo mayor que el periodo de // la seal T =16000 uS, para refrescar el nivel alto de la // seal. Si utilizamos la funcin delay_ms(5) el tiempos de // retardo equivale al valor puesto multiplicado por 4 // (Estamos utilizando un cristal de 1 MHz). es decir 20ms.

} }

IES Joan Mir

Pgina 114

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.4.3.- PWM3.c
La funcin set_pwm2_duty(TH) genera una seal de PWM de 10bit, es decir TH est definido con esta resolucin. Tenemos 210 (01023) cdigos diferentes para controla el nivel alto TH. Si queremos controlar TH con solo 8 bits 28 (0..255) cdigos diferentes el proceso es el siguiente: Leemos un dato de 8 bits , lo introducimos en la variable TH de 16 bit 216 (0..65535). Multiplicamos el contenido de la variable TH por 4. Introducimos TH en la funcin set_pwm2_duty(int16);

Ejemplo:
PORT B 1 TH PORTB TH TH x 4 // Introducimos en el Puerto B el nmero 5 // Introducimos en TH el contenido del Puerto B. // TH vale 4 // Se genera una seal PWM cuyo tiempo a nivel alto // TH es proporcional al cdigo introducido.

set_pwm2_duty(TH);

PORT B 128 TH PORTB TH TH x 4

// Introducimos en el Puerto B el nmero 5 // Introducimos en TH el contenido del Puerto B. // TH vale 512 // Se genera una seal PWM cuyo tiempo a nivel alto // TH es proporcional al cdigo introducido.

set_pwm2_duty(TH);

PORT B 255 TH PORTB TH TH x 4

// Introducimos en el Puerto B el nmero 5 // Introducimos en TH el contenido del Puerto B. // TH vale 1020 // Se genera una seal PWM cuyo tiempo a nivel alto // TH es proporcional al cdigo introducido.

set_pwm2_duty(TH);

Ejemplo:

IES Joan Mir

Pgina 115

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


//****************Control de velocidad de un motor con PWM a travs del Puerto B ****************** // ******************************* Directivas de Preprocesado********************************** #include <16F876A.h> #FUSES XT,NOWDT #use delay(clock=1000000) #BYTE TRISB = 0x86 #BYTE portB = 0x06 // TRISB en 86h. // PORTB en 06h.

// ************************ Funcin principal o programa principal ******************************* void main() { int16 TH =0; TRISB = 0B11111111; // Defines Puerto B como entrada de datos.

setup_timer_2(T2_DIV_BY_16,249,1);

// setup_timer(Prescaler,PR2,Postscaler) // Configuracin timer2. Si el Periodo = 16mS ----> T = 16000uS // T = [PR2+1] x Tcm x Postscaler x Prescaler // PR2 puede valer de 0 a 255. // Tcm es el tiempo de Ciclo Maquina. // Tcm = 4/Fosc = 4/1.000.000 hz = 4uS. // Prescaler puede valer 1,4,16 // Postscaler puede valer 1. // 16000uS = [PR2+1] x 4 x 16 x 1 // PR2 =[T/(Tcm x Preescaler x Postscaler)]-1 // PR2 =[16000uS/(4uS x 16 x 1)]-1 = 249 (en C 249) // CCP2 en modo PWM (Salida por RC1) // Bucle infinito. // Lectura del Puerto B // Multiplicar TH por 4 // Refrescamos el Tiempo alto TH de la seal. // Tiene que transcurrir un tiempo mayor que el periodo de la // seal T =16000 us, para refrescar el nivel alto de la seal. // Si utilizamos la funcin delay_ms(5)el tiempos de retardo // equivale al valor puesto multiplicado por 4 (Estamos utilizando // un cristal de 1 MHz) es decir 20ms.

setup_ccp2(CCP_PWM); while (true) { TH = portB; TH = TH *4; set_pwm2_duty(TH); delay_ms(5);

} }

IES Joan Mir

Pgina 116

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.5.- Control de un Servo de Posicin.
Un Servomotor de posicin, da una posicin angular proporcional a una variable elctrica. Si se intenta variar la posicin angular (Quitando o poniendo Inercia en su eje) este debe mantener su posicin angular. Los servos de posicin ms utilizados en microcrobtica son los controlados por PWM. (Hitec HS-300, Futaba S3003, etc.) Estn constituidos por un pequeo motor de corriente continua, unas ruedas dentadas que trabajan como reductoras, (dando una potencia considerable) y una pequea tarjeta de control. Debido a la reductora mecnica formada por las ruedas mecnicas se pueden conseguir pares de fuerzas de 3 Kg/cm o superiores. La seal de PWM que ataca a los servos est comprendida entre 4 y 8V. El consumo puede ser considerable hasta que el servo alcanza su posicin (hasta 500 mA). Funcionamiento:

IES Joan Mir

Pgina 117

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


En el siguiente ejemplo simulado en Proteus hemos utilizado un driver de control del servo de posicin llamado Servo_Futaba_10bit.c que nos ayudar a realizar el control de forma muy sencilla.

4.5.1.- Control_2_Servos_Posicin.c

IES Joan Mir

Pgina 118

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


/* *** Driver de Control de un Servomotor de Posicin de Futaba con PWM utilizando 10 bit de resolucin ****** ; Con TH=0 corresponde a -90 grados de Posicin del servo ; Con TH=57 corresponde a 0 grados de Posicin del servo ; Con TH=113 corresponde a 90 grados de Posicin del servo ;El microcontrolador PIC 16f876a tiene un hardware integrado que puede generar 2 seales PWM ;por las patillas RC2 y RC1. ;El periodo para ambas seales se fija con la siguiente frmula ;T =[(PR2+1)*4*Tosc]*(TMR2_Valor_preescalar) ;El nivel alto T1H se controla con 10 bit ( Los 8 bit ms significativo con el registro CCPR1L y ;los dos bit menos significativos con CCP1X y CCP1Y que estn en el registro CCP1CON) ;Esta seal sale por la patilla RC2. ;El nivel alto T2H se controla con 10 bit ( Los 8 bit ms significativo con el registro CCPR2L y ;los dos bit menos significativos con CCP2X y CCP2Y que estn en el registro CCP2CON) ;Esta seal sale por la patilla RC1. ;Para refrescar el nivel alto T1H que haber transcurrido un tiempo superior a un periodo "T". ;El Servomotor de Futaba se controla con una seal cuadrada de periodo "T1". ;La posicin del Servomotor lo determina el nivel alto de la seal "T1H" ;El Servomotor de Futaba necesita un periodo "T1" entre 10ms y 30 ms. ;Cargando los registros de forma correcta sale T1 =[(249+1)*4*1uS](16)=16 mS (Cristal de cuarzo 1 MHz) ;Tiene un control de Posicin de -90 Grados < P (Angular)< +90 Grados controlado con T1H. ;Para -90 Grados corresponde un nivel alto T1H = 0,6 ms ;Para 0 Grados corresponde un nivel alto T1H = 1,2 ms ;Para +90 Grados corresponde un nivel alto T1H = 2,4 ms

*/

// ****************************** Declaracin de funciones ***************************************** void Inicializacion_Futaba_RC1(); void Inicializacion_Futaba_RC2(); void Futaba_RC1(int16 TH); void Futaba_RC2(int16 TH); // Inicializar PWM por RC1 // Inicializar PWM por RC2 // Generar PWM por RC1 // Generar PWM por RC2

//************************************* Igualdades *********************************************** #define THmin 37 #define THmax 150 #define THmed 94 // THmin=37 equivale a 600uS a nivel alto a -90 // THmax=150 equivale a 2400uS a nivel alto a +90 // THmed=94 equivale a 1500uS a nivel alto a 0

IES Joan Mir

Pgina 119

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

// ******************************* Funcin Inicializacion_Futaba_RC1() ******************************* void Inicializacion_Futaba_RC1() { int16 TH; setup_timer_2(T2_DIV_BY_16,249,1); // setup_timer(Prescaler,PR2,Postscaler) // Configuracin timer2. Si el Periodo = 16mS ----> T = 16000uS // T = [PR2+1] x Tcm x Postscaler // PR2 puede valer de 0 a 255. // Tcm es el tiempo de Ciclo Maquina. // Tcm = 4/Fosc = 4/1.000.000 hz = 4uS. // Prescaler puede valer 1,4,16 // Postscaler puede valer 1. // 16000uS = [PR2+1] x 1 x 16 // PR2 =[T/(Tcm x Preescaler x Postscaler)]-1 // PR2 =[16000uS/(4uS x 16 x 1)]-1 = 249 (en C 249) // CCP2 en modo PWM (Salida por RC1) // Cargar TH con valor medio // Refrescamos el Tiempo alto TH de la seal.

setup_ccp2(CCP_PWM); TH = THmed; set_pwm2_duty(TH); delay_ms(5); }

// ******************************** Funcin Inicializacion_Futaba_RC2() ******************************* void Inicializacion_Futaba_RC2() { int16 TH; setup_timer_2(T2_DIV_BY_16,249,1); // setup_timer(Prescaler,PR2,Postscaler) // Configuracin timer2. Si el Periodo = 16mS ----> T = 16000uS // T = [PR2+1] x Tcm x Postscaler // PR2 puede valer de 0 a 255. // Tcm es el tiempo de Ciclo Maquina. // Tcm = 4/Fosc = 4/1.000.000 hz = 4uS. // Prescaler puede valer 1,4,16 // Postscaler puede valer 1. // 16000uS = [PR2+1] x 1 x 16 // PR2 =[T/(Tcm x Preescaler x Postscaler)]-1 // PR2 =[16000uS/(4uS x 16 x 1)]-1 = 249 (en C 249) // CCP1 en modo PWM (Salida por RC2) // Cargar TH con valor medio // Refrescamos el Tiempo alto TH de la seal.

setup_ccp1(CCP_PWM); TH = THmed; set_pwm1_duty(TH); delay_ms(5); }

IES Joan Mir

Pgina 120

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


// ********************************* Funcin Futaba_RC1(int16 TH) ********************************** void Futaba_RC1(int16 TH) { TH = TH+THmin; if(TH>THmin && TH<THmax) set_pwm2_duty(TH); // Cargar TH con valor mnimo // Si THmin < TH < THmax // Refrescamos el Tiempo alto TH de la seal.

if(TH<=THmin) // Si TH THmin { TH=THmin+1; // Cargar TH con valor mnimo set_pwm2_duty(TH); // Refrescamos el Tiempo alto TH de la seal. } if(TH>=THmax) // Si TH THmax { TH=THmax-1; // Cargar TH con valor mximo set_pwm2_duty(TH); // Refrescamos el Tiempo alto TH de la seal. } delay_ms(5); // Tiene que transcurrir un tiempo mayor que el periodo de la seal T =16000 us, // para refrescar el nivel alto de la seal. // Si utilizamos la funcin delay_ms(5)el tiempos de retardo equivale al // valor puesto multiplicado por 4 (Estamos utilizando un cristal de 1 MHz). // es decir 20ms. } // ********************************** Funcin Futaba_RC2(int16 TH) ********************************* void Futaba_RC2(int16 TH) { TH = TH+THmin; if(TH>THmin && TH<THmax) set_pwm1_duty(TH); if(TH<=THmin) { TH=THmin+1; set_pwm1_duty(TH); } if(TH>=THmax) { TH=THmax-1; set_pwm1_duty(TH); } delay_ms(5); // Cargar TH con valor mnimo // Si THmin < TH < THmax // Refrescamos el Tiempo alto TH de la seal. // Si TH THmin // Cargar TH con valor mnimo // Refrescamos el Tiempo alto TH de la seal. // Si TH THmax // Cargar TH con valor mximo // Refrescamos el Tiempo alto TH de la seal.

// Tiene que transcurrir un tiempo mayor que el periodo de la seal T =16000 us, // para refrescar el nivel alto de la seal. // Si utilizamos la funcin delay_ms(5)el tiempos de retardo equivale al // valor puesto multiplicado por 4 (Estamos utilizando un cristal de 1 MHz). // es decir 20ms.

IES Joan Mir

Pgina 121

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


//******************************* Control de Posicin de 2 Servo Futaba ****************************** // ************************************ Directivas de Preprocesado********************************* #include <16F876A.h> #device adc=10 #FUSES XT,NOWDT #use delay(clock=4000000) #include <Servo_Futaba_10bit.c> // Incluimos el driver que contiene las funciones de control de // los Servos de Futaba.

// Conversor Analgico Digital de 10 bit el PIC 16F876A puede trabajar //con 8 o 10 bit de resolucin.

// ****************************** Funcin principal o programa principal ****************************** void main() { int16 TH; Inicializacion_Futaba_RC1(); Inicializacion_Futaba_RC2(); // While (1); setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(0); // Inicializacin del Servo en RC1 // Inicializacin del Servo en RC2 // Vemos posicin central. // Fuente de reloj RC interno. // Seleccionamos el Puerto A como entradas Analgicas. // Mirar ADCON1. // Bucle infinito.

while (true) { set_adc_channel(0); delay_us(5); TH = read_adc(); Futaba_RC1(TH);

// Habilitacin canal 0 "AN0" // Retardo de 20uS necesaria para respetar el tiempo de // Adquisicin Tad. // Lectura canal 0 "AN0" // Posicionar el Servo de la patilla RC1.

set_adc_channel(1); delay_us(5); TH = read_adc(); Futaba_RC2(TH); } }

// Habilitacin canal 1 "AN1" // Retardo de 20uS necesaria para respetar el tiempo de // Adquisicin Tad. // Lectura canal 1 "AN1" // Posicionar el Servo de la patilla RC2.

IES Joan Mir

Pgina 122

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.6.- Diseo de Mandos Transmisores y Receptores de radio frecuencia.

4.6.1.- Introduccin.
Antes de introducirnos en la Transmisin y Recepcin Serie de datos va radiofrecuencia, explicaremos de forma breve el tipo de transmisin utilizada, como se modula la seal para poderla transmitir va radio frecuencia y que protocolo se ha seguido para poder dar seguridad a una transmisin. 4.6.1.1.- Transmisin serie asncrona. Es transmitir 8 bit de uno en uno siguiendo un protocolo de comunicaciones. Primero se transmite un bit de START despus 8 bit de DATOS y por ultimo un bit de STOP. El transmisor y receptor de datos tiene que estar trabajando a la misma velocidad. En nuestro caso 2400 bit/segundo. Los datos se comunican en serie de la siguiente manera:

El nmero de bits de datos, bit de Stop es uno de los parmetros configurables, as como el criterio de paridad par o impar para la deteccin de errores. Normalmente, las comunicaciones serie tienen los siguientes parmetros: 1 bit de Start, 8 bits de Datos, 1 bit de Stop y sin paridad. En esta figura se puede ver un ejemplo de la transmisin del dato binario 01011010B. La lnea en reposo est a nivel alto: (Se transmite primero el bit LSB)

IES Joan Mir

Pgina 123

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


4.6.1.2.- Modulacin en AM. Es introducir una seal moduladora (En nuestro caso una seal cuadrada procedente de la transmisin serie de datos) en la Amplitud de la portadora. La Tarjeta Transmisora de Datos CEBEK C-0503 es un circuito hbrido encargado de transmitir va radiofrecuencia, los datos digitales SERIE procedentes de la patilla RC6/TX del microcontrolador PIC 16f876a del mando. La seal digital tiene que tener una frecuencia entre 20 Hz < fo < 4 KHz. Y se modular con una portadora de 433,92 MHz.

4.6.1.3.- Protocolo de Comunicaciones entre el Mando y el Receptor. Se ha utilizado una transmisin serie asncrona de datos. Se transmite una rfaga de datos de la siguiente manera: 1bit de START + 8bit de DATOS + 1bit de STOP (Llave que identifica un proceso, se ha activado un pulsador o se ha variado el Potencimetro del Mando.) 1bit de START + 8bit de DATOS + 1bit de STOP (Informacin del proceso, que pulsador se ha activado o la tensin digitalizada del Potencimetro del Mando.)

Esta rfaga (Seal que sale de la patilla RC6/TX del microcontrolador PIC16F876A) se transmite va serie 10 veces a una velocidad de 2400 bit/segundo. El modulador CEBEK C-0503 genera una seal de AM con esta seal moduladora. El receptor serie CEBEK C-0504 demodula la seal, es decir filtra la portadora de 433,92 MHz obteniendo la seal moduladora (Rfaga de datos) El microcontrolador del Receptor trabaja en modo interrupcin Serie de Datos. Es decir cada vez que le llega un dato con el protocolo asincrono serie ( 1bit de START 8 bit de DATOS, 1 bit de STOP y a una frecuencia de 2400 bit/segundo.) interrumpir un programa principal y ejecutar una rutina de interrupcin para este proceso. La rutina de interrupcin realiza el proceso de validar los datos que le llegan. Se validan los datos si llegan dos rfagas de 20bits consecutivas y tienen la mismas llaves que identifican el proceso e informacin del proceso.

IES Joan Mir

Pgina 124

Curso de Robtica y aplicaciones a el Aula de Tecnologa

IES Joan Mir

Pgina 125

Curso de Robtica y aplicaciones a el Aula de Tecnologa


4.6.2.- Ejemplo 1 (Transmisin Simple).

Transmisin_Serie_1a.c
//************************ Mando de Transmisin serie va radiofrecuencia ***************************** // ********************************* Directivas de Preprocesado************************************* #include <16F876A.h> #FUSES XT,NOWDT #use delay(clock=4000000) #use rs232(baud=2400, xmit=pin_c6, rcv=pin_c7) // Definimos la velocidad de transmisin de 2400 // baudios/segundo // Elegimos RC6 como patilla transmisora de datos. // Elegimos RC7 como patilla receptora de datos. // TC3 en 0x87 patilla 7. // RC3 en 0x07 patilla 3.

#BIT TC3 = 0x87.3 #BIT rc3 = 0x07.3

IES Joan Mir

Pgina 126

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


#BYTE TRISB = 0x86 #BYTE portB = 0x06 #BIT rb0 = 0x06.0 #BIT rb1 = 0x06.1 #BIT rb2 = 0x06.2 #BIT rb3 = 0x06.3 #BIT rb4 = 0x06.4 #BYTE cambio2 = 0x20 #BIT c0 = 0x20.0 #BIT c1 = 0x20.1 #BIT c2 = 0x20.2 #BIT c3 = 0x20.3 #BIT c4 = 0x20.4 #define Clave_Pulsadores 63 #define Numero_Repeticiones 10 // ******************************* Funcin principal o programa principal ***************************** void main() { int8 i=1; int8 q; TRISB = 0B11111111; cambio2=0; TC3 = 0; rc3 = 1; while(1) { q= portB & 0B00011111; if (q!=0B00011111) { if (rb0==0) c0=~c0; if (rb1==0) c1=~c1; if (rb2==0) c2=~c2; if (rb3==0) c3=~c3; if (rb4==0) c4=~c4; rc3 = 0; // Si se pulsa rb0 cambiar el valor de c0. // Si se pulsa rb1 cambiar el valor de c1. // Si se pulsa rb2 cambiar el valor de c2. // Si se pulsa rb3 cambiar el valor de c3. // Si se pulsa rb4 cambiar el valor de c4. // Habilitamos la tarjeta CEBEK C-0503. // Definimos la variable "i" como tipo byte. // Definimos la variable "q" como tipo byte. // Defines Puerto B como ENTRADA de datos. // Inicializamos la variable cambio2 con 0. // Defines la patilla 3 Puerto C como SALIDA de datos. // Inhabilitamos la tarjeta CEBEK C-0503. // bucle infinito. // Filtramos los 5 bit menos significativos del Puerto B. // Si se activa un pulsador, transmitir datos. // TRISB en 86h. // PORTB en 06h. // RB0 en 0x06 patilla 0. // RB1 en 0x06 patilla 1. // RB2 en 0x06 patilla 2. // RB3 en 0x06 patilla 3. // RB4 en 0x06 patilla 4. // cambio2 en 0x20h. // c0 en 0x20.0 // c1 en 0x20.1 // c2 en 0x20.2 // c3 en 0x20.3 // c4 en 0x20.4

IES Joan Mir

Pgina 127

for (i=0; i<=Numero_Repeticiones; i++) // Enviamos de Tecnologa Curso de Robtica y otras aplicaciones en el Aula el dato via serie, tantas veces { putc(Clave_Pulsadores); putc(cambio2); } rc3 = 1; delay_ms(200); } } } // Inhabilitamos la tarjeta CEBEK C-0503. // Esperamos 200 mS hasta que dejemos de pulsar. // Enviamos va serie la Clave_Pulsador. // Enviamos va serie la variable cambio2.

// como diga la variable Nmero_Repeticiones

Recepcin_Serie_1a.c
//********************************* Recepcin Serie de Datos Simple ******************************** // ************************************ Directivas de Preprocesado********************************** #include <16F876A.h> #FUSES XT,NOWDT #use delay(clock=4000000)

#use rs232(baud=2400,xmit=pin_c6, rcv=pin_c7)

#BYTE TRISB = 0x86 #BYTE portB = 0x06 #define Clave_Pulsadores 63

// Definimos la velocidad de transmisin de 2400 // baudios/segundo // Elegimos RC6 como patilla transmisora de datos. // Elegimos RC7 como patilla receptora de datos. // TRISB en 86h. // PORTB en 06h.

/* ****************************** Declaracin de funciones *************************************** */ void leer_dato_serie (void); // Leer Dato.

// ************************ Funcin principal o programa principal ************************************ void main() { TRISB = 0B00000000; // Defines Puerto B como SALIDA de datos. portB = 0B00000000; // Reseteamos el Puerto B. enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); // Habilitamos la interrupcin serie de datos. // Habilitamos la Interrupcin General.

IES Joan Mir

Pgina 128

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


while(1) { sleep(); // Bucle sin fin. // Se pone el uC en bajo consumo. Cuando le llega una // transmisin serie de datos se activa el uC. Atiende la // interrupcin y vuelve a bajo consumo.

} } /* ******************** Atencin a la interrupcin por recepcin serie de datos ************************ */ #int_RDA /* Validamos el dato serie si cumple las siguiente condiciones. Si dos palabras consecutivas de 2 byte son iguales se valida el dato. clave,dato,clave,dato,......,clave,dato Se lee el 1 dato serie recibido con la funcin "getc()" y se compara con la "clave" del transmisor que tiene que ser la misma que la del receptor, si son iguales se lee el 2 dato serie recibido con la funcin "getc()" y se guarda. Se lee el 3 dato serie recibido con la funcin "getc()" y se compara con la "clave" del transmisor que tiene que ser la misma que la del receptor, si son iguales se lee el 4 dato serie recibido con la funcin "getc()" y se compara con el 2 dato ledo, si son iguales se valida el dato con la variable global "Valor". */ void leer_dato_serie (void) { int8 Dato_Recibido; int8 Numero_datos1; int8 dato1; Dato_Recibido=getc(); switch (Numero_datos1) { case 0: if(Dato_Recibido==Clave_Pulsadores) { Numero_datos1=1; } break; case 1: dato1=Dato_Recibido; Numero_datos1=2; break; // Recibimos el dato serie. // Es un autmata modelo Moore, que valida los datos // si llegan dos tramas iguales consecutivas

IES Joan Mir

Pgina 129

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


case 2: if(Dato_Recibido==Clave_Pulsadores) { Numero_datos1=3; } else { Numero_datos1=0; } break; case 3: if(Dato_Recibido==dato1) Numero_datos1=0; } } portB=Dato_Recibido; // El dato vlido se deposita en el Puerto B

IES Joan Mir

Pgina 130

Curso de Robtica y aplicaciones a el Aula de Tecnologa


4.6.3.- Ejemplo2 (Transmisin Compleja).

IES Joan Mir

Pgina 131

Curso de Robtica y aplicaciones a el Aula de Tecnologa


Transmisin_Serie_2.c
//****************** Mando de Transmisin serie va radiofrecuencia (Pulsadores y Potencimetros)********* // ******************************** Directivas de Preprocesado************************************** #include <16F876A.h> #device adc=8 #FUSES XT,NOWDT #use delay(clock=4000000) #use rs232(baud=2400, xmit=pin_c6, rcv=pin_c7) // Definimos la velocidad de transmisin de // 2400 baudios/segundo // Elegimos RC6 como patilla transmisora de datos. // Elegimos RC7 como patilla receptora de datos. // TRISB en 86h. // PORTB en 06h. // TC3 en 0x87 patilla 7. // RC3 en 0x07 patilla 3. // RB0 en 0x06 patilla 0. // RB1 en 0x06 patilla 1. // RB2 en 0x06 patilla 2. // RB3 en 0x06 patilla 3. // RB4 en 0x06 patilla 4. // RB5 en 0x06 patilla 5. // cambio2 en 0x20h. // c0 en 0x20.0 // c1 en 0x20.1 // c2 en 0x20.2 // c3 en 0x20.3 // c4 en 0x20.4 // c5 en 0x20.5

#BYTE TRISB = 0x86 #BYTE portB = 0x06 #BIT TC3 = 0x87.3 #BIT rc3 = 0x07.3 #BIT rb0 = 0x06.0 #BIT rb1 = 0x06.1 #BIT rb2 = 0x06.2 #BIT rb3 = 0x06.3 #BIT rb4 = 0x06.4 #BIT rb5 = 0x06.5 #BYTE cambio2 = 0x20 #BIT c0 = 0x20.0 #BIT c1 = 0x20.1 #BIT c2 = 0x20.2 #BIT c3 = 0x20.3 #BIT c4 = 0x20.4 #BIT c5 = 0x20.5 #define Clave_Pot_Der 235 #define Clave_Pot_Izq 134 #define Clave_Pulsadores 63 #define Numero_Repeticiones 10

// ***************************** Funcin principal o programa principal ******************************* void main() { int8 cambio0=0; // Definimos la variable "cambio0" como tipo bit. int8 cambio1=0; // Definimos la variable "cambio1" como tipo bit. int8 i=1; // Definimos la variable "i" como tipo byte.

IES Joan Mir

Pgina 132

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


int8 q; int1 rb5_1=0; cambio2=0; TRISB = 0B11111111; TC3 = 0; RC3 = 1; setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(0); while(1) { set_adc_channel(0); delay_us(20); q = read_adc(); // Definimos la variable "q" como tipo byte. // Definimos la variable "rb5_1" como tipo bit. // Reseteamos la variable cambio2. // Defines Puerto B como ENTRADA de datos. // Defines la patilla 3 Puerto C como SALIDA de datos. // Inhabilitamos la tarjeta CEBEK C-0503. // Fuente de reloj RC interno. // Seleccionamos el Puerto A como entradas Analogicas. // Mirar ADCON1. // bucle infinito. // Habilitacin canal 0 "AN0" // Retardo de 20uS necesaria para respetar el tiempo de // Adquisicin Tad. // Lectura canal 0 "AN0"

if (cambio0!=q) // Si se ha variado el Potencimetro Derecho transmitir dato. { cambio0=q; RC3 = 0; // Habilitamos la tarjeta CEBEK C-0503. for(i=1;i<=Numero_Repeticiones;i++) // Enviamos el dato va serie, tantas veces // como diga la variable Nmero_Repeticiones { putc(Clave_Pot_Der); // Enviamos va serie la Clave_Pot_Der. putc(q); // Enviamos va serie la variable q.(Tensin //digitalizada del Potencimetro Derecho) } RC3 = 1; // Inhabilitamos la tarjeta CEBEK C-0503. } set_adc_channel(1); delay_us(20); q = read_adc(); // Habilitacin canal 1 "AN1" // Retardo de 20uS necesaria para respetar el tiempo de // Adquisicin Tad. // Lectura canal 1 "AN1"

if (cambio1!=q) // Si se ha variado el Potencimetro Izquierdo transmitir dato. { cambio1=q; RC3 = 0; // Habilitamos la tarjeta CEBEK C-0503. for(i=1;i<=Numero_Repeticiones;i++) // Enviamos el dato va serie, tantas veces // como diga la variable Nmero_Repeticiones { putc(Clave_Pot_Izq); // Enviamos va serie la Clave_Pot_Der. putc(q); // Enviamos va serie la variable q.(Tensin // digitalizada del Potencimetro Izquierdo)

IES Joan Mir

Pgina 133

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


RC3 = 1; } q= portB & 0B00011111; if (q!=0B00011111) { if (rb0==0) c0=~c0; if (rb1==0) c1=~c1; if (rb2==0) c2=~c2; if (rb3==0) c3=~c3; if (rb4==0) c4=~c4; // Filtramos los 5 bit menos significativos del Puerto B. // Si se activa un pulsador, transmitir datos. // Si se pulsa rb0 cambiar el valor de c0. // Si se pulsa rb1 cambiar el valor de c1. // Si se pulsa rb2 cambiar el valor de c2. // Si se pulsa rb3 cambiar el valor de c3. // Si se pulsa rb4 cambiar el valor de c4. // Habilitamos la tarjeta CEBEK C-0503. // Enviamos el dato va serie, tantas veces // como diga la variable Nmero_Repeticiones // Enviamos va serie la Clave_Pulsadores. // Enviamos va serie la variable cambio2. // (Pulsador Activado) // Inhabilitamos la tarjeta CEBEK C-0503. // Inhabilitamos la tarjeta CEBEK C-0503.

RC3 = 0; for(i=1;i<=Numero_Repeticiones;i++) { putc(Clave_Pulsadores); putc(cambio2); } RC3 = 1; } if (rb5!=rb5_1) { rb5_1=rb5; c5=~rb5; RC3 = 0; for(i=1;i<=Numero_Repeticiones;i++) { putc(Clave_Pulsadores); putc(cambio2); } RC3 = 1; } } }

// Si se ha cambiado el Interruptor de la patilla rb5 // transmitir dato.

// Habilitamos la tarjeta CEBEK C-0503. // Enviamos el dato va serie, tantas veces // como diga la variable Nmero_Repeticiones // Enviamos va serie la Clave_Pulsadores. // Enviamos va serie la variable cambio2. // (Interruptor Activado) // Inhabilitamos la tarjeta CEBEK C-0503.

IES Joan Mir

Pgina 134

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

Recepcin_Serie_2a.c
//***************************** Recepcin Serie de Datos Compleja *********************************** // ********************************** Directivas de Preprocesado************************************ #include <16F877A.h> #FUSES XT,NOWDT #use delay(clock=4000000) #use rs232(baud=2400,xmit=pin_c6, rcv=pin_c7) // Definimos la velocidad de transmisin de // 2400 baudios/segundo // Elegimos RC6 como patilla transmisora de datos. // Elegimos RC7 como patilla receptora de datos. #BYTE TRISD = 0x88 // TRISD en 88h. #BYTE portD = 0x08 // PORTD en 08h. #BYTE TRISC = 0x87 // TRISC en 87h. #BYTE portC = 0x07 // PORTC en 07h. #BYTE TRISB = 0x86 // TRISB en 86h. #BYTE portB = 0x06 // PORTB en 06h. #define Clave_Pot_Der 235 #define Clave_Pot_Izq 134 #define Clave_Pulsadores 63 int8 dato_recibido=0; int1 valido_Aut_Pul=1; int1 valido_Aut_Pot_Der=1; int1 valido_Aut_Pot_Izq=1; // Definimos claves

// Inicializamos variables

/* ******************************** Declaracin de funciones ************************************* */ void leer_dato_serie (void); // Leer Dato. void Automata_Pulsadores (void); // Valida los datos serie procedentes de los Pulsadores. void Automata_Pot_Der (void); // Valida los datos serie procedentes del Potencimetro Derecho. void Automata_Pot_Izq (void); // Valida los datos serie procedentes del Potencimetro Izquierdo. // ************************** Funcin principal o programa principal ********************************** void main() { TRISD = 0B00000000; // Defines Puerto D como SALIDA de datos. TRISC = 0B10000000; // Defines Puerto C como SALIDA de datos // a excepcin de RC7/Rx que es entrada de datos. TRISB = 0B00000000; // Defines Puerto B como SALIDA de datos. portD = 0B00000000; portC = 0B00000000; portB = 0B00000000; enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); // Reseteamos el Puerto D. // Reseteamos el Puerto C. // Reseteamos el Puerto B. // Habilitamos la interrupcin serie de datos. // Habilitamos la Interrupcin General.

IES Joan Mir

Pgina 135

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


while(1) { sleep(); // Bucle sin fin. // Se pone el uC en bajo consumo. Cuando le llega una // transmisin serie de datos se activa el uC. Atiende la // interrupcin y vuelve a bajo consumo.

} } /* ********************** Atencin a la interrupcin por recepcin serie de datos ********************** */ #int_RDA /* Validamos el dato serie si cumple las siguiente condiciones. Si dos palabras consecutivas de 2 byte son iguales se valida el dato. clave,dato,clave,dato,......,clave,dato Se lee el 1 dato serie recibido con la funcin "getc()" y se compara con la "clave" del transmisor que tiene que ser la misma que la del receptor, si son iguales se lee el 2 dato serie recibido con la funcin "getc()" y se guarda. Se lee el 3 dato serie recibido con la funcin "getc()" y se compara con la "clave" del transmisor que tiene que ser la misma que la del receptor, si son iguales se lee el 4 dato serie recibido con la funcin "getc()" y se compara con el 2 dato leido, si son iguales se valida el dato con la variable global "Valor". */

void leer_dato_serie (void) { dato_recibido=getc(); if (valido_Aut_Pul==1) Automata_Pulsadores(); // Recibimos el dato serie. // Ejecutas la funcin Autmata_Pulsadores // si la variable Valido_Aut_Pul==1. // Ejecutas la funcin Automata_Pot_Der // si la variable Valido_Aut_Pot_Der==1. // Ejecutas la funcin Automata_Pot_Izq // si la variable Valido_Aut_Pot_Izq==1.

if (valido_Aut_Pot_Der==1) Automata_Pot_Der(); if (valido_Aut_Pot_Izq==1) Automata_Pot_Izq(); }

IES Joan Mir

Pgina 136

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


/*************************Funcin Automata_Pulsadores ***************************************** */ void Automata_Pulsadores(void) { int8 numero_datos; int8 dato; switch (numero_datos) // Es un autmata modelo Moore, que valida los datos si llegan dos // tramas iguales consecutivas. Variacin de los Pulsadores e Interruptor // del Transmisor.

{ case 0: if(dato_recibido==Clave_Pulsadores) { numero_datos=1; valido_Aut_Pot_Der=0; valido_Aut_Pot_Izq=0; } break; case 1: dato=dato_recibido; numero_datos=2; break; case 2: if(dato_recibido==Clave_Pulsadores) { numero_datos=3; } else { numero_datos=0; valido_Aut_Pot_Der=1; valido_Aut_Pot_Izq=1; } break; case 3: if(dato_recibido==dato) portC=dato_recibido; numero_datos=0; valido_Aut_Pot_Der=1; valido_Aut_Pot_Izq=1; } }

IES Joan Mir

Pgina 137

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


/***********************************Funcin Automata_Pot_Der ********************************** */ void Automata_Pot_Der(void) { int8 numero_datos; int8 dato; switch (numero_datos) // Es un autmata modelo Moore, que valida los datos si llegan dos // tramas iguales consecutivas. Variaciones del Potencimetro Derecho // del Transmisor.

{ case 0: if(dato_recibido==Clave_Pot_Der) { numero_datos=1; valido_Aut_Pul=0; valido_Aut_Pot_Izq=0; } break; case 1: dato=dato_recibido; numero_datos=2; break; case 2: if(dato_recibido==Clave_Pot_Der) { numero_datos=3; } else { numero_datos=0; valido_Aut_Pul=1; valido_Aut_Pot_Izq=1; } break; case 3: if(dato_recibido==dato) portD =dato_recibido; numero_datos=0; valido_Aut_Pul=1; valido_Aut_Pot_Izq=1; } }

IES Joan Mir

Pgina 138

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


/* ******************************Funcin Automata_Pot_Izq ************************************* */ void Automata_Pot_Izq(void) { int8 numero_datos; int8 dato; switch (numero_datos) // Es un autmata modelo Moore, que valida los datos si llegan dos // tramas iguales consecutives. Variaciones del Potencimetro Izquierdo //del Transmisor.

{ case 0: if(dato_recibido==Clave_Pot_Izq) { numero_datos=1; valido_Aut_Pul=0; valido_Aut_Pot_Der=0; } break; case 1: dato=dato_recibido; numero_datos=2; break; case 2: if(dato_recibido==Clave_Pot_Izq) { numero_datos=3; } else { numero_datos=0; valido_Aut_Pul=1; valido_Aut_Pot_Der=1; } break; case 3: if(dato_recibido==dato) portB=dato_recibido; numero_datos=0; valido_Aut_Pul=1; valido_Aut_Pot_Der=1; } }

IES Joan Mir

Pgina 139

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa

4.6.4.- Apertura de una puerta.

IES Joan Mir

Pgina 140

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa Mando_Puerta.c


//******************************** Mando de Apertura de la puerta ********************************** // ************************************ Directivas de Preprocesado********************************** #include <16F876.h> #FUSES XT,NOWDT #use delay(clock=4000000) #use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7) // Definimos la velocidad de transmisin de // 9600 baudios/segundo // Elegimos RC6 como patilla transmisora de datos. // Elegimos RC7 como patilla receptora de datos. // Incluimos el driver LCD1.c que contiene las funciones // de control del LCD. // TRISA en 85h. // PORTA en 05h. // RA0 en 0x05 patilla 0.

#include <LCD1.C> #BYTE TRISA = 0x85 #BYTE portA = 0x05 #BIT ra0 = 0x05.0 #define Clave 235 #define Numero_Repeticiones 10

// ****************************** Funcin principal o programa principal ****************************** void main() { int1 valor=0; int1 cambio=0; int8 i=1; lcd_init(); TRISA = 0B11111111; printf(lcd_putc," Mando Activo\n"); printf(lcd_putc," Puerta Cerrada"); while(1) { if(ra0==0) { valor = ~valor; delay_ms(200); cambio =1; } // Definimos la variable "valor" como tipo bit. // Definimos la variable "cambio" como tipo bit. // Definimos la variable "i" como tipo byte. // Inicializamos el LCD // Ponemos el puerto A como salida de datos. // Mostramos en el LCD el mensaje Mando Activo y // saltamos a la lnea siguiente. // Mostramos en el LCD el mensaje Puerta Cerrada. // bucle infinito. // Preguntamos si se ha pulsado ra0. // Complementamos la variable "valor". // Retardamos 200 mS. // Activamos la variable "cambio".

IES Joan Mir

Pgina 141

Curso de Robtica y aplicaciones a el Aula de Tecnologa


if (cambio==1) { for(i=1;i<=Numero_Repeticiones;i++) { putc(clave); putc(valor); } if(valor==1) { lcd_gotoxy(1,2); printf(lcd_putc," Abrir Puerta "); } else { lcd_gotoxy(1,2); printf(lcd_putc," Cerrar Puerta "); } cambio=0; } } }. // Posicionamos el Cursor del LCD en la // posicin 1 lnea 2 // Mostramos en el LCD el mensaje // Cerrar Puerta. // Desactivamos la variable "cambio". // Si la variable "valor" es 1 abrimos la puerta // Posicionamos el Cursor del LCD en la // posicin 1 lnea 2 // Mostramos en el LCD el mensaje // Abrir Puerta. // Enviamos la clave va serie. // Enviamos valor va serie. // Si la variable "cambio" est activa actuamos. // Enviamos el dato va serie, tantas veces // como diga la variable Nmero_Repeticiones

Receptor_Puerta.c
//******************************* Recepcin Serie de Datos de la puerta ****************************** // ************************************* Directivas de Preprocesado********************************* #include <16F876.h> #FUSES XT,NOWDT #use delay(clock=4000000) #use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)

#include <LCD1.C> #BYTE TRISC = 0x87 #BYTE portC = 0x07

// Definimos la velocidad de transmisin de // 9600 baudios/segundo // Elegimos RC6 como patilla transmisora de datos. // Elegimos RC7 como patilla receptora de datos. // Incluimos el driver LCD1.c que contiene las funciones // de control del LCD. // TRISC en 87h. // PORTC en 07h.

IES Joan Mir

Pgina 142

Curso de Robtica y aplicaciones a el Aula de Tecnologa


#BIT indicador_cierre = 0x07.5 #BIT indicador_apertura = 0x07.4 int8 valor=0; #define Clave 235 int8 CONST NUMEROS[9]={9,1,3,2,6,4,12,8,9}; // Definimos la variable "valor" como entero de // 8 bit. Variable global. // Array de 9 nmeros tipo entero de 8 bit. Representa // las posiciones del Motor PAP.

/* ******************************** Declaracin de funciones ************************************* */ void leer_dato_serie (void); // Leer Dato.

// *************************** Funcin principal o programa principal ********************************* void main() { signed int8 i=0; // Definimos la variable "i" como entera con signo. TRISC = 0B10000000; portC = 0B00101001; lcd_init(); printf(lcd_putc,"Puerta Cerrada"); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); while(1) { if (valor==1) { if (i<8) { i++; portc = NUMEROS[i]; lcd_gotoxy(1,1); printf(lcd_putc,"Abriendo Puerta "); // Situamos el cursor del LCD en la // posicin 1, lnea 1. // Ponemos en el LCD el mensaje // "Abriendo Puerta " // Situamos el cursor del LCD en la // posicin 1, lnea 2. // Ponemos en el LCD el mensaje " // Espere " // Definimos el puerto C como salida de datos a // excepcin de rc7/rx // Inicializamos el puerto C con Indicador de cierre // encendido y activado el Motor PAP. // Inicializamos el LCD // Ponemos en el LCD el mensaje "Puerta Cerrada" // Habilitamos la interrupcin serie de datos. // Habilitamos la Interrupcin General. // Bucle sin fin. // Si la variable "valor" esta activa abrimos puerta. // Ejecutamos la secuencia de apertura del Motor PAP.

lcd_gotoxy(1,2); printf(lcd_putc," delay_ms(500); } Espere ");

IES Joan Mir

Pgina 143

Curso de Robtica y aplicaciones a el Aula de Tecnologa


else { lcd_gotoxy(1,1); printf(lcd_putc," Puerta Abierta "); lcd_gotoxy(1,2); printf(lcd_putc," Puede pasar "); indicador_apertura = 1; } indicador_cierre = 0; } else { if (i>0) { i--; portc = NUMEROS[i]; delay_ms(500); lcd_gotoxy(1,1); printf(lcd_putc," Cerrando Puerta"); lcd_gotoxy(1,2); printf(lcd_putc," } else { lcd_gotoxy(1,1); printf(lcd_putc," Puerta Cerrada "); lcd_gotoxy(1,2); printf(lcd_putc," indicador_apertura = 0; indicador_cierre = 1; "); // Situamos el cursor del LCD en la // posicin 1, lnea 1. // Ponemos en el LCD el mensaje // " Puerta Cerrada " // Situamos el cursor del LCD en la // posicin 1, lnea 2. // Ponemos en el LCD el mensaje // " " // Desactivamos el Indicador de // Apertura. // Activamos el Indicador de Cierre. Espere "); // Situamos el cursor del LCD en la //posicin 1, lnea 1. // Ponemos en el LCD el mensaje // " Cerrando Puerta". // Situamos el cursor del LCD en la // posicin 1, lnea 2. // Ponemos en el LCD el mensaje // " Espere " // Cuando la puerta est cerrada // mostrar mensajes nuevos. // Ejecutamos la secuencia de cierre // del Motor PAP. // Situamos el cursor del LCD en la // posicin 1, lnea 1. // Ponemos en el LCD el mensaje // " Puerta Abierta " // Situamos el cursor del LCD en la // posicin 1, lnea 2. // Ponemos en el LCD el mensaje // " Puede pasar " // Activamos el Indicador de Apertura. // Desactivamos el Indicador de Cierre. // Si la variable "valor" est inactiva // cerramos puerta. // Cuando la puerta est abierta // mostrar mensajes nuevos.

IES Joan Mir

Pgina 144

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


} } } } /* ********************** Atencin a la Interrupcin por Recepcin Serie de datos ********************* */ #int_RDA /* Validamos el dato serie si cumple las siguiente condiciones. Si dos palabras consecutivas de 2 byte son iguales se valida el dato. clave,dato,clave,dato,......,clave,dato Se lee el 1 dato serie recibido con la funcin "getc()" y se compara con la "clave" del transmisor que tiene que ser la misma que la del receptor, si son iguales se lee el 2 dato serie recibido con la funcin "getc()" y se guarda. Se lee el 3 dato serie recibido con la funcin "getc()" y se compara con la "clave" del transmisor que tiene que ser la misma que la del receptor, si son iguales se lee el 4 dato serie recibido con la funcin "getc()" y se compara con el 2 dato leido, si son iguales se valida el dato con la variable global "Valor". */ void leer_dato_serie (void) { int8 numero_datos; int8 dato_recibido; int8 dato1; dato_recibido=getc(); switch (numero_datos) // Es un autmata modelo Moore, que valida los datos si llegan { // dos tramas iguales consecutivas case 0: if(dato_recibido==clave) { numero_datos=1; } break; case 1: dato1=dato_recibido; numero_datos=2; break; case 2: if(dato_Recibido==clave) { numero_datos=3; }

IES Joan Mir

Pgina 145

Curso de Robtica y otras aplicaciones en el Aula de Tecnologa


else { numero_datos=0; } break; case 3: if(dato_Recibido==dato1) numero_datos=0; } } valor=dato_Recibido;

4.7.- Diseo y creacin de un Robot Rastreador y Coche Teledirigido.


El proyecto est en la carpeta Documentacin.

IES Joan Mir

Pgina 146

Das könnte Ihnen auch gefallen