Beruflich Dokumente
Kultur Dokumente
Pgina 1
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.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
Pgina 2
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
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).
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 de la Placa
Fabricacin de la Placa
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.
Pgina 4
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
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.
Pgina 5
Muestra el resultado de la bsqueda de los componentes a que bibliotecas pertenecen y una descripcin breve de cada uno de ellos
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.
Pgina 6
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.
Pgina 7
Terminal por defecto Terminal de entrada Terminal de salida Terminal Bidireccional Terminal de Alimentacin Terminal de masa Terminal bus
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
Pgina 8
Inter-sheet-Terminal (Terminales)
Generator (Generador)
Osciloscopio
Voltmetro (CA)
Pgina 9
Ficheros Fuente
Herramienta de Compilacin
Con la opcin Define Code Generation Tools podemos introducir nuevos compiladores y depuradores de programas.
Generador de Ficheros
Pgina 10
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
Pulsar con el botn derecho del ratn y despus con el botn izquierdo
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
Pgina 12
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
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.
Pgina 13
Barra de Simulacin
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.
Pgina 14
Buscar variables
Muestra el formato de la variables Binario, Decimal, Hexadecimal, etc. (Tiene que estar seleccionada la variable)
Pgina 15
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.
Pgina 16
Trabaja de modo continuo hasta que encuentra un retorno de cualquier subrutina o funcin y sale de ella.
Componente a buscar
Encapsulado(PCB)
Pgina 17
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
Pgina 18
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.
Pgina 19
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.
Pgina 20
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
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
Pgina 21
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
Pad Placement
Herramientas de diseo grfico
2D Graphics
Selector de Objetos
Ventana de Trabajo
Object Selector
Selector de Caras
Layer Selector
Barra de Estado
Test de errores
2D Graphics box
Herramientas de diseo grfico
2D Graphics
Pgina 22
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
Display Commands
Milmetros/Pulgadas
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
2D Graphics
Cotas
Con el Selector de Caras Layer Selector seleccionamos borde de placa Board Edge
Borde de placa
Board Edge
Selector de Caras
Layer Selector
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.
Herramientas de Diseo
Layout Tools
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
Restaurar valores
No obstante se puede posicionar determinados componentes de forma manual y el resto de forma automtica.
Pgina 25
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.
Netlis
Pgina 26
Comandos de Edicin
Editing Commands
Borrar un conjunto de componente Rotacin de un conjunto de componente
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
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.
Pgina 27
Pistas de Seal
Herramientas de Diseo
Layout Tools
Se abre este men contextual marcamos las reglas de diseo y seleccionamos los componentes que queremos posicionar de forma automtica.
Opciones de Rutado Permiso de rutado Permiso de Ordenamiento Proteccin manual de las pistas trazadas manualmente
Pgina 28
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
Pgina 29
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.
Pgina 30
Herramientas de Posicionamiento
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
Tamao de la VIA
Pgina 31
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.
Clareo
La placa queda:
Pgina 32
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
S50-25
S90-50
Pgina 33
Manejo de Bibliotecas
Manage Libraries
Se abre un men contextual, donde podemos crearnos nuestra propia Biblioteca, aadir encapsulados de otra Biblioteca, borrar encapsulados, etc.
Pgina 34
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.
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
Pgina 35
Biblioteca Robtica_ARES
Confirmacin de copia
Top Silk
2D Graphics
Selector de Caras
Layer Selector
Pgina 36
PAD Redondo
Pad Placement
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
Pgina 37
Categora
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
Pgina 38
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.
Mximo 4000
Pgina 39
Biblioteca Robtica_ISIS
Confirmacin de copia
Pgina 40
Comandos de Dibujo
b) Le aadimos pines patillas. Seleccionamos Patillas de Componentes Device Pin de las Herramientas de Diseo
Tipo de Pin
Herramientas de Diseo
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.
Pgina 41
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.
Pgina 42
Aadir Encapsulado
Aadir Encapsulado
Pgina 43
Elegimos el encapsulado adecuado MOTOR-TRI_ROBOTICA Ponemos la palabra clave MOTOR y aparecen diferentes motores
Aparece otro men contextual en el que podemos aadir pines y poner este encapsulado como principal.
Aadir Pines
Pgina 44
Se abre otro men contextual donde se puede introducir el modelo de componte simulado
Pgina 45
Categora
Biblioteca
Pgina 46
Deshacer el smbolo
Decompose
Variamos el simbolo, lo seleccionamos con el botn derecho del ratn y la volvemos almacenarlo pulsando Make Device
Pgina 47
CPU
Buses
CPU
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
3 Ciclo
4 Ciclo
5 Ciclo
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.
Pgina 48
Pgina 49
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.
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.
Pgina 51
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.
Programa Principal
Pgina 52
//******************************** 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
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
Pgina 53
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.
Pgina 54
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
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.
Pgina 55
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.
Pgina 56
#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 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
{ 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.
Pgina 57
//******************************* Funcion Raiz *************************************************************** int8 Raiz (int8 muestra3) { int8 resultado; resultado = SQRT (muestra3); return(resultado); }
Llamada a la Funcin SQRT y lleva implcita la variable muestra3devuelve un valor de 8bit a resultado
Pgina 58
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.
Pgina 59
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
{
Pgina 60
Programa_1:
Leer la Patilla RC0 = 1 (RB0=0 y RB1=1), RC0 = 0 (RB0=1 y RB1=0)
Diagrama de Flujo:
// Defines Puerto B como SALIDA de datos. // Defines Puerto C como ENTRADA de datos.
si
rc0=1?
no
Pgina 61
// ********************************* 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.
Pgina 62
switch (expresin)
{
case constante1
Instruccin_1; Instruccin_n;
Expresin= constante1?
si
Instruccin_1 Instruccin _n
no
break?
si no
Instruccin_1
si
Instruccin _n
no
si
break?
no
Instruccin_1
si
Instruccin _n
break; default:
Instruccin_1; Instruccin_n; }
no
no
break?
si
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.
Pgina 63
// Defines Puerto B como SALIDA de datos. // Defines Puerto C como ENTRADA de datos.
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
Pgina 64
// ************************************ 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.
Pgina 65
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;
nn+1
Pgina 66
Nmero Decimal 0 1 2 3 4 5 6 7 8 9
2 Dgito en Hexadecimal
1 Dgito en Hexadecimal
2 Dgito en Hexadecimal
Pgina 67
// 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
// Inicializacin de la variable
n0
// Condicin de finalizacin
no
n<=Numero_Maximo? si
portD DISPLAY[n]
Retardo_1Seg
nn+1
Pgina 68
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.
Pgina 69
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
// Defines Puerto E como SALIDA de datos. // Defines Puerto A como SALIDA de datos. // Defines Puerto C como ENTRADA de datos.
no portC= 0? si
lmpara 1 motor 1 // Encender Lmpara. // Activar Motor. lmpara 0 motor 0 // Apagar Lmpara. // Parar Motor.
Pgina 70
// **************************** 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.
Pgina 71
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
// Encender LED
Retardo _1Seg
// 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
// 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); } }
Pgina 73
Pgina 74
Pgina 75
Pgina 76
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.
// ***************************** Funcin principal o programa principal ******************************************* void main() Programa Principal { int8 muestra1; // Variable muestra1 definida como un entero de 8 bit TRISB = 0B00000000
Pgina 77
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.
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
Pgina 78
/* **************************** 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
Pgina 79
#include <math.h> #include <LUCES-COCHE-FANTASTICO.h> #include <REPR-NUMEROS-DISPL.h> #BYTE TRISC = 0x87 #BYTE portC = 0x07
//************** 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
Pgina 80
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.
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
Pgina 81
Pgina 82
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
Pgina 83
Si dejamos pasar intensidad por el diodo emisor, este emite una luz infrarroja que saturara el Fototransistor (Se comporta como un Interruptor cerrado)
Pgina 84
Pgina 85
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.
Pgina 86
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
Pgina 87
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
RS RW E 4 5 6
1 2 3
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.
7 8 9 10 11 12 13 14
D0 D1 D2 D3 D4 D5 D6 D7
Pgina 88
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.
Pgina 89
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
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
Pgina 90
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
Para entender mejor el manejo del LCD hemos realizado un entrenador con ISIS. Simularemos diferentes ejemplos.
4.2.1.- LCD_ejemplo1.c
Pgina 91
/* ************************* 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); }
Pgina 92
/* ******* 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
// ************************ 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]);
// Fin.
Pgina 93
/* ************ 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
// ************************* 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.
// Fin.
Pgina 94
/* ******** 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.
// Fin.
Pgina 95
/* ***************** 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.
Pgina 96
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.
Pgina 97
// ******************* 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. } }
Pgina 98
5V0V 1024
= 4,8 mV.
Pgina 99
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
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
1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
+ + 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
Pgina 100
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+
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
Pgina 101
// ************************ 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.
= 2 = 500 Seg
Pgina 102
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
Pgina 103
4.3.2.- Conversin_A-D1.c
Pgina 104
//*************************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". } }
Pgina 105
#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
Pgina 106
} }
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.
Pgina 107
// ************************** 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"); } }
Pgina 108
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)
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
TH T
x 100 =
16 mS 16 mS
= 100 %
(mSeg)
Pgina 109
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.
Pgina 110
// 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
Pgina 111
Pgina 112
// 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.
Pgina 113
// 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.
// 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.
} }
Pgina 114
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);
// 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);
// 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:
Pgina 115
// ************************ 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.
} }
Pgina 116
Pgina 117
4.5.1.- Control_2_Servos_Posicin.c
Pgina 118
*/
// ****************************** 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
Pgina 119
// ******************************* 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.
// ******************************** 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.
Pgina 120
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.
Pgina 121
// 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.
// 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.
// 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.
Pgina 122
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)
Pgina 123
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.
Pgina 124
Pgina 125
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.
Pgina 126
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.
Recepcin_Serie_1a.c
//********************************* Recepcin Serie de Datos Simple ******************************** // ************************************ Directivas de Preprocesado********************************** #include <16F876A.h> #FUSES XT,NOWDT #use delay(clock=4000000)
// 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.
// ************************ 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.
Pgina 128
} } /* ******************** 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
Pgina 129
Pgina 130
Pgina 131
#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.
Pgina 132
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)
Pgina 133
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; } } }
// 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.
Pgina 134
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.
Pgina 135
} } /* ********************** 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.
Pgina 136
{ 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; } }
Pgina 137
{ 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; } }
Pgina 138
{ 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; } }
Pgina 139
Pgina 140
#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".
Pgina 141
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)
// 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.
Pgina 142
// *************************** 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.
Pgina 143
Pgina 144
Pgina 145
Pgina 146