ÍNDICE Introducción ................................................................................................4 Comunicación serie (RS-232)......................................................................5 Transmisión serie/paralelo ................................................................5 Transmisión síncrona/asíncrona ........................................................5 Uso de un único reloj en la transmisión síncrona .........................7 Sincronización del principio de cada carácter en la transmisión Asíncrona....................................................................................7 RS-232...............................................................................................8 Mecánicos...................................................................................8 Eléctrica......................................................................................9 Funcional: (sobre norma asíncrona )............................................9 Primer bloque ....................................................................10 Segundo bloque: "Control de flujo"....................................10 Tercer Bloque: “Transmisión/recepción de datos”..............11 Gestión Simplex, Half-duplex y Full-duplex de un canal de comunicación.....................................................................................11 Conexionado DTE-DTE: Null-Modem ...............................................11 Bloque 1 .....................................................................................12 Bloque 2 .....................................................................................12 Bloque 3 .....................................................................................12 Terminales y emuladores de terminal.................................................13 Control de flujo con RS232 ................................................................13 Circuito eléctrico .........................................................................................15 Programa del microcontrolador .................................................................18 Programa de comunicación en Visual Basic ..............................................24 Conclusión ...................................................................................................28 Bibliografía..................................................................................................28 Anexo I. Datasheet del MAX232.................................................................29 Anexo II. Datasheet del 74245 ....................................................................36 Anexo III. Datasheet del 74373 ...................................................................42 Anexo IV. Datasheet del ULN2803 .............................................................50 Anexo V. Circuito eléctrico del control por voz .........................................58 3 INTRODUCCIÓN El avance de las nuevas tecnologías ha provocado el desarrollo de nuevos métodos de fabricación para conseguir un mayor número de piezas y un menor coste, esta evolución se ha producido, entre otras cosas, a la automatización industrial que consiste en construir un sistema que controle todas las máquinas encargadas de la fabricación del producto para que funcionen sin un operario y gobernadas por un control para que todo funcione correctamente. En la actualidad, los procesos de automatización han llegado a los hogares mediante la domótica, estos sistemas se encargan de controlar distintos sistemas de la casa como la calefacción , el aire acondicionado… para conseguir que la casa se haga más habitable cuando los habitantes lleguen a su hogar. El problema de todo esto es el gran número de sensores (aparatos que controlan las variables, como la temperatura), actuadores (aparatos que modifican el sistema, como los radiadores), buses para la comunicación, un sistema para visualizar los sensores y actuadores, etcétera. Todo esto se puede simplificar gobernando todo desde un mismo lugar o puesto de control que puede ser cualquier ordenador personal (no hace falta que sea moderno) conectado por una interfaz apropiada y comunicado por un software específico. Esta interfaz y este software es el proyecto propuesto a continuación, un sistema que controla ocho entradas digitales activas por alto por niveles TTL (el “0” lógico es con 0V y el “1” con 5V), ocho salidas activas por relees por lo que se pueden poner actuadores de potencia, comunicado mediante puerto serie (RS-232) y gobernado por el microcontrolador PIC16F84. El microcontrolador PIC16F84 tiene 1Kb de memoria FLASH de programa, 68b de memoria RAM y 64b de memoria EEPROM para datos, una pila de ocho niveles, trece líneas de entrada/salida divididas en dos puertos, uno de cinco bits y otro de ocho; cuatro interrupciones, un temporizador y un perro guardián (WDT) que es un temporizador que si se desborda el microcontrolador se resetea. En el proyecto no se utilizan los temporizadores ya que las temporizaciones se realizan por software ni las interrupciones, en el trabajo lo que se utiliza es la comunicación serie que este chip no posee por lo que está desarrollada por software. La aplicación que comunica la interfaz con el ordenador está realizada en Visual Basic gracias al componente mscomm32.ocx que es un método para comunicarse por el puerto serie mandando caracteres en código ASCII y recibiendo también en ASCII o en decimal, por lo que en la transmisión se ha tenido que transformar de binario a ASCII y en la recepción de decimal a binario. En esta memoria están detallados los métodos de comunicación por el puerto serie, el circuito eléctrico de la interfaz y los programas, el del microcontrolador y el de comunicación con el ordenador. 4 COMUNICACIÓN SERIE (RS-232) RS232 es el nombre del interfaz de comunicación serie más utilizado del mundo. La norma serie está disponible en prácticamente el 99% de los ordenadores. Entre ellos el IBM PC compatible que habitualmente está equipado con dos puertos serie RS232, uno de ellos utilizado para conectar el ratón. El Apple Macintosh es una notable excepción, utilizando otra norma serie, la RS422. La norma RS232 fue originalmente diseñada para conectar terminales de datos con dispositivos de comunicación (como módems y AITs). Desde un principio, fue también utilizada para conectar casi cualquier dispositivo imaginable. Los usos de la RS232 en el entorno doméstico son muchos y ampliamente conocidos. Desde la conexión del ratón, el modem/fax, agendas electrónicas de bolsillo, impresoras serie, grabadores de memoria (tipo EPROM), digitalizadores de vídeo, radios de AM/FM, etc. La lista sólo está limitada por la imaginación de los diseñadores. En el entorno industrial el peso de la RS232 es también muy importante. Si bien existen soluciones de comunicación serie más robustas y versátiles, como la RS422 o la RS475, la RS232 sigue siendo por su sencillez, su diseño económico y, sobre todo, por su gran difusión, la norma más frecuente. Así, es fácil ver cómo robots industriales, manipuladores, controles de todo tipo, utilizan la RS232. Existen hasta cafeterías industriales (de las utilizadas en bares y restaurantes) que disponen de una RS232 para ser conectadas a un PC e informar de cuántos cafés han hecho en el transcurso del día, permitiendo al gerente de la empresa un control de caja, estadísticas de uso, etcétera. TRANSMISIÓN SERIE/PARALELO Conceptualmente una transmisión paralelo consiste en utilizar simultáneamente varios circuitos de transmisión serie. Dejando al margen problemas específicos de una transmisión en paralelo, como puede ser el efecto crosstalk o interferencia inducida de símbolos, la transmisión paralelo es el recurso lógico cuando un solo circuito no proporciona un ancho de banda suficiente. Si en un diseño, un problema de transmisión puede resolverse (a coste similar) con una transmisión serie, esta opción es en principio deseable frente a una paralelo. Piénsese que en una transmisión con múltiples circuitos la probabilidad de fallo de línea y la necesidad de mantenimiento es proporcional al número de líneas utilizadas. TRANSMISIÓN SÍNCRONA/ASÍNCRONA Independientemente de si la transmisión es serie o paralelo, ésta puede ser síncrona o asíncrona. Para entender la diferencia es interesante fijarse en la etimología de las palabras. Ambas vienen del griego cronos --tiempo (reloj)--. Síncrona significa "mismo reloj" y asíncrona lo contrario, es decir, relojes distintos. Entre dos equipos, emisor y receptor, existe un problema básico en la identificación de los distintos símbolos (bits en este caso) que se transmiten por una línea de transmisión. Supongamos dos computadores A y B, y una línea de transmisión por la que se comunican. Supongamos que A manda a B 50 bits a una velocidad de 1000 bits/s. Esto quiere decir que cada bit estará en la línea de transmisión una milésima de segundo. La máquina B necesita conocer este dato y necesita un reloj, o base de tiempos, que le permita medir con precisión esa milésima de segundo para saber cuándo ésta en la línea el segundo bit, el tercer bit, etcétera. El lector debe conocer que la forma 5 normal en que el equipo receptor decide si un bit es "0" o "1" es muestreando (haciendo un muestreo de) la línea de transmisión durante el intervalo del bit, preferiblemente a mitad del intervalo. Es evidente que si el reloj utilizado por el receptor no mide el tiempo con precisión y la secuencia de bits es lo suficientemente larga, entonces cometerá un error en el muestreo de la línea e identificará una secuencia de bits incorrecta. Si, por ejemplo, el reloj receptor atrasa y cuando indica al sistema que ha pasado 1 ms en realidad ha pasado 1,1 ms (un error del 10%, sin duda un poco exagerado) entonces se producirá un primer error de muestreo en el 6º a 7º bits transmitido (si asumimos que el primer bit lo muestreó correctamente en el centro del intervalo del bits) (ver figura). 2º bit Tiempo 1º bit 1,1ms 1,1ms Error de lectura. El muestreo del Deriva respecto flanco no garantiza al punto medio una lectura correcta del intervalo. del bit. La figura muestra claramente cuál es el problema. Debe quedar claro que aunque el planteamiento del ejemplo hace culpable al reloj del receptor, en una situación real encontraremos que, de usar dos relojes, es imposible garantizar que ambos midan el tiempo (batir segundos) exactamente igual. Y aunque el error entre ambos sea mucho menor, nótese que si la secuencia de bits es lo suficientemente larga, el error de muestreo terminará por ocurrir. Problema: determinar la diferencia (error) máxima admisible entre los relojes del emisor y receptor para transmitir un carácter de ocho bits (suponemos existe un mecanismo que permite siempre leer el primer bit de cada carácter correctamente). De esta situación se pueden deducir dos conclusiones: 1. La transmisión síncrona (emisor y receptor comparten el mismo reloj) permite que el receptor pueda interpretar (muestrear) sin error de sincronismo una secuencia (bloque) arbitrariamente larga de bits. 2. La transmisión asíncrona, a diferencia de la síncrona, esta orientada a la transmisión de caracteres (bloque mínimo de tan sólo siete u ocho bits). 6 USO DE UN ÚNICO RELOJ EN LA TRANSMISIÓN SÍNCRONA 1. Si se utiliza el reloj de una de las dos máquinas (o un reloj tercero) se puede transmitir la señal de reloj por una línea auxiliar a la otra máquina. La figura muestra como a partir de la señal de reloj el muestreo es siempre exacto. 0 1 0 1 0 1 0 0 1 Datos Reloj 2. El emisor puede utilizar una codificación para los datos de las denominadas "auto-reloj",como por ejemplo el código Manchester (utilizado por ejemplo en redes locales Ethernet). La figura muestra una secuencia de bits codificada en código Manchester. 0 1 0 1 0 1 0 0 1 Datos Código Mánchester Se puede observar que la codificación Manchester tiene la propiedad de que existe siempre una transmisión en la mitad del intervalo del bit. El receptor aprovecha esta propiedad para sincronizarse en cada bit. Es como si hubiera un reloj entre los datos que marca el ritmo del muestreó que debe hacer el receptor, de ahí el nombre de autoreloj. SINCRONIZACIÓN DEL PRINCIPIO DE CADA CARÁCTER EN LA TRANSMISIÓN ASÍNCRONA Datos 1 0 0 1 1 0 1 0 STOP START Cuando el emisor no transmite, en el periodo entre caracteres, la línea se mantiene a "1" lógico. Cuando decide transmitir un carácter, primero transmite un "0" que se denomina bit de START y sirve para que el receptor sincronice (empieza a contar tiempos desde ese momento). El instante de sincronismo es el flanco de bajada de la señal (ver figura). Tras el bit de START se transmiten los bits de datos y después es obligatorio al menos un bit de STOP a "1" lógico. La secuencia se repite tantas veces como caracteres se transmitan. Obsérvese que este mecanismo de sincronización con el bit de START impide que la deriva de muestreo por diferencias entre los relojes continúe en el siguiente carácter. Se asume que la deriva de muestreo no debe ser tan grande que provoque un error de muestreo en los bits de cada carácter. Sincronización y muestreo del caracter 7 RS-232 La norma serie RS232 fue diseñada para conectar DTEs (Data Terminal Equipment) o equipos terminales de datos (como un terminal, un ordenador,...) con DCEs (data communication equipment) o equipos de comunicación de datos, como módems, codecs, AITs, etcétera. La diferenciación entre DTE y DCE es fundamental para la comprensión de la norma como se verá más adelante. La RS232 permite la transmisión síncrona y asíncrona. La subnorma asíncrona es sin duda la más frecuente por lo que nos centraremos en ella. La transmisión asíncrona se lleva a cabo tal y como se describe en el punto anterior. En concreto además del bit de START utiliza: • 5, 6, 7 o 8 bits de datos, • 0 o 1 bit de paridad (la paridad puede ser "par"(Even), "impar"(Odd), "siempre a cero"(Reset) y "siempre a uno"(Set). • 1, 1.5 o 2 bits de STOP. Para agilizar el lenguaje se suele emplear una nomenclatura abreviada como, por ejemplo, "8N1" que indica que la transmisión serie RS232 se ha configurado para transmitir 8 bits de datos, No paridad y 1 bit de STOP. Otro ejemplo sería "6E2" que indica 6 bits de datos, paridad par y 2 bits de STOP. El estándar RS232 normaliza los aspectos mecánicos, eléctricos y funcionales. MECÁNICOS: La RS232 utiliza un conector Cannon DB-25 (ISO 2110) macho para el DTE y hembra para el DCE (ver figura). Pin 14 Secondary Transmitted Data Pin 1 Sheild Pin 2 Transmitted Data Pin 15 Transmit Clock Pin 3 Recieved Data Pin 16 Secondary Received Data Pin 4 Request to Send Pin 17 Receive Clock Pin 5 Clear to Send Pin 5 Ground Pin 9 Ringing Indicator Pin 4 Data Terminal Ready Pin 8 Clear to Send Pin 3 Transmit Data Pin 7 Request to Send Pin 2 Recieve Data Pin 6 Data Set Ready Pin 1 Data Carrier Detect Cannon DB-9 Pin 18 Local Loopback Pin 6 DCE Ready Pin 19 Secondary Request to Send Pin 7 Signal Ground Pin 20 Data Terminal Ready Pin 8 Carrier Detect Pin 21 Remote Loop/ Quality Detect Pin 9 Reserved for Testing Pin 22 Ring Indicator Pin 10 Reserved for Testing Pin 23 Data Rate Selector Pin 11 Unassigned Pin 24 Transmit Clock Pin 12 Secondary Carrier Detect Pin 25 Test Made Pin 13 Secondary Clear to Send Cannon DB-25 La conexión entre DTE y DCE es simple. Cada pin conecta con su par (el 1 con el 1, el N con el N) existen versiones de DB-25 para cable plano que simplifica el mecanizado de las conexiones. Cada pin tiene asignado una función tal y como se muestra en la figura. Los nombres de las líneas están puestos desde el punto de vista del DTE. Así, el pin 2 es la línea TxD (transmisión de datos) pero obviamente eso no es cierto en ambos equipos, sólo en el DTE. En el DCE, por el contrario, es la línea por la que recibe los datos del DTE. Cuando sólo se utiliza la transmisión asíncrona, sólo es necesario utilizar nueve líneas. Se puede utilizar el conector Cannon-DB-9. Igualmente 8 el macho es el DTE y la hembra el DCE. (Desgraciadamente esta norma, y otras de la RS232, no siempre es seguida por todos los fabricantes, razón por la cual no siempre es fácil manejar esta interfaz). La longitud máxima del cable entre DTE y DCE depende de la calidad de éste y de la velocidad de transmisión utilizada. En principio la norma recomienda que no sea superior a 15 metros para una velocidad de 20 Kb/s. ELÉCTRICA: La subnorma eléctrica de la RS232 es la V28. La norma fija una transmisión en modo común (cada circuito tienen una referencia a tierra y esta es común para todos los circuitos). Los circuitos son punto a punto, es decir, un driver con un sólo receptor de la señal. La señal es bipolar con lógica invertida, utilizando los siguientes valores: • 1 lógico =-3 a - 15 voltios • 0 lógico = + 3 a + 15 voltios La ausencia de señal (0 voltios) queda diferenciado del 0 y 1 lógicos. La RS232 es cortocircuitable. Esto quiere decir que, al menos teóricamente, los drivers de salida de las puertas disponen de un mecanismo de auto-protección contra sobrecalentamientos. La tensión máxima de operación es +/-25voltios y la carga máxima es de 3 KΩ a 7 KΩ, con una corriente máxima de 500 mA. FUNCIONAL: (SOBRE NORMA ASÍNCRONA ) La norma asíncrona la forman nueve líneas. PIN DTE DB-9 DB-25 2 2 TxD DCE TxD DCE DTE TxD TxD PIN DB-9 DB-25 2 2 Bloque 3 3 3 RxD RxD RxD RxD 3 3 7 4 RTS RTS RTS RTS 7 4 8 5 CTS CTS CTS CTS 8 5 1 8 DCD DCD DCD DCD 1 8 4 20 DTR DTR DTR DTR 4 20 6 6 DSR DSR DSR DSR 6 6 9 22 RI RI RI RI 9 22 5 5 GND GND GND GND 5 Bloque 2 Bloque 1 5 Red telefónica conmutada La línea GND conecta la masa de ambos equipos y no merece mayor comentario. Las restantes ocho líneas pueden ser agrupados en tres bloques funcionales 9 que se explican fácilmente si recordamos que la norma fue diseñada para conectar un PC (DTE típico) con un modem (DCE típico). PRIMER BLOQUE Lo denominaremos "de establecimiento de conexión". Está formado por las líneas: DTR (Data Terminal Ready): Terminal de datos preparado. (El PC y su RS232 están listos). DSR (Data Set Ready): Equipo de comunicación preparado. (El modem está listo). RI (Ring Indicator): Indicador de llamada. (El modem indica a su PC que ha recibido una llamada). El objetivo es que ambos ordenadores sepan que se ha establecido un canal de comunicación (normalmente a través de la línea telefónica). Las líneas DTR y DSR del equipo local y del remoto deben estar activas (set) durante todo el proceso. (De hecho cuando un PC desea dar por terminada una conexión basta con que, momentáneamente, desactive (reset) su DTR). La conexión se inicia manualmente (el usuario llama con el teléfono al modem remoto) o automáticamente (el modem tiene capacidad de marcar un número de teléfono – dialling ) y se gestiona en los módems (que negocian, de forma automática, los parámetros de transferencia como la velocidad, compresión, etc). Se asume que el usuario del PC que llama activará el proceso que va a utilizar la conexión (un programa de transmisión de ficheros, por ejemplo). En el PC llamado se asume que el proceso homólogo está ya activo (porque, por ejemplo, lo está permanentemente) o se puede activar automáticamente al recibir de su modem la señal de RI. Sea como fuera, la conexión queda establecida. A partir de este momento los ordenadores pueden intercambiar información. SEGUNDO BLOQUE: "CONTROL DE FLUJO" Estas líneas tienen sentido en el caso de que el canal de comunicación establecido tenga una gestión half-duplex (ver a continuación “gestión simplex, halfduplex y full-duplex...”). Si el canal está establecido, el protocolo software de nivel de enlace de datos que se esté utilizando (Xmodem, Ymodem, HDLC,...) fijará cuál de los dos DTEs debe comenzar a hablar/transmitir. Las líneas en este bloque son usadas de la siguiente manera: RTS (Request To Send): Petición de transmisión. El PC indica a su modem que quiere transmitir a la máquina remota. CTS (Clear To Send): Canal libre para la transmisión. El modem indica a su PC que puede transmitir. Previamente habrá transmitido una señal portadora por el canal de comunicación para avisar al otro modem que ocupa el canal. DCD (Data Carrier Detected): Detectada portadora. El modem indica a su PC que el canal de comunicación está ocupado por el equipo remoto. El PC que quiere transmitir activa RTS, entonces su modem manda una señal portadora (sin modular, sin datos) para avisar al modem remoto que se reserva el canal. Una vez reservado el canal comunica a su DCE que ya puede transmitir activando la línea CTS. Cuando un PC haya terminado de transmitir, desactivará RTS, el modem quitará la portadora y desactivará CTS. Entonces el otro modem podrá reservar el canal si su PC desea transmitir. 10 En caso de que la gestión del canal sea full-duplex todo es más sencillo. Cuando un PC quiere transmitir activa su RTS. Automáticamente su modem le da paso activando CTS. TERCER BLOQUE: “TRANSMISIÓN/RECEPCIÓN DE DATOS” El funcionamiento de las líneas de este bloque es obvio. TxD: Transmisión de datos. RxD: Recepción de datos La transmisión serial de los datos, tal y como se ha explicado, con el bit de START, de STOP, etcétera, se produce en estas líneas. GESTIÓN SIMPLEX, HALF-DUPLEX Y FULL-DUPLEX DE UN CANAL DE COMUNICACIÓN Un canal de comunicación puede ser gestionado de tres maneras: simplex, semiduplex (o half-duplex) y duplex (o full-duplex). Simplex: La comunicación sólo es posible en un sentido. Por ejemplo, las emisiones de radio o televisión gestionan el éter en modo simplex. Half-duplex: La comunicación es posible en ambos sentidos pero de modo alternado, nunca simultáneamente. Por ejemplo un walkie-talkie gestiona el éter en modo half-duplex. Full-duplex: La comunicación es posible en ambos sentidos simultáneamente. Por ejemplo los teléfonos móviles utilizan el éter en modo full-duplex. Debe quedar claro que se trata de un modo de gestión del canal, no de una propiedad de éste. En los ejemplos queda claro que un mismo medio, el éter, puede ser gestionado de modos distintos. CONEXIONADO DTE-DTE: NULL-MODEM Como ya se ha mencionado, es frecuente que la norma RS232 se utilice para otros propósitos distintos de los originales. Uno de los más frecuentes es conectar un DTE con otro DTE. En este caso el cableado normal DTE a DCE no tiene sentido y estaríamos cortocircuitando las líneas de salida. Existe una solución, un cableado cruzado que se conoce como Null-modem. Es fácil de entender si lo analizamos usando los tres bloques funcionales. 11 BLOQUE 1: Conectar DTR con DSR remoto y RI remoto. De esta manera cuando un PC activa su RS232 se lo comunica al remoto. BLOQUE 2: RTS con CTS local y DCD remoto. Para entender la lógica de este cableado debe observarse (ver figura a continuación) que hay dos líneas independientes de transmisión de datos, una en cada sentido. Por lo tanto la comunicación es potencialmente Full-duplex. Esto implica que cada DTE puede transmitir cuando lo desee, independientemente de que el otro DTE lo esté haciendo o no. Por lo tanto cuando un PC quiere transmitir activa su RTS, esto activa también su propia CTS lo que le permite transmitir inmediatamente. Además indica que está transmitiendo a la máquina remota activando el DCD remoto. BLOQUE 3: TxD con RxD remoto. Como habíamos mencionado, la comunicación es potencialmente Full-Duplex. 12 TERMINALES Y EMULADORES DE TERMINAL Una terminal es un conjunto formado por un teclado, una pantalla y un interfaz serie (típicamente RS232) que permite conectar ambos a un ordenador central o host. El terminal en sí no posee ninguna capacidad de cálculo, se limita a sacar por pantalla la información que recibe del host y a transmitir al host la información/comandos introducida por teclado. Cada vez son menos frecuentes estos equipos. En su lugar se utiliza un ordenador personal con un programa de emulación de terminal (como el TELIX, el PROCOMM+, el HYPERTERMINAL de Windows95, etc.). Un terminal puede ser Full-Duplex (FD) o Half-duplex (HD) en función de como proceda para mostrar por pantalla las pulsaciones del teclado. Si la pantalla recibe directamente del teclado el código a visualizar entonces es HD (ver dibujo). El modo FD es algo más complejo pues requiere la participación del host. Consiste en que el host haga eco de la información que recibe del teclado. De esta forma el código pulsado "va y viene" al/del host antes de ser mostrado en pantalla (y de ahí que se denomine terminal full-duplex). La ventaja del método FD es que permite al usuario comprobar si ha habido error de transmisión. Si el código en pantalla es el deseado, también es el que ha leído el host. Esto no pasa en HD. Si en HD existiera un error de transmisión y el código de la tecla pulsada no llega o llega mal al host, el usuario no puede, en principio, saberlo. CONTROL DE FLUJO CON RS232 Existen dos posibilidades de control de flujo de datos con la RS232: Una hardware mediante las líneas RTS/CTS (que ya se ha descrito) y otra software XON/XOFF. RTS/CTS: la línea CTS indica al PC si puede transmitir o no. En aplicaciones como la conexión de un PC a una impresora serie (dispositivo este normalmente bastante lento) la línea CTS está gobernada por la impresora para impedir que el PC desborde su buffer de entrada. 13 XON/XOFF: Otra posibilidad es usar el protocolo software XON / XOFF que consiste en lo siguiente: 1. Cuando la impresora está dispuesta para recibir datos (buffer de entrada vacío o casi vacío) transmite al PC la marca XON (XON y XOFF son códigos ASCII predefinidos). 2. Si el PC transmite demasiado rápido para la impresora y el buffer está próximo a llenarse, entonces se manda la marca XOFF. 3. El PC transmite sólo si la última marca recibida fue XON. Dependiendo de las características de los equipos a conectar se puede hacer un control de flujo RTS / CTS, XON / XOFF, ambos o ninguno. Cuando se utilizan ambos, normalmente es porque hay que controlar dos buffers de recepción, el del dispositivo físico (UART), que se hace por RTS / CTS, y el buffer de la aplicación que está recibiendo los datos, que se hace con XON / XOFF. 14 5 3 4 2 DB9 9 8 7 6 1 1µF Tx Rx 1µF 1µF 6 13 2 14 5 4 3 V+ V- 15 GND Vcc + T2OUT R2IN T2IN R2OUT T1IN R1OUT MAX232 T1OUT R1IN C2- C2+ C1- C1+ Terminal - 1µF 1 16 +5V 1µF + Línea de Transmisión de datos Línea de Recepción de datos Bus de entrada Bus de salida Bus de entrada / salida Línea de Activación del 74245 Línea de Activación del 74373 + 8 9 7 10 11 12 Terminal + + Rx Tx +5V + 33pF 4MHz 10KΩ +5V 15 16 4 3 RB7 RB6 PIC16F84 5 Vss OSCI2/CLKOUT OSCI1/CLKIN MCLR RB5 RB4 RB3 RB2 RB1 RB0/INT Vdd 14 RA4/TOCKI RA3 RA2 RA1 RA0 33pF 2 1 18 17 +5V 13 12 11 10 9 8 7 6 1 11 18 17 14 13 8 7 4 3 1 19 9 8 7 6 5 4 3 2 O7 D7 OE 74373 10 O6 D6 LE O5 D5 O3 O2 O1 O0 B8 B7 B6 B5 B4 B3 B2 B1 O4 GND Vcc 20 +5V 74245 10 GND Vcc D4 D3 D2 D1 D0 DIR G A8 A7 A6 A5 A4 A3 A2 A1 +5V 20 19 16 15 12 9 6 5 2 11 12 13 14 15 16 17 18 8 7 6 5 4 3 2 1 IN7 IN6 IN5 IN4 IN3 IN2 IN1 IN0 +5V 9 GND Vcc 10 OUT7 OUT6 OUT5 OUT4 OUT3 OUT2 OUT1 OUT0 ULN2803 10KΩ 10KΩ 10KΩ 10KΩ 10KΩ 10KΩ 10KΩ 10KΩ +5V 11 12 13 14 15 16 17 18 +5V CIRCUITO ELÉCTRICO 15 El circuito se alimenta mediante una fuente de corriente continua de 5V, se comunica al ordenador por el conector Cannon DB-9 explicado anteriormente. Todos los integrados excepto el PIC16F84 tienen conectados entre el terminal positivo y el negativo un condensador electrolítico para filtrar las posibles corrientes parásitas, y que no afecten a su funcionamiento. Las entradas son los interruptores que se pueden sustituir por cualquier sensor que cuando se active haya entre sus terminales 5V para que el circuito reconozca un “1” lógico, ya que el circuito utiliza los niveles de tensión TTL. Las salidas son los relees que activan sus conmutadores, por lo que el circuito, cuando una salida está desactivada, puede accionar un actuador y al seleccionar esta misma salida puede encender otro actuador. Otra ventaja de ser relees es que la tensión máxima es de 250V en alterna, 50V en continua y una corriente máxima de 10A por lo que se pueden activar aparatos de potencia elevada. Como todos los circuitos integrados funcionan con niveles lógicos TTL, y la comunicación por el puerto serie utiliza sus propios niveles, hay que adaptarlos todos para que los circuitos se puedan comunicar entre ellos, de esto se encarga el MAX232, que transforma los niveles de RS232 a TTL. Los condensadores que tiene conectados son los especificados por el fabricante en el Datasheet (ver anexo I). Los terminales que no están conectadas se pueden utilizar para la adaptación de las líneas DSR y DTR pero no están conectadas por que no se utilizan en las rutinas del microcontrolador. Las líneas Tx y Rx se conectan a los terminales R1IN y T1OUT porque son los especificados por el fabricante como terminales de entrada y salida respectivamente, sus homólogos con tensiones TTL son el R1OUT y el T1IN respectivamente que se conectan a los terminales del PIC programados para que funcionen como las línea Rx y Tx, esto se explica en software del microcontrolador. Como el 16F84 sólo tiene un puerto de 8 bits, el Puerto B, las entradas y salidas se efectúan por él. Cuando el circuito lee las entradas se activa el integrado 74245 (que es un bus transmisor que se puede seleccionar el sentido de transmisión si de las puertas A a las B o al contrario) por estar conectado al terminal RA2 del microcontrolador, cuando por este terminal sale un “0” lógico se activa el 74245 leyendo los datos en sentido B a A, como especifica el fabricante en el datasheet (ver anexo II), enviando los datos recogidos por los sensores (en este caso interruptores) al 16F84 que, anteriormente, se ha programado el puerto B como lectura; al recibir los datos los envía por la línea Tx al ordenador. Se ha elegido este circuito por que cuando se envía la orden de escritura en las salidas las entradas no intervengan ya que el integrado permanece en alta impedancia (no dan ni un “0” lógico ni un “1”, el circuito lo reconoce como resistencias muy elevadas). Los interruptores de las entradas tienen conectados en paralelo una resistencia para que cuando se pulse y cambie su valor, en el momento en que no está haciendo contacto con ningún terminal, el 74245 reconozca un “0” lógico en vez de alta impedancia. Cuando, al microcontrolador, se le ordena que escriba en las salidas, este activa el 74373 enviando un “1” lógico por el terminal RA3, que es el que está conectado al LE del 74373, y después, manda el dato de los relees que hay que activar. El 74373 es un bus en el que, si se desactiva el terminal LE, sus salidas permanecen con el estado anterior y si se modifican las entradas, las salidas no varían, ya que tiene un flip-flop tipo D en cada salida, esto se ve en la tabla del datasheet (ver 16 anexo III). El terminal OE está conectado a tierra para que el circuito funcione, si no las salidas estarían en alta impedancia. Se ha elegido este chip para que cuando el microcontrolador lea las entradas las salidas sigan activas o desactivadas como eligió el usuario anteriormente. Las salidas del 74373 están conectadas a las entradas del ULN2803, que es un integrado compuesto por transistores en etapa Darlinton, lo que provoca que soporte una elevada carga en su salida, esto quiere decir que el ULN2803 se utiliza para amplificar los niveles de corriente de la salida del 74373 para que se puedan accionar los relees. Este integrado soporta una carga de hasta 50V este dato está expuesto en el datasheet (ver anexo IV). 17 PROGRAMA DEL MICROCONTROLADOR En el programa principal se configura el microcontrolador, programando los registros que necesitamos. El programa es el siguiente: Inicio Espera de la orden El dato recibido es un 1 list p=16F84 radix HEX El dato recibido es un 0 Orden de lectura Orden de escritura Activación del 74245 Activación del 74373 Lectura de las entradas Espera del dato Envio del Dato Activación de los relees Desactivación del 74245 Desactivación del 74373 • En esta primera parte se elige que el microcontrolador es el PIC16F84 y que los números se introducen en hexadecimal. Estado PA_TA PB_TB Intcon EQU EQU EQU EQU 0x03 0x05 0x06 0x0B Rxdreg Txdreg Cont EQU EQU EQU Dlycnt EQU 0x0C ;registro de recepción 0x0D ;registro de transmisión 0x0E ;contador de bits Transmitidos 0x0F ;contador de retraso Aquí se han declarado los registro específicos que se utilizan, además de los utilizados por el programa que son designados por el programador: Estado: Se utilizará para seleccionar el banco en el que estamos, para poder programar las puertas como entrada o como salida. 18 • Tris A: Es el registro utilizado para programar el puerto A como entrada o como salida. En el programa se denomina PA_TA ya que si estamos en el banco 0 este registro es el Puerto A y si estamos en el banco 1 es el Tris A. • Tris B: Lo mismo que el Tris A pero con el puerto B. • Intcon: Es el encargado de la habilitación o deshabilitación de las interrupciones. Los demás registros son los específicos del programa, y están explicados al lado, sus bits no modifican el funcionamiento del microcontrolador, son utilizados para almacenar datos. #define RXport PA_TA,1 #define TXport PA_TA,0 #define SAport PA_TA,3 #define ENport PA_TA,2 ;llamamos RXport a PA1 configurado como la señal RX ;llamamos TXport a PA0 configurado como la señal TX ;llamamos SAport a PA3 configurado como la señal que activa las salidas ;llamamos ENport a PA2 configurado como la señal que activa las entradas Esto es la definición de los bits utilizados de la puerta A, se han nombrado porque son muy utilizados y así hacer el programa más legible. ORG 0 19 La instrucción ORG se utiliza para seleccionar en que dirección se empiece a grabar el programa, aquí se ha seleccionado la dirección de memoria 0. clrf bsf clrf clrf bcf Intcon Estado,5 PA_TA PB_TB Estado,5 ;prohibición de las interrupciones ;selección del banco 1 ;Programación del PA ;Programación del PB ;selección del banco 0 Se prohíben todas las interrupciones porque no se necesitan en el programa. Después, se programan los dos puertos como salidas. bsf TXport ;Activación de Tx porque si no estaría transmitiendo La norma RS232 dice que cuando no transmite la línea Tx está a “1”, y que cuando cambia de “1” a “0” es cuando recibe el bit de inicio. bsf clrf bsf bsf bsf bcf bcf ENport PB_TB SAport Estado,5 RXport Estado,5 Saport ;reseteo de las salidas del circuito ;selección del banco 1 ;Programación de RX port como entrada ;selección del banco 0 Lo primero que se hace el activar el 74373 para que reconozca los datos que se le envían, después se envían todos los bits a cero para desactivar todos los relees. Inicio call btfss RxD Rxdreg,0 goto goto Salida Entrada ;Comprueba que orden se le ha mandado de lectura o escritura Se declara la rutina de inicio, lo que hace es buscar la instrucción de lectura o escritura y, una vez recibida, saltar al programa de escritura o lectura. Salida bsf call bsf clrf bcf movf movwf SAport RxD Estado,5 PB_TB Estado,5 Rxdreg,W PB_TB ;se activa el 74373 ;leemos dato del ordenador ;selección del banco 1 ;programación del PB como salidas ;selección del banco 0 ;Movemos el dato recibido a la salida bcf btfsc goto goto SAport SAport borra Inicio ;desactivación del 74373 ;comprueba que se ha desactivado el 74373 borra Este es el programa de escritura, lo primero que hace es activar el 74373, después recibe el byte programa las salidas y desactiva el 74373 para que no se modifiquen hasta la próxima vez que reciba datos. La subrutina “borra” comprueba que el 74373 no este activo, si estuviese activo volvería a borrar el bit SAport. 20 Entrada bcf clrf bsf movlw movwf bcf movf movwf call bsf bsf clrf bcf clrf goto Enport Txdreg Estado,5 0xFF PB_TB Estado,5 PB_TB,W ;activación del 74245 ;reseteo del registro de transmisión ;selección del banco 1 ;programación de PB como entrada ;selección del banco 0 ;llevamos dato de PB al registro de transmisión Txdreg TxD ENport Estado,5 PB_TB Estado,5 PB_TB Inicio ;transmisión del dato ;desactivación del 74245 ;selección del banco 1 ;programación del PB como salidas ;selección del banco 0 ;reseteo de las salidas Lo primero que se hace es activar el 74245 para poder leer las entradas, después resetea el registro de transmisión para evitar errores. Lo siguiente que hace es programar el puerto B como entradas y leer el dato. Por último envía el dato y se desactiva el 74245. Se programa el puerto B otra vez en salida para evitar posibles errores al tenerlo en entrada. RxD Espera del Bit de inicio Retardo del Bit de inicio clrf Rxdreg btfsc RXport goto RxD call Dly_Ini Lectura de un Byte movlw 0x08 movwf Cont RxD_Bit call Dly_bit btfsc RXport Rotar el registro Retardo de un bit Decremento del contador Ha leido 8 Bits Regreso a donde realizó el salto No ha leido 8 Bits bsf Rxdreg,7 btfss bcf RXport Rxdreg,7 decfsz Cont,W rrf Rxdreg,f ;reseto del registro de recepción ;comprueba que se ha mandado el bit de inicio ;si no se ha mandado espera a que lo manden ;si se ha mandado hace el retardo correspondiente al bit de inicio ;mueve el número de bits a recibir al contador ;hace el retardo del bit ;comprueba que dato se le ha mandado ;si es un uno se activa el bit 7 del registro de recepción ;si es un cero se desactiva el bit ;decrementa el contador y lo guarda en W para rotar sólo 6 veces ;rota a la derecha el registro de recepción si el resultado anterior no es cero 21 decfsz Cont,f ;decrementa el contador para ver si ha terminado ;va a leer otro bit ;hace el retardo del bit de stop ;regresa al salto goto RxD_Bit call Dly_bit return Esta es la rutina de recepción, en la primera parte, antes de la subrutina, lo único que trata es el bit de Inicio, cuando la línea Rx cambia de “1” a “0” hace el retardo del bit de inicio que es 1,5 veces mayor que el resto de los bits, ya que primero hace un retardo de la mitad de un bit (el llamado Dly_Ini), carga el contador y vuelve a hacer un retardo de bit Este retardo es mayor porque el ordenador espera la orden de que la línea está libre, si no recibe contestación transcurrido este tiempo envía el dato. La parte en la que rota el registro se hace para reducir el programa, ya que sólo se modifica un bit y después se rota. Donde decrementa y lo guarda en el acumulador (W), se hace porque si el resultado es cero, no tiene que rotar el registro porque sino guardaría el bit 0 en el bit de acarreo (C) del registro estado. TxD Mando del Bit de inicio movlw 0x08 movwf bcf call Txd_Bit btfsc Retardo de un Bit Cont TXport Dly_bit Txdreg,0 Envio de un Bit Rotar el registro Retardo de un bit Retardo de un bit TXport btfss bcf rrf Txdreg,0 TXport Txdreg,f call Dly_bit decfsz Cont,f goto Txd_Bit Decremento del contador Ha leido 8 Bits bsf No ha leido 8 Bits bsf call call TXport Dly_bit Dly_bit ;mueve el número de bits a transmitir al contador ;envía el bit de inicio ;hace el retardo del bit ;comprueba si es un 0 o un 1 lo que hay que enviar ;si es un 1 activa el puerto de transmisión ;si es un 0 desactiva el puerto ;rota a la derecha el registro de transmisión ;hace el retardo ;decrementa el contador de bits ;si no se han mandado todos los bits va a seguir enviando ;envió del bit de STOP ;se hacen dos retardos para centrar tiempos return Regreso a donde realizó el salto En la rutina de transmisión no hay que enviar el bit de inicio más largo que los demás puesto que el ordenador está no espera a que se le de la orden de puerto libre, recibe lo que va llegando. La rotación se efectúa por el mismo motivo que en la recepción, con lo que sólo se chequea el bit 0 del registro de transmisión. 22 Carga del Byte de retardo Dly_bit movlw 0x1D Salto a la rutina de retardo movwf Dlycnt goto Dly decrementa y compara Ha termiando No ha termiando ;se hace un retardo de 833us que es el tiempo que se tarda en transmitir un bit a 9600 baudios ;salto a la rutina de temorización El salto de las rutinas del bit de inicio y de bit normal a Dly se realiza sólo para reducir la programación puesto que en los dos casos es la misma Dly_Ini Regreso movlw 0x08 ;retardo equivalente a mitad del tiempo que tarda entre bit bit movwf Dlycnt goto Dly ;salto a la rutina de temporización Esta es la rutina del bit de inicio, como la anterior, carga el dato y después salta. Dly decfsz Dlycnt,f goto Dly return ;decrementa el contador de temporización, si el resultado es 0 salta ;si es 1 vuelve a decrementar ;si es 0 regresa a donde se hizo el salto Esta es la rutina que realiza el retardo. END Esta instrucción se utiliza para indicar que el programa ha terminado. 23 PROGRAMA DE COMUNICACIÓN EN VISUAL BASIC El programa hecho en Visual Basic se desarrolla gracias al componente mscomm32.ocx que permite la comunicación entre máquinas de forma rápida y sencilla. Los componentes se cargan en el menú proyecto haciendo clic en componentes y seleccionando el apropiado, en nuestro caso Microsoft Comm Control 6.0, ahora aparece en la barra de herramientas, se selecciona y se dibuja en el form. Los componentes tienen una serie de propiedades que se pueden modificar bien en la ventana de propiedades o bien en el programa poniendo el nombre elegido para el componente, un punto y la propiedad, como cualquier otra herramienta. El form del proyecto es muy sencillo, tiene una matriz de checkbox llamada salida para activar los relees agrupados en un frame, las matrices se crean dando el mismo nombre a una herramienta y cambiando en propiedades la opción index o bien dando a copiar y pegar. La opción index es el número de fila de la matriz. Se han elegido checkbox puesto que se pueden seleccionar más de uno. Para indicar que entradas hay activas hay una matriz de label agrupada en un frame que lo que hace es cambiar el color del fondo, a rojo cuando esta activada y en negro cuando no lo esta, el cambio de color se hace con los dos labels que no pertenecen a la matriz, el llamado negro y el rojo. Por último, un botón que mande la orden de recibir. La programación es la siguiente: Option Explicit Esta instrucción obliga a que las variables se hayan creado anteriormente. Dim valor As Integer Dim cont As Integer Se declaran valor y cont como variables de números enteros. Private Sub Form_Load() MSComm1.CommPort = 1 MSComm1.Settings = "9600,n,8,1" MSComm1.PortOpen = True 'Al iniciar el programa 'se cargan los parámetros 'y se abre el puerto 1 End Sub Rutina que se ejecuta cuando se carga el form. Private Sub Recibir_Click() MSComm1.Output = "1" 'Manda la acción de leer End Sub Cuando se hace clic en el botón recibir se envía al microcontrolador la orden de transmisión y el ordenador espera a que le llegen los datos. 24 Private Sub Salida_Click(Index As Integer) Dim caracter As String If Salida(Index).Value = 1 Then valor = valor + 2 ^ Index Else valor = valor - 2 ^ Index End If MSComm1.Output = "0" caracter = Chr(valor) MSComm1.Output = carácter 'Chequea si el valor pulsado es activo o no 'y lo transforma a decimal 'Manda la acción de escritura en PB del µC 'transforma el dato de decimal a ASCII 'Envía el dato en ASCII End Sub Cuando se hace clic en cualquier elemento del la matriz de checkbox, lee el valor de todos sus elementos, lo transforma a decimal y después a ACII para enviarlo en este formato. Se ha declarado la variable carácter como una matriz de caracteres, la diferencia entre esta variable y las declaradas al principio del programa es que esta solo se puede utilizar dentro de esta subrutina, y las otras en cualquier parte de la programación del form. Si tuviésemos otros forms y necesitásemos una variable para todos habría que crear un módulo y declarar una variable pública. Private Sub MSComm1_OnComm() Dim datoE() As Byte Select Case MSComm1.CommEvent Case 2 datoE() = MSComm1.Input valor = datoE(0) cont = 0 Do 'Espera a que el detector de tranmisión del puerto se active 'En el caso de que reciba un dato haga lo de debajo 'recibe el dato 'paso de decimal a binario activando los cuadrados oportunos If valor Mod 2 Then Bit(cont).BackColor = rojo.BackColor cont = cont + 1 Else Bit(cont).BackColor = Negro.BackColor cont = cont + 1 End If valor = valor \ 2 Loop Until valor = 0 End Select End Sub 25 Esta subrutina se ejecuta cuando hay algún cambio en el puerto, pueden ser de distintos tipos: Valor Evento 1 Enviar datos 2 Recibir datos 3 Cambio en la línea CTS 4 Cambio en la línea DSR 5 Cambio en la línea CD 6 Detección de llamada 7 Fin de fichero 1001 Señal de interrupción recibida 1002 Tiempo de espera de CTS sobrepasado 1003 Tiempo de espera de DSR sobrepasado 1004 Error de trama 1006 Pérdida de información en el puerto 1007 Tiempo de espera de CD sobrepasado 1008 Desbordamiento del buffer de recepción 1009 Error de paridad 1010 Buffer de transmisión lleno 1011 Error al recuperar el DCB para el puerto En el programa sólo se ha elegido el valor 2 porque sólo nos interesa el caso en el que recibe algún dato. Se ha definido la variable DatoE como una matriz de un número no definido de bytes, se ha escogido así aunque sólo se utiliza el elemento 0, porque el compilador reconoce como una matriz de bytes la orden input del componente que estamos utilizando. La operación mod lo que hace es calcular el resto de una división, por eso si existe, es que el bit es un uno y si no es un cero. Después se utiliza la división entera que se define con la barra invertida (\) para que el número no tenga decimales. Las opciones que aparecen el la ventana propiedades son: • Nombre: El nombre que se le da al componente para acceder a él desde la programación. En nuestro caso por defecto. • CommPort: El puerto serie que se va a utilizar. En nuestro caso el 1. • DTREnable: Habilitación o deshabilitación de la línea DTR. En nuestro caso por defecto. • EOFEnable: Habilitación o deshabilitación de la búsqueda del carácter EOF (final del fichero). En nuestro caso por defecto. • Handshacking: Selección del protocolo a utilizar puede ser: sin protocolo, protocolo XON/XOFF, protocolo RTS/CTS o los dos últimos. En nuestro caso sin protocolo. • InBufferSize: tamaño del buffer de entrada. En nuestro caso por defecto. • Index: Índice de la matriz. En nuestro caso por defecto. • InputLen: Número de caracteres que la propiedad input lee del buffer de recepción. En nuestro caso 0. • InputMode: Como lee el uerto si reconociendo caracter o en binario. En nuestro caso en binario. • Left: Distancia hacia la izquierda. • NullDiscard: Determina si se transmiten los caracteres nulos desde el puerto al buffer de recepción. En nuestro caso por defecto. 26 • • • • • • • • OutBufferSize: Tamaño del buffer de salida. En nuestro caso por defecto. ParityReplace: Símbolo que aparece cuando no recibe bien un carácter. RThreshold: Número de caracteres a recibir. En nuestro caso 1 porque si pusiésemos 0 deshabilitaríamos el evento 2. RTSEnable: Habilitación de la línea RTS. En nuestro caso por defecto. Settings: Propiedades del puerto, primero la velocidad, segundo la paridad, tercero el número de bits por carácter y por último el número de bits de STOP. En nuestro caso 9600,n,8,1. Sthreshold: Número de bits a transmitir. En nuestro caso 0, para desactivar el evento 1. Tag: Contiene información para el programa. Top: Distancia a la parte superior. 27 CONCLUSIÓN La asignatura me ha parecido muy interesante ya que me llamaba mucho la atención el mundo de los PICs. En lo referente a la forma de impartirla, creo que es una buena manera ya que se puede participar abiertamente en clase. El trabajo, es tan complicado como uno quiera ya que lo elige él mismo por lo que no me puedo quejar. Mi trabajo me gusta ya que nunca había desarrollado nada comunicándolo al ordenador por lo que he aprendido otras muchas cosas que no conciernen a los microcontroladores como el manejo del puerto RS232, programación en Visual Basic de este puerto, que no siempre funcionan bien los circuitos integrados comprados… BIBLIOGRAFÍA La mayoría de los datos referentes a los microcontroladores están sacados de los apuntes de clase, y el resto de Internet sobretodo de foros como: • http://www.codes-sources.com: foro francés sobre programación en muchos lenguajes, con ejemplos de aplicaciones. • http://miarroba.com: foro argentino de electrónica en general Para la programación de Visual Basic he utilizado los apuntes de clase de la asignatura programación visual, el libro “Enciclopedia de Microsoft Visual basic 6” de Francisco Javier Ceballos de la editorial Ra-Ma y foros de internet como www.portalvb.com. Para el desarrollo del circuito lo que he utilizado es el catálogo de Farnell y los datasheet descargados de www.alldatasheet.com, además de buscar ejemplos construidos en Internet como el teclado controlado por el PIC16F84 de la página www.viddata.com/keypad_hadware.htm. Todas las búsquedas las he realizado desde www.google.es. 28 ANEXO I. DATASHEET DEL MAX232 29 30 31 32 33 34 35 ANEXO II. DATASHEET DEL 74245 36 37 38 39 40 41 ANEXO III. DATASHEET DEL 74373 42 43 44 45 46 47 48 49 ANEXO IV. DATASHEET DEL ULN2803 50 51 52 53 54 55 56 57 ANEXO V. CIRCUITO ELÉCTRICO DEL CONTROL POR VOZ 58