pic16f84a mando a distancia para pc

Upload: chuchis

Post on 09-Jan-2016

32 views

Category:

Documents


0 download

DESCRIPTION

Mando a Distancia Para Pc

TRANSCRIPT

  • UNIVERSIDAD TECNOLOGICA NACIONAL FACULTAD REGIONAL SAN NICOLAS

    INGENIERIA EN ELECTRONICA

    PROBLEMA DE INGENIERA

    TECNICAS DIGITALES III

    MANDO A DISTANCIA PARA PC

    Integrantes:

    - Buxman Jorge A. - De Nicol Lisandro. - Gallina Luciano.

    Docentes:

    - Profesor: Poblete Felipe - Auxiliar: Gonzlez Mariano

    AO 2007

  • Tcnicas Digitales III Problema de ingeniera

    2

    INDICE

    OBJETIVOS DEL TRABAJO 3 MATERIAS INTEGRADAS......................................................................................................... 3 POSIBLES APLICACIONES........................................................................................................ 3 PROFESORES ENTREVISTADOS..............................................................................................3 BIBLIOGRAFA...........................................................................................................................3

    DESARROLLO 4 INTRODUCCIN.........................................................................................................................4 TEORIA DE FUNCIONAMIENTO ..............................................................................................4

    EL ENLACE INFRARROJO............................................................................................................4 RECEPCION DE INFRARROJO ....................................................................................................6 PROTOCOLO DE PHILIPS RC-05..................................................................................................9 EL URC SBC-RU-240/38 DE PHILIPS..........................................................................................12 ESTANDAR RS- 232 ....................................................................................................................13

    DIAGRAMAS Y CIRCUITOS..................................................................................................... 15 PRIMER INTENTO .......................................................................................................................15 RECEPTOR ...................................................................................................................................16 EL CODIGO FUENTE DEL PIC16F84A.....................................................................................19

    ESTRUCTURA DE UN PROGRAMA WINDOWS GUI.............................................................20 Parmetros de entrada de "WinMain"..............................................................................................22 Funcin WinMain tpica .................................................................................................................23 Declaracin.....................................................................................................................................24 Inicializacin ..................................................................................................................................24 Bucle de mensajes...........................................................................................................................24

    El procedimiento de ventana ......................................................................................................... 25 Sintaxis...........................................................................................................................................25 Prototipo de procedimiento de ventana............................................................................................26 Implementacin del procedimiento de ventana simple.....................................................................26

    RESULTADOS DE LAS PRUEBAS ...........................................................................................27

    CONCLUSIONES 29

    ANEXOS 33 Anexo A: LISTADO DE PROGRAMAS...................................................................................... 33

    Cdigo fuente para el PIC16F84A: .................................................................................................33 Cdigo fuente para la PC: ...............................................................................................................41

    Anexo B: Sitios en la WEB........................................................................................................... 57 Anexo C: GL3276A-datasheets (no includo en este documento) .................................................. 57 Anexo D: MAX232-datasheets (no includo en este documento)................................................... 57

  • Tcnicas Digitales III Problema de ingeniera

    3

    OBJETIVOS DEL TRABAJO

    Lograr el manejo o accionamiento de los comandos bsicos de programas multimedia en plena reproduccin mediante un mando a distancia enlazado con la PC a travs de un enlace de seal infrarroja. La implementacin requiere de la utilizacin de un control remoto comercial del tipo universal o cualquier otro control remoto de cualquier equipo en desuso (Equipo de audio o Tv, etc.).

    MATERIAS INTEGRADAS

    Informtica I y II.

    Tcnicas digitales I, II, y III.

    Fsica II y III.

    POSIBLES APLICACIONES

    Implementacin de control sobre archivos multimedia en plena reproduccin logrando una mayor comodidad, ya sean de audio o video.

    PROFESORES ENTREVISTADOS

    Ramiro Vota (Interfaz RS-232 en Windows XP).

    Mariano Gonzales (dem).

    BIBLIOGRAFA

    Turbo C/C++ Manual de referencia-Herbert Schildt (serie McGary-Hill de Informtica). Programacin Elemental en C++ Manual de Referencia Abreviado revisin 1.2 (Universidad de

    Mlaga Dpto. de Ing. Informtica) Programacin en C Metodologa, algoritmos y estructura de datos.-Luis Joyanes Aguilar /

    Ignacio Zahonero Martnez. Protocolo Philips RC-5 para control remoto descripcin por Eduardo J. Carletti

    (Comunicacion_protocolorc5.htm). RS-232 Ingeniera en microcontroladores Ing. Eric Lpez Prez. Hojas de datos de los sistemas involucrados (apndices). Organizacin de las computadoras-un enfoque estructurado-Andrew S. Tanembaum. Diversos sitios web (ver al final de este informe).

  • Tcnicas Digitales III Problema de ingeniera

    4

    DESARROLLO

    INTRODUCCIN

    Probablemente los botones ms frecuentemente pulsados en cualquier casa son los del mando a distancia de la televisin, y es que actualmente el control remoto de aparatos electrnicos es algo habitual. Resulta evidente que los mandos por infrarrojos han sido una revolucin.

    Por otra parte, es indudable que la presencia de ordenadores personales en hogares y oficinas, que duplican su capacidad a velocidades vertiginosas, facilita la extensa tarea en las diversas actividades que realiza el ser humano. La tendencia actual es optimizar el ordenador al mximo. Por todo ello, por qu no aplicar las comodidades del control remoto al ordenador? .

    Se pretende recibir la informacin enviada desde un emisor de infrarrojos, que ser un mando a distancia convencional, procesar esa informacin y enviarla va RS-232 a un ordenador personal.

    La informacin extrada del mando es una serie de pulsos que, en principio, no sirve de nada si no se procesa adecuadamente. Para llevar a cabo este proceso se utiliza un PIC modelo 16F84A de Microchip, que es un pequeo microcontrolador de 18 pines. Dicho PIC dispone de un entorno de desarrollo para la confeccin del programa que ejecutar y se encargar de procesar convenientemente la trama recibida del IR, obtenindose as otra trama de ceros y unos que ahora s es comprensible por cualquier sistema (palabra digital de 6 bits). Finalmente, como esta informacin se desea transmitir va serie siguiendo el estndar RS-232, se utilizar un integrado comercial (MAX232) que adecua los niveles de la trama extrada por el PIC (trama TTL) a los requeridos por la norma. Importante sealar que el PIC ya se ha encargado de aadir los bits de STOP y START a cada una de las palabras digitales, no utilizndose control de flujo hardware.

    Se emplea como emisor un mando a distancia universal al que se le ha programado el cdigo 033 correspondiente a los mandos PHILIPS (RC-05).

    TEORIA DE FUNCIONAMIENTO

    EL ENLACE INFRARROJO

    Un enlace infrarrojo consiste en una comunicacin va sealizacin lumnica.

    La luz infrarroja no es ms que una onda electromagntica como las de radio (claro es, que se trata de una frecuencia muy diferente) y como las del resto de las ondas que constituyen el espectro de luz visible (desde el infrarrojo hasta el ultravioleta).

    El nombre de luz infrarroja, que significa por debajo del rojo, proviene de la primera vez que fue observada al dividir la luz solar en diferentes colores por medio de un prisma que separaba la luz en su espectro de manera que a ambos extremos aparecen visibles, las componentes del rojo al violeta (en ambos extremos).

  • Tcnicas Digitales III Problema de ingeniera

    5

    Aunque estas experiencias haban sido realizadas anteriormente por Isaac Newton, William Herschel observ en el ao 1800 que se reciba radiacin debajo del rojo al situar medidores de calor en las diferentes zonas no visiblemente irradiadas por el espectro.

    Imagen de un perro tomada con radiacin infrarroja media (trmica) y coloreada:

    Su longitud de onda es del orden de los 700 nano-metros:

  • Tcnicas Digitales III Problema de ingeniera

    6

    Y su frecuencia:

    Todos estos parmetros son caractersticos de cualquier tipo de onda:

    RECEPCION DE INFRARROJO

    Todos los dispositivos semiconductores son sensibles a la luz (a todo tipo de luz), de hecho este es el principal factor que determina el encapsulado de los chips: un plstico completamente opaco, normalmente negro. Un sensor de infrarrojos est construido bsicamente por una unin semiconductora recubierta por un cristal que slo deja pasar la luz infrarroja (photodiodo).

    Un sensor de infrarrojos construido de esa forma ser capaz de detectar la presencia de cualquier luz infrarroja, independientemente de la fuente que la genere. Los diseadores de mandos a distancia tuvieron que aadir una caracterstica diferenciadora a la luz emitida desde un mando a distancia para hacerla distinguible del resto de fuentes luminosas. La seal emitida por un mando est modulada a una frecuencia entre 32 y 40 KHz, dependiendo del fabricante y modelo del mando a distancia. No tenemos que perder de vista que todo lo que se haga para emitir la seal, luego durante la recepcin se tendr que deshacer. Si se emite luz infrarroja, luego se tendr que recibir; si esta seal se modula con una portadora luego se tendr que eliminar (filtrar) esa portadora. La demodulacin se realiza analgicamente con un sencillo filtro paso banda (eliminar todas las frecuencias que no sean prximas a la frecuencia de emisin) junto con un rectificador/integrador.

  • Tcnicas Digitales III Problema de ingeniera

    7

    Una onda modulada es una forma de onda obtenida mediante una operacin matemtica implementada a travs de circuitos electrnicos y en la que intervienen la seal que se quiere transmitir (moduladora) y al onda portadora. Esta onda portadora es de una frecuencia mucho ms alta que la de la seal moduladora (la seal que contiene la informacin a transmitir).

    Al modular una seal desplazamos su contenido espectral en frecuencia, ocupando un cierto ancho de banda alrededor de la frecuencia de la onda portadora (f0). Esto nos permite multiplexar en frecuencia varias seales simplemente utilizando diferentes ondas portadoras y conseguir as un uso ms eficiente del espectro de frecuencias.

    Luz infrarroja modulada a una frecuencia de 36 KHz (para nuestro caso de RC-05), es el medio de comunicacin entre el emisor (mando a distancia) y el receptor (PIC16F84A). Ahora queda por determinar cmo se transmite la informacin, esto es, los bits que identifican la tecla del mando a distancia que se ha pulsado, pero esto se detallara en el apartado del protocolo RC-05.

    Para la realizacin de la tarea de recibir el dato empleamos un circuito integrado comercial estndar cuyas especificaciones se pueden consultar en el Anexo A (hoja de datos). Es el GL3276A el circuito mencionado y brevemente podemos decir que consta de los siguientes bloques funcionales:

    Caractersticas del integrado:

    Menor numero de errores asociados a la alta frecuencia emanada por luces fluorescentes (impulsos luminiscentes) mediante circuito trampa interna.

    Frecuencia de portadora (demodulacin) preselecionable mediante resistencia instalada en el pin f0 en un rango de 30 a 80 KHz. Margen de variacin de f0 reducido.

    Pocos elementos externos necesarios. Resistencias de pull-ups y filtros internas. Capacitores externos de capacidades bajas.

    Salida a colector abierto con resistencia de pull-up.

  • Tcnicas Digitales III Problema de ingeniera

    8

    Este es un circuito integrado analgico diseado especialmente para este tipo de aplicaciones, tanto es as que el fabricante nos aporta el circuito de aplicacin tpico que obviamente se consigue en cualquier tienda de electrnica completo dentro de una caja de chapa que hace a las veces de jaula de Faraday para disminuir el efecto de interferencias por ondas electromagnticas.

    Como veremos a este se acopla directamente el photodiodo receptor y un conjunto mnimo de componentes de seteo y dems. Como se muestra en su diagrama de bloques consta en una primera instancia de un amplificador de entada, seguido de u limitador, un filtro pasa banda, un circuito detector y un acondicionador de forma de onda que va directo a la etapa de salida a colector abierto.

    El valor de R(f0) lo encontramos mediante las curvas aportadas por el fabricante del circuito integrado. Para 36 KHz seria al rededor de 156 K.

  • Tcnicas Digitales III Problema de ingeniera

    9

    PROTOCOLO DE PHILIPS RC-05

    Es evidente, dada la forma de modular la seal, que la informacin se transmite en serie, esto es, un bit detrs de otro, y por tanto slo es necesario una lnea (de datos) para recibirla. Descubramos un poco que es y como esta hecho el protocolo de Philips.

    El cdigo RC-05 de Philips es, posiblemente, el protocolo ms utilizado por los experimentadores, debido a la amplia disponibilidad de controles remotos baratos que se basan en l.

    Adems, dentro de este protocolo hay comandos predefinidos para distintos artefactos, una caracterstica que aporta una mayor compatibilidad al utilizarlo con muchos equipos hogareos.

    Philips ha comenzado a utilizar un nuevo protocolo, el RC-06, que tiene ms capacidades.

    Caractersticas

    Direccin de 5 bit y comando de 6 bit (7 bits de comando para RC-05X)

    Codificacin de doble fase o bi-fase (Bi-phase, tambin llamada cdigo Manchester)

    Frecuencia de portadora de 36 KHz.

    Tiempo de bit constante de 1,778 ms (64 ciclos de 36 KHz.)

    Modulacin

    El protocolo est basado en una modulacin Manchester de doble fase sobre una portadora de 36 KHz.

    En esta codificacin, todos los bits tienen la misma longitud, de 1,778 ms. La mitad del bit es un tren de pulsos de la portadora de 36 KHz., y en la otra mitad la seal est plana.

    El cero lgico es representado por un tren de pulsos en la primera mitad (primer nible) del tiempo que corresponde al bit. El uno lgico es representado por un tren de pulsos en la segunda mitad de este tiempo. La relacin entre pulso y pausa en la portadora de 36 KHz. es de 1/3 o 1/4, lo que reduce el consumo de energa.

    Protocolo

    La imagen muestra un tpico tren de pulsos en un mensaje RC-05. En este ejemplo se transmite la direccin $05 y el comando $35.

    Los dos primeros bits son los de inicio (start), que deben ser dos "1" lgicos. Ntese que transcurre medio tiempo de bit hasta que el receptor se entera de que ha comenzado el mensaje.

  • Tcnicas Digitales III Problema de ingeniera

    10

    El protocolo RC-05 extendido (RC-05x) tiene un solo bit de inicio y este es en realidad el que utilizaremos pues es el que mas abunda aunque lo sigamos llamando RC-05. El tercer bit del protocolo RC-05, marcado como T en el dibujo, es el bit de conmutacin (toggle). Este bit es invertido cada vez que se libera una tecla en el control remoto y se la presiona de nuevo o se presiona otra diferente. De esta manera el receptor puede distinguir entre una tecla que permanece presionada (mientras lo est, el comando que le corresponde se repite indefinidamente en la seal) y una misma tecla a la que se la presiona varias veces. Para nuestra aplicacin lo que haremos es que el PIC16f84A decodifique el mensaje enviado por el control remoto y enve los datos a la PC mediante el puerto serie. Ya que hacemos esto, no es necesario pasarle a la PC toda la cadena, basta con que le pasemos el dato de comando para que la PC ejecute una tarea respectiva. Entonces el dato correspondiente al dispositivo que nos habla se lo queda el PIC para lograr el reconocimiento del mismo y as impedir leer mensajes de otros controles remotos circundantes. En la cadena que le pasamos a la PC haremos que, ya que nos sobran dos bis para completar el byte (6 bits de comando), el bit 6 (cadena 0~7 bits) de dicha cadena sea 1 lgico para informar no repeticin de la tecla y 0 lgico para representar repeticin de la tecla y as la PC pueda hacer alguna discriminacin de ser necesario.

    El bit que sigue al bit T es el primero de la direccin del dispositivo receptor de infrarrojos (identificacin de quien nos habla y por esto, obviamente, para quien es el mensaje), poniendo en primer lugar el bit ms significativo de la direccin. A esta direccin le sigue el comando de 6 bits, tambin con su bit ms significativo en primer lugar.

    Un mensaje, entonces, consiste de un total de 14 bits, que sumados dan una duracin total del mensaje de 25 ms. A veces puede parecer que un mensaje es ms corto debido a que la primera parte del bit de inicio S1 es inactiva.

    Mientras se mantenga presionada la tecla, el mensaje se repite cada 114 ms. El bit de conmutacin mantendr el mismo nivel lgico durante la repeticin de un mensaje.

    Comandos predefinidos

    Philips ha creado una lista de comandos estandarizados. Esto asegura compatibilidad entre artefactos de un mismo tipo y evita que la tecla que cambia de canal en un televisor produzca al mismo tiempo algn efecto en una videocasetera que tambin est all, enfrente del control remoto.

    Una caracterstica interesante es que la mayora de los artefactos estn representados dos veces, lo que permitira tener dos videocaseteras juntas sin tener problemas para comandarlas por separado.

  • Tcnicas Digitales III Problema de ingeniera

    11

    La lista que sigue no es exhaustiva.

    Direccin RC-5 Dispositivo

    $00 - 0 TV1

    $01 - 1 TV2

    $02 - 2 Teletexto

    $03 - 3 Video

    $04 - 4 LV1

    $05 - 5 VCR1

    $06 - 6 VCR2

    $07 - 7 Experimental

    $08 - 8 Sat1

    $09 - 9 Cmara

    $0A - 10 Sat2

    $0B - 11

    $0C - 12 CDV

    $0D - 13 Camcorder

    $0E - 14

    $0F - 15

    $10 - 16 Preamplificador

    $11 - 17 Sintonizador

    $12 - 18 Grabador1

    $13 - 19 Preamplificador

    $14 - 20 Reproductor CD

    $15 - 21 Telfono

    $16 - 22 SatA

    $17 - 23 Grabador2

    $18 - 24

    $19 - 25

    $1A - 26 CDR

    $1B - 27

    $1C - 28

    $1D - 29 Iluminacin

    $1E - 30 Iluminacin

    $1F - 31 Telfono

    Comando RC-5 Comando TV Comando VCR

    $00 - 0 0 0

    $01 - 1 1 1

    $02 - 2 2 2

    $03 - 3 3 3

    $04 - 4 4 4

    $05 - 5 5 5

    $06 - 6 6 6

    $07 - 7 7 7

    $08 - 8 8 8

    $09 - 9 9 9

    $0A - 10 -/-- -/--

    $0C - 12 Espera Espera

    $0D - 13 Silenciar

    $10 - 16 Volumen +

    $11 - 17 Volumen -

    $12 - 18 Brillo +

    $13 - 19 Brillo -

    $20 - 32 Programa + Programa +

    $21 - 33 Programa - Programa -

    $32 - 50 Retroceso rpido

    $34 - 52 Retroceso rpido

    $35 - 53 Reproducir

    $36 - 54 Detener

    $37 - 55 Grabar

  • Tcnicas Digitales III Problema de ingeniera

    12

    EL URC SBC-RU-240/38 DE PHILIPS

    Utilizamos este control remoto universal de Philips y lo configuramos para trabaja con una VRC pues nos habilita la mayor cantidad de botones posible permitindonos, en definitiva, el mayor rango de interaccin con la PC. Conseguimos entonces las siguientes salidas del control hacia nuestro sistema receptor:

    Estos cdigos de salida adems de aparecer en la tabla antes mostrada, los podemos comprobar y lo hicimos mediante el ordenador. En el cdigo fuente del programa de la PC haremos la siguiente tabla de asignaciones por defecto (el usuario puede modificar dicha tabla cuando abre el programa).

    Esta es una asignacin por defecto para controlar el programa WINAMP (configuracin de teclado por defecto, del programa) de reproduccin de archivos multimedia y adems nos permitir interactuar en lo que a las principales funciones respecta, con el sistema operativo Windows.

  • Tcnicas Digitales III Problema de ingeniera

    13

    Para la configuracin del control remoto:

    Elegir dispositivo (uno de cuatro los botones superiores), en nuestro caso VCR. Mantener presionado los botones numero 1 y numero 3, destello de led indicador de envo

    dos veces. Ingresar el cdigo correspondiente al protocolo que el control remoto debe emitir, para nuestro

    caso es 033, destello de led indicador de envo una vez.

    Ahora tenemos el mando a distancia configurado para emitir en protocolo RC-05X en modo VCR.

    ESTANDAR RS- 232

    La transmisin de datos en serie es una de las ms comunes para aquellas aplicaciones en las que la velocidad no es demasiado importante, o no es posible conseguirla (por ejemplo, va red telefnica). Para simplificar el proceso de enviar los bits uno por uno han surgido circuitos integrados que realizan la funcin, teniendo en cuenta todos los tiempos necesarios para lograr una correcta comunicacin y aliviando a la CPU de esta pesada tarea. El circuito que estudiado es el 8250 de National, fabricado tambin por Intel, aunque existen diferencias respecto al 16550.

    Esta ltima UART es ms reciente y mucho ms potente (aunque solo sea por unos pequeos detalles) y cada vez est ms extendida, en particular en las actuales placas base.

  • Tcnicas Digitales III Problema de ingeniera

    14

    La lnea que transmite los datos en serie est inicialmente en estado alto. Al comenzar la transferencia, se enva un bit a 0 bit de inicio. Tras l irn los 8 bits de datos a transmitir (en ocasiones son 7, 6 5): estos bits estn espaciados con un intervalo temporal fijo y preciso, ligado a la velocidad de transmisin que se est empleando, en nuestro caso es de 9600 baudios. Tras ellos podra venir o no un bit de paridad generado automticamente por la UART. Al final, aparecer un bit (a veces un bit y medio dos bits) a 1, que son los bits de parada o bits de stop.

    Lo de medio bit significa que la seal correspondiente en el tiempo a un bit dura la mitad. La presencia de bits de arranque y paro permite sincronizar la estacin emisora con la receptora, haciendo que los relojes de ambas vayan a la par. A la hora de transmitir los bits de datos unos tras otros, no se necesitan seales de reloj como se requieren para otras comunicaciones como es por ejemplo el I2C y por esto se considera al protocolo RS-232 asncrono.

    El ACE 8250 (Asynchronous Communication Element) integra en un solo chip una UART (Universal Asynchronous Receiver/Transmitter) y un BRG (Baud Rate Generator). Soporta velocidades de hasta 625000 baudios con relojes de hasta 10 MHz. El BRG incorporado divide la frecuencia base para conseguir las velocidades estndar de la RS-232. Para llevar a cabo ala comunicacin el integrado consta de varios registros en los que se aloja bandera de estado, configuracin de lnea y modem. Tambin estn los registros buffer en los que se encuentran los datos recibidos, los datos a enviar, el registro de salida secuencial bit a bit e dem para la entrada.

    Desde un punto de vista elctrico la norma RS-232 establece:

    Un 1 lgico es un voltaje comprendido entre 5v y 15ven el transmisor y entre -3v y - 25v en el receptor.

    Un 0 lgico es un voltaje comprendido entre +5v y +15v en el trasmisor y entre +3v y +25 v en el receptor.

    Para adaptar las salidas del micro controlador al protocola se usa el MAX232 este chip se utiliza en aquellas aplicaciones donde no se dispone de fuentes dobles de +12 y 12 Volts. El MAX 232 necesita solamente una fuente de +5V para su operacin, internamente tiene un elevador de voltaje que convierte el voltaje de +5V al de doble polaridad de +12V y -12V. Cabe mencionar que existen una gran variedad de CI que cumplen con la norma RS-232 como lo son: MAX220, DS14C232, MAX233, LT1180A.

  • Tcnicas Digitales III Problema de ingeniera

    15

    Implementacin cableada

    En la siguiente tabla se muestra las seales y configuracin RS-232 ms comn segn se implemente ficha DV9 o DV25:

    DIAGRAMAS Y CIRCUITOS

    PRIMER INTENTO

    Parea enriquecimiento de nuestra experiencia en un primer intento por querer logra la comunicacin va puerto serie de la PC e ignorantes totalmente de la existencia del MAX232 intentamos hacer la adaptacin de niveles de voltaje a travs de un circuito a base de amplificadores operacionales (LM324) puestos como comparadores. Si bien conseguimos la comunicacin, el dato transmitido era muy distante del que realmente queramos enviar. Al observar el comportamiento del amplificador operacional configurado de esa manera con un osciloscopio, al atravesarlo un dato a transmitir, pudimos ver que la salida no poda acompaar a la entrada en tiempo y forma. As que intentamos resolver el problema bajando la velocidad de transmisin, ya tenamos el hardware armado. Conseguimos una leve mejora a 330 baudios, as que debamos intentar configurar el operacional como amplificador inverso de alguna manera. Como fuese, haba que modificar el hardware y a su vez ya nos habamos enterado de MAX232, as que para evitar mayores perdidas de tiempo nos inclinamos a la implementacin de integrado, y problema resuelto. Adems el otro mtodo, por supuesto nos demandaba una fuente bipolar.

  • Tcnicas Digitales III Problema de ingeniera

    16

    RECEPTOR

    E sistema de recepcin esta compuesto por un hardware de deteccin-decodificacin, integrado por un microcontrolador PIC16F84A, y la PC para la ejecucin de una tarea determinada.

    En el circuito de deteccin-decodificacin, el PIC16F84A, toma el dato serie (onda cuadrada) que el GL3276A proporciona como salida al recibir la seal del mando a distancia. Separa el cdigo de mando del de dispositivo, hace el reconocimiento del dispositivo y enva el dato de comando mas el de repeticin a la PC mediante el protocolo RS-232 a travs del puerto serie de la misma. Para logra el cometido anterior, entre el PIC16F84A se instala un driver adaptador de nivel de seal MAX232. Este circuito integrado adapta la seal de 0V~5V que emite el PIC16F84A en su salida de dato a la PC a los respectivos niveles 10V~ (-10V) necesarios para representar el estado lgico en el protocolo RS-232. La transmisin a travs del puerto serie se hace a 9600 baudios (baudio=bit/segundos) preseleccionados en la programacin del PIC16F84A (ver cdigo en PIC16F84A), y en el cdigo fuente del programa que correr en el ordenador (ver cdigo en PC).

    Este es un esquemtico del hardware de deteccin-decodificacin:

  • Tcnicas Digitales III Problema de ingeniera

    17

    Es un circuito muy sencillo:

    Led PWR: se enciende al alimentar el circuito.

    Led Led V: emite un destello por cada dato enviado a la PC, permanece encendido durante un segundo, aproximadamente (simultneamente con Led R) de no poder concretar la comunicacin. De presionar el pulsador Borrar disp. durante cierto tiempo el led enciende por un segundo dos veces para indicar salida de dato paralelo y una ves para indicar salida de datos serie.

    Led Led R: al encender el receptor, este no esta vinculado a ningn dispositivo (TV, etc.) entonces esta situacin se ve indicada por la permanencia de este led encendido. La situacin se revierte al enviarle algn mensaje desde el control remoto (presionando cualquier tecla del control). A partir de entonces el receptor solo reconocer mensajes provenientes de ese mando a distancia y con ese cdigo de dispositivo. Si se quiere cambiar el cdigo de dispositivo de reconocimiento por cualquier razn, el receptor consta de un pulsador Borrar disp. Que al presionarlo durante un tiempo reducido deshace la vinculacin encendiendo nuevamente Led R y poniendo al receptor a la espera del nuevo cdigo de reconocimiento.

    Pulsador Borrar disp.: pensionndolo durante un breve lapso de tiempo se deshace la vinculacin del receptor y el cdigo de dispositivo (cdigo de reconocimiento), se encender entonces el Led R. Si el pulsador se presiona durante un tiempo prolongado el receptor, adems de desvincular el mendo a distancia, cambia su modo de transmisin de datos a la PC, si estaba transmitiendo en serie lo har en paralelo entonces (enciende por un segundo dos veces Led V), y viceversa (enciende por un segundo una vez Led V).

    Nota: para que el hardware pueda comunicarse con el ordenador mediante el puerto paralelo, se debe quita el buffer MAX232 lo cual se puede llevar a cabo interponiendo un conector entre este y la electrnica principal. En este conector tambin se debe conectar el adaptador de conexiones para efectuar la comunicacin va puerto paralelo. Esta comunicacin enva el dato en dos partes como puede verse en el cdigo fuente del PIC16F84A. En una primera instancia se envan los cuatro bits ms significativos, se espera un determinado tiempo

  • Tcnicas Digitales III Problema de ingeniera

    18

    una confirmacin por parte de la PC y se procede al envo del pedazo restante para completar el byte. Esto es as para aprovechar mejor y de manera ms simple las caractersticas del puerto segn nuestras necesidades.

    Puerto paralelo: El puerto paralelo se implementa en hardware a travs de una ficha DV25 (25 pines) macho (hembra en la PC) de los cuales desde el pin 18, inclusive, hasta el pin 25, tambin inclusive, sirven de masa. EL controlador de la comunicacin consta de tres registros de 8 bit cada uno (un byte). El registro

    PORT 888, puerto de datos, (direccin en memoria 888), Pines del 2 al 9, es de solo escritura, por este registro se envan los datos al exterior de la PC. El registro PORT 889, puerto de estado, es de solo lectura, por aqu se enviaremos seales elctricas al ordenador, de este registro solo se utilizan los

    cinco bits de ms peso, que son el bit 7, 6, 5, 4 y 3 teniendo en cuenta que el bit 7 funciona en modo invertido, pines 15, 13, 12, 10 y 11. El registro PORT 890, puerto de control, es de lectura/escritura, es

    decir, podremos enviar o recibir seales elctricas, segn nuestras necesidades. De los 8 bits de este registro solo se utilizan los cuatro de menor peso o sea el 0, 1, 2 y 3, con un pequeo detalle, los bits 0,

    1, y 3 estn invertidos.

    Adaptacin: Para enviar el dato a la PC utilizamos del puerto de estado los pines 10, 12, 13, y 15 (E6, E5, E4 y E3 respectivamente). Para la confirmacin la esperamos por el puerto de datos, pin 2 (D0). La conexin cableada deber hacerse como se indica a continuacin:

  • Tcnicas Digitales III Problema de ingeniera

    19

    EL CODIGO FUENTE DEL PIC16F84A Este cdigo fuente debe encargarse de las tareas descriptas antes. Es importante remarcar que la comunicacin con la PC mediante el protocolo RS-232 se debe programar porque no viene incorporada a diferencia del siguiente modelo de microcontrolador de Microchip PIC16F873. Para entender ms fcilmente el cdigo se muestra el siguiente diagrama de bloque del algoritmo.

  • Tcnicas Digitales III Problema de ingeniera

    20

    Cdigo fuente: Para la elaboracin de este cdigo fuente se utilizo un entorno de desarrollo integrado distribuido en forma gratuita por Microchip, el MPLAB 9.0 IDE. Para la programacin o grabado del cdigo en la memoria del PIC16F84A se uso otro programa de distribucin libre y gratuita, el IC-Prog. Para esta ultima tarea tambin se hizo uso de una tarjeta de programacin llamada ProPic 2 Programer. (Ver cdigo fuente para PIC16F84A en Anexo C).

    ESTRUCTURA DE UN PROGRAMA WINDOWS GUI

    Para el desarrollo de este cdigo fuente se utilizo un entorno de desarrollo integrado tambin. Se utilizo Dev-C 4.9, un producto de Bloodshed y se programo WIN API (Appication Programming Interface) con clases. Los programas Windows son independientes de la mquina en la que se ejecutan (o al menos deberan serlo), el acceso a los dispositivos fsicos se hace a travs de interfaces, y nunca se accede

  • Tcnicas Digitales III Problema de ingeniera

    21

    directamente a ellos. Esta es una de las principales ventajas para el programador, ya que no hay que preocuparse por el modelo de tarjeta grfica o de impresora, la aplicacin funcionar con todas, y ser el sistema operativo el que se encargue de que as sea. Un concepto importante es el de recurso. Desde el punto de vista de Windows, un recurso es todo aquello que puede ser usado por una o varias aplicaciones. Existen recursos fsicos, que son los dispositivos que componen el ordenador, como la memoria, la impresora, el teclado o el ratn y recursos virtuales o lgicos, como los grficos, los iconos o las cadenas de caracteres, etc. Por ejemplo, si nuestra aplicacin requiere el uso de un puerto serie, primero debe averiguar si est disponible, es decir, si existe y si no lo est usando otra aplicacin; y despus lo reservar para su uso. Esto es necesario porque este tipo de recurso no puede ser compartido. Los programas en Windows estn orientados a eventos, esto significa que normalmente los programas estn esperando a que se produzca un acontecimiento que les incumba, y mientras tanto permanecen aletargados o dormidos. Un evento puede ser por ejemplo, el movimiento del ratn, la activacin de un men, la llegada de informacin desde el puerto serie, una pulsacin de una tecla... Esto es as porque Windows es un sistema operativo multitarea, y el tiempo del microprocesador ha de repartirse entre todos los programas que se estn ejecutando. Si los programas fueran secuenciales puros, esto no sera posible, ya que hasta que una aplicacin finalizara, el sistema no podra atender al resto.

    Ejemplo de programa secuencial:

    Ejemplo de programa por eventos:

  • Tcnicas Digitales III Problema de ingeniera

    22

    Hay algunas diferencias entre la estructura de un programa C/C++ normal, y la correspondiente a un programa Windows GUI. Algunas de estas diferencias se deben a que los programas GUI ests basados en mensajes, otros son sencillamente debidos a que siempre hay un determinado nmero de tareas que hay que realizar.

    // Ficheros include: #include // Prototipos: LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); // Funcin de entrada: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) { // Declaracin: // Inicializacin: // Bucle de mensajes: return Message.wParam; } // Definicin de

    La funcin de entrada de un programa Windows es "WinMain", en lugar de la conocida "main". Normalmente, la definicin de esta funcin cambia muy poco de una aplicacin a otra. Se divide en tres partes claramente diferenciadas: declaracin, inicializacin y bucle de mensajes.

    Parmetros de entrada de "WinMain"

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)

    La funcin WinMain tiene cuatro parmetros de entrada:

    hInstance es un manipulador para la instancia del programa que estamos ejecutando. Cada vez que se ejecuta una aplicacin, Windows crea una Instancia para ella, y le pasa un manipulador de dicha instancia a la aplicacin.

    hPrevInstance es un manipulador a instancias previas de la misma aplicacin. Como Windows es multitarea, pueden existir varias versiones de la misma aplicacin ejecutndose, varias instancias. En Windows 3.1, este parmetro nos serva para saber si nuestra aplicacin ya se estaba ejecutando, y de ese modo se podan compartir los datos comunes a todas las instancias. Pero eso era antes, ya que en Win32 usa un segmento distinto para cada instancia y este parmetro es siempre NULL, slo se conserva por motivos de compatibilidad.

    lpszCmdParam, esta cadena contiene los argumentos de entrada del comando de lnea.

  • Tcnicas Digitales III Problema de ingeniera

    23

    nCmdShow, este parmetro especifica cmo se mostrar la ventana. Para ver sus posibles valores consultar valores de ncmdshow. Se recomienda no usar este parmetro en la funcin ShowWindow la primera vez que se sta es llamada. En su lugar debe usarse el valor SW_SHOWDEFAULT.

    Funcin WinMain tpica

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) { /* Declaracin: */ HWND hwnd; MSG mensaje; WNDCLASSEX wincl; /* Inicializacin: */ /* Estructura de la ventana */ wincl.hInstance = hInstance; wincl.lpszClassName = "NUESTRA_CLASE"; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof(WNDCLASSEX); /* Usar icono y puntero por defecto */ wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor(NULL, IDC_ARROW); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH)COLOR_BACKGROUND; /* Registrar la clase de ventana, si falla, salir del programa */ if(!RegisterClassEx(&wincl)) return 0; hwnd = CreateWindowEx( 0, "NUESTRA_CLASE", "Ejemplo 001", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL );

  • Tcnicas Digitales III Problema de ingeniera

    24

    ShowWindow(hwnd, SW_SHOWDEFAULT); /* Bucle de mensajes: */ while(TRUE == GetMessage(&mensaje, 0, 0, 0)) { TranslateMessage(&mensaje); DispatchMessage(&mensaje); } return mensaje.wParam; }

    Declaracin

    En la primera zona declararemos las variables que necesitamos para nuestra funcin WinMain, que como mnimo sern tres:

    HWND hWnd, un manipulador para la ventana principal de la aplicacin. Ya sabemos que nuestra aplicacin necesitar al menos una ventana. MSG Message, una variable para manipular los mensajes que lleguen a nuestra aplicacin. WNDCLASSEX wincl, una estructura que se usar para registrar la clase particular de ventana que usaremos en nuestra aplicacin. Existe otra estructura para registrar clases que se usaba antiguamente, pero que ha sido desplazada por esta nueva versin, se trata de WNDCLASS.

    Inicializacin

    Esta zona se encarga de registrar la clase o clases de ventana, crear la ventana y visualizarla en pantalla.

    Para registrar la clase primero hay que rellenar adecuadamente la estructura WNDCLASSEX, que define algunas caractersticas que sern comunes a todas las ventanas de una misma clase, como color de fondo, icono, men por defecto, el procedimiento de ventana, etc. Despus hay que llamar a la funcin RegisterClassEx.

    En el caso de usar una estructura WNDCLASS se debe registrar la clase usando la funcin RegisterClass.

    A continuacin se crea la ventana usando la funcin CreateWindowEx, la funcin CreateWindow ha cado prcticamente en desuso. Cualquiera de estas dos funciones nos devuelve un manipulador de ventana que podemos necesitar en otras funciones, sin ir ms lejos, la siguiente.

    Pero esto no muestra la ventana en la pantalla. Para que la ventana sea visible hay que llamar a la funcin ShowWindow. La primera vez que se llama a sta funcin, despus de crear la ventana, se puede usar el parmetro nCmdShow de WinMain como parmetro o mejor an, como se recomienda por Windows, el valor SW_SHOWDEFAULT.

  • Tcnicas Digitales III Problema de ingeniera

    25

    Bucle de mensajes

    Este es el ncleo de la aplicacin, como se ve en el ejemplo el programa permanece en este bucle mientras la funcin GetMessage retorne con un valor TRUE.

    while(TRUE == GetMessage(&mensaje, 0, 0, 0)) { TranslateMessage(&mensaje); DispatchMessage(&mensaje); }

    Este es el bucle de mensajes recomendable, aunque no sea el que se usa habitualmente. La razn es que la funcin GetMessage puede retornar tres valores: TRUE, FALSE -1. El valor -1 indica un error, as que en este caso se debera abandonar el bucle.

    El bucle de mensajes que encontraremos habitualmente es este:

    while(GetMessage(&mensajee, 0, 0, 0)) { TranslateMessage(&mensaje); DispatchMessage(&mensaje); }

    NOTA: El problema con este bucle es que si GetMessage regresa con un valor -1, que indica un error, la condicin del "while" se considera verdadera, y el bucle contina. Si el error es permanente, el programa jams terminar.

    La funcin TranslateMessage se usa para traducir los mensajes de teclas virtuales a mensajes de carcter.

    Los mensajes traducidos se reenvan a la lista de mensajes del proceso, y se recuperarn con las siguientes llamadas a GetMessage.

    La funcin DispatchMessage enva el mensaje al procedimiento de ventana, donde ser tratado adecuadamente.

    El procedimiento de ventana

    Cada ventana tiene una funcin asociada, esta funcin se conoce como procedimiento de ventana, y es la encargada de procesar adecuadamente todos los mensajes enviados a una determinada clase de ventana. Es la responsable de todo lo relativo al aspecto y al comportamiento de una ventana.

    Normalmente, estas funciones estn basadas en una estructura "switch" donde cada "case" corresponde aun determinado tipo de mensaje.

    Sintaxis

    LRESULT CALLBACK WindowProcedure(

  • Tcnicas Digitales III Problema de ingeniera

    26

    HWND hwnd, // Manipulador de ventana UINT msg, // Mensaje WPARAM wParam, // Parmetro palabra, vara LPARAM lParam // Parmetro doble palabra, vara );

    hwnd es el manipulador de la ventana a la que est destinado el mensaje. msg es el cdigo del mensaje. wParam es el parmetro de tipo palabra asociado al mensaje. lParam es el parmetro de tipo doble palabra asociado al mensaje.

    Podemos considerar este prototipo como una plantilla para crear nuestros propios procedimientos de ventana. El nombre de la funcin puede cambiar, pero el valor de retorno y los parmetros deben ser los mismos. El miembro lpfnWndProc de la estructura WNDCLASS es un puntero a una funcin de este tipo, esa funcin es la que se encargar de procesar todos los mensajes para esa clase de ventana. Cuando registremos nuestra clase de ventana, tendremos que asignar a ese miembro el puntero a nuestro procedimiento de ventana.

    Prototipo de procedimiento de ventana

    LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);

    Implementacin del procedimiento de ventana simple

    /* Esta funcin es llamada por la funcin del API DispatchMessage() */ LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) /* manipulador del mensaje */ { case WM_DESTROY: PostQuitMessage(0); /* enva un mensaje WM_QUIT a la cola de mensajes */ break; default: /* para los mensajes de los que no nos ocupamos */ return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; }

    En general, habr tantos procedimientos de ventana como programas diferentes y todos sern distintos, pero tambin tendrn algo en comn: todos ellos procesarn los mensajes que lleguen a una clase de ventana.

    En este ejemplo slo procesamos un tipo de mensaje, se trata de WM_DESTROY que es el mensaje que se enva a una ventana cuando se recibe un comando de cerrar, ya sea por men o mediante el icono de aspa en la esquina superior derecha de la ventana.

  • Tcnicas Digitales III Problema de ingeniera

    27

    Este mensaje slo sirve para informar a la aplicacin de que el usuario tiene la intencin de abandonar la aplicacin, y le da una oportunidad de dejar las cosas en su sitio: cerrar ficheros, liberar memoria, guardar variables, etc. Incluso, la aplicacin puede decidir que an no es el momento adecuado para abandonar la aplicacin. En el caso del ejemplo, efectivamente cierra la aplicacin, y lo hace envindole un mensaje WM_QUIT, mediante la funcin PostQuitMessage.

    El resto de los mensajes se procesan en el caso "default", y simplemente se cede su tratamiento a la funcin del API que hace el proceso por defecto para cada mensaje, DefWindowProc.

    Este es el camino que sigue el mensaje WM_QUIT cuando llega, ya que el proceso por defecto para este mensaje es cerrar la aplicacin.

    A grandes rasgos, bsicamente, ya sabemos hacer el esqueleto de una aplicacin de Windows. Para entender el resto del cdigo que se presenta a continuacin se pide al lector remitirse a la bibliografa. (ver cdigo fuente para la PC en Anexo C).

    RESULTADOS DE LAS PRUEBAS

    Las pruebas fueron satisfactorias. Hubo que realizar algunas modificaciones antes de alcanzar el material o informacin expuesta en este informe. Finalmente conseguimos fabricar tanto la aplicacin de la PC como el Hardware externo para el resolver el problema de ingeniera que se nos propuso. El archivo ejecutable de la aplicacin resultante consta de la siguiente representacin grafica bsica:

    Haciendo click sobre el botn Principal

    El tem Reorganizar Botones modifica la organizacin de la tabla cargada por defecto mostrada en el apartado EL URC SBC-RU-240/38 DE PHILIPS. Al presionar este item se abre un nuevo cuadro de dialogo que nos permite elegir la combinacin de teclas a reordenar y a continuacin el programa se dispone a esperar el correspondiente cdigo emitido por el control remoto. Cuando la PC recibe este dato, el programa nos devuelve un mensaje de cdigo guardado. En este ejemplo se selecciona la opcin 2 (Alt).

  • Tcnicas Digitales III Problema de ingeniera

    28

    Despus de aceptar la eleccin, presionamos un botn del mando a distancia y el programa nos informa de su recepcin:

    El tem Recordatorios nos permite colocar una etiqueta recordatorio para cada combinacin de tecla disponible.

  • Tcnicas Digitales III Problema de ingeniera

    29

    El tem Default, carga la tabla indicada en el apartado EL URC SBC-RU-240/38 DE PHILIPS en el caso de que el usuario no encuentre una mejor disposicin del control remoto.

    Por ultimo, el tem Comenzar provoca que el programa se disponga a vigilar el puerto serie en espera por la entrada de cada nuevo comando.

    CONCLUSIONES

    Durante la realizacin del proyecto el grupo tuvo que enfrentarse a muchsimos problemas, algunos comentados en este informe.

    Tuvimos muchsimos problemas, en un principio con la comunicacin por el puerto serie. En primer lugar era tema de total desconocimiento para todos nosotros, as mismo con la comunicacin por puerto paralelo, la cual la aprendimos por necesidad para poder solucionar el problema de no funcionamiento del puerto serie. Por suerte justo antes de hacer la implementacin, de dicha comunicacin, en el cdigo fuente de la PC, probamos por ltima vez con el puerto serie y nos anduvo. Por ello es que en el cdigo fuente de la aplicacin para la PC no aparece la interaccin con el puerto paralelo a pesar de que el PIC16F84A si es capaz de soportarla (en teora pues no la alcanzamos a probar).

    En cuanto a la programacin en entorno Windows tuvimos que leer muchsimo para as a duras penas poder hacer algo.

    En los comienzos logramos antes que nada establecer la comunicacin serie en Windows 98 con un cdigo programado en Borland C++ que andaba pero al no ser una aplicacin de Windows, no podamos de ninguna manera simular el teclado. Entonces ya con medio proyecto realizado tuvimos que echarnos atrs, desistir del Borland C++ y utilizar las API de Windows.

  • Tcnicas Digitales III Problema de ingeniera

    30

    Cdigo en Borland: #include #include #include #include #define LCR (base+3) /* registro de control de linea */ #define IER (base+1) /* registro de activacion de interrupciones */ #define DLL (base+0) /* parte baja del divisor */ #define DLM (base+1) /* parte alta del divisor */ #define MCR (base+4) /* registro de control del modem */ #define MSR (base+6) /* registro de estado del modem */ #define LSR (base+5) /* registro de estado de linea */ #define RBR (base+0) /* registro buffer de recepcion */ #define THR (base+0) /* registro de retencion de transmision */ #define DR 1 /* bit dato disponible del LSR */ #define OE 2 /* bit de error de overrun del LSR */ #define PE 4 /* bit de error de paridad del LSR */ #define FE 8 /* bit de error en bits de stop del LSR */ #define BI 16 /* bit de error de break en el LSR */ #define DSR 32 /* bit de data set ready */ unsigned com, base, dll, dlm, entrada, lsr, lcr, mcr, msr, divisor, con=0; char opc='z',c='z'; void impcart(void); void error(void); void correr(void); void ventana(void); void transdat(void); void main() { com=1; princ: clrscr(); impcart(); printf("\n\r1:Eleccion de puerto serie\n\r2:Correr programa\n\r3:Salir\n\rOpcion: "); opc=getch(); switch (opc) { case '1': { sound(1250); delay(250); nosound(); ventana(); scanf ("%d", &com); sound(1250); delay(225); nosound(); delay(100); sound(1250); delay(225); nosound(); } break; case '2': { sound(1250); delay(225);

  • Tcnicas Digitales III Problema de ingeniera

    31

    nosound(); delay(100); sound(1250); delay(225); nosound(); correr(); } break; } if(opc=='3'); else goto princ; } void correr() { clrscr(); impcart(); base=peek(0x40, (com-1)*2); if (base==0) { error(); goto finc; } divisor=115200/8300; //para 9600 baudios outportb (LCR, 0x83); /* DLAB=1, 8 bits, 1 stop, sin paridad */ outportb (IER, 0); outportb (DLL, divisor%256); //resto de la division por 256 outportb (DLM, divisor/256); //parte entera de la division por 256 dll=inportb(DLL); dlm=inportb(DLM); outportb (LCR, 0x03); /* DLAB=0, 8 bits, 1 stop, sin paridad */ corr: outportb (MCR, 1); //limpio el control de modem do { lsr=inportb(LSR); msr=inportb(MSR); if(lsr & DR) outportb(MCR, 0); /* if (lsr & (PE|FE|BI)) { error(); goto corr; }*/ }while(!(lsr & DR) && !kbhit()); entrada=inportb(RBR); if(kbhit()) c=getche(); if(c=='e') goto finc; clrscr(); printf("dato: %d", entrada); transdat(); goto corr; finc: c='z'; return; } void error() {

  • Tcnicas Digitales III Problema de ingeniera

    32

    gotoxy(23,11); textcolor(6); textbackground(4); cprintf(" error en la comunicacion "); textcolor(7); textbackground(0); getch(); return; } void impcart() { gotoxy(23,1); textcolor(4); textbackground(3); cprintf(" control remoto IR \n"); textcolor(7); textbackground(0); return; } void ventana() { gotoxy(23,11); textcolor(1); textbackground(3); cprintf(" ingrese el puerto preferido: "); textcolor(7); textbackground(0); return; } void transdat() { FILE *archi; archi=fopen("trans.txt", "w"); fprintf(archi, "%d", entrada); fclose(archi); return; }

    En este cdigo se puede ver el intento de envo del dato recibido por el puerto a travs de un archivo de texto para interactuar con el programa que simulaba el teclado y que si corra bajo Windows. Si bien esta tcnica presenta muchos problemas de errores conceptuales, conseguamos una mnima interaccin entre el control remoto y la PC.

    El grupo entero considera un enriquecimiento muy importante de conocimientos, aprendimos mucho acerca de Windows como sistema operativo y de la PC como sistema elctrico.

    Tambin consideramos haber aprendido mucho de cmo es que se encara un trabajo particular a nivel profesional.

    Agradecemos la interaccin constante por parte de los profesores entrevistados, agradecemos toda su paciencia y participacin para con los alumnos y los problemas con los que nos enfrentamos

    Gracias Ramiro

  • Tcnicas Digitales III Problema de ingeniera

    33

    ANEXOS

    Anexo A: LISTADO DE PROGRAMAS

    Cdigo fuente para el PIC16F84A: List P=16F84 pua equ 05h pub equ 06h copua equ 85h copub equ 86h inte equ 0Bh coti equ 01h opci equ 81h esta equ 03h

    cblock 0X0C cnttrb cbyte byte cont1 cont2 cont3 disp1 disp contr contr1 contr2 aux endc #define ir pub,0 #define rts pub,1 #define dtr pub,2 #define txd pub,3 #define rxd pub,4 #define dsr pub,5 #define cts pub,6 #define bot pub,7 #define ledv pua,0 #define ledr pua,2 #define prvz aux,0 #define resul aux,1 #define aplv aux,2 #define tsp aux,3 #define terr aux,4 #define resu aux,5 #define bit aux,6 #define cop aux,7 #define toif inte,2 #define rbo inte,4 #define tmro inte,5 #define todas inte,7 #define rbof inte,1 #define car esta,0 #define z esta,2 org 00h

  • Tcnicas Digitales III Problema de ingeniera

    34

    goto inicio org 04h goto intsub inicio clrf esta bsf esta, 5 movlw b'10001111' movwf copub movlw b'11111010' movwf copua clrf opci ;iterrupcion por flanco

    ;desendente bsf opci,7 bcf esta, 5 clrf pua bsf ledr clrf pub bsf dsr bsf rxd clrf inte clrf aux clrf disp movlw h'ff' movwf disp clrf disp1 clrf byte clrf cbyte movlw b'10010000' movwf inte ;habilita IR rcecptor esper btfss bot ;para retardo del pulsador goto esper ;la cantidad de pulsos de 1us ; para un reloj de 4 Mhz son: movlw d'33' ;1 movwf cont1 ;1 con1 ; movlw d'255' ;1*k movwf cont2 ;1*k con2 ; decfsz cont2,1 ;255*k+k=256*k goto con2 ;2*255*k=510*k decfsz cont1,1 ;k+1 goto con1 ;2*k btfss bot ;************** goto esper ;771*k+3=>si 771*k+3=20 ms/1 ;us=25000=>k=32.42~33 clrf disp1 bcf prvz bsf ledr call retalar btfss bot goto esper movlw b'00001000' xorwf aux, 1 bsf ledv call retalar bcf ledv btfss tsp goto esper call retalar bsf ledv

  • Tcnicas Digitales III Problema de ingeniera

    35

    call retalar bcf ledv goto esper ;****************************************************** ledat bsf esta,5 ;con un reloj de 4 Mhz: movlw b'10000001' ;tb'=889 us

    ;->tb=2*tb'=1.778 ms movwf opci ;TOIF=

    ;div*(257 us-tin)+2=889 bcf esta,5 ;con div=4=>

    ;tin=257-887/4=35.25~35 ;pero experimentalmente ;~36

    entce ;voy a esperar ;que pase el primer ;bit de ;sincr

    btfss ir goto entce movlw d'147' ;pero la primer pregunta

    ;es a TOIF/2 movwf coti ;=>con div=4,

    ;tin=146.125=> ;tin~146, pero

    ;experimentalmente ~147 bcf toif clrf byte bcf bit clrf disp1 movlw d'26' movwf cnttrb etmr btfss toif goto etmr bcf toif movlw d'36' movwf coti decf cnttrb,1 movlw d'24' subwf cnttrb,0 btfss z goto etmr comie btfss toif goto comie movlw d'36' movwf coti bcf toif decf cnttrb,1 movlw d'12' subwf cnttrb,0 btfss z goto dsipo bcf bit incf cnttrb,1 ;para corregir tb el ultimo nibble goto cmnz dsipo movlw b'01000000' xorwf aux,1 btfss bit

  • Tcnicas Digitales III Problema de ingeniera

    36

    goto sgdo btfsc ir goto cerx bsf disp1,0 ;en disp1 esta guardando 1

    ;bit de ;"T" y los 5 de ;dispositivo

    goto comie cerx bcf disp1,0 goto comie sgdo btfss ir goto ceroz btfss disp1,0 goto listim bcf car rlf disp1,1 goto comie ceroz btfsc disp1,0 goto listim bcf car rlf disp1,1 goto comie cmnz btfss toif goto cmnz movlw d'36' movwf coti bcf toif comma movlw b'01000000' xorwf aux,1 btfss bit goto sgdz btfsc ir goto crxz bsf byte,0 goto parch crxz bcf byte,0 ;en byte guarda los 6 bit del comando goto parch sgdz btfss ir goto crz btfss byte,0 goto listim bcf car rlf byte,1 goto parch crz btfsc byte,0 goto listim bcf car rlf byte,1 parch decfsz cnttrb,1 goto cmnz acoreg ;pongo un cero en el bit 7

  • Tcnicas Digitales III Problema de ingeniera

    37

    ;de byte si se da ;codigo de repeticion

    bcf car rrf byte,1 comf byte,1 ;los datos estan

    ;exactamente al reves, ;comprobado con

    ;sciloscopio movlw b'00111111' andwf disp1,1 andwf byte,1 btfss disp1,5 goto not btfss disp,5 goto ciro bcf byte,6 goto listi ciro bsf disp,5 bsf byte,6 goto listi not ;pongo un uno en el bit 7

    ;de byte si no se da ;codigo de repeticion

    btfsc disp,5 goto cir bcf byte,6 goto listi cir bcf disp,5 bsf byte,6 goto listi listim bsf terr listi return ;****************************************************** cmprb movf disp1,0 subwf disp,0 btfsc z bsf cop finto return ;****************************************************** intsub bcf todas call ledat btfsc terr goto finle btfsc prvz goto disp1,0 movwf disp bsf prvz bcf ledr bsf ledv call retalar bcf ledv fingdi call cmprb btfss cop

  • Tcnicas Digitales III Problema de ingeniera

    38

    goto finle bcf cop bsf ledv btfss tsp goto serie call datopcp goto finle serie call datopcs finle bcf ledv bcf terr bcf rbof bsf todas retfie ;****************************************************** datopcs movf byte,0 movwf cbyte movlw d'09' movwf contr bcf dsr ;espero un rato lo que dura un ;mensaje (25ms) y si la pc no me ;contesta, fue... bsf esta,5 ;para 25ms =>con div=128=>

    ;tin~61.7~62, pero ;experimentalmente ~61 movlw b'10000110' movwf opci movlw b'10001111' movwf copub bcf esta,5 movlw d'61' movwf coti bcf toif agnte btfss dtr goto acseg btfss toif goto agnte bsf ledr call retalar bcf ledr goto fintr acseg bsf esta,5 movlw b'10000000' movwf opci bcf esta,5 ;con un reloj de 4 Mhz, y

    ;para 9600 b/s: bcf toif ;tb=1/9600=104.16 us bcf rxd ;TOIF->104.16 ;us=>TOIF=(257us*div)+2

    ;=>div=102.16 ;us/257us=0.398

    movlw d'206' ;=>adopto div=2 y preseteo ;el TMRO:

    movwf coti ;=>(257-in)*2us+2us= ;104.16 us=>

    ;tin=257-102.16/2= ;205.92~206

    ;experimentalmente ~206

  • Tcnicas Digitales III Problema de ingeniera

    39

    bcf toif goto sgteb estmr btfss cbyte,0 ;0 para empezar;

    ;transmitiendo el LSB. 7 ;de lo contrario. Se ;modifica el sentido de

    ;rotacion tb goto escer bsf rxd rrf cbyte,1 goto sgteb escer bcf rxd rrf cbyte,1 sgteb btfss toif goto sgteb movlw d'206' movwf coti bcf toif decfsz contr,1 goto estmr dtlst btfss toif goto dtlst bsf rxd fintr bsf dsr bsf rxd return ;************************************************* retalar movlw d'20' movwf cont1 bsf esta,5 movlw b'10000111' movwf opci bcf esta,5 aquie clrf coti bcf toif pruev btfss toif goto pruev decfsz cont1,1 goto aquie return ;******************************************************* datopcp bsf esta, 5 movlw b'10000101' movwf copub bcf esta, 5 clrf cbyte btfsc byte, 0 bsf cbyte, 5 btfsc byte, 1 bsf cbyte, 6 btfsc byte, 2 bsf cbyte, 3

  • Tcnicas Digitales III Problema de ingeniera

    40

    btfsc byte, 3 bsf cbyte, 1 movf cbyte, 0 movwf pub ;espero un rato lo que dura un

    ;mensaje ; ;(25ms) y si la pc no me

    ;contesta, fue... bsf esta,5 ;para 25ms =>con div=128=>

    ;tin~61.7~62, ;pero experimentalmente ~61

    movlw b'10000110' movwf opci bcf esta,5 movlw d'61' movwf coti bcf toif agntep btfsc dtr goto acsegp btfss toif goto agntep bsf ledr call retalar bcf ledr goto fintra acsegp clrf cbyte btfsc byte, 4 bsf cbyte, 5 btfsc byte, 5 bsf cbyte, 6 btfsc byte, 6 bsf cbyte, 3 btfsc byte, 7 bsf cbyte, 1 movf cbyte, 0 movwf pub fintra call retalar clrf pub return ;*************************************************** END

  • Tcnicas Digitales III Problema de ingeniera

    41

    Cdigo fuente para la PC:

    WinMain:

    #include #include #include #include #include #include #include #include using namespace std; typedef struct { char Puerto[5]; int Baudios; int BitsDatos; int BitsStop; char Paridad[25]; } tipoOpciones; // Variables globales: tipoOpciones Ops; // Opciones HGLOBAL hCadena, hSalida; // Buffers int *sal, *cad; DCB dcb; // Puerto serie HANDLE idComDev; bool Comunicacion; int aux2; char dinum[20]="C:\\nume.txt"; char diide[20]="C:\\iden.txt"; FILE *numeros, *ide; int num[50], con1, tec[50]; char idtf[22][80]; // Prototipos: void IniciarBuffers(); void comenzar(void); void actualizar(); void actualizaride(); void LiberarBuffers(); bool InicioComunicacion(void); bool FinComunicacion(void); int lee_el_puerto(void); void LeeSerie(); void crear_la_tabla(); void crear_la_tablaide(); void cargar_archivo(); void cargar_archivoide(); /* Declaracin del procedimiento de ventana */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK DlgProc2(HWND, UINT, WPARAM, LPARAM);

  • Tcnicas Digitales III Problema de ingeniera

    42

    /* Declaraciones de tipos */ typedef struct stDatos { int Teclas; char identif1[80]; char identif2[80]; char identif3[80]; char identif4[80]; char identif5[80]; char identif6[80]; char identif7[80]; char identif8[80]; char identif9[80]; char identif10[80]; char identif11[80]; char identif12[80]; char identif13[80]; char identif14[80]; char identif15[80]; char identif16[80]; char identif17[80]; char identif18[80]; char identif19[80]; char identif20[80]; char identif21[80]; } DATOS; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* Manipulador de ventana */ MSG mensaje; /* Mensajes recibidos por la aplicacin */ WNDCLASSEX wincl; /* Estructura de datos para la clase de ventana */ num[0]=EOF; idtf[21][0]=EOF; tec[0]=EOF; /* Estructura de la ventana */ wincl.hInstance = hThisInstance; wincl.lpszClassName = "NUESTRA_CLASE"; wincl.lpfnWndProc = WindowProcedure; /* Esta funcin es invocada por Windows */ wincl.style = CS_DBLCLKS; /* Captura los doble-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Usar icono y puntero por defecto */ wincl.hIcon = LoadIcon (hThisInstance, "icono"); wincl.hIconSm = LoadIcon (hThisInstance, "icono"); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = "Menu"; wincl.cbClsExtra = 0; /* Sin informacin adicional para

    la */ wincl.cbWndExtra = 0; /* clase o la ventana */ /* Usar el color de fondo por defecto para la ventana */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Registrar la clase de ventana, si falla, salir del programa */ if(!RegisterClassEx(&wincl)) return 0;

  • Tcnicas Digitales III Problema de ingeniera

    43

    /* La clase est registrada, crear la ventana */ hwnd = CreateWindowEx( 0, /* Posibilidades de variacin */ "NUESTRA_CLASE", /* Nombre de la clase */ "Control Remoto", /* Texto del ttulo */ WS_OVERLAPPEDWINDOW, /* Tipo por defecto */ CW_USEDEFAULT, /* Windows decide la posicin */ CW_USEDEFAULT, /* donde se coloca la ventana */ 200, /* Ancho */ 100, /* Alto en pixels */ HWND_DESKTOP, /* La ventana es hija del escritorio */ NULL, /* Sin men */ hThisInstance, /* Manipulador de instancia */ NULL /* No hay datos de creacin de ventana */ ); /* Mostrar la ventana */ ShowWindow(hwnd, SW_SHOWDEFAULT); /* Bucle de mensajes, se ejecuta hasta que haya error o GetMessage devuelva FALSE */ while(TRUE == GetMessage(&mensaje, NULL, 0, 0)) { /* Traducir mensajes de teclas virtuales a mensajes de caracteres */ TranslateMessage(&mensaje); /* Enviar mensaje al procedimiento de ventana */ DispatchMessage(&mensaje); } /* Salir con valor de retorno */ return mensaje.wParam; } /* Esta funcin es invocada por la funcin DispatchMessage() */ LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HINSTANCE hInstance; static DATOS Datos; switch (msg) /* manipulador del mensaje */ { case WM_CREATE: hInstance = ((LPCREATESTRUCT)lParam)->hInstance; /* Inicializacin de los datos de la aplicacin */ Datos.Teclas = 1; return 0; break; case WM_COMMAND: if(LOWORD(wParam) == CM_DIALOGO) DialogBoxParam(hInstance, "DialogoTeclas", hwnd, DlgProc, (LPARAM)&Datos); if(LOWORD(wParam) == CM_DIALOGO2) DialogBoxParam(hInstance, "DialogoTeclasmos", hwnd, DlgProc2, (LPARAM)&Datos); if(LOWORD(wParam) == CM_DIALOGO3) { comenzar(); } if(LOWORD(wParam) == CM_DIALOGO4) crear_la_tabla();

  • Tcnicas Digitales III Problema de ingeniera

    44

    break; case WM_DESTROY: PostQuitMessage(0); /* enva un mensaje WM_QUIT a la cola de mensajes */ break; default: /* para los mensajes de los que no nos ocupamos */ return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { BOOL NumeroOk; static DATOS *datos; int nume, auxi, auxi2; if((numeros=fopen(dinum, "rb"))==NULL) crear_la_tabla(); else fclose(numeros); cargar_archivo(); switch (msg) /* manipulador del mensaje */ { case WM_INITDIALOG: datos = (DATOS *)lParam; SetDlgItemInt(hDlg, ID_TECLAS, (UINT)datos->Teclas, FALSE); SetFocus(GetDlgItem(hDlg, ID_TECLAS)); return FALSE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: nume = GetDlgItemInt(hDlg, ID_TECLAS, &NumeroOk, FALSE); if(NumeroOk) { inv: datos->Teclas = nume; EndDialog(hDlg, FALSE); if(nume>21 || nume

  • Tcnicas Digitales III Problema de ingeniera

    45

    EndDialog(hDlg, FALSE); break; } return TRUE; } return FALSE; } BOOL CALLBACK DlgProc2(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static DATOS *datos; if((ide=fopen(diide, "a"))==NULL) crear_la_tablaide(); else fclose(ide); cargar_archivoide(); switch (msg) /* manipulador del mensaje */ { case WM_INITDIALOG: datos = (DATOS *)lParam; SetDlgItemText(hDlg, ID_IDENT1, idtf[0]); SetDlgItemText(hDlg, ID_IDENT2, idtf[1]); SetDlgItemText(hDlg, ID_IDENT3, idtf[2]); SetDlgItemText(hDlg, ID_IDENT4, idtf[3]); SetDlgItemText(hDlg, ID_IDENT5, idtf[4]); SetDlgItemText(hDlg, ID_IDENT6, idtf[5]); SetDlgItemText(hDlg, ID_IDENT7, idtf[6]); SetDlgItemText(hDlg, ID_IDENT8, idtf[7]); SetDlgItemText(hDlg, ID_IDENT9, idtf[8]); SetDlgItemText(hDlg, ID_IDENT10, idtf[9]); SetDlgItemText(hDlg, ID_IDENT11, idtf[10]); SetDlgItemText(hDlg, ID_IDENT12, idtf[11]); SetDlgItemText(hDlg, ID_IDENT13, idtf[12]); SetDlgItemText(hDlg, ID_IDENT14, idtf[13]); SetDlgItemText(hDlg, ID_IDENT15, idtf[14]); SetDlgItemText(hDlg, ID_IDENT16, idtf[15]); SetDlgItemText(hDlg, ID_IDENT17, idtf[16]); SetDlgItemText(hDlg, ID_IDENT18, idtf[17]); SetDlgItemText(hDlg, ID_IDENT19, idtf[18]); SetDlgItemText(hDlg, ID_IDENT20, idtf[19]); SetDlgItemText(hDlg, ID_IDENT21, idtf[20]); SetFocus(GetDlgItem(hDlg, ID_IDENT1)); return FALSE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: GetDlgItemText(hDlg, ID_IDENT1, datos->identif1, 80); strcpy(idtf[0], datos->identif1); GetDlgItemText(hDlg, ID_IDENT2, datos->identif2, 80); strcpy(idtf[1], datos->identif2); GetDlgItemText(hDlg, ID_IDENT3, datos->identif3, 80); strcpy(idtf[2], datos->identif3); GetDlgItemText(hDlg, ID_IDENT4, datos->identif4, 80); strcpy(idtf[3], datos->identif4); GetDlgItemText(hDlg, ID_IDENT5, datos->identif5, 80); strcpy(idtf[4], datos->identif5); GetDlgItemText(hDlg, ID_IDENT6, datos->identif6, 80); strcpy(idtf[5], datos->identif6); GetDlgItemText(hDlg, ID_IDENT7, datos->identif7, 80); strcpy(idtf[6], datos->identif7);

  • Tcnicas Digitales III Problema de ingeniera

    46

    GetDlgItemText(hDlg, ID_IDENT8, datos->identif8, 80); strcpy(idtf[7], datos->identif8); GetDlgItemText(hDlg, ID_IDENT9, datos->identif9, 80); strcpy(idtf[8], datos->identif9); GetDlgItemText(hDlg, ID_IDENT10, datos->identif10, 80); strcpy(idtf[9], datos->identif10); GetDlgItemText(hDlg, ID_IDENT11, datos->identif11, 80); strcpy(idtf[10], datos->identif11); GetDlgItemText(hDlg, ID_IDENT12, datos->identif12, 80); strcpy(idtf[11], datos->identif12); GetDlgItemText(hDlg, ID_IDENT13, datos->identif13, 80); strcpy(idtf[12], datos->identif13); GetDlgItemText(hDlg, ID_IDENT14, datos->identif14, 80); strcpy(idtf[13], datos->identif14); GetDlgItemText(hDlg, ID_IDENT15, datos->identif15, 80); strcpy(idtf[14], datos->identif15); GetDlgItemText(hDlg, ID_IDENT16, datos->identif16, 80); strcpy(idtf[15], datos->identif16); GetDlgItemText(hDlg, ID_IDENT17, datos->identif17, 80); strcpy(idtf[16], datos->identif17); GetDlgItemText(hDlg, ID_IDENT18, datos->identif18, 80); strcpy(idtf[17], datos->identif18); GetDlgItemText(hDlg, ID_IDENT19, datos->identif19, 80); strcpy(idtf[18], datos->identif19); GetDlgItemText(hDlg, ID_IDENT20, datos->identif20, 80); strcpy(idtf[19], datos->identif20); GetDlgItemText(hDlg, ID_IDENT21, datos->identif21, 80); strcpy(idtf[20], datos->identif21); actualizaride(); EndDialog(hDlg, FALSE); break; case IDCANCEL: EndDialog(hDlg, FALSE); break; } return TRUE; } return FALSE; } int lee_el_puerto(void) { int c; DWORD dwEvtMask; DWORD n, param, id; // Inicializar opciones del puerto serie: strcpy(Ops.Puerto, "COM1"); Ops.Baudios = 9600; Ops.BitsDatos = 8; Ops.BitsStop = 1; strcpy(Ops.Paridad, "Sin paridad"); IniciarBuffers(); // No se ha establecido comunicacin: Comunicacion = false; if(!InicioComunicacion()) { LiberarBuffers(); return 1; }

  • Tcnicas Digitales III Problema de ingeniera

    47

    do { }while(!((WaitCommEvent(idComDev, &dwEvtMask, NULL))&&(dwEvtMask & EV_RXCHAR))); LeeSerie(); c=*cad; FinComunicacion(); LiberarBuffers(); aux2=c&127; c=c&63; aux2=aux2-c; return(c); } // Reservar memoria global para buffers del puerto serie: void IniciarBuffers() { hCadena = GlobalAlloc(GMEM_MOVEABLE, 4096); hSalida = GlobalAlloc(GMEM_MOVEABLE, 4096); cad = (int *)GlobalLock(hCadena); sal = (int *)GlobalLock(hSalida); } // Liberar memoria global de buffers del puerto serie: void LiberarBuffers() { GlobalUnlock(hCadena); GlobalUnlock(hSalida); GlobalFree(hCadena); GlobalFree(hSalida); } // Iniciar el puerto serie: bool InicioComunicacion(void) { bool fSuccess; // Abrir el fichero asociado al puerto: idComDev = CreateFile(Ops.Puerto, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(idComDev ==INVALID_HANDLE_VALUE) return false; // Leer estructura de control del puerto serie, cdb: fSuccess = GetCommState(idComDev, &dcb); if(!fSuccess) return false; // Modificar el dcb segn las opciones definidas: dcb.BaudRate = Ops.Baudios; dcb.ByteSize = Ops.BitsDatos; if(!strcmp(Ops.Paridad, "Sin paridad")) dcb.Parity = NOPARITY; if(!strcmp(Ops.Paridad, "Paridad par")) dcb.Parity = EVENPARITY; if(!strcmp(Ops.Paridad, "Paridad impar")) dcb.Parity = ODDPARITY; switch(Ops.BitsStop) { case 1: dcb.StopBits = ONESTOPBIT; break; case 2: dcb.StopBits = TWOSTOPBITS; break;

  • Tcnicas Digitales III Problema de ingeniera

    48

    } // Modificar la estructura de control del puerto serie: fSuccess = SetCommState(idComDev, &dcb); if(!fSuccess) return false; // Especifica que queremos monitorizar la recepcin de datos: if(!SetCommMask(idComDev, EV_RXCHAR)) return false; // Comunicacin establecida: Comunicacion = true; return true; } // Finalizar comunicacin por puerto serie: bool FinComunicacion(void) { // Liberar mscara de eventos del puerto serie: SetCommMask(idComDev, 0); // Cerrar el puerto serie: CloseHandle(idComDev); // Comunicacin interrumpida: Comunicacion = false; return true; } // Leer datos del puerto serie: void LeeSerie() { int i, j, k; DWORD x; COMSTAT cs; // Actualizar COMSTAT, sirve para // averiguar el nmero de bytes en el buffer de entrada: ClearCommError(idComDev, &x, &cs); // Leer cs.cbInQue caracteres: ReadFile(idComDev, cad, cs.cbInQue, &x, NULL); // Actualizar el fin de cadena: cad[x]=0; return; } void comenzar() { int delcontr, aux, i, k=0; //inicio if((numeros=fopen(dinum, "rb"))==NULL) crear_la_tabla(); else fclose(numeros); cargar_archivo(); if((ide=fopen(diide, "r"))==NULL) crear_la_tablaide(); else fclose(ide); cargar_archivoide(); for(i=0;i

  • Tcnicas Digitales III Problema de ingeniera

    49

    delcontr=lee_el_puerto(); con1=0; while(num[con1]!=delcontr && (con1

  • Tcnicas Digitales III Problema de ingeniera

    50

    keybd_event(VK_BACK,0x8e, KEYEVENTF_KEYUP,0); // suelta Back Space break; case 14: keybd_event(VK_MENU,0xb8,0 , 0); //Presiona Alt keybd_event(VK_SPACE,0xb9,0 , 0); // Presiona Barra espaciadora keybd_event(VK_SPACE,0xb9, KEYEVENTF_KEYUP,0); // Suelta Barra espaciadora keybd_event(VK_MENU,0xb8,KEYEVENTF_KEYUP,0); // Suelta Alt break; case 15: keybd_event(VK_MENU,0xb8,0 , 0); //Presiona Alt keybd_event(VK_F4,0xbe,0 , 0); // Presiona Tecla F4 keybd_event(VK_F4,0xbe, KEYEVENTF_KEYUP,0); // Suelta Tecla F4 keybd_event(VK_MENU,0xb8,KEYEVENTF_KEYUP,0); // Suelta Alt break; case 16: keybd_event(VK_CONTROL,0x9d,0 , 0); // Periona Ctrl keybd_event(VK_TAB,0x8f,0 , 0); //Prtesiona tab keybd_event(VK_TAB,0x8f, KEYEVENTF_KEYUP,0); //suelta tab keybd_event(VK_CONTROL,0x9d,KEYEVENTF_KEYUP,0); // Suelta Ctrl break; case 17: keybd_event(VK_TAB,0x8f,0 , 0); //Prtesiona tab keybd_event(VK_TAB,0x8f, KEYEVENTF_KEYUP,0); //suelta tab break; case 18: keybd_event(VK_LEFT,0xcb,0 , 0); // Flecha izquierda keybd_event(VK_LEFT,0xcb, KEYEVENTF_KEYUP,0); // Flecha izquierda break; case 19: keybd_event(VK_LWIN,0x9b,0 , 0); // Periona Windows keybd_event(VK_LWIN,0x9b,KEYEVENTF_KEYUP,0); // Suelta Windows break; case 20: keybd_event(VK_LWIN,0x9c,0 , 0); // Periona Windows keybd_event(VkKeyScan('M'),0xa6,0 , 0); // Presiona 'M' keybd_event(VkKeyScan('M'),0xa6, KEYEVENTF_KEYUP,0); // Suelta 'M' keybd_event(VK_LWIN,0x9c,KEYEVENTF_KEYUP,0); // Suelta Windows break; case 21: keybd_event(VK_RSHIFT,0xb6,0 , 0); // Periona Shift derecho keybd_event(VK_TAB,0x8f,0 , 0); //Prtesiona tab keybd_event(VK_TAB,0x8f, KEYEVENTF_KEYUP,0); //suelta tab keybd_event(VK_RSHIFT,0xb6,KEYEVENTF_KEYUP,0); // Suelta Shift derecho break; } goto otra; } void crear_la_tabla() { num[0]=52; num[1]=9; num[2]=3; num[3]=1; num[4]=2; num[5]=12; num[6]=7; num[7]=8; num[8]=32; num[9]=33; num[10]=55; num[11]=0; num[12]=48; num[13]=15;

  • Tcnicas Digitales III Problema de ingeniera

    51

    num[14]=56; num[15]=5; num[16]=4; num[17]=50; num[18]=54; num[19]=53; num[20]=6; num[21]=EOF; numeros=fopen(dinum, "wb"); for(con1=0;con1

  • Tcnicas Digitales III Problema de ingeniera

    52

    } Archivo de Recursos: #include #include Menu MENU BEGIN POPUP "&Principal" BEGIN MENUITEM "&Reorganizar Botones", CM_DIALOGO MENUITEM SEPARATOR MENUITEM "&Recordatorios", CM_DIALOGO2 MENUITEM SEPARATOR MENUITEM "&Comenzar", CM_DIALOGO3 MENUITEM SEPARATOR MENUITEM "&Default Botones", CM_DIALOGO4 END END icono ICON "ICONGROUP_92.ico" DialogoTeclas DIALOG 0, 0, 145, 200 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "Ingresar Tecla" FONT 8, "Helv" { CONTROL "1) Flchder", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 5, 52, 34 CONTROL "2) Alt", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 20, 52, 34 CONTROL "3) B", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 35, 52, 34 CONTROL "4) Z", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 50, 52, 34 CONTROL "5) X", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 65, 52, 34 CONTROL "6) Enter", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 85, 52, 34 CONTROL "7) L", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 100, 52, 34 CONTROL "8) Shift+L", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 115, 52, 34 CONTROL "9) Flcharr", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 130, 52, 34 CONTROL "10) Flchaba", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 145, 52, 34 CONTROL "11) Esc", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 88, 5, 52, 34

  • Tcnicas Digitales III Problema de ingeniera

    53

    CONTROL "12) BarEspc", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 88, 20, 52, 34 CONTROL "13) BackSpc", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 88, 35, 52, 34 CONTROL "14) Alt+Espc", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 88, 50, 52, 34 CONTROL "15) Alt+F4", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 88, 65, 52, 34 CONTROL "16) Ctrl+Tab", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 88, 85, 52, 34 CONTROL "17) Tab", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 88, 100, 52, 34 CONTROL "18) Flchizq", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 88, 115, 52, 34 CONTROL "19) Inicio", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 88, 130, 52, 34 CONTROL "20) Escritorio", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 88, 145, 52, 34 CONTROL "21) Shift+Tab", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 88, 160, 52, 34 CONTROL "Eleccion:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 160, 52, 34 CONTROL "", ID_TECLAS, "EDIT", ES_NUMBER | ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 46, 160, 36, 12 CONTROL "Aceptar", IDOK, "BUTTON", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 75, 175, 45, 14 CONTROL "Cancelar", IDCANCEL, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 15, 175, 45, 14 } DialogoTeclasmos DIALOG 0, 0, 310, 200 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "Relaciones Disponibles" FONT 8, "Helv" { CONTROL "", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 121, 5, 60, 34 CONTROL "1) Flchder :", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 5, 52, 34 CONTROL "", ID_IDENT1, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 55, 5, 66, 12 CONTROL "2) Alt :", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 20, 52, 34

  • Tcnicas Digitales III Problema de ingeniera

    54

    CONTROL "", ID_IDENT2, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 55, 20, 66, 12 CONTROL "3) B :", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 35, 52, 34 CONTROL "", ID_IDENT3, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 55, 35, 66, 12 CONTROL "4) Z :", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 50, 52, 34 CONTROL "", ID_IDENT4, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 55, 50, 66, 12 CONTROL "5) X :", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 65, 52, 34 CONTROL "", ID_IDENT5, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 55, 65, 66, 12 CONTROL "6) Enter :", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 85, 52, 34 CONTROL "", ID_IDENT6, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 55, 85, 66, 12 CONTROL "7) L :", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 100, 52, 34 CONTROL "", ID_IDENT7, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 55, 100, 66, 12 CONTROL "8) Shift+L :", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 115, 60, 34 CONTROL "", ID_IDENT8, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 55, 115, 66, 12 CONTROL "9) Flcharr :", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 130, 60, 34 CONTROL "", ID_IDENT9, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 55, 130, 66, 12 CONTROL "10) Flchaba :", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 145, 60, 34 CONTROL "", ID_IDENT10, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 55, 145, 66, 12 CONTROL ":12) Esc", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 250, 5, 52, 34 CONTROL "", ID_IDENT11, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 180, 5, 66, 12 CONTROL ":13) BarEsp", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 250, 20, 52, 34 CONTROL "", ID_IDENT12, "EDIT",

  • Tcnicas Digitales III Problema de ingeniera

    55

    ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 180, 20, 66, 12 CONTROL ":14 BackSpa", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 250, 35, 52, 34 CONTROL "", ID_IDENT13, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 180, 35, 66, 12 CONTROL ":15) Alt+Spac", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 250, 50, 52, 34 CONTROL "", ID_IDENT14, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 180, 50, 66, 12 CONTROL ":16) Alt+F4", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 250, 65, 52, 34 CONTROL "", ID_IDENT15, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 180, 65, 66, 12 CONTROL ":17) Ctrl+Tab", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 250, 85, 52, 34 CONTROL "", ID_IDENT16, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 180, 85, 66, 12 CONTROL ":18) Tab", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 250, 100, 52, 34 CONTROL "", ID_IDENT17, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 180, 100, 66, 12 CONTROL ":19) Flchizq", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 250, 115, 52, 34 CONTROL "", ID_IDENT18, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 180, 115, 66, 12 CONTROL ":20) Inicio", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 250, 130, 52, 34 CONTROL "", ID_IDENT19, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 180, 130, 66, 12 CONTROL ":21) Escritorio", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 250, 145, 52, 34 CONTROL "", ID_IDENT20, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 180, 145, 66, 12 CONTROL "11) Shift+Tab :", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 160, 70, 34 CONTROL "", ID_IDENT21, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 55, 160, 66, 12 CONTROL "Aceptar", IDOK, "BUTTON", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 250, 175, 50, 14 CONTROL "Cancelar", IDCANCEL, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,

  • Tcnicas Digitales III Problema de ingeniera

    56

    160, 175, 50, 14 }

    Cdigo de la librera IDS3.H Esta librera la creamos nosotros para suministrar las definiciones de las constantes que luego usamos tanto en el WinMain como en el archivo de recursos /* Identificadores */ /* Identificadores de comandos */