Marcador Automatizado de Call Centers con PIC 16F84

Introducción.

autodialer.jpg


Para mucha gente, la posibilidad de una caída del suministro eléctrico es motivo de gran preocupación, debido a la enorme cantidad de consecuencias que puede acarrear. Volver a casa y encontrarse todo lo que hay en el frigorífico en estado de descomposición es muy desagradable, pero para un pequeño negocio de alimentación puede ser una ruina. Saber inmediatamente que se ha producido un corte de luz, en muchos casos permite solucionarlo (si simplemente ha saltado un interruptor automático o hay una avería local), y cuando menos, se pueden paliar los daños resultantes.

El circuito que aquí se presenta permite recibir un aviso en el teléfono prefijado cuando detecta que hay una caída en la tensión de red. No hace mucho más, pero su precio (menos de 15 euros) y su simplicidad, creo que lo harán atractivo para mucha gente.

Los campos en los que puede encontrar aplicación son muchos, pero se me ocurren varios en los que sería muy útil: negocios de congelados y refrigerados, sistemas de mantenimiento asistido de la vida (granjas de cría intensiva, piscifactorías, acuarios...), hornos de cocción de cerámicas, instalaciones domésticas, etc.

El circuito, además, puede ser la base para otros diseños más específicos, si es modificado para que detecte otros eventos en lugar de la caída de la tensión de red, por ejemplo el disparo de una alarma contra robo o incendio, el desbordamiento de un depósito, etc.


Principio de funcionamiento.

Como punto de partida, tenemos la red eléctrica y la red telefónica, y conectado entre ambas, nuestro circuito. Hablemos un poco de cada elemento.

La red eléctrica en España, distribuye corriente alterna a 50Hz, con una tensión eficaz de 220V. En otros países estos valores varían, habiendo tensiones entre 110V y 240V y frecuencias de 50Hz y 60Hz. ¿Y qué significa esto? Pues simplemente, que si tomamos uno de los cables como cero, en el otro (respecto al cero) tendremos una onda senoidal de frecuencia 50Hz o 60Hz y una tensión de pico de hasta +340V en la cresta positiva y hasta –340V en la cresta negativa.

La red telefónica conmutada, inicialmente muy simple, ha variado mucho con el tiempo, ya que se han ido añadiendo prestaciones. Sin embargo, estos cambios se han hecho sin eliminar el sistema básico, de forma que hoy se puede utilizar perfectamente un teléfono de bakelita de hace 30 años. Para no entrar en complicaciones mayores, digamos que la red telefónica utiliza dos cables entre los cuales hay una tensión con una componente continua y ocasionalmente otra alterna. En el sistema antiguo, la componente continua se utiliza para el control (teléfono colgado/descolgado y marcación) y la alterna para las señales sonoras (voz, señales de línea libre, de llamada y de ocupado). Actualmente se pueden codificar muchas más señales en alterna (marcación por tonos, conteo de pasos, etc.), pero nada impide ignorarlas y utilizar el sistema antiguo, que además es mucho más universal.

Según esto, cuando la línea está libre (teléfono colgado), entre los dos hilos hay una tensión continua de entre 45V y 50V y cuando está ocupada (teléfono descolgado), esta tensión baja a entre 6V y 10V. Hay que decir que, si bien esta tensión tiene polaridad por ser continua, la realidad es que no conocemos a priori cual de los hilos es el positivo y cual es el negativo, porque al hacer el cableado de las rosetas, no se tiene en cuenta un código de colores (de hecho, hasta hace poco se usaba para conectarlas cable paralelo color marfil sin distinción entre uno y otro polos). Para bajar la tensión a esos entre 6V y 10V, el teléfono, al ser descolgado, conecta entre los dos hilos una carga de entre 600Ω y 1.200Ω. La marcación por pulsos se hace enviando una serie de tantos pulsos como indique cada cifra (10 pulsos para el 0), y dejando un tiempo de un segundo entre cifra y cifra. Cada pulso dura 50ms y entre dos pulsos se dejan 150ms. Para enviar un pulso se libera la línea (se cuelga) momentáneamente. Esto es lo que hacía el disco de los teléfonos antiguos (supongo que no soy el único que ha llamado desde un teléfono con el disco bloqueado por un candado, usando el botón de colgar para marcar los pulsos a mano).

Es muy importante darse cuenta de que no conocemos a priori la diferencia de potencial de la línea telefónica respecto a la red eléctrica. Son redes independientes y aisladas y cualquier cosa que se conecte entre ambas debe garantizar que sigan quedando aisladas galvánicamente. Dos redes están aisladas galvánicamente cuando no se puede derivar corriente de una a otra.

El circuito del avisador telefónico, tendrá que chequear la tensión presente en la red eléctrica y cuando detecte que ésta ha caído, emular el funcionamiento de un teléfono para llamarnos. La solución inmediata es usar un microcontrolador de gama baja para las tareas lógicas, es decir, detectar la caída de tensión y hacer la llamada, pero tenemos básicamente dos problemas a resolver. En primer lugar, decidir cómo alimentar nuestro circuito, y en segundo lugar, cómo aislar la red eléctrica de la telefónica. Como veremos, ambos problemas están muy relacionados.

Para alimentar al circuito, y puesto que tiene que poder funcionar cuando no hay tensión de red, en principio hay dos posibilidades: alimentarlo a baterías o extraer la alimentación de la tensión presente en la red telefónica.

Si decidimos extraer la tensión de alimentación de la red telefónica, y puesto que en ella la tensión presente es continua, tendremos que hacer algún tipo de acoplamiento de continua a continua. Este tipo de acoplamiento es difícil hacerlo manteniendo el aislamiento galvánico entre la línea y el circuito. Podríamos pensar en aprovechar la componente alterna intercalando un transformador, pero cuando la línea está desocupada no hay componente alterna. Así que si usamos la tensión de la línea telefónica para extraer alimentación, el circuito no estará aislado de la línea telefónica. En este caso, habría que garantizar el aislamiento galvánico del circuito respecto a la red eléctrica. Esto no sería problema, si tomamos la señal de la red eléctrica a través de un transformador.

Yo, sin embargo, he elegido el otro camino, por cuestiones de economía, es decir, alimentar el circuito a baterías, concretamente mediante 3 pilas alcalinas de tipo AA (LR6). De esta forma, puedo elegir entre aislar galvánicamente el circuito respecto a la red eléctrica o la red telefónica. Lo más simple, según mi opinión era aislarlo de la red telefónica, pero al mismo tiempo tengo que poder conectar una carga de entre 600 ohmios y 1.200 ohmios entre sus hilos. Para ello no he tenido que inventar la pólvora y simplemente he utilizado el mismo método que la mayoría de modems, un micro-relé. Cuando el circuito activa este relé, una resistencia de 1K queda conectada entre los dos hilos de la red telefónica, simulando que se ha descolgado un teléfono. Así, y siempre que nadie meta las manos en el circuito, puedo dejarlo sin aislar de la red eléctrica, y tomar una muestra de la tensión en dicha red mediante un simple divisor de tensión a resistencias.

Claro que alguien podría pensar en el problema que supone tener que estar cambiando las pilas. Para su tranquilidad diré que con un juego de pilas, el aparto puede estar funcionando varios años (luego hablaremos más detenidamente sobre esto).


El circuito.

En la figura 1 se muestra el esquema del circuito. Como se ve, utiliza sólo unos pocos componentes, agrupados alrededor de un microcontrolador PIC16F84 de la marca Microchip. Este micro está configurado para utilizar el oscilador RC y su frecuencia depende de R5 y C1. Con los valores elegidos, el micro correrá (o más bien se arrastrará) aproximadamente a 5KHz. Se ha elegido una frecuencia tan baja para minimizar el consumo y porque las tareas que desempeñará el micro son muy simples y no requieren gran velocidad. La alimentación la proporcionan tres pilas alcalinas tipo AA de 1,5V conectadas en serie, a través de los terminales IO5 e IO6. No se requiere ningún tipo de estabilización, ya que la tensión proporcionada por las pilas es muy estable, y se mantendrá entre 4,4V y 4,7V durante toda la vida de éstas, suficiente para que el circuito funcione perfectamente.

sch.gif


Para que el micro “sepa” cuándo hay tensión y cuándo no en la red eléctrica conectada a los terminales IO3 e IO4, el circuito funciona como sigue: el divisor de tensión formado por R6 y R7 asegura que en los terminales de R7 tendremos una tensión alterna con una tensión de pico de 15V para redes de 220V a 240V (para redes de 110V a 125V se puede sustituir el valor de R6 por 270KΩ). Se han elegido valores tan altos para que la corriente que circula por ellas sea mínima (0,5mA) evitando que disipen demasiada potencia (0,1W). D2 y R8 eliminan la parte negativa de la señal, y rebajan su tensión de pico a unos 10V, de forma que C3 se carga a través de R9 en cada cresta positiva, tendiendo la tensión en C3 a alcanzar esos 10V. Además, R9 limita la velocidad a la que se carga y se descarga C3, eliminando el rizado y haciendo que la tensión en este punto sólo pueda variar lentamente, para evitar que los micro-cortes de la tensión de red sean detectados por el microcontrolador. R10 y D3 constituyen un limitador de tensión a aproximadamente 4,5V. Esta tensión es leída por U1 a través de la entrada 7 del puerto B, como veremos más adelante. Es importante darse cuenta de que la masa del circuito está conectada directamente a uno de los terminales de la red eléctrica, por lo que la tensión en este punto respecto a tierra puede llegar a 340V de pico. Esto significa, que mientras el circuito esté conectado a la red, está absolutamente prohibido manipular en su interior, pues el riesgo de descarga es realmente alto.

La conexión a la red telefónica se hace mediante un relé que al activarse conecta R1 entre los terminales de la línea telefónica. Cuando se conecta, R1 disipará algo más de 1W, así que debe ponerse de al menos 2W. La salida 0 del puerto A de U1, a través de R3 maneja el transistor T1 que, al entrar en conducción, permite que circule corriente por la bobina del relé. D1 tiene por objeto eliminar la corriente reactiva de dicha bobina para evitar que se dañe el transistor. Así que cuando el micro pone un 1 (4,5V) en la salida 0 del puerto A, el transistor conduce y cuando pone un 0 (0V) el transistor no conduce, pero ¿qué pasa cuando configuramos esta patilla del micro como entrada en lugar de cómo salida? Bien, en ese caso, R2 se encarga de polarizar el transistor para que no conduzca y no excite el relé, reduciendo el consumo al mínimo.

Hemos hablado sólo por encima del microcontrolador, pero es sin duda el corazón de este circuito. En este tipo de componentes, es difícil comprender su funcionamiento físico sin comprender el funcionamiento de su lógica, su firmware. Aunque luego veremos con más detalle dicho firmware, avanzaré ahora algunos conceptos sobre él relacionados con sus características físicas. Básicamente, un micro tiene una serie de puertos o patillas que pueden ser configurados como entradas o salidas de forma independiente. A través de las entradas, el micro puede recibir señales del exterior y, siguiendo un proceso lógico de toma de decisiones conducido por el programa que corre en su interior, modificar el estado de las salidas. En nuestro caso concreto, el PIC16F84, los puertos configurados como entradas presentan una impedancia muy alta y un consumo mínimo, especialmente si están conectadas a masa. Por eso se han puesto a masa todos los puertos no utilizados (que el firmware configurará como entradas). La patilla 13 del micro (PORTB:bit7) será configurada también como entrada y por ella leerá el micro si hay o no hay tensión en la red eléctrica, mientras que la patilla 17 (PORTA:bit0) será configurada como salida y el micro pondrá aquí un estado alto o bajo según quiera activar o no el relé.

Habitualmente, un microcontrolador va ejecutando instrucciones de un programa que le indican lo que debe hacer, en este caso una instrucción por cada cuatro ciclos del oscilador de reloj. Como dijimos, este oscilador se ha configurado para una frecuencia de 5KHz, así que se ejecutan 1.250 instrucciones por segundo. Pero el PIC16F84 tiene una prestación de la que nos vamos a aprovechar, y es que se puede poner en un estado llamado POWER-DOWN mode (yo prefiero llamarlo stand-by). En este modo, la ejecución del programa se detiene y todos los dispositivos del micro se configuran de forma que su consumo sea mínimo. El micro permanece en este estado hasta que haya un reset o algún evento que lo saque de él, lo que se llama WAKE-UP (despertarse). Nuestro micro estará configurado para que dicho evento sea un cambio de estado en la entrada PORTB:bit7, es decir, cuando pasemos de no haber a sí haber tensión en la red eléctrica y viceversa. De esta forma, mientras no haya cambios en el suministro eléctrico, el micro permanecerá “dormido”, consumiendo lo mínimo, y cuando haya un cambio, se despertará, hará lo que tenga que hacer (decidir si nos llama por teléfono y si es así llamarnos) y volverá a dormirse. El programa está escrito de forma que antes de pasar a stand-by el micro configure PORTA:bit0 como entrada para ahorrar energía, lo que hará que T1 no conduzca y el relé quede desactivado (linea desocupada).

Aunque ya adelanté algo y se explicará con más detalle al hablar del firmware, explicaré cómo hace el circuito para llamar por teléfono. La secuencia empieza descolgando (activando el relé). El micro espera 3 segundos y marca la primera cifra. Para marcar una cifra, se cuelga durante 50ms y se descuelga durante 150ms, tantas veces como indique la cifra (10 veces si es 0). Después espera 1s descolgado y marca la siguiente cifra, y así hasta la última. Luego, el micro sigue durante un minuto una secuencia de silencios y pulsos que es audible por la persona que recoge la llamada y que le indicará que se ha ido la luz (o que ha vuelto, como luego veremos). Por último, vuelve a colgar (desactivando el relé). Quede claro que el circuito no comprueba si la línea está ocupada antes de llamar o si han contestado.

El consumo de corriente del circuito completo cuando está llamando viene determinado esencialmente por el consumo del relé, que puede variar de unos modelos a otros. Con el que yo utilicé, un micro-relé marca Finder de 5V, la corriente cuando está llamando es de unos 60mA. Como una llamada dura aproximadamente 1,5 minutos, la carga consumida en una llamada será 1,5mA hora. Si suponemos que en un año el aparato nos llamará, por ejemplo 100 veces, la carga consumida anual será de 150mA hora. En cambio, cuando el circuito está en stand-by, la corriente es de 6μA, y como un año tiene 8.760 horas, la carga consumida anual en este modo sería 52mA hora. La carga total anual sería entonces de unos 200mA hora, y puesto que las pilas alcalinas AA tienen una carga aproximada de 2.000mA hora (las de peor calidad), resulta que en estas condiciones, un juego de pilas nos duraría 10 años. Naturalmente, la duración varía en función del número de llamadas anuales, pero es muy raro que se vaya la luz con tanta frecuencia.


Firmware.

Como ya dije, el firmware es parte integrante del microcontrolador, pues define su funcionamiento. Normalmente se llama firmware a todos los datos contenidos en un dispositivo programable con la particularidad de que no se pierdan al quitar la alimentación. El nombre deriva de firm (firme o firma) y los autores no se ponen de acuerdo sobre cual de las dos acepciones dio origen al término firmware, ya que, por un lado, es una información lógica almacenada de forma permanente (firmemente), y por otro lado, es lo que distingue dispositivos que, siendo idénticos al salir de fábrica, quedan personalizados (firmados) gracias a él. Olvidando la etimología del término, es lo que hay grabado en una ROM, en su acepción más amplia, que incluye ROM, PROM, EPROM, EEPROM y cualquier dispositivo lógico programable.

Atendiendo a su funcionalidad, y concretamente en nuestro caso, el firmware es el conjunto de instrucciones y datos que constituyen el programa que será ejecutado por el microcontrolador, que serán almacenados en sus memorias Flash EPROM y EEPROM internas antes de poder utilizarlo, en un proceso llamado programación o grabación. El programa en código máquina será escrito y depurado mediante un software especial y luego almacenado en un fichero de tipo Intel HEX. El software de programación lee los datos de este fichero y los graba en el microcontrolador mediante un programador adecuado al tipo de micro.

En nuestro caso, necesitamos un programador y un software de programación que soporten el PIC16F84. Cada cual puede usar el que quiera, pero yo recomiendo el programador PIPO2 y el software ICPROG (ambos se pueden bajar de mi página). De cualquier forma, el software utilizado debe permitir editar la memoria EEPROM del PIC manualmente. Hablemos de ello un poco.

La elección del PIC16F84 en lugar de otro micro de gama más baja (por ejemplo el PIC12C508) no ha sido caprichosa. Interesaba un microcontrolador que incluyera memoria EEPROM, para poder almacenar en ella el número de teléfono al que queremos que llame y alguna cosa más. Al ser la memoria EEPROM independiente de la memoria de programa, se puede modificar sin que el programa varíe, y por tanto sin necesidad de volver a ensamblar el código. Si hubiéramos usado un micro sin EEPROM, el número tendría que almacenarse de alguna forma en la memoria de programa, lo que obligaría a modificar el programa y reensamblarlo en cada caso. Esto no sería problema para quien domine este tema, pero al aficionado que sólo quiera poner a funcionar el avisador telefónico hay que ponérselo más fácil.

Así, para personalizar su propio avisador telefónico, cada uno sólo tiene que editar los datos de la EEPROM antes de grabar el microcontrolador. Las 32 primeras direcciones de la EEPROM (h00 – h1F) están reservadas para el número de teléfono que el avisador debe marcar. En cada dirección se pone una cifra de h00 a h09. La cifra h0A corresponde a una pausa de un segundo, por ejemplo para esperar después de marcar el 0 (llamada exterior) en una centralita. La dirección siguiente a la última cifra debe contener hFF. Por ejemplo, si nuestro teléfono es el 123, las cuatro primeras direcciones de la EEPROM deberían contener h01, h02, h03 y hFF. La dirección 32 (h20) de la EEPROM almacena lo que llamaremos byte de configuración, y debe contener uno de estos valores: h00 le indicará al programa que nos llame sólo cuando se vaya la luz, dándonos una señal sonora consistente en un silencio y cinco “clics” seguidos que se repetirá durante un minuto. En cambio h01 le indicará al programa que nos llame también cuando vuelve la luz. En este caso, el sonido que escuchará quien descuelgue el teléfono será una secuencia de un silencio y un “clic” repetida durante un minuto. Esta segunda opción es útil porque nos avisa que el problema ha desaparecido y puede evitarnos un viaje o una preocupación innecesarios.

De esta forma, el proceso para programar el PIC se compone de los siguientes pasos:

1º. Pinchar el PIC16F84 en la posición correcta en el zócalo del programador y conectarlo, mediante el cable adecuado, al ordenador.

2º. Abrir el programa ICPROG. Si nuestro sistema operativo es Windows XP, Windows NT o Windows 2000, habrá que bajarse un driver especial de la página de ICPROG (www.ic-prog.com) y en el menú “Ajustes - Opciones” desplegar la carpeta “Miscelánea” y marcar la casilla “Habilitar driver NT/2000”, y salir del programa y volver a abrirlo (para que los cambios tengan efecto).

3º. En el menú “Ajustes - Tipo hardware” verificar que el programador y el puerto configurados son los nuestros. En el menú “Ajustes - Dispositivo - Microchip PIC” elegir el PIC16F84 ó PIC16F84A (según sea el modelo que hemos comprado).

4º. En el menú “Archivo - abrir datos...” escoger el fichero TELEF1.HEX. Veremos que las ventanas “Código de programa” y “Datos EEPROM” han cambiado, pues ahora contienen los datos que se van a grabar en el PIC.

5º. Situamos el cursor sobre la primera dirección (h00) de la EEPROM y vamos rellenando esta y las sucesivas direcciones con las cifras del número de teléfono en la forma 0x, 0y, 0z... En la dirección inmediatamente posterior a la última cifra ponemos FF.

6º. Situamos el cursor sobre la dirección 32 (h20) de la EEPROM y escribimos 00 ó 01 según queramos que nos llame sólo cuando se va la luz o también cuando vuelva.

7º. En el menú “Comando” elegir la opción “Programar todo”. Pedirá confirmación y comenzará la grabación y verificación, que tarda aproximadamente 30 segundos. Al final, debe indicar “Verificación correcta”.

Por ejemplo, si el número al que quiero que me llame el avisador es 1071 666 666 666 (el móvil de Lucifer con el prefijo de Airtel), y quiero que sólo me llame en caso de caída de tensión, después de seguir los pasos 1º al 6º, la pantalla de ICPROG quedaría como indica la figura 2. Sólo faltaría grabar el PIC.

icprog.gif


Hardware.

El diseño final (figura 3) ocupa sólo 4,3cm por 4,8cm y se puede montar en una placa pretaladrada, pues su trazado es realmente simple. Si se decide hacerla cableando las rutas, habrá que usar cable con aislamiento válido para tensión de red y si se hace trazando las pistas, deben seguirse las formas originales, que respetan el aislamiento debido entre pistas con mucha diferencia de tensión. La placa está pensada para ser alojada en una caja de tipo enchufable (como las de los adaptadores de corriente).

compu.gif


Montaje
No voy a explicar ahora cómo fabricar la placa, es fácil encontrar en internet tutoriales al respecto (o en mi propia página, en la sección INFOS), pero sí haré mención de un par de detalles a tener en cuenta. En primer lugar, U1 debe ir montado sobre zócalo, sin olvidar soldar antes el puente que hay bajo él. El relé, se puede soldar o montarlo sobre un zócalo al que habremos cortado las patillas no utilizadas, pero hay que asegurarse antes de montarlo de que no habrá problema para cerrar la caja después, con las pilas ya sujetas en su sitio. Recordar de nuevo que al contrario que las demás resistencias que serán de 0,25W, R1 debe ser de al menos 2W. Igualmente, es imprescindible que C3 sea de al menos 40V.

Por último, recordar que el circuito estará conectado directamente a la tensión de red, así que hay que revisar una y mil veces las soldaduras y asegurarse de que no haya ningún cortocircuito antes de conectarlo.

La figura 4 indica cómo conectar la placa de circuito impreso con el resto de elementos que componen el montaje. El interruptor es opcional y su función es desconectar las pilas mientras el aparato no se usa, aunque teniendo en cuenta el consumo del circuito en stand-by, quizás no merezca la pena incluirlo. En cualquier caso, debe ser de 220V, no por las tensión que va a conmutar, sino para garantizar el aislamiento respecto a la persona que lo utiliza.

cableado.gif


La caja que yo utilicé aparece en la figura 5. Este tipo de cajas son baratas, suficientemente robustas y proporcionan un aislamiento eficaz, ya que están fabricadas en PVC de 3mm de grosor. Al ser enchufables nos ahorran la necesidad de añadir un cable y una clavija. Una ventaja adicional es la dificultad para abrirlas cuando están enchufadas, lo que puede evitar accidentes. De cualquier forma, el circuito se puede adaptar a casi cualquier caja de tamaño pequeño, así que cada cual que elija la que más le guste.

fotos1.jpg


Para conectar los terminales IO3 e IO4 a la clavija de red o a los bornes del enchufe de la caja, si se ha elegido una caja enchufable, se utilizará cable para conducciones eléctricas de 220V, para estar seguros de que el aislante es suficientemente eficaz (figura 6-A). Para la conexión a la línea telefónica se puede usar un cable de un teléfono o un MODEM viejo (figura 6-B). El extremo que entra en la caja se debe proteger con un trozo de macarrón o funda de goma para evitar el desgaste. Se utilizarán sólo los dos hilos correspondientes a los contactos centrales del conector RJ-11, habitualmente los hilos rojo y verde.

fotos2.jpg


El paquete de las pilas requiere también de cierta preparación. En primer lugar sujetamos juntas las tres pilas alcalinas tipo AA o LR6 sobre un trozo de chapa o una lámina de plástico y lo ligamos todo con cinta aislante (figura 7). Cada pila debe ir mirando hacia el lado contrario que la anterior, para facilitar su conexionado posterior. Las pilas se soldarán en serie (positivo de una con el negativo de la siguiente) tratando de hacerlo rápido para no calentar en exceso el interior, lo que podría dañarlas. En los extremos libres de la primera y la última pilas, soldaremos dos cablecitos de distintos colores (normalmente negro para el negativo y cualquier otro color para el positivo).

fotos3.jpg


Una vez terminado el paquete de pilas, practicamos el agujero necesario para el interruptor elegido (si se va a poner) en la tapa y fijamos dicho interruptor y las pilas en su sitio, como refleja la figura 8. Para fijar las pilas yo utilicé una brida de nylon (solución de estética dudosa, pero muy eficaz).

Si finalmente se puso el interruptor, soldaremos un cablecito desde uno de los polos de las pilas hasta uno de los terminales del interruptor y otro trozo de cable al otro terminal de dicho interruptor, siguiendo el esquema de cableado de la figura 4. Los cables no se deben dejar más largos de lo necesario, para que luego no haya dificultad al cerrar la caja.

fotos4.jpg


A continuación soldaremos cada cable en su lugar correspondiente de la placa de circuito impreso siguiendo el esquema de cableado de la figura 4, y fijaremos la placa en su sitio como indica la figura 9-A. Ahora hay que pinchar el PIC16F84, ya programado (como vimos en el apartado anterior), en su zócalo correspondiente. Lo ideal sería hacerlo sin tensión de alimentación, es decir, con el interruptor abierto, pero si no se ha puesto interruptor, no existe esta posibilidad, así que nos arriesgaremos a pincharlo así. En realidad este microcontrolador es bastante duro y es muy raro que sufra daños.

Sólo queda cerrar la caja con cuidado de no pillar ningún cable (figura 9-B) y probar el invento. Para ello, lo encendemos y lo enchufamos a la red. Por ahora no lo conectaremos a la línea telefónica. En principio, no debe hacer nada hasta que le falte la tensión de red. Para simular un corte de luz no hay más que desenchufarlo. A los pocos segundos escucharemos una serie de “clics” correspondientes al marcado del número, seguidos de la secuencia de silencio y cinco “clics” durante un minuto. Esperaremos a que termine y lo enchufaremos de nuevo. Si se configuró para que sólo avisara en caso de corte de luz, ya no debería hacer nada más. En caso contrario, al volver a enchufarlo detectaría que ha vuelto la luz y volverían a oírse los “clics” de marcado y luego una secuencia de un silencio y un “clic” repetida durante un minuto.

fotos5.jpg


Si todo fue bien, podemos conectarlo a la línea telefónica y hacer las mismas pruebas, y si todo está correcto, recibiremos las correspondientes llamadas y al descolgar escucharemos el sonido característico de cada situación. Ya veréis que es fácil de distinguir. Téngase en cuenta durante las pruebas, que el micro en stand-by consume tan poco que puede funcionar muchos segundos sólo con la carga que haya quedado en el condensador C3, así que para que realmente se apague habrá que esperar al menos un minuto después de apagar el interruptor.

El programa.

Aunque la mayor parte de gente que construya este avisador telefónico no estará interesada en el programa que corre dentro del microcontrolador, habrá quien quiera modificarlo o rehacerlo para adaptarlo a sus necesidades, o simplemente comprender su funcionamiento. En la figura 10 aparece el diagrama de flujo del programa principal y en la figura 11 el diagrama de flujo de la rutina “CONECTAR”. Por último, en el apéndice A se incluye el listado completo del programa en ensamblador.

flujo1.gif


flujo2.gif


Apéndice A. Listado del programa en ASM.


;****************************************************************************************
; TELEF1 V1.0
; FIRMWARE PARA PIC16F84 PARA TELEF1.
; POR : JOSE MANUEL GARCIA y MIGUEL FLORES (XCAMOTITOX).
;
; CALCULADO PARA OSCILADOR EN MODO RC A 5KHZ (R=10K, C=15nF).
;****************************************************************************************

;########################################################################################
;# CODIGO STANDARD PARA PIC16F84.
;########################################################################################

IFNDEF __16F84
MESSG "Processor-header file mismatch. Verify selected processor."
ENDIF

W EQU H'0000'
F EQU H'0001'
INDF EQU H'0000'
TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
EEDATA EQU H'0008'
EEADR EQU H'0009'
PCLATH EQU H'000A'
INTCON EQU H'000B'
OPTION_REG EQU H'0081'
TRISA EQU H'0085'
TRISB EQU H'0086'
EECON1 EQU H'0088'
EECON2 EQU H'0089'
IRP EQU H'0007'
RP1 EQU H'0006'
RP0 EQU H'0005'
NOT_TO EQU H'0004'
NOT_PD EQU H'0003'
Z EQU H'0002'
DC EQU H'0001'
C EQU H'0000'
GIE EQU H'0007'
EEIE EQU H'0006'
T0IE EQU H'0005'
INTE EQU H'0004'
RBIE EQU H'0003'
T0IF EQU H'0002'
INTF EQU H'0001'
RBIF EQU H'0000'
NOT_RBPU EQU H'0007'
INTEDG EQU H'0006'
T0CS EQU H'0005'
T0SE EQU H'0004'
PSA EQU H'0003'
PS2 EQU H'0002'
PS1 EQU H'0001'
PS0 EQU H'0000'
EEIF EQU H'0004'
WRERR EQU H'0003'
WREN EQU H'0002'
WR EQU H'0001'
RD EQU H'0000'

__MAXRAM H'CF'
__BADRAM H'07', H'50'-H'7F', H'87'

;########################################################################################
;# CODIGO ESPECIFICO DEL PROGRAMA.
;########################################################################################

;****************************************************************************************
; VARIABLES PROPIAS
;****************************************************************************************
RET1 EQU H'0010'
RET2 EQU H'0011'
CIFRA EQU H'0012'
NUMCIFRA EQU H'0013'
PULSOS EQU H'0014'

LIST

__CONFIG H'3FF3' ;CP OFF, WDT OFF, PWRT ON, RC OSC

;****************************************************************************************
; MACROS
;****************************************************************************************
BANK0 MACRO
BCF STATUS,RP0
ENDM

BANK1 MACRO
BSF STATUS,RP0
ENDM

;****************************************************************************************
; VECTOR DE RESET
;****************************************************************************************
ORG H'0000'

GOTO INICIO

;****************************************************************************************
; VECTOR DE INTERRUPCION: POR SI ACASO.
;****************************************************************************************
ORG H'0004'

GOTO INICIO

;****************************************************************************************
; INICIO DEL PROGRAMA
;****************************************************************************************
ORG H'0010'

INICIO BANK1
MOVLW B'11111111' ;OPCIONES:
MOVWF OPTION_REG ;PORTB PULL-UP = OFF.

BANK0
MOVLW B'00001000' ;RB PORT CHANGE INTERRUPT = ON
MOVWF INTCON ;GLOBAL INTERRUPT = OFF
;BANDERAS DE INTERRUPCION = OFF

BANK1 ;PONE TODOS LOS PUERTOS COMO ENTRADAS PARA
MOVLW H'FF' ;MINIMIZAR EL CONSUMO.
MOVWF TRISB

STANDBY BANK1 ;PORTA = ENTRADA.
MOVLW H'FF'
MOVWF TRISA

BANK0
BCF INTCON,RBIF ;BORRA BANDERA DE CAMBIO EN PORTB.
SLEEP ;MODO STAND-BY. LA EJECUCION NO CONTINUARA HASTA
NOP ;QUE SE DETECTE UN CAMBIO EN EL PORTB, ES DECIR,
NOP ;HASTA QUE HAYA UN CAMBIO EN LA TENSION DE RED.

BTFSC PORTB,7 ;SI HAY TENSION DE RED SALTA A RED_ON, SI NO
GOTO RED_ON ;CONTIUA.

CALL RET_LARGO ;ESPERA 5 SEGUNDOS Y CHEQUEA SI SIGUE SIN HABER
CALL RET_LARGO ;TENSION DE RED, PARA EVITAR HACER UNA LLAMADA
CALL RET_LARGO ;POR UNA CAIDA MOMENTANEA.
CALL RET_LARGO
CALL RET_LARGO

BTFSC PORTB,7 ;SI EN 5 SEGUNDOS HA VUELTO LA LUZ, VA A STANDBY.
GOTO STANDBY

CALL CONECTAR ;LLAMA AL TELEFONO PREFIJADO Y VUELVE A COMPROBAR
BTFSC PORTB,7 ;QUE NO HAYA VUELTO LA LUZ MIENTRAS TANTO (ANTES
GOTO STANDBY ;DE QUE DESCUELGUEN). SI HA VUELTO VA A STANDBY.

MOVLW D'40' ;MARCA 40 VECES UNA SECUENCIA DE 5 PULSOS Y UN
MOVWF RET2 ;ESPACIO EN BLANCO QUE INDICA A QUIEN COGE EL
;TELEFONO QUE SE HA IDO LA LUZ. ESTO DURA
BUCLE1 CALL RET_LARGO ;APROXIMADAMENTE 1 MINUTO.
CALL PULSO
CALL PULSO
CALL PULSO
CALL PULSO
CALL PULSO
DECFSZ RET2,F
GOTO BUCLE1

CALL COLGAR ;CUELGA Y VUELVE A STANDBY.
GOTO STANDBY

RED_ON MOVLW H'20' ;LEE DE LA EEPROM EL BYTE DE CONFIGURACION.
CALL RD_EEPROM ;SI CONTIENE '01' (AVISAR CUANDO VUELVE LA LUZ),
XORLW H'01' ;CONTINUA CON LA RUTINA DE LLAMADA. SI NO,
SKPZ ;VUELVE A STANDBY.
GOTO STANDBY

CALL RET_LARGO ;ESPERA 5 SEGUNDOS Y CHEQUEA SI SIGUE HABIENDO
CALL RET_LARGO ;TENSION DE RED, PARA EVITAR HACER UNA LLAMADA
CALL RET_LARGO ;POR UNA VUELTA MOMENTANEA DE LA TENSION.
CALL RET_LARGO
CALL RET_LARGO

BTFSS PORTB,7 ;SI EN 5 SEGUNDOS YA NO HAY LUZ, VA A STANDBY.
GOTO STANDBY

CALL CONECTAR ;LLAMA AL TELEFONO PREFIJADO Y VUELVE A COMPROBAR
BTFSS PORTB,7 ;QUE SIGA HABIENDO LUZ (ANTES DE QUE
GOTO STANDBY ;DESCUELGUEN). SI SE HA VUELTO A CORTAR VA A
;STANDBY.

MOVLW D'55' ;MARCA 55 VECES UNA SECUENCIA DE 1 PULSOS Y UN
MOVWF RET2 ;ESPACIO EN BLANCO QUE INDICA A QUIEN COGE EL
;TELEFONO QUE YA HAY LUZ. ESTO DURA
BUCLE2 CALL RET_LARGO ;APROXIMADAMENTE 1 MINUTO.
CALL PULSO
DECFSZ RET2,F
GOTO BUCLE2

CALL COLGAR ;CUELGA Y VUELVE A STANDBY.
GOTO STANDBY

;****************************************************************************************
; RD_EEPROM: LEE UNA POSICION DE LA EEPROM.
; RECIBE W: DIRECCION DE MEMORIA A LEER.
; DEVUELVE W: DATO LEIDO.
;****************************************************************************************
RD_EEPROM BANK0
MOVWF EEADR ;PONE DIRECCION EN EEADR
BANK1
BSF EECON1,RD ;ACTIVA LECTURA
NOP
BANK0
MOVF EEDATA,W ;PONE EEDATA EN W
RETURN

;****************************************************************************************
; CONECTAR: LLAMA AL NUMERO PREFIJADO EN LAS 32 PRIMERAS DIRECCIONES DE LA EEPROM. DEBE
; HABER UNA CIFRA DECIMAL EN CADA DIRECCION DE LA EEPROM Y LA DIRECCION SIGUIENTE A LA
; ULTIMA CIFRA DEBE CONTENER 'FF'. UN VALOR '0A' INDICA UNA PAUSA DE 1 SEGUNDO.
;****************************************************************************************
CONECTAR CALL DESCOLGAR ;DESCUELGA Y ESPERA 3 SEGUNDOS.
CALL RET_LARGO
CALL RET_LARGO
CALL RET_LARGO

CLRF NUMCIFRA ;INICIA CONTADOR DE CIFRAS.

CONECTAR_1 MOVF NUMCIFRA,W
CALL RD_EEPROM ;LEE CIFRA DE LA EEPROM
MOVWF CIFRA ;GUARDA LA CIFRA LEIDA EN CIFRA

XORLW H'FF' ;SI LA CIFRA ES 'FF' SALTA A CONECTAR_4 PARA
BZ CONECTAR_4 ;SALIR DEL BUCLE DE MARCADO.

MOVF CIFRA,W
XORLW H'0A' ;SI LA CIFRA ES '0A' SALTA A CONECTAR_3 PARA NO
BZ CONECTAR_3 ;MARCARLA.

MOVF CIFRA,W
XORLW H'00' ;SI LA CIFRA ES '00' SE CAMBIA A '0A' PARA QUE
BNZ CONECTAR_2 ;DE DIEZ PULSOS (CORRESPONDIENTE AL 0).
MOVLW H'0A'
MOVWF CIFRA

CONECTAR_2 CALL PULSO ;BUCLE QUE MARCA TANTOS PULSOS COMO INDIQUE
DECFSZ CIFRA,F ;CIFRA.
GOTO CONECTAR_2

CONECTAR_3 CALL RET_LARGO ;DEJA UN ESPACIO DE 1 SEG ENTRE CIFRA Y CIFRA.
INCF NUMCIFRA,F ;INCREMENTA NUMCIFRA PARA PASAR A LA SIGUIENTE
GOTO CONECTAR_1 ;CIFRA Y CIERRA EL BUCLE DE MARCADO.

CONECTAR_4 RETURN

;****************************************************************************************
; DESCOLGAR: ACTIVA LA SALIDA PORTA(0) Y DESCUELGA, OCUPANDO LA LINEA.
;****************************************************************************************
DESCOLGAR CLRF PORTA ;PORTA(0)=0
BANK1
MOVLW B'11111110' ;PORTA(0)=SALIDA
MOVWF TRISA
BANK0
BSF PORTA,0 ;PORTA(0)=1
RETURN

;****************************************************************************************
; COLGAR: DESACTIVA LA SALIDA PORTA(0) Y CUELGA, DESOCUPANDO LA LINEA.
;****************************************************************************************
COLGAR BANK1
MOVLW B'11111111' ;PONE PORTA COMO ENTRADA.
MOVWF TRISA
BANK0
CLRF PORTA ;BORRA PORTA
RETURN

;****************************************************************************************
; PULSO: MARCA UN PULSO DE 50 ms Y DEJA UN ESPACIO DE 150 ms.
;****************************************************************************************
PULSO BCF PORTA,0 ;CUELGA

MOVLW D'20' ;RETARDO DE 50 ms
MOVWF RET1
DECFSZ RET1,F
GOTO $-1

BSF PORTA,0 ;DESCUELGA DE NUEVO

MOVLW D'62' ;RETARDO DE 150 ms
MOVWF RET1
DECFSZ RET1,F
GOTO $-1

RETURN

;****************************************************************************************
; RET_LARGO: RETARDO DE 1 s (1250 CICLOS DE PROGRAMA).
;****************************************************************************************
RET_LARGO MOVLW D'249'
MOVWF RET1
NOP
NOP
DECFSZ RET1,F
GOTO $-3
RETURN

;****************************************************************************************
; VALORES INICIALES DE LA EEPROM
;****************************************************************************************
ORG H'2100'

DE H'01',H'00',H'07',H'01',H'06',H'06',H'06',H'06'
DE H'06',H'06',H'06',H'06',H'06',H'FF',H'FF',H'FF'
DE H'FF',H'FF',H'FF',H'FF',H'FF',H'FF',H'FF',H'FF'
DE H'FF',H'FF',H'FF',H'FF',H'FF',H'FF',H'FF',H'FF'
DE H'00' ;BYTE DE CONFIGURACION (LLAMAR SOLO CUANDO SE VA LA LUZ).

;*********************************************************************
END

;*********************************************************************
AGRADECER A MI AMIGO JOSE M, quien me ayudo en la parte del marcado del PIC.
 
hola me parece muy interesante tu proyecto y me gustaria hacerlo para mi colegio entiendo algo de electronica por que me gusta al año me toca la U y ya me decidi por que carrera, pero quisiera pregunta si me podrias hacer el favor de postearmelo o colgarlo el software el programa en terminacion HEX para poderlo simular en proteus, y si habria la posibilidad de darme la lista de materiales por que algunos componentes no los conozco bien y no quiero hacer el ridiculo en la tienda si?
 
Última edición:
Atrás
Arriba