Nuevo entorno en nube de Microchip


En efecto la famosa empresa  Microchip    ha creado   un  IDE basado en la nube llamado MPLAB Xpress  el cual  es un entorno de desarrollo en línea que contiene la mayor parte funciones más populares del veterano  y famoso  IDE MPLAB X  , siendo esta  una reproducción fiel del programa,  lo que le permite fácilmente la transición entre los dos entornos .

MPLAB Xpress es un punto de partida ideal para los nuevos usuarios de microcontroladores  PIC®  pues  elimina el tiempo de instalación y permite que los usuarios desarrollen una aplicación por completo en cuestión de minutos tan solo abriendo un navegador y generando código de forma rápida con el configurador de código MPLAB integrado, que incorpora a su vez MPLAB Xpress(lo cual es una  característica no disponible en ningún otro IDE basado en la nube).Obviamente  después los usuarios pueden comprobar ese código con el simulador incluido, compilar el código y luego programar y depurar el microcontrolador al que se dirigen.

 

Este entorno ofrece pues las siguientes herramientas:

  • Una biblioteca de ejemplos de código validados por Microchip,
  • Interface al configurador de código MPLAB (MPLAB Code Configurator, MCC) 3.0 para configuración de periféricos basada en interface gráfico de usuario,
  • Generador automática de código,
  • Compiladores MPLAB XC integrados,
  • Soporte para hardware de programador/depurador
  •  10 GB de almacenamiento seguro en Internet con una cuenta myMicrochip.
  • Los usuarios pueden migrar sus proyectos fácilmente al IDE completo y descargable MPLAB X.

Una de las piezas claves  es su nueva  placa de desarrollo MPLAB Xpress Evaluation Board.Esta tarjeta de desarrollo incorpora un programador integrado, un microcontrolador PIC16F18855 y una cabecera de MikroBUS para ampliar el sistema con más de 180 tarjetas Click de MikroElektronika.

El IDE MPLAB Xpress también es compatible con la tarjeta de desarrollo Curiosity de Microchip, una herramienta económica con programador y depurador integrados, así como opciones de ampliación para tarjetas conectables y conectividad externa. Además, este IDE en línea se puede utilizar junto con el conocido depurador/programador en circuito PICkit 3 de Microchip, que proporciona capacidades de programación y depuración para más de 1.000 microcontroladores PIC.

foto

 

La manera más rápida de comenzar con MPLAB Xpress es el modo de unidad de prueba . Basta con escribir en el navegador mplabxpress.microchip.com y hacer  clic en el botón ” Test Drive” para empezar a  usarlo de modo que la mayor parte de las características del IDE ya están disponibles , y el MPLAB Placa de evaluación Xpress se puede programar en este modo.

  1. Para empezar  si no dispone la placa  lo mejor es pulsar  en Test Drive       ( no necesitara validación alguna)                                                                                                                       reccc.PNG
  2. Comience su evaluación con la  biblioteca de ejemplos de código de la MPLAB Comunidad Xpress . Haga clic en el botón de ” Ejemplos ” en la parte superior cuadrante derecho del IDE. Una vez que encuentre un ejemplo que se adapte a su interés , Haga clic en la pestaña ” Abrir” para poner en marcha el ejemplo en el Xpress MPLAB IDE                                        .recortye1.PNG
  3. Si  dispone de la placa ,para programar la placa MPLAB Xpress Evaluation Board ,conectar esta a su PC con un cable micro – USB . La placa MPLAB Xpress Evaluation Board  aparecerá como un dispositivo de almacenamiento masivo USB o una unidad flash . Copiar el archivo .hex generado en el directorio raíz de la MPLAB ** unidad flash del Comité de Evaluación de Xpress . Nota :MPLAB Xpress Evaluation Board  sólo reconoce archivos colocados en el directorio raíz . Realice un restablecimiento con el botón RESET en el tablero .                                                 .recorte2.
  4.  

    Para compilar el código,presione el botón ”  Programar el dispositivo ” en la parte superior izquierda del cuadrante de la IDE . Un archivo nuevo project_name.hex se generará ,el cual se depositara  en el directorio ” Descargas ” de su PC .

 

Para sacar el máximo provecho de MPLAB Xpress ,lo mejor es  iniciar  sesión con su nombre de usuario y contraseña myMicrochip . Si usted no tiene una cuenta, basta con hacer clic en el botón ” Mi cuenta” y seguir  las instrucciones para crear dicha cuenta.

  1. Creando una cuenta le permitirá guardar los proyectos para su uso futuro , generar código con MPLAB Código configurador ( MCC ) , y / Debug una placa de desarrollo del programa y la posibilidad de usar el depurador PICKit ™ 3  en circuito      .
  2. Una vez tenga en la cuenta pulse “my Account”  y escriba sus credenciales                                                                                                                                                     aaa
  3. Acelerar su diseño con MPLAB  ofrece un fácil acceso a los poderosos  configuradores de de codigo de MPLAB  . Esta herramienta basada en GUI puede crear código de configuración y función MCU listo para la producción simplemente haciendo  clic. Para acceder a ella , vaya a Herramientas > Embedded > MPLAB Código configurador:embedd
  4. Desde Microchip recomiendan unirse a la Comunidad MPLAB.  Como parte de su cuenta myMicrochip , se tiene acceso a la comunidad MPLAB Xpress . Además, la MPLAB Xpress Community permite a los desarrolladores compartir su código, diseñar ideas y conocimientos.Puede utilizarlo para:
  •  Los proyectos de acción utilizando la sección ” Ejemplos “
  • Búsqueda por contribuyente , Empleo, función , o de dispositivos de hardware
  • Discutir ideas sobre el Foro Xpress MPLAB
  •  Aprender a optimizar los diseños en el MPLAB Xpress Wiki

Capturamenu

Fuente

Anuncios

Enviar datos directamente a Google Docs desde un PicMicro


Controlar la temperatura (o el tamaño que sea) desde cualquier lugar del planeta y compartir datos en la nube de Google gracias  a una simple  hoja de cálculo ya es posible  .Ademas  también muy sencillo gracias a FTPmicro y algunas implementaciones de la pila TCP / IP de Microchip.

¿Te gustaría ser capaz de controlar la temperatura de la cámara frigorífica o cualquier otro dispositivo repartidos por todo el mundo y enviar los datos en tiempo real a una hoja de cálculo de documento estándar? Y si este documento tuvo siempre en línea y de fácil acceso desde cualquier lugar del planeta? Todo es posible si usted tiene una conexión a Internet, una cuenta de Google y un PICmicro mano 🙂

Enviar a mis documentos de Google Docs con PICmicro

Primero usted tiene que crear  un  documento  de Google (que pronto pasará a Google Drive)  creando  un  nuevo formulario . A continuación, aparecerá una pantalla en la que puede configurar los “titulares de las preguntas” que no son más que los títulos de las columnas que organizarán nuestros datos.
En el ejemplo    insertaron Device en Roma y luego en Milán.
Una vez que haya guardado (automáticamente)  esto , debe volver a la página principal de Google Drive (anteriormente Documentos) y nos encontramos con nuestro documento a la que puede asignar un nombre, en nuestro ejemplo, controlar la temperatura, y luego modificar la primera línea de la primera columna de “información histórica” ​​para Marca de tiempo que nos dará la hora exacta de la actualización de la célula.
Así que vamos a tener nuestra primera línea que corre 3 columnas:
Fecha y hora – Dispositivo de Roma – Dispositivo de Milán

Por supuesto, todos estos nombres se pueden personalizarse de acuerdo a sus necesidades,asi como  también puede aumentar el número de columnas para controlar un mayor número de dispositivos.

A continuación, debe compartir el documento para que sea público y   visible
,(puede compartirse sólo con algunas personas).

El formulario también será un enlace para compartir, consistentente en  un acceso rápido que  puede  difundir  a sus amigos para que acceso directo, en tiempo real, los datos actualizados sobre el documento:
https://docs.google.com/spreadsheet/ccc?key=0Ail81YGXRx8XdFVJMDBVYS02YjZ …

En este punto tenemos que ir a averiguar el nombre de las cajas, estamos hablando de el nombre asignado por el software para reconocer las diferentes columnas, que es diferente del nombre asignado por nosotros 😉

Para ello, basta con echar un vistazo a la fuente de su página web de nuestra hoja de cálculo, formulario que se encuentra en el menú-> editar, compruebe el nombre de los campos de entrada utilizados como encabezados. It ‘s sólo una confirmación, ya que Google designe el formulario de entrada con entry.NumeroProgressivo.single

a continuación:

entry.0.single (En la columna Device en Roma)
y
entry.1.single (En la columna Device en Milán)

al final de la misma página web, usted encontrará también el enlace con el formkey

“Usted puede ver el formulario publicado a continuación: https://docs.google.com/spreadsheet/viewform?formkey=dFVJMDBVYS02YjZwNFl …

Por favor, anótelo, servirá como acceso remoto clave para el formulario!

Ahora usted tiene todos los parámetros que se incluirán en la configuración de la carga de firmware en PICmicro (FTPmicro)

Sabemos que con el fin de acceder al documento se utiliza el formkey
y escribir en filas en la columna de ROMA entry.0.single que tenemos que utilizar, en lugar de entry.1.single MILAN

Estos parámetros se pueden programar a continuación, ya sea en FTPmicro ROMA (0) y que de Milano (1)

Encabezado HTTP

La cadena de actualizar los datos de las celdas, se puede verificar a través del navegador, de hecho, sólo tienes que escribir en la url compuesta formkey y las células y sus valores en su navegador para ver los datos que se envían a la hoja de cálculo de Google relevantes.
Para transformar estos datos en código legible, debe pasar a través de un visor de encabezado http como
http://web-sniffer.net/
De esta manera usted puede tener los datos exactos que se deben incluir en el firmware.

 

El firmware de FTPmicro (PICmicro 18F67J60)

En el codigo se utilizó la pila tcp / ip  version 5:41 de Microchip   las siguientes configuraciones e implementaciones:

en el archivo de TCPIP ETH97.h permiten los siguientes módulos:

# Definir el protocolo de configuración STACK_USE_DHCP_CLIENT / / dinámica de host para obtener la dirección IP del cliente y otros parámetros
# Definir STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE / / Ejemplo de cliente HTTP en GenericTCPClient.c
# Definir STACK_USE_DNS / / Domain Name Service Client para resolver las cadenas de nombre de host en direcciones IP

en GenericTCPClient.c archivo realice los siguientes implementaciones:

estática BYTE ServerName [] = “spreadsheets.google.com”;
estática ServerPort WORD = 80;RemoteURL1 BYTE ROM estática [] = “formkey =”;
Formkey BYTE ROM estática [] = “dFVJMDBVYS02YjZwNFlPVXp4Q1dHMXc6MQ”;
RemoteURL2 BYTE ROM estática [] = “& IFQ &”;
ROM / / Static BYTE Entry0 [] = “entry.0.single =” / / Número del cambio Coloumn AQUÍ para actualizar (0 = dispositivo en Roma)
Entry0 BYTE ROM estática [] = “entry.1.single =” / / Número del cambio Coloumn AQUÍ para actualizar (1 = Dispositivo de Milán)Temperaturas BYTE extern [2];

y luego

TCPPutROMString (MySocket, (BYTE ROM *) “POST / formResponse HTTP/1.1 \ r \ n”);
TCPPutROMString (MySocket, (BYTE ROM *) “Anfitrión:”);
TCPPutString (MySocket, ServerName);
TCPPutROMString (MySocket, (BYTE ROM *) “\ r \ n”);
TCPPutROMString (MySocket, (BYTE ROM *) “Connection: close \ r \ n”);
TCPPutROMString (MySocket, (BYTE ROM *) “Content-Type: application /-www-form-urlencoded x \ r \ n”);
TCPPutROMString (MySocket, (BYTE ROM *) “Content-Length: 83 \ r \ n”);
TCPPutROMString (MySocket, (BYTE ROM *) “\ r \ n”);
TCPPutROMString (MySocket, RemoteURL1);
TCPPutROMString (MySocket, formkey);
TCPPutROMString (MySocket, RemoteURL2);
TCPPutROMString (MySocket, Entry0);
TCPPutString (MySocket, temperatura);
TCPPutROMString (MySocket, (BYTE ROM *) “& # B0C y submit = Enviar”);

A continuación, en el archivo principal, luego MainDemo.c inserta:

/ /
/ / Aplicación principal punto de entrada.
/ /Temperaturas sin firmar char [2];void main (void){
estática DWORD t = 0;
DWORD estática dwLastIP = 0;/ / Inicializa el hardware específico de la aplicación
InitializeBoard ();

TickInit ();

/ / Inicializar Stack y aplicaciones relacionadas con las variables NV en AppConfig.
InitAppConfig ();

/ / Inicializar capas de la pila de núcleo (MAC, ARP, TCP, UDP) y
/ / Módulos de aplicación (HTTP, SNMP, etc.)
StackInit ();

mientras que (1)
{
/ / Si (TickGet () – t> = TICK_SECOND) / / about 5 seg. – >> Dispositivo de Roma REFRESCO
if (TickGet () – t> = TICK_MINUTE/8ul) / / about 30 seg. – >> Dispositivo de Milán REFRESCO
{
t = TickGet ();
GenericTCPClient ();
}

/ / Esta tarea realiza la tarea normal de pila, incluida la comprobación
/ / Para los paquetes entrantes, el tipo de paquete y llamar
/ / Entidad pila adecuada para procesarla.
StackTask ();

/ / Esta tarea Invoca cada una de las tareas fundamentales de la aplicación de la pila
StackApplications ();

/ / Procesar las tareas específicas de la aplicación aquí.
Processio ();

}
}

Lo ‘sólo la parte que se ocupa de la gestión de los tiempos de actualización. De hecho los dos FTPmicro se han programado con diferentes tiempos de actualización. El dispositivo en Roma envía datos a Google hoja de cálculo cada 5 segundos, mientras que en Milán cada 30 segundos. Las temperaturas se van a actualizar en relación con estos tiempos.

En la llamada a processio habrá los resultados de la conversión analógica a digital se volvieron a representar numéricamente la temperatura medida con el sensor de temperatura de a bordo dell’FTPmicro.

Gracias siempre a la forma de Google Drive, usted puede convertir los datos de la tabla en un gráfico. Este es un resultado para controlar la temperatura de los dos dispositivos en dos lugares diferentes.

Todo el firmware es software libre tan fácilmente personalizable, también puede utilizar los comentarios de este artículo para reportar mejoras y / o implementaciones.

Aquí está el enlace al código de Google para descargar la fuente y todo el proyecto listo para MPLAB IDE de Microchip.
http://code.google.com/p/from-picmicro-to-google/downloads/list

Fuente  aqui

Como grabar un PIC16Fxx con el JDM con un portátil


var _gaq = _gaq || []; _gaq.push([‘_setAccount’, ‘UA-37244819-1’]); _gaq.push([‘_trackPageview’]); (function() { var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true; ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’) + ‘.google-analytics.com/ga.js’; var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s); })(); El programador JDM es una solución de bajo coste para la introducción de un programa en la memoria flash interna del PIC. Además de los planes originales de Jens Dyekjær Madsen, también hay muchos esquemas modificados en la web, entre elllos el TE20, el TE20x o el grabador_smt1.De destacar R1 y el voltaje de D5 son modificaciones adicionales que son necesarias para todos los PICs recientes que vienen con una capacidad de programación de bajo voltaje (que, de hecho, el programador JDM no utiliza y debe ser deshabilitada con la resistencia pulldown en el pin RB3) y un valor ligeramente incrementado para el diodo Z para cumplir las especificaciones de programación del PIC16F87x y PIC18F452.

Web oficial: http://www.jdm.homepage.dk/newpics.htm

Este programador es alimentado por el puerto RS232 del PC y funciona con niveles RS232 <±8.6V.

Dispositivos que soporta JDM
24CXX, EEPROM
PIC12C5XX
PIC12C67X
PIC16C55X
PIC16C61
PIC16C62X
PIC16C71
PIC16C71X
PIC16C8X
PIC16F8X
Tarjetas ISO con ASF

4 diodos 1N4148
1 diodo Zener de 8.2v
1 diodo Zener de 5.1v
1 capacitor electrolítico de 100uF x 40v
1 capacitor electrolítico de 22uF x 16v
2 transistores BC547B
1 resistencia de 10k, ¼ de watt
1 resistencia de 1.5k, ¼ de watt.
1 zócalo de 18 pines
Es un circuito muy simple, pero que tiene varias ventajas que lo hacen muy interesante:

>Se conecta al puerto serie, que generalmente en cualquier PC esta disponible.
>Existe software gratis para utilizarlo, incluso bajo DOS, LINUX y por supuesto Windows (incluido WinXP)
>Sirve para programar varios modelos de PICS (PIC12C5XX, 12C67X, 24CXX, 16C55X, 16C61, 16C62X, 16C71, 16C71X, 16C8X, 16F8X entre otros ) y también para leer/escribir varios chips de memoria (24Cxx ). Otros microcontroladores también pueden ser programados mediante un adaptador.
>Dispone del conector ICSP (In-Circuit Serial Programming) para la programación de microcontroladores sin necesidad de desmontarlos de su placa de circuito impreso.
>No necesitamos de una fuente de alimentación externa, ya que se alimenta directamente del puerto de la PC.
>Su costo es muy bajo, los componentes necesarios difícilmente nos cuesten mas de 3 o 4 u$s y son muy fáciles de conseguir.

Una aclaración importante antes de seguir adelante: el hecho de que el programador se conecte a un puerto serie RS-232 de la PC no significa que el protocolo utilizado para comunicar la PC y la placa del programador sea este, de hecho se puede adaptar este circuito para conectarlo al puerto paralelo e incluso USB. Como dijimos antes, los tiempos, y las señales necesarias para programar los PICs dependen de un protocolo especifico desarrollado por Microchip, por lo que utilizamos el puerto como vehiculo para llevar los bits al PIC y para obtener las tensiones necesarias para la programación, pero utilizando un programa y un protocolo especifico para esta tarea

DESCRIPCION DEL CIRCUITO.

La tensión de la entrada de reloj está limitada mediante D3 y D4 sin que sea necesaria ninguna resistencia limitadora.

Los diodos a Vdd internos del PIC protegen también las entradas. Los dispositivos 24CXX no tienen ningún diodo a Vdd, y D4 es absolutamente necesario.

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES Programador PIC y EEPROM JDM 13.5

Q2 aumenta el voltaje de salida a niveles RS232. Entonces funciona como base común. R2 es una resistencia pull-up que no resulta fundamental debido a la corriente limitada del puerto RS232. Q2 también limita la tensión de la entrada al PIC cuando DTR es de nivel alto. Entonces funciona como un seguidor de emisor y se reduce la tensión de la entrada a Vdd-0.7V.

Cuando DTR se pone a nibel bajo, Q2 trabaja invertido y la ganancia sólo es aproximadamente 5. La resistencia equivalente es aproximadamente 10K/5 = 2K. Esto reduce la corriente de entrada de datos al PIC junto con la resistencia R2. Cuando DTR cambia de nivel bajo a nivel alto, Q2 cambia de modo invertido saturado a seguidor de emisor activo. Esta causa un pico sobre los datos, pero el pico está extinguido cuando cambia el reloj. Esto garantiza que las eeprom no pasen al modo de prueba.

Q1 trabaja en cierto modo como seguidor de emisor también, pero se satura cuando es activo. En ese caso su tensión CE es muy baja. El transistor activa o desactiva la tensión para MCLR.

TXD alimenta a C2 para que alcance 13V a través de la unión base-colector de Q1. El tensión en C2 está limitado por el zener D6 y es aproximadamente 5.1V+8.2V = 13.3V. Cuando TXD está a nivel alto la tensión en MCLR no excede esta tensión. La base sube a una tensión mas alta, pero Q1 se satura y la salida no excederá la tensión de colector.

C2 proporciona la Vpp y la Vdd a través del diodo zener D6. Pero Vdd sólo aparece si el voltaje en C2 es aproximadamente de 13V. Si tiene 8V, entonces será posible controlar la alimentación mediante RTS y DTR. La alimentación C2 se reduce aproximadamente a 8V por medio de TXD, DTR y RTS mantenidas a nivel alto durante aproximadamente 0.5s.

El diodo extra, D5, limita la tensión sobre TXD. En principio se utiliza para alimentar la eeprom cuando DTR y RTS están a nivel alto. También garantiza que MCLR es mayor de -0.2V cuando TXD está a nivel bajo. El diodo D7 pone MCLR a nivel bajo cuando TXD está a nivel bajo.

El PIC también es alimentado por RTS mediante D3. La corriente de entrada “on data” también alimenta el PIC a Vss. Ambas señales necesitan ser negativas para alimentar al dispositivo con la máxima corriente posible. C2 alimenta al PIC si las señales son positivas. RTS y DTR no son criticas al programar el 24CXX, porque el diodo D5 pone Vss a nivel bajo.

Al programar un PIC sólo D3 puede utilizarse. RTS y DTR necesitan ser de nivel bajo para alimentarlo, y no deben estar a nivel alto durante demasiado tiempo. La corriente es excepcionalmente alta al leer ceros del PIC, y el tiempo de lectura activo con DTR a nivel alto debe ser corto. Para compensar el corriente utilizada, un nivel bajo de be aplicarse a RTS durante un tiempo extra.

Si reemplaza D5 y D7 por un BC557B,es importante que sepa que la base-emisor se comporta como un un diodo zener. Sólo D7 pueden actuar como un zener, y MCLR necesita ser conectada al emisor, mientras el colector del BC557B se conecta a Vss. El transitor trabaja en cierto modo como seguidor de emisor, y proporciona a MCLR una corriente alta extra.

Esta corriente alta no es necesaria, y puede incluso dañar al BC557B si el programador se conecta con alimentación externa. Conectar el programador a una fuente de alimentación externa siempre puede causar problemas, y no se permite para el uso normal.

El peligro de conectar una fuente de alimenmtación externa está en que el diodo zener interior reduce el voltaje a 5.1V. Puede ser perjudicial que se aplique una tensión demasiado alta. Las conexiones externas pueden causar problemas también debido a tensiones negativas. Vdd se conecta a la masa del PC y pueden provocarse cortocircuitos si un circuito externo se conecta con la masa del ordenador, por ejemplo a traves de la toma de tierra. Una fuente de alimentación externa también puede dar problemas de seguridad si los PIC u otros dispositivos no se insertan adecuadamente

Generalmente este diseño funciona muy bien sobre puertos serie “estandard” ( de pc de sobremesa) pero ultimamente en los pc’s modernos o portatiles no termina de funcionar a traves de adaptadores usb a rs232 ( ya que en la mayoria de lso portatiles se ha eliminado este util puerto)

IC-Prog por Bonny Gijzen parece ser el software de grabación más flexible, ya que no solo soporta el JDM, sino muchos otros programadores. Se puede descargar aquí: http://www.ic-prog.com. Antes de empezar a programar cualquier chip, por favor, revisa tu circuito de programación en el menú Hardware Check .( Es Importante que no midas los voltajes con un osciloscopio o instrumentos similares que estén conectados a tierra como tu PC, ya que esto falsificaría los resultados de la medicon pues el JDM usa la conexión de tierra para Vdd).

Otros programadores que soportan el JDm y sus variantes: WINPIC800, WINPICPGM

Por tanto para probar el TE20 ,usaremos el IC-PROG y un multímetro con batería .Sigue estas instrucciones:

Ve a Settings->Hardware menu, ponlo en “JDM Programmer”, selecciona el Puerto (COM1, COM2, …?), Selecciona Interface Direct I/O (bueno para Windows 9x) o API (Windows ME/NT/2000/XP). Comienza con I/O Delay 0, No inviertas ninguna señal:

Ahora selecciona el dispositivo correcto:: Settings->Device->Microchip PIC->PIC16F84)

Start Settings->Options, ve al sub-menú “Programming”

Habilita “Verfiy after programming” y “Verify during programming”. La última opción asegura que se te notifiquen inmediatamente los errores de programación. La primera opción es especialmente necesaria para los derivados de PIC16F87xA, ya que IC-Prog no verifica estos chips durante la programación.

Ve al submenú “Misc”, habilita “Vcc control for JDM” y selecciona “Realtime” en Process Priority

Ve a Settings->menú Hardware Check

Prepara tu multímetro y revisa los voltajes de tu programador.

Notas:

Cuando se deshabilita una señal, el voltaje cae hasta 0V muy, muy despacio, ya que los capacitadores no se descargan con una carga. Así que no estés pendiente de los valores de señales desactivadas, solo revisa las señales habilitadas.

Los voltajes cambiarán a los valores correctos y especificados cuando haya un PIC en el socket. El propósito de la revisión de hardware no es ver los voltajes correctos, sino asegurarse de que las señales puedan ser controladas (switched on/off) por tu PC. Si te quieres asegurar de que el voltaje no sea demasiado alto en la carga para verificar que el circuito esté correctamente cableado, conecta temporalmente una resistencia de 1k entre Vss y el “pin en pruebas”.

¡¡¡Asegúrate de que no haya PIC en el socket de programación!!!

Pulsa sobre “Enable Data Out“: La caja de Data In debe ser automáticamente seleccionada para soporte de hardware (Data Out->Data In). Desconecta “Data out” de nuevo. No te preocupes si Data In se acciona en los siguientes tests, este es el comportamiento normal.

Pulsa sobre “Enable MCLR“, mide el voltaje entre Vss (Pin 12/31) y MCLR# (Pin 1) : ca. 14 V

Deshabilita todas las señales

Pulsa sobre “Enable Vcc“, mide el voltaje entre Vss (Pin 12/31) y Vdd (Pin 11/32): ca. 5 V
Si esta prueba falla, asegúrate de que la opción “Vcc control for JDM” esté activada en el submenú “Misc”(Settings->Options)
Deshabilita todas las señales y p

Pulsa sobre “Enable clock“, mide el voltaje entre Vss (Pin 12/31) y RB6 (Pin 39): ca. 5 V +/- 1 V, despues deshabilita todas las señales
Pulsa sobre “Enable Data Out“, mide el voltaje entre Vss (Pin 12/31) y RB7 (Pin 40): ca 5 V +/- 0.5 V
Ahroa enchufa el PIC en el socket de programación.
Start Command->Read All

Durante la lectura:
Mide el voltaje entreVss (Pin 12/31) y MCLR# (Pin 1) : ca. 13.7 V
Mide el voltaje entre Vss (Pin 12/31) y Vdd (Pin 11/32): ca. 5.1 V

No tiene sentido medir los voltajes de los otros pines, ya que se accionan muy rápido.

Nota: El programador JDM no funcionará cuando pruebes estos pines con un osciloscopio (GND->Earth problem)
Si no mides 13.7V entre Vss y MCLR cuando el PIC esté enchufado, puedes incrementar/decrecer el voltaje con el I/O Delay en el menú Hardware. Retrasos más bajos incrementan el voltaje, retrasos más altos decrecerán el

voltaje! Me di cuenta de que no se pueden alcanzar 13.7V cuando se accede al JDM a través de las funciones API de Windows

Start File->Open File: carga el firmware (archivo .hex ) en IC-Prog

Start Command->Program All

Ahora pasarán unos 3 min. hasta que el PIC esté programado. Si la escritura no funciona, IC-Prog lo notificará como “Verify failed” cuando esten marcadas “Verfiy after programming” y “Verify during programming” en Settings->Options->submenú Programming

Nota:Parece que con algunos PCs, el proceso de programación solo pasa cuando el pin 5 (GND) del enchufe SubD-Plug está conectado con el chásis de metal(tierra) del conector.
Después de que la programación esté hecha, tu PIC estará preparado 🙂

Solución de problemas
Compara tu circuito con el esquema y la base PCB una y otra vez- Revisa especialmente la polaridad de los diodos, capacitadores y transistores. Asegúrate de que las soldaduras estén bien (sin falsos contactos)
IC-Prog a veces se olvida alguna opción bajo circonstancias desconocidas (por ej. el retraso I/O y el número de puerto COM ). Así que si falla el proceso de quemado, asegúrate de tu configuración no se ha cambiado.

Prueba diferentes valores de retraso I/O

Usa la función de verificación de IC-Prog para asegurar que el firmware se haya quemado correctamente si ves que el PIC no funciona.

Si el voltaje MCLR# no fuera suficientemente alto (este problema se ha visto en portátiles, pero también en PCs con un puerto COM débil), puedes proporcionar este voltaje desde el exterior de 15-20v en los extremos de C1(de 100mf).Usa o dos baterías de 9V o un PSU que entrega al menos 15V. No hace falta ningún regulador ya que los diodos zener limitan el voltaje. No olvides la resistencia de 220 Ohm – que limita la corriente y protege el circuito JDM.

Si esta solucion no es suficiente para alcanzar la tension necesaria de programacion ,se puede probar con un amplificador RS2323 con alimentacion externa, tal vez sea un solucion drastica pero muchos usarios qeu lo han probado han tenido exito.

Si usted mira esta página, usted probablemente parece hice cuando traté de controlar a un programador autoimpulsado PIC con mi ordenador portátil. Sí, el puerto serie era el tipo ” el poder extremo bajo ” y wouldn ` la t proporciona bastante corriente para impulsar al programador. El problema era claro y la solución también . Yo podría haber modificado al programador para conseguir el poder de en otra parte, pero en el futuro yo me estrellaría con la misma pared. Necesité algo al interfaz el puerto serie de poder bajo al programador hambriento. No encontré nada en el web, entonces decidí diseñarlo solo. Otra vez, la MÁXIMA debía allí ayudar con uno de su ICS simpático tramado, el MAX205
El MAX205 es algo similar a MAX232 popular pero estos son las buenas noticias:
Ello hast 5 receptores y 5 conductores en vez de sólo 2 + 2. ¡¡Esto no necesita condensadores de bomba de precio externos!! Si usted une(conecta) las salidas TTL de los receptores RS-232 (al TTL) las entradas de los conductores RS-232, usted con eficacia consigue las señales originales con mucha corriente para cualquier dispositivo impulsado por serie con un circuito sumamente simple:

No olvide de conectar los conectores DB9 a tierra del circuito. Como se puede observar en el esquema las entradas del RS-232 no necesitan ser amplificadas , por lo que todo lo que tiene que hacer usted es alimentar el Max205 con 5v.(por ejemplo puede usar cualquier fuente en desuso y añadirle un simple 7805 de regulador).

Como grabar un PIC16Fxx con el JDM con un portátil


El programador JDM es una solución de bajo coste para la introducción de un programa en la memoria flash interna del PIC. Además de los planes originales de Jens Dyekjær Madsen, también hay muchos esquemas modificados en la web, entre elllos el TE20, el TE20x o el grabador_smt1.De destacar R1 y el voltaje de D5 son modificaciones adicionales que son necesarias para todos los PICs recientes que vienen con una capacidad de programación de bajo voltaje (que, de hecho, el programador JDM no utiliza y debe ser deshabilitada con la resistencia pulldown en el pin RB3) y un valor ligeramente incrementado para el diodo Z para cumplir las especificaciones de programación del PIC16F87x y PIC18F452.

Web oficial: http://www.jdm.homepage.dk/newpics.htm

Este programador es alimentado por el puerto RS232 del PC y funciona con niveles RS232 <±8.6V.

Dispositivos que soporta JDM
24CXX, EEPROM
PIC12C5XX
PIC12C67X
PIC16C55X
PIC16C61
PIC16C62X
PIC16C71
PIC16C71X
PIC16C8X
PIC16F8X
Tarjetas ISO con ASF

4 diodos 1N4148
1 diodo Zener de 8.2v
1 diodo Zener de 5.1v
1 capacitor electrolítico de 100uF x 40v
1 capacitor electrolítico de 22uF x 16v
2 transistores BC547B
1 resistencia de 10k, ¼ de watt
1 resistencia de 1.5k, ¼ de watt.
1 zócalo de 18 pines
Es un circuito muy simple, pero que tiene varias ventajas que lo hacen muy interesante:

>Se conecta al puerto serie, que generalmente en cualquier PC esta disponible.
>Existe software gratis para utilizarlo, incluso bajo DOS, LINUX y por supuesto Windows (incluido WinXP)
>Sirve para programar varios modelos de PICS (PIC12C5XX, 12C67X, 24CXX, 16C55X, 16C61, 16C62X, 16C71, 16C71X, 16C8X, 16F8X entre otros ) y también para leer/escribir varios chips de memoria (24Cxx ). Otros microcontroladores también pueden ser programados mediante un adaptador.
>Dispone del conector ICSP (In-Circuit Serial Programming) para la programación de microcontroladores sin necesidad de desmontarlos de su placa de circuito impreso.
>No necesitamos de una fuente de alimentación externa, ya que se alimenta directamente del puerto de la PC.
>Su costo es muy bajo, los componentes necesarios difícilmente nos cuesten mas de 3 o 4 u$s y son muy fáciles de conseguir.

Una aclaración importante antes de seguir adelante: el hecho de que el programador se conecte a un puerto serie RS-232 de la PC no significa que el protocolo utilizado para comunicar la PC y la placa del programador sea este, de hecho se puede adaptar este circuito para conectarlo al puerto paralelo e incluso USB. Como dijimos antes, los tiempos, y las señales necesarias para programar los PICs dependen de un protocolo especifico desarrollado por Microchip, por lo que utilizamos el puerto como vehiculo para llevar los bits al PIC y para obtener las tensiones necesarias para la programación, pero utilizando un programa y un protocolo especifico para esta tarea

DESCRIPCION DEL CIRCUITO.

La tensión de la entrada de reloj está limitada mediante D3 y D4 sin que sea necesaria ninguna resistencia limitadora.

Los diodos a Vdd internos del PIC protegen también las entradas. Los dispositivos 24CXX no tienen ningún diodo a Vdd, y D4 es absolutamente necesario.

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES Programador PIC y EEPROM JDM 13.5

Q2 aumenta el voltaje de salida a niveles RS232. Entonces funciona como base común. R2 es una resistencia pull-up que no resulta fundamental debido a la corriente limitada del puerto RS232. Q2 también limita la tensión de la entrada al PIC cuando DTR es de nivel alto. Entonces funciona como un seguidor de emisor y se reduce la tensión de la entrada a Vdd-0.7V.

Cuando DTR se pone a nibel bajo, Q2 trabaja invertido y la ganancia sólo es aproximadamente 5. La resistencia equivalente es aproximadamente 10K/5 = 2K. Esto reduce la corriente de entrada de datos al PIC junto con la resistencia R2. Cuando DTR cambia de nivel bajo a nivel alto, Q2 cambia de modo invertido saturado a seguidor de emisor activo. Esta causa un pico sobre los datos, pero el pico está extinguido cuando cambia el reloj. Esto garantiza que las eeprom no pasen al modo de prueba.

Q1 trabaja en cierto modo como seguidor de emisor también, pero se satura cuando es activo. En ese caso su tensión CE es muy baja. El transistor activa o desactiva la tensión para MCLR.

TXD alimenta a C2 para que alcance 13V a través de la unión base-colector de Q1. El tensión en C2 está limitado por el zener D6 y es aproximadamente 5.1V+8.2V = 13.3V. Cuando TXD está a nivel alto la tensión en MCLR no excede esta tensión. La base sube a una tensión mas alta, pero Q1 se satura y la salida no excederá la tensión de colector.

C2 proporciona la Vpp y la Vdd a través del diodo zener D6. Pero Vdd sólo aparece si el voltaje en C2 es aproximadamente de 13V. Si tiene 8V, entonces será posible controlar la alimentación mediante RTS y DTR. La alimentación C2 se reduce aproximadamente a 8V por medio de TXD, DTR y RTS mantenidas a nivel alto durante aproximadamente 0.5s.

El diodo extra, D5, limita la tensión sobre TXD. En principio se utiliza para alimentar la eeprom cuando DTR y RTS están a nivel alto. También garantiza que MCLR es mayor de -0.2V cuando TXD está a nivel bajo. El diodo D7 pone MCLR a nivel bajo cuando TXD está a nivel bajo.

El PIC también es alimentado por RTS mediante D3. La corriente de entrada “on data” también alimenta el PIC a Vss. Ambas señales necesitan ser negativas para alimentar al dispositivo con la máxima corriente posible. C2 alimenta al PIC si las señales son positivas. RTS y DTR no son criticas al programar el 24CXX, porque el diodo D5 pone Vss a nivel bajo.

Al programar un PIC sólo D3 puede utilizarse. RTS y DTR necesitan ser de nivel bajo para alimentarlo, y no deben estar a nivel alto durante demasiado tiempo. La corriente es excepcionalmente alta al leer ceros del PIC, y el tiempo de lectura activo con DTR a nivel alto debe ser corto. Para compensar el corriente utilizada, un nivel bajo de be aplicarse a RTS durante un tiempo extra.

Si reemplaza D5 y D7 por un BC557B,es importante que sepa que la base-emisor se comporta como un un diodo zener. Sólo D7 pueden actuar como un zener, y MCLR necesita ser conectada al emisor, mientras el colector del BC557B se conecta a Vss. El transitor trabaja en cierto modo como seguidor de emisor, y proporciona a MCLR una corriente alta extra.

Esta corriente alta no es necesaria, y puede incluso dañar al BC557B si el programador se conecta con alimentación externa. Conectar el programador a una fuente de alimentación externa siempre puede causar problemas, y no se permite para el uso normal.

El peligro de conectar una fuente de alimenmtación externa está en que el diodo zener interior reduce el voltaje a 5.1V. Puede ser perjudicial que se aplique una tensión demasiado alta. Las conexiones externas pueden causar problemas también debido a tensiones negativas. Vdd se conecta a la masa del PC y pueden provocarse cortocircuitos si un circuito externo se conecta con la masa del ordenador, por ejemplo a traves de la toma de tierra. Una fuente de alimentación externa también puede dar problemas de seguridad si los PIC u otros dispositivos no se insertan adecuadamente

Generalmente este diseño funciona muy bien sobre puertos serie “estandard” ( de pc de sobremesa) pero ultimamente en los pc’s modernos o portatiles no termina de funcionar a traves de adaptadores usb a rs232 ( ya que en la mayoria de lso portatiles se ha eliminado este util puerto)

IC-Prog por Bonny Gijzen parece ser el software de grabación más flexible, ya que no solo soporta el JDM, sino muchos otros programadores. Se puede descargar aquí: http://www.ic-prog.com. Antes de empezar a programar cualquier chip, por favor, revisa tu circuito de programación en el menú Hardware Check .( Es Importante que no midas los voltajes con un osciloscopio o instrumentos similares que estén conectados a tierra como tu PC, ya que esto falsificaría los resultados de la medicon pues el JDM usa la conexión de tierra para Vdd).

Otros programadores que soportan el JDm y sus variantes: WINPIC800, WINPICPGM

Por tanto para probar el TE20 ,usaremos el IC-PROG y un multímetro con batería .Sigue estas instrucciones:

Ve a Settings->Hardware menu, ponlo en “JDM Programmer”, selecciona el Puerto (COM1, COM2, …?), Selecciona Interface Direct I/O (bueno para Windows 9x) o API (Windows ME/NT/2000/XP). Comienza con I/O Delay 0, No inviertas ninguna señal:

Ahora selecciona el dispositivo correcto:: Settings->Device->Microchip PIC->PIC16F84)

Start Settings->Options, ve al sub-menú “Programming”

Habilita “Verfiy after programming” y “Verify during programming”. La última opción asegura que se te notifiquen inmediatamente los errores de programación. La primera opción es especialmente necesaria para los derivados de PIC16F87xA, ya que IC-Prog no verifica estos chips durante la programación.

Ve al submenú “Misc”, habilita “Vcc control for JDM” y selecciona “Realtime” en Process Priority

Ve a Settings->menú Hardware Check

Prepara tu multímetro y revisa los voltajes de tu programador.

Notas:

Cuando se deshabilita una señal, el voltaje cae hasta 0V muy, muy despacio, ya que los capacitadores no se descargan con una carga. Así que no estés pendiente de los valores de señales desactivadas, solo revisa las señales habilitadas.

Los voltajes cambiarán a los valores correctos y especificados cuando haya un PIC en el socket. El propósito de la revisión de hardware no es ver los voltajes correctos, sino asegurarse de que las señales puedan ser controladas (switched on/off) por tu PC. Si te quieres asegurar de que el voltaje no sea demasiado alto en la carga para verificar que el circuito esté correctamente cableado, conecta temporalmente una resistencia de 1k entre Vss y el “pin en pruebas”.

¡¡¡Asegúrate de que no haya PIC en el socket de programación!!!

Pulsa sobre “Enable Data Out“: La caja de Data In debe ser automáticamente seleccionada para soporte de hardware (Data Out->Data In). Desconecta “Data out” de nuevo. No te preocupes si Data In se acciona en los siguientes tests, este es el comportamiento normal.

Pulsa sobre “Enable MCLR“, mide el voltaje entre Vss (Pin 12/31) y MCLR# (Pin 1) : ca. 14 V

Deshabilita todas las señales

Pulsa sobre “Enable Vcc“, mide el voltaje entre Vss (Pin 12/31) y Vdd (Pin 11/32): ca. 5 V
Si esta prueba falla, asegúrate de que la opción “Vcc control for JDM” esté activada en el submenú “Misc”(Settings->Options)
Deshabilita todas las señales y p

Pulsa sobre “Enable clock“, mide el voltaje entre Vss (Pin 12/31) y RB6 (Pin 39): ca. 5 V +/- 1 V, despues deshabilita todas las señales
Pulsa sobre “Enable Data Out“, mide el voltaje entre Vss (Pin 12/31) y RB7 (Pin 40): ca 5 V +/- 0.5 V
Ahroa enchufa el PIC en el socket de programación.
Start Command->Read All

Durante la lectura:
Mide el voltaje entreVss (Pin 12/31) y MCLR# (Pin 1) : ca. 13.7 V
Mide el voltaje entre Vss (Pin 12/31) y Vdd (Pin 11/32): ca. 5.1 V

No tiene sentido medir los voltajes de los otros pines, ya que se accionan muy rápido.

Nota: El programador JDM no funcionará cuando pruebes estos pines con un osciloscopio (GND->Earth problem)
Si no mides 13.7V entre Vss y MCLR cuando el PIC esté enchufado, puedes incrementar/decrecer el voltaje con el I/O Delay en el menú Hardware. Retrasos más bajos incrementan el voltaje, retrasos más altos decrecerán el

voltaje! Me di cuenta de que no se pueden alcanzar 13.7V cuando se accede al JDM a través de las funciones API de Windows

Start File->Open File: carga el firmware (archivo .hex ) en IC-Prog

Start Command->Program All

Ahora pasarán unos 3 min. hasta que el PIC esté programado. Si la escritura no funciona, IC-Prog lo notificará como “Verify failed” cuando esten marcadas “Verfiy after programming” y “Verify during programming” en Settings->Options->submenú Programming

Nota:Parece que con algunos PCs, el proceso de programación solo pasa cuando el pin 5 (GND) del enchufe SubD-Plug está conectado con el chásis de metal(tierra) del conector.
Después de que la programación esté hecha, tu PIC estará preparado 🙂

Solución de problemas
Compara tu circuito con el esquema y la base PCB una y otra vez- Revisa especialmente la polaridad de los diodos, capacitadores y transistores. Asegúrate de que las soldaduras estén bien (sin falsos contactos)
IC-Prog a veces se olvida alguna opción bajo circonstancias desconocidas (por ej. el retraso I/O y el número de puerto COM ). Así que si falla el proceso de quemado, asegúrate de tu configuración no se ha cambiado.

Prueba diferentes valores de retraso I/O

Usa la función de verificación de IC-Prog para asegurar que el firmware se haya quemado correctamente si ves que el PIC no funciona.

Si el voltaje MCLR# no fuera suficientemente alto (este problema se ha visto en portátiles, pero también en PCs con un puerto COM débil), puedes proporcionar este voltaje desde el exterior de 15-20v en los extremos de C1(de 100mf).Usa o dos baterías de 9V o un PSU que entrega al menos 15V. No hace falta ningún regulador ya que los diodos zener limitan el voltaje. No olvides la resistencia de 220 Ohm – que limita la corriente y protege el circuito JDM.

Si esta solucion no es suficiente para alcanzar la tension necesaria de programacion ,se puede probar con un amplificador RS2323 con alimentacion externa, tal vez sea un solucion drastica pero muchos usarios qeu lo han probado han tenido exito.

Si usted mira esta página, usted probablemente parece hice cuando traté de controlar a un programador autoimpulsado PIC con mi ordenador portátil. Sí, el puerto serie era el tipo ” el poder extremo bajo ” y wouldn ` la t proporciona bastante corriente para impulsar al programador. El problema era claro y la solución también . Yo podría haber modificado al programador para conseguir el poder de en otra parte, pero en el futuro yo me estrellaría con la misma pared. Necesité algo al interfaz el puerto serie de poder bajo al programador hambriento. No encontré nada en el web, entonces decidí diseñarlo solo. Otra vez, la MÁXIMA debía allí ayudar con uno de su ICS simpático tramado, el MAX205
El MAX205 es algo similar a MAX232 popular pero estos son las buenas noticias:
Ello hast 5 receptores y 5 conductores en vez de sólo 2 + 2. ¡¡Esto no necesita condensadores de bomba de precio externos!! Si usted une(conecta) las salidas TTL de los receptores RS-232 (al TTL) las entradas de los conductores RS-232, usted con eficacia consigue las señales originales con mucha corriente para cualquier dispositivo impulsado por serie con un circuito sumamente simple:

No olvide de conectar los conectores DB9 a tierra del circuito. Como se puede observar en el esquema las entradas del RS-232 no necesitan ser amplificadas , por lo que todo lo que tiene que hacer usted es alimentar el Max205 con 5v.(por ejemplo puede usar cualquier fuente en desuso y añadirle un simple 7805 de regulador).

Un despertador muy perspicaz


circuito_funcionando

Realmente la electrónica evoluciona a un ritmo  frenético y la verdad es que lo queramos o no, la electrónica del siglo XXI es difícil de entender sin la ayuda de los elementos programables, ocupando sin  duda un lugar crucial  en este apartado, los microcontroladores, por su gran flexibilidad, bajo precio y altísimas prestaciones, por lo que cada vez mas, dispositivos corrientes  (incluso  de relativa sencillez), integran en gran parte de su electrónica un microcontrolador  o un microprocesador, siendo cada vez mayor la lista de dispositivos y aparatos  que  utilizan esta tecnología: electrodomésticos, periféricos para ordenadores, teléfonos móviles, etc.

La verdad es que si bien la electrónica en general se ha visto muy mejorada por la simplificación de los componentes necesarios  en cualquier proyecto complejo ( piénsese que  un microcontrolador  integra prácticamente todo lo necesario: CPU, memoria, timers, puertos de E/S, controladores de LCD, etc. ), no lo ha sido  así  el software requerido para  que estos  cumplan con el cometido deseado, pues tradicionalmente este  se creaba   basándose en   ensamblador, el cual es  un lenguaje  muy  potente  por ser muy cercano a la maquina, si bien como contrapartida, es muy dependiente de esta, y además es  de relativa  dificultad  para todos los aficionados que desean empezar en este mundo y no poseen los conocimientos de programación que se requieren.

Afortunadamente  en el mundo de los dispositivos programables recientemente han aparecido nuevos lenguajes más próximos al lenguaje natural (en C  o en Basic)   que nos pueden ayudar  en el desarrollo del software de estos dispositivos: precisamente   desde estas líneas intentaremos demostrar la gran sencillez  para realizar un proyecto electrónico medianamente  complejo basándonos en un simple y barato microcontrolador (en esta ocasión usaremos el PIC16F84A)   desde cero usando el sencillísimo   lenguaje  PIC-BASIC-PRO (en adelante PBP).

A  continuación intentaremos  transmitir los conocimientos mínimos para que cualquiera que no haya programado  ningún PIC, simplemente  estudiando  las explicaciones siguientes, junto con los ejemplos  de porciones del proyecto, pueda iniciarse progresivamente  en la comprensión  de la programación de estos dispositivos tan potentes, de modo que  al final como colofón pueda comprender  el programa definitivo, el cual es plenamente funcional, y será encargado de gestionar por completo el proyecto  del reloj-temporizador semanal con salida a LCD que se  propone.

Tal  y como se ha adelantado, el proyecto versara sobre  un  reloj con display LCD de dos líneas en el que mostraremos información de la hora actual  ,el día de la semana y el modo de temporización  seleccionado) contando para su control de  varios pulsadores ( para ajustes de  día de semana, hora y día actual, ajuste de hora  de activación y ajuste de modalidad de activación) y dos salidas independientes ( una para la luz de fondo del display y otra para usos varios:  buzzer, relé, etc.).

El corazón del circuito tal y como hemos expuesto Serra un PIC16F84 el cual programemos con el código en PBP   que más adelante  citaremos (aunque la mayoría de las partes de este ya han sido comentadas.

A este conectaremos por un lado  los cinco pulsadores, las dos salidas  y por otro lado el display LCD.

Respecto a las entradas utilizaremos pulsadores normalmente abiertos  conectados  a su vez a resistencias de 10k para asegurar que en  reposo hay un valor alto.

En cuanto al display, para esta ocasión utilizaremos cualquier LCD de dos líneas compatible con Hitachi 44780, el cual conectaremos al PIC  en modo 4 bits (utilizando los 4 bits altos) .El resto de  las conexiones del LCD lo haremos según la recomendación de PBP:

Pin 1àgnd

Pin2à+5V

Pin3  à+5v

Pin4(RS) àRA4

Pin5 àN.C.

Pin6(EN) àRB3

Pines7,8,9.10 àN.C.

Pin 11àRA0

Pin 12à RA1

Pin 13à RA2

Pin 14àRA3

Por ultimo, todo el circuito podemos  alimentarlo o bien con alimentador filtrado  a cuya salida conectaremos un regulador tipo 78L05  y dos condensadores de filtro  tanto en la entrada como en la salida de este o bien en su lugar una económica fuente conmutada de 5V ya montada( en cuyo caso no necesitaremos el citado  regulador y el circuito será aun más compacto.

El circuito se completa con un diodo de protección a la entrada  para evitar  cambios de polaridad dado que  el circuito lo alimentaremos con un simple alimentador externo  reciclado  que  entregue  5V.
diseño despertador

Lista de componentes

R1=47K

R2,R3,R4 ,R5 y R8=10K

R6,R7=470ohm

C1,C2=10Mf/16v

C3,C4=10nF

C5,C6=27pf

Q1=XTAL 4Mhz

U1=78L05

IC1= PIC16F84A

DIS2=display 16 caracteres y 2 lineas (POWERTIP PC1602F)

Varios:

Bloque Diodos leds tricolor( se puede reciclar  de una economica lamparita decorativa alimentada con pilas de botón fácilmente localizable en tiendas de decoración) .

S1, S2, S3, S4, S5= pulsadores miniatura normalmente abiertos.

Un zumbador de 5V.

Fuente conmutada de 5v 100mA( por  ejemplo se puede recuperar de un cargador de teléfono móvil en desuso).

Caja: usaremos una vieja caja de plástico de disquetes de 3 ½” .

Circuitos Impresos

Dada la sencillez del circuito este circuito puede realizarse muy  fácilmente sobre una placa  de puntos, o bien sobre una placa de prototipos o si lo desea sobre una simple  placa de una cara cuyo diseño se adjunta:

circuito_impreso

Diseño  a doble cara

Dada la extrema sencillez del circuito no se aconseja  realizar un circuito impreso de doble cara, pero para el lector que le interese se presenta a continuación junto con las conexiones de este con el resto de componentes.

Conexiones placa doble cara

 

Conector FUNCIÓN CONEXIÓN A
1 GND
2 +5V
3 +5V
4 RA0 PIN 11 LCD
5 RA1 PIN12 LCD
6 RA2 PIN13 LCD
7 RA3 PIN14 LCD
8 RA4 PIN 4 LCD
9 RB0 SALIDA 1
10 RB1 SALIDA2
11 RB2 PULSADOR1
12 RB3 PIN6 LCD
13 RB4 PULSADOR2
14 RB5 PULSADOR3
15 RB6 PULSADOR4
16 RB7 PULSADOR5
17 N.C.
18 N.C.
19 +5V
20 GND

 

Pasos para la construcción del prototipo

 

Paso 1: Compilación del código fuente

El código  generado en PBP  por si mismo  no es apto para ser  cargado en el PIC,  ya que este solo  entiende su propio lenguaje máquina, para lo cual deberemos convertir  con un complilador nuestro código escrito en PBP a un código que el micro pueda procesar.

Existe una versión gratuita  limitada de  PIC Basic Pro  en su web oficial http://www.melabs.com/pbpdemo.htm

Como el lector adivinara el  entorno del compilador   PIC-BASIC-PRO es algo austero (requiere trabajar en línea de comandos y un editor de texto),  por lo que por lo general lo normal será usar un entorno de desarrollo Grafico (IDE) donde el editor, grabador, compilador,  etc. estén  integrados  como por ejemplo el MicroCode Studio  de la casa Mecanique ,el cual se puede descargar de la siguiente url: http://www.mecanique.co.uk/products/compiler/pbp.html

NOTA: Para aquellos lectores que  deseen adquirir directamente el código del proyecto ya compilado y no deseen compilarlos por ellos  mismos pueden solicitarlo gratuitamente a: [email protected]

Paso 2: Simulación del código fuente

Con objeto de no estar continuamente programando  el PIC, existen simuladores para no tener que realiza ningún  prototipo  físicamente y de esta manera evaluar  el comportamiento global de este  antes de estudiar su realización real.

Existen muchos simuladoras, por software (por ejemplo Proteus es el más famoso),  pero existe uno especifico para PIC’s: el PIC Simulator de  OshonSoft (se puede descargar una versión limitada en http://www.oshonsoft.com/downloads.html )

Suponiendo  instalado el software para la simulación del código,  realizaremos los siguientes pasos:

  1. FileàLoad Programà .hex

 

  1. ToolsàLCD ModuleàChange LCD Module Color SchemeàLCDtype 2x:2×16,data lines:portA.interface 4 bits Low,RS:A4,E line=B3,r/W:no used

 

  1. Tools àMicrocontroller View

 

  1. RateàFast

 

  1. SimulationàStart

 

Paso 3: Grabación del PIC

Una vez obtenido el código ensamblado y simulado necesitaremos  un simple circuito llamado programador  para salvar el .hex en la flash del PIC. Normalmente los programadores más simples están   basados  en el diseño JDM, siendo el más usual el TE20 (  se puede conseguir fácilmente    en http://todoelectronica.com ).

Para poder emplear nuestro grabador, necesitaremos un software grabador que lo permita. Uno de los programas para grabación de PIC’s mas conocidos es  el Ic-Prog, el cual se puede descargar gratuitamente de http://www.ic-prog.com/index1.htm

Proceso de Grabación  a través  del ICPROG  con el TE20

Ponemos en marcha en ICPROG 1.06b, si lo iniciamos por primera vez, nos saldrá una pantalla de configuración, si no es el caso, pulsamos la tecla F3 (settingsàHardware), una vez en ella, colocaremos las siguientes opciones:

·        Programmer: JDM Programmer

·        Ports: Com1 o Com2 dependiendo de donde hallamos colocado el TE20

·        I/O Delay: Normalmente, tiene que estar a 5, pero si nos da problemas al programar la eeprom, lo colocaremos en 4.

·        Interface: Direct I/O

·        Communication: Todas sin activar

Ahora nos vamos a SettingsàOptions, y chequearemos las pestañas:

·        I²C: Ambas tienen que estar desactivadas

·        Misc: Desactivar la opción de “Enable Vcc control for JDM”

·        Programming: Tiene relación con el fuse “CP”   (Code Protection) para la protección del PIC tendremos que desactivar ambas casillas, pero si queremos verificar que nuestro PIC o eeprom ha sido bien grabado tendremos que desactivar el fuse “CP” y activaremos cualquiera de la dos casillas, la primera lo verifica al acabar de programar y la segunda mientras programa (se aconseja dejar la primera opción). Si activamos el verificado y el fuse “CP” nos dará el 0000h.

Seguidamente en la parte izquierda de la pantalla  seleccionamos los  fuses y Oscilator:

FUSES

·        “WDT” :Perro Guardián. Cuando el programa entra en un bucle infinito, el WDT se desborda y resetea el PIC

·        “PWRT”:Power on Reset. Hasta que el PIC no alcance una tensión de funcionamiento correcta lo mantiene en reset

·        “CP”: Code Protection. Protege el código contra lectura.

OSCILATOR

·        “LP”:Oscilador de bajo consumo, de frecuencia de 35 a 200Khz.

·        “XT”:Oscilador para frecuencias estándar, de 100Khz a 4Mhz

·        “HS”:Oscilador de alta velocidad de 4Mhz a 10Mhz (Cristal de Cuarzo) àlo seleccionaremos

·        “RC”:Oscilador de bajo coste formado por condensador y resistencia

Finalmente, una vez llegado ha este punto, vamos a comenzar la programación del PIC en nuestro TE20 que debe de estas desenchufado del cable ext. RS232, con las muescas del chip que coincida con las muescas del  zócalo de 18 pines. Una vez colocado, enchufamos el TE20 al cable, elegimos el chip (en nuestro caso  PIC 16F84) en el menú superior   abrimos el archivo compilado (.hex), el oscillator debe de estar en XT y los fuses todos desactivados, el CP lo podemos activar o no, dependiendo de las necesidades.

Ya sólo nos queda cruzar los dedos y darle a Commandà Program all o al icono que tiene un chip con un rayo…

Si tuviéramos algún problema en la grabación del chip  bajaríamos la velocidad del puerto donde estuviera enchufado el TE20 a 2400 bits por segundo, pero si persiste el problema consultar  en esta URL: http://soloelectronicos.wordpress.com/2008/07/24/como-grabar-un-PIC16fxx-desde-un-portatil-con-el-te20jdm/).

Paso4: Realización del circuito

Como el lector  habrá comprobado a lo largo de todos los apartados anteriores, tras el  paso de  grabación del PIC, ya solo  nos queda alimentar este  y  conexionar  todos sus periféricos para que nuestro proyecto cobre vida

En este proyecto, la realización práctica incluye  tres  partes:

  • La placa de control en la que incluiremos los siguientes elementos:

–          El circuito del resonador formado por el cristal de cuarzo de 4Mhz  y los dos condensadores cerámicos conectados a este .

–          La fuente de alimentación  de 5voltios 50mA(opcional si o se cuenta con una fuente externa de estas características ), formada por un regulador  tipo 75L05(de baja potencia) y lo respectivos condensadores de desacople .

–          El zumbador  ( que conectaremos a B1).

–          Las resistencias de 10K  que nos aseguran en valor alto en las entradas asociadas a los pulsadores.

–          El microcontrolador programado con el programa descrito.

  • La placa del display LCD de dos líneas que  se conectara a la  placa de control de la siguiente forma:

Pin 1àgnd

Pin2à+5V

Pin3  à+5v

Pin4(RS) àRA4

Pin5 àN.C.

Pin6(EN) àRB3

Pines7,8,9.10 àN.C.

Pin 11àRA0

Pin 12à RA1

Pin 13à RA2

Pin 14àRA3

  • La placa de entradas: tal y como se ha descrito en nuestro caso estará constituido por  cinco  pulsadores normalmente abiertos, los cuales conectaremos directamente a la placa de control   a B7, B6, B5, B4, B2, B3 ( recuerde que en esta ya hemos incluido las resistencias de 10K.

 

Paso 5: Comprobación de resultados

Normalmente si el  micro está bien grabado y las conexiones de éste a sus periféricos son correctas el circuito debiera funcionar a  la primera sin problemas.

Un buen indicador de funcionamiento es el display LCD, de modo que si este no visualiza nada en su pantalla  lo más normal es que sea por  de falta de alimentación, en cuyo caso  comprobaremos   con un polímetro si la tensión de alimentación llega tanto  al micro como al LCD.

Si aún llegando alimentación al LCD, en el display de este  aparecen solos unos bloques oscuros en las primeras columnas  de la primera fila es señal de que o el micro no esta funcionando o las conexiones de este no son correctas, para lo cual comprobaremos  en primer lugar que las  conexiones del LCD a la placa de control son las correctas: echo esto deberían ya verse caracteres correctos en el LCD.

Si persiste aún el mensaje en el LCD es señal que las conexiones internas son incorrectas por lo que comprobaremos  que la resistencia de 47k esta correctamente conectada al pin 6 así como el cristal y los dos condensadores lo están  a los pines 15 y 16 del micro.

Una vez el circuito este funcionando ya solo cabe ajustar el reloj interno a la hora actual por lo que en primer lugar ajustaremos el día de semana y  la hora  actual  pulsando sobre el pulsador de  días/horas (al pasar 24 horas automáticamente se cambia al día de la semana siguiente hasta llegar al domingo que se vuelve a repetir el ciclo) y  después ajustaremos  los minutos pulsando directamente sobre el botón de  minutos ( al pulsar se va incrementando su valor hasta llegar a 60,momento en el cual vuelve a empezar desde 1.

Seguidamente ajustaremos  la hora de alarma pulsando el botón  de hora y minutos  de la hora de activación de la  alarma ( por simplificar el número de pulsadores  este  ajusta los minutos y también las horas de modo que presionando este se van incrementando los minutos de la hora de activación de modo que si se llega hasta los 60 minutos automáticamente se incrementa el valor  de las horas hasta llegar a las 24 h, momento en el que se vuelve a repetir el proceso.

Finalmente elegiremos el modo de activación, presionando sucesivamente el botón de modo , el cual definirá la periodicidad  semanal de activación, mostrando los siguientes mensajes en el lcd:

  1. ‘Off’: desactiva el circuito de temporización.

 

  1. ‘Tod’= lo activa para todos los días de  la semana.

 

  1. ‘Lab’= solo lo activa para los días laborales ( de Lunes a Viernes).

 

  1. ‘NoL’ =lo activa para todos los días excepto los Lunes.

 

  1. ‘Mañ’ =lo activa puntualmente para el día siguiente.

Para finalizar para desactivar tanto la luz de cortesía como el buzzer pulsaremos simplemente el botón “stop”.

Como detalle de cortesía, como puede verse en el código, pulsando cualquier pulsador se encenderá la luz del display aproximadamente un minuto.

Por ultimo animo desde estas líneas a que el lector experimente con el código en PBP que a continuación  se adjunta  adoptándolo y personalizando a las necesidades y exigencias particulares  que se crean oportunos a nuevos proyectos, pues como habrá podido observar realmente programar un PIC no es tan complicado ¿verdad?

Listado del programa en PBP

‘****************************************************************

‘***********************************************

‘***  PROGRAMADOR SEMANAL CON SALIDA a rele

‘***     Por Carlos Rodríguez Navarro

‘***    [email protected]

‘****    procesador PIC16F84

‘****  28/octubre/2008

‘ DISPLAY LCD HD 44480

‘RA0,RA1,RA2,RA3=DATOS(PINES 11-14)

‘RB3=ENABLE   (PIN 6)

‘RA4=RS     (PIN 4)

‘vcc (pin 2)

‘gnd (pin 1)

‘vee(pin 3)   a vcc

‘SALIDAS

‘alarma1   portb.0    ‘salida

‘ luz portb.1     ‘salida

‘PULSADORES

‘alarma_boton portb.2    ‘ent

‘solo_hora_boton portb.7  ‘ent

‘hora_boton portb.4    ‘ent

‘prog_boton portb.5    ‘ent

‘periodo_boton portb.6  ‘ent

‘***********************************************

symbol alarma1=portb.0    ‘salida

symbol luz=portb.1     ‘salida

SYMBOL alarma_boton=portb.2    ‘ent

SYMBOL  solo_hora_boton=portb.7 ‘ ent

symbol  hora_boton=portb.4    ‘ent

symbol  prog_boton=portb.5    ‘ent

symbol periodo_boton=portb.6  ‘ent

ticks var byte

hora var byte

horaal VAR BYTE

minuto var byte

minutoal VAR BYTE

segundo var byte

semana VAR BYTE

delay var byte

DESC VAR BYTE

desc1 var byte

lunes var bit

martes var bit

miercoles var bit

jueves var bit

viernes var bit

sabado var bit

domingo VAR Bit

PATTERN VAR BYTE

i var byte

minutoluz var byte

TRISA=0      ‘PORTA COMO SALIDAS         ( 0=output,1=input)

TRISB= $f4  ‘116   ‘RB0,RB1,rb3 COMO SALIDAS   resto entradas   1110100=  116

‘PONER A CERO HORA,MIN,SEG Y TICLS

HORA=0

horaal=0

MINUTO=0

minutoal=0

SEGUNDO=2

semana= 1

TICKS=0

DESC=0

DESC1=0

Lcdout $fe, 1 ‘ Clear LCD screen

lcdout $FE,2

lcdout “CRN”   ‘mensaje de cortesia

pause 10

‘INICIALIZAR VECTOR INTERRUPCOPN

OPTION_REG=$05  ‘timer prescaler es cargado a 64 a traves de option_reg  00000101

ON INTERRUPT GOTO ISR

INTCON=$A0           ‘habilita INTERRUPCIONES POR TMR0

‘BORRAR DISPLAY

LOOP:           ‘bucle principal de ejecucion

‘bloque de ajuste minutos,hora, segundos y dia de la semana

IF solo_hora_boton=0 THEN      ‘si se pulsa el boton de ajuste

GOSUB RETARDO

IF solo_hora_boton=0 THEN      ‘si se pulsa el boton de ajuste

MINUTO=MINUTO+1               ‘se incrementan minutos

gosub minuto60

endif

endif

‘bloque de ajuste minutos,hora, segundos y dia de la semana

IF HORA_boton=0 THEN      ‘si se pulsa el boton de ajuste

GOSUB RETARDO

IF HORA_boton=0 THEN      ‘si se pulsa el boton de ajuste

minuto=60

‘  hora=hora+1

GOSUB minuto60 ‘HORA24

endif

endif

‘bloque de ajuste hora de alarma

IF PROG_boton=0 THEN      ‘si se pulsa el boton de ajuste    hora alarmas

GOSUB RETARDO

IF PROG_boton=0 THEN      ‘si se pulsa el boton de ajuste    hora alarmas

MINUTOAL=MINUTOAL+1               ‘se incrementan minutos

IF MINUTOAL>59 THEN            ‘horas

MINUTOAL=0

horaAL=horaAL+1

endif

if horaal>23 then horaal=0

endif

endif

‘bloque ajuste periodicidad  de alarma ( 6 modos)

IF periodo_boton=0 THEN      ‘si se pulsa el boton de ajuste de semanas

GOSUB RETARDO

IF periodo_boton=0 THEN

DESC=DESC +1

DESC1=DESC

IF DESC=6 THEN

desc=0

DESC1=0

ENDIF

endif

endif

‘bloque apagado de alarma y de la  luz

IF alarma_boton=0 THEN      ‘si se pulsa el boton de ajuste de semanas

pause 150

IF alarma_boton=0 THEN

desc=desc1 ‘restara modalidad alarmqa

low alarma1     ‘resetea alarma

low luz

endif

endif

‘condicion de alarma

if hora=horaal and minuto=minutoal and segundo=1  and ( semana=   lunes*1  or   semana=martes*2 or  semana=miercoles*3 or     semana=jueves*4 or      semana=viernes*5 or   semana=sabado*6 or  semana=domingo *7)   then

GOSUB LUZON       ‘ enciende luz de fondo

HIGH ALARMA1      ‘activa alarma

desc=5         ‘PINTA EN PANTALLA

ENDIF

‘apaga la luz de fondo al minuto

if minutoluz=minuto then

gosub  luz_fondo_off

endif

gosub display

goto loop             ‘bucle principal de ejecucion

‘RUTINA DE SERVICIO

DISABLE

ISR:

TICKS=TICKS +1

if ticks<61 THEN SINACTUALIZAR

TICKS=0

SEGUNDO=SEGUNDO+1

IF SEGUNDO=60 THEN

SEGUNDO=0

MINUTO=MINUTO+1

gosub minuto60

ENDIF

SINACTUALIZAR:

INTCON.2=0   ‘   REACTIVA TMR0

RESUME

ENABLE

END

display:

lcdout $FE,2

lcdout dEC2 hora,”:”,DEC2 minuto ,”:”,DEC2 SEGUNDO,” ”

LOOKUP semana,[“0″,”L”,”M”,”M”,”J”,”V”,”S”,”D”,”M”] ,pattern

LCDOUT PATTERN

LOOKUP semana,[“F”,”U”,”A”,”I”,”U”,”I”,”A”,”O”,”A”] ,pattern

lcdout pattern

lcdout $FE,2

LcdOut $FE, $C0 ‘Principio segunda linea

lcdout dEC2 horaAL,”:”,DEC2 minutoAL ,” ”

select case desc

case 0:       LCDOUT “OFF”

gosub borra

case 1:     ‘todos los dias

gosub llena

LCDOUT “Tod “‘”LMXJVSD”

case 2: ‘laborales

gosub llena

sabado=0

domingo=0

LCDOUT “Lab”‘ LMXJV  ”

case 3 :   ‘libra lunes

gosub llena

lunes=0

LCDOUT “NoL”

case 4:         lcdout “Mañ”

GOSUB BORRA

IF  SEMANA=1 then martes=1

if semana=2 then  miercoles=1

if semana=3 then jueves=1

if semana=4 then viernes=1

if semana=5 then sabado=1

if semana=6 then domingo=1

if semana=7 then lunes=1

case 5:

lcdout “ON ”

end select

return

llena:               ‘inicializa a 1 los indicadores semanales

lunes=1

martes=1

miercoles=1

jueves=1

viernes=1

sabado=1

domingo=1

return

borra:         ‘inicializa a 0 los indicadores semanales

lunes=0

martes=0

miercoles=0

jueves=0

viernes=0

sabado=0

domingo=0

return

LUZON:

HIGH LUZ      ‘activa la luz de fondo guardando el minuto

minutoluz = minuto+1

if minutoluz>60 then minutoluz=1

RETURN

RETARDO:  ‘antirebotes de 150ms  pulsadores activando tambien la  luz de fondo

PAUSE 250

GOSUB LUZON         ‘ enciende luz de fondo

RETURN

HORA24:      ‘si se incrementan las horas mas de 24h

IF HORA=24 THEN

HORA=0

semana=semana+1

if semana>7 then    semana=1

endif

RETURN

minuto60:  ‘ si se incrementan los minutos mas de 60

IF MINUTO=60 THEN

MINUTO=0

HORA=HORA+1

GOSUB HORA24

ENDIF

return

luz_fondo_off:      ‘apaga luz de fondo

low luz

minutoluz=61

return

PULSA AQUI PARA ACCEDER AL FICHERO HEX—
PROGRAMADOR_SEMANAL_CON_LCD -hex

ATENCION:COPIAR Y PEGAR EL CODIGO AL BLOC DE NOTAS Y LUEGO RENOMBRAR A .HEX

Introduccion al PIC-Basic


Introducción al lenguaje PIC-BASIC-PRO

 

Variables

La programación sería prácticamente imposible sin el uso de variables. Podemos hacernos una imagen mental de la variable consistente en una caja en la que podemos guardar algo. Esa caja es una de las muchas que disponemos, y tiene en su frente pegada una etiqueta con su nombre. Estas cajas tienen ciertas particularidades, que hace que solo se puedan guardar en ellas determinados tipos de objetos.

En esta analogía, cada caja es una variable, su contenido es el valor que adopta, y la etiqueta es el nombre de la variable. Como su nombre  indica, y como veremos mas adelante, el contenido de una variable puede ser modificado a lo largo del programa

Tipos de datos

En PBP tenemos distintos tipos de variables, según el dato que puedan almacenar:

  • Bit :un bit de longitud, almacena 0 o 1 únicamente

 

  • Byte :un byte de longitud, almacena números enteros entre 0 y 255.

 

 

  • Word: dos bytes de longitud, almacenan números enteros entre 0 y 65,535(accederemos individualmente a cada uno de los bytes que componen un Word mediante las extensiones “. HB” y “. LB”) .

 

 

 

VAR

Las variables deben ser declaradas antes de utilizarlas, mediante la instrucción var, pero a diferencia de otros lenguajes en PBP, la declaración de variables puede ser hecha en cualquier parte del programa, y todas las variables son consideradas globales, es decir, su valor es accesible desde todas las subrutinas y zonas del programa, estando lógicamente limitado su  número al tamaño de  memoria RAM disponible en cada microcontrolador.

En el programa de  este proyecto utilizamos los siguientes variables:

ticks var byte: almacena el numero de pulsos que serán utilizados para calcular los segundos

hora var byte :almacenara la hora actual

horaal VAR BYTE: almacenara la hora de la alarma

minuto var byte : almacenara los  minutos de la hora  actual

minutoal VAR BYTE :  almacenara el minuto de la alarma

segundo var byte : almacenara los segundos de la hora actual

semana VAR BYTE :almacenara el día de semana actual

delay var byte : define el retardo para evitar lecturas erróneas en los pulsadores

DESC VAR BYTE : almacenara el modo de activación

PATTERN VAR BYTE: almacenara el tipo de día en dos caracteres

lunes var bit: define si la alarma se activara los lunes

martes var bit: define si la alarma se activara los martes

miercoles var bit : define si la alarma se activara los miércoles

jueves var bit : define si la alarma se activara los jueves

viernes var bit : define si la alarma se activara los viernes

sabado var bit : define si la alarma se activara los sábados

domingo VAR Bit : define si la alarma se activara los domingos

PUERTOS

Poco nos serviría un PIC  si no tuviésemos posibilidad de conectar éste con el mundo real  como displays, pulsadores, leds, relés, etc., cometido que se hace a través de los llamados puertos de entrad/salida.

Todos los puertos están disponibles para usar en los programas PBP, como si se tratase de variables del tipo BYTE con el nombre del registro utilizado en las hojas de características (PORTA, PORTB, TRISA, etc..). También se puede acceder a bits individuales simplemente usando las variables tipo byte RA, RB, RC, RD, RE o bien las tipo bit RA0, RA1, RA2,…, RE6, RE7.

Como en la mayoría de los controladores de E/S en  PBP debe definirse como emplearemos los bits de cada puerto (como entrada o como salida), cometido que se realizará a través del comando TRIS seguido  del nombre del puerto  asignándolo a un valor que en binario   transcribe   cada  bit  según esté a cero o uno como  ceros, si funciona ese bit como salidas o como entrada.

En el programa  de este proyecto utilizamos la siguiente definición de bits en los puertos:

TRISA=0      : define todos los bits del PORTA como  SALIDAS

TRISB= $F4  ‘ define algunos  bits del PORTB como  SALIDAS( los bits que estén a cero: BO, B1 Y B3 EL RESTO SERIAN ENTRADAS), veámoslo mas detalladamente: f4 en Hexadecimal es 11110100 en binario  por lo que si  miramos de izda a derecha este numero , los bits b0,b1 y b3 están  a cero  y   el resto ( b2,,b4,b5,b6 ,b7 )  a uno, por eso  las primeras RB0,RB1 Y RB3 se define como bits de salida (a las que conectaremos los circuitos de aplicación que nos interesen: buzzer, leds, relés etc.)    y las otras se definen como entradas RB2,RB4,RB5,RB6  y RB7 (a los que conectaremos  los pulsadores en el  proyecto).

SYMBOL

Una forma de escribir programas que nos resulte mucho más fáciles de entender es el uso de nombres simbólicos, o SYMBOL. Un “symbol” es una cadena que contiene código, asignado a un nombre. Al momento de compilar,  PBP hace la “búsqueda y reemplazo” de nuestros símbolos y luego genera el código ASM y el HEX. Supongamos que tiene un buzzer conectado al bit uno del puerto B. Mediante SYMBOL podemos hacer: SYMBOL ALARMA1 = PORTB.1, Luego, si queremos encender  la alarma1, en lugar de PORTB.1 = 1, podemos hacer  alarma1 = 1 que es mucho mas claro y fácil de leer. Por supuesto, el código que aparece a la derecha del igual no puede contener instrucciones.

En el programa de  este proyecto utilizamos los siguientes símbolos:

Symbol hora_boton=portb.4 : lo usaremos para modificar el número de semana y la hora.

symbol  prog_boton=portb.5 : lo usaremos para modificar la hora de la programación.

symbol periodo_boton=portb.6 : lo usaremos para modificar el periodo de funcionamiento del programador.

SYMBOL alarma_boton=portb.0 : lo usaremos para programar la hora de  la alarma.

symbol luz_boton=portb.7    : lo usaremos para encender la luz de fondo del LCD (la encenderemos durante un cierto periodo de tiempo siempre que pulsemos una tecla) y también para parar la alarma.

symbol alarma1=portB.1 :lo usaremos para hacer sonar un buzzer.

symbol luz=portb.2     : lo usaremos para encender la luz de fondo.

Las constantes (valores que usamos en nuestro programa, y que, por ejemplo, asignamos a las variables) pueden ser escritas en decimal (directamente el valor), en hexadecimal (anteponiendo “0x” o posponiendo “H” al valor) o en binario (anteponiendo “%” al valor).

Hay tres instrucciones para el manejo individual de bits, que si bien no hacen nada que no se puede resolver con otras instrucciones o símbolos, ayudan mucho en la lectura del código. Se tratan de HIGH, LOW y TOGGLE, que ponen el bit en alto, bajo o lo invierten, respectivamente. Importante: Si el bit implicado como argumento de una de estas instrucciones es un bit de un PORT, el mismo bit en el TRIS correspondiente es puesto en cero, y dicho pin queda configurado como salida.

Por ejemplo

low  alarma1 : desactiva el buzzer de alarma

low luz :apaga la luz de fondo

GOSUB

GOSUB significa literalmente “IR A Subrutina”, y sirve justamente para eso: desviar el flujo del programa a otro punto donde estará la subrutina.

Para usar GOSUB, es necesario poner una etiqueta en el lugar al que queremos “saltar”. Las etiquetas son simplemente nombres terminados en “:”, y también en muy importante terminar el código de la subrutina con la sentencia RETURN (para que una vez ejecutada la subrutina vuelva a la instrucción siguiente de donde se hizo la llamada).

Como ejemplo veamos una sección del programa presentado donde se utiliza una llamada a subrutina:

if hora=horaal and minuto=minutoal and segundo=1  and ( semana=   lunes*1  or   semana=martes*2 or  semana=miercoles*3 or     semana=jueves*4 or      semana=viernes*5 or   semana=sabado*6 or  semana=domingo *7)   then        ‘activacion

gosub alarma_on               ‘ACTIVACION  ALARMA

endif

..

alarma_on:      ‘subrutina de activación de alarma y luz de fondo

high alarma1 ‘ activa bit de alarma

high luz ‘ active bit de luz de fondo

return  ‘ devuelve el control

..

En el ejemplo anterior, si la condición del IF es cierta el programa  ejecutará la llamada a la subrutina alarma_on, la cual desviará la ejecución al bloque alarma_on (que vendrá delimitado  por su etiqueta)  hasta encontrar la sentencia RETURN que hará que el programa devuelva el control a la siguiente instrucción donde se había realizado la llamada.

Como se está viendo la utilización de  subrutinas es un modo muy poderoso de optimizar y ahorrar código ya que un mismo bloque (subrutina) podrá emplearse en múltiples sitios del programa sin por ello tener que repetirlo tantas veces como se necesite.

OPERACIONES LÓGICAS Y MATEMÁTICAS

PBP dispone de cinco operaciones matemáticas básicas, disponibles para las variables tipo Byte y Word. Estas son la suma (operador +), la sustracción (operador -), el producto (operador *), el cociente (operador /) y el módulo (operador MOD), siendo  posible calcular raíces cuadradas (aunque el resultado debe ser entero) con la función SQR, e incluso para las variables de tipo Bit existen siete operaciones lógicas disponibles. Solo es posible efectuar una operación lógica por instrucción (aunque es muy posible que próximas versiones permitan más flexibilidad.

IF – THEN – ELSE – ENDIF

En cualquier programa medianamente complejo que queramos realizar, seguramente necesitaremos en algún punto tomar alguna decisión basándonos en el estado de una entrada o en el valor de una variable.  PBP incorpora instrucciones que nos permiten este tipo de comportamiento, siendo la más sencilla y frecuentemente utilizada la sentencia IF – THEN – ELSE – ENDIF.

Caso 1: IF condición THEN instrucción, donde “IF” significa “SI….”, y “THEN” significa “LUEGO” o “ENTONCES”. El caso anterior puede leerse como “SI se cumple la condición, entonces ejecuto la instrucción” .La “condición” es una expresión lógica que puede ser verdadera o falsa. En caso de ser verdadera, la instrucción a continuación del THEN será ejecutada. En caso de la condición sea falsa, el programa seguirá su ejecución con la instrucción siguiente al “IF – THEN”.

Caso 2: IF…THEN…ENDIF: Muchas veces, luego de evaluar la condición necesitamos ejecutar más de una instrucción. En los ejemplos vistos en el CASO 1 siempre se ejecutaba una sola instrucción cuando la condición era cierta, ahora no varia prácticamente nada respecto del primer caso, salvo que esta vez se van a ejecutar todas las instrucciones que se encuentren entre el THEN y el ENDIF cada vez que condición sea verdadera.

Caso 3: IF.THEN….ELSE…ENDIF: Hay veces que de acuerdo a la condición, queremos ejecutar un grupo u otro de instrucciones. Para eso, utilizamos el ELSE:,es decir, si la condición es verdadera, se ejecutan las sentencias entre THEN y ELSE. Y si la condición es falsa, las que estén entre ELSE y ENDIF. “ELSE” puede ser traducido como “en otro caso” o “si no…”.

Caso4:IF..THEN..ELSE…ELSE …ENDIF…ENIF: Por ultimo, tenemos que saber que es posible “anidar” instrucciones IF-THEN-ELSE-ENDIF, con lo que se pueden tomar decisiones verdaderamente complejas. Por supuesto, tenemos que ser cautos en el uso de esta característica ya que debido a limitaciones en el tamaño de la pila y cantidad de memoria disponible del PIC podemos ocasionar un desborde y el programa colapsara.

Como ejemplo veamos una sección del programa presentado donde se utilizan   varios bloques IF..THEN..ELSE encadenados

TICKS=0

SEGUNDO=SEGUNDO+1

IF SEGUNDO=60 THEN

SEGUNDO=0

MINUTO=MINUTO+1

IF MINUTO=60 THEN

MINUTO=0

HORA=HORA+1

IF HORA=24 THEN

HORA=0

semana=semana+1

if semana=7 then

semana=0

endif

ENDIF

ENDIF

ENDIF

Es decir: cada vez que la variable segundo toma el valor 60  se resetea su valor, y se incrementan el valor de los minutos. Si a su vez los minutos superan el valor de 60 se resetea su valor  y se incrementa el valor de las horas. A su vez si se superan las 24 horas se resetea su valor y se  incrementa el día de la semana. Este análisis termina cuando se superan los 7 días de la semana que se resetea para empezar nuevamente el ciclo.

BUCLES

Así como la toma de decisiones que vimos en el epígrafe anterior esta presente en casi todos nuestros programas, las estructuras que permiten repetir un grupo de instrucciones un número determinado de veces también son indispensables. En  PBP hay dos de ellas. Veamos  ahora la primera, FOR – TO – STEP – NEXT.

Esta estructura necesita una variable (tipo Byte o Word) para funcionar. En cada iteración del bucle, la variable va cambiando su valor. Cuando el valor de la variable alcanza o supera el valor prefijado, el bucle termina.

WHILE – WEND

La segunda estructura de control que proporciona  PBP es WHILE – WEND. Su propósito es el mismo que la que vimos en el apartado anterior, y su funcionamiento consiste en que mientras que la condición sea verdadera, el grupo de instrucciones dentro del cuerpo del WHILE-WEND se ejecuta (las características de la condición son las mismas que vimos  para IF-THEN-ELSE-ENDIF).

Por supuesto, si no somos cuidadosos al momento de elegir la condición, puede darse el caso de que el número de repeticiones del bucle sea infinito, y nunca salgamos de él. De hecho, esta circunstancia se aprovecha en algunos programas para repetir indefinidamente un grupo de instrucciones. También hay que tener presente que si la condición no es cierta al momento de ejecutar la primera vez el WHILE, el flujo del programa pasara directamente a la instrucción posterior al WEND y las instrucciones dentro del bucle no se ejecutarán ninguna vez.

SELECT CASE

La tercera estructura de control que proporciona  PBP es select case –end select. Su propósito es el simplificar las estructuras anidadas if..then else en los casos en que  sea siempre la mima variable y se necesiten  varias decisiones en función de los valores posibles, y su estructura es la siguiente:

SELECT CASE  variable

CASE  valor1: instruccion1

END SELECT

Como ejemplo veamos una sección del programa presentado donde se utilizan   varios bloques case :

select case desc

case 0:       LCDOUT “”

gosub borra

case 1:     ‘todos los dias

gosub llena

LCDOUT “Todos “‘”LMXJVSD”

case 2: ‘laborales

gosub llena

sabado=0

domingo=0

LCDOUT “Labor”‘ LMXJV  ”

case 3 :   ‘libra lunes

gosub llena

lunes=0

LCDOUT “NoLun”

case 4:         LCDout “Mañan”

GOSUB BORRA

IF  SEMANA=1 then martes=1

if semana=2 then  miercoles=1

if semana=3 then jueves=1

if semana=4 then viernes=1

if semana=5 then sabado=1

if semana=6 then domingo=1

if semana=7 then lunes=1

case 5:

LCDout ” ”

end select

Es decir en función de los cinco valores que tome la variable desc  se escribirá en el LCD la modalidad de la temporización.

LOOKUP

La función LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de constantes del mismo tipo, de acuerdo al valor de un índice (también de tipo Byte). El resultado de la selección se almacena también en una variable tipo byte. La forma de la función LOOKUP es la siguiente:        LOOKUP(byte0, byte1, …, byteN), indice,variable.

Esta función asignara el valor byteX a variable en función del valor de índice ( es decir si índice=0  se asignara a variable el valor de byte0, si  por el contrario  índice=1, se asignara a variable el valor de byte1, y así sucesivamente).

Veamos como se ha usado esta función en el programa que presentamos:

LOOKUP semana,[“0″,”L”,”M”,”X”,”J”,”V”,”S”,”D”,”M”] ,pattern

LCDout pattern

LOOKUP semana,[“F”,”U”,”A”,”I”,”U”,”I”,”A”,”O”,”A”] ,pattern

LCDout pattern

En el primer Lookup, la variable pattern  tomara el primer carácter del día de la semana, reservando el 0 para desconexión (por ejemplo tomara O para semana=0,L para  semana =1,M para semana=2,M para semana etc.)

En el segundo Lookup, la variable pattern  tomara el segundo carácter del día de la semana, reservando el 0 para desconexión (por ejemplo tomara F para semana=0, U para  semana =1, A para semana=2, I para semana etc.).

Por tanto con estas dos sentencias lookup y adyacentes, escribiremos en la segunda línea del display los caracteres: OF, LU, MA, MI, JU, VI, SA o DO en función del valor de la variable semana .

SOPORTE DE DISPLAYS LCD

Pin  Puerto Paralelo
Función LCD

Gnd

>
VCC

>
Contraste LCD

16
RS

>
Write

1
Enable

2
Data bit 0

3
Data bit 1

4
Data bit 2

5
Data bit 3

6
Data bit 4

7
Data bit 5

8
Data bit 6

9
Data bit 7

Pin LCD
1  GND 2 +5v 3 GND 4 5 GND 6 7 8 9 10 11 12 13 14

Lista de conexiones del LCD 2×16

A grandes rasgos, y a pesar de la simplicidad que brinda el disponer de un mismo integrado especializado (compatible con Hitachi 44480)en casi todos los modelos de displays, la escritura en estos es relativamente compleja, dado que se deben respetar protocolos de inicialización, tiempos entre envío de datos, etc., lo que hace bastante tediosa su programación en Assambler.

Pero  PBP dispone de un juego de instrucciones especiales para manejar displays en modo “8 bits” y en modo “4 bits” que nos evitan toda esa complejidad.

El manejo de los LCD se hace mediante el uso de sentencias “DEFINE”, que le dicen al compilador a que pines del microcontrolador hemos conectado cada uno de los pines del LCD. La forma de la instrucción DEFINE es la siguiente:  DEFINE parámetro = valor.

Donde “parámetro” es el nombre del parámetro al que le queremos asignar el “valor”. Los parámetros disponibles para el manejo de LCD alfanuméricos son los siguientes:

  • LCD_BITS: Define el número de bits de la interfaz de datos. Se pueden asignar valores de 4 u 8, siendo 4 el valor por defecto.

 

  • LCD_DREG: Define a que puerto del PIC tenemos conectado el port de datos del LCD. Los valores permitidos son PORTA, PORTB, PORTC, etc. Por defecto se asume PORTB.

 

 

  • LCD_DBIT: Define cual es el primer pin del puerto que usamos para enviar los datos al LCD cuando seleccionamos un bus de 4 bits. Solo puede ser el 0 (para los pines el 0, 1, 2 y 3) o 4 (para usar los pines 4, 5, 6 y 7. Por defecto se asume “4”, y esta instrucción se ignora para LCD_BITS = 8.

 

 

  • LCD_RSREG: Define a que puerto del PIC tenemos conectado el pin RS del LCD. Los valores permitidos son PORTA, PORTB, PORTC, etc. Por defecto se asume PORTB.

 

 

  • LCD_RSBIT: Define a que pin del puerto tenemos conectado el pin RS del LCD. Por defecto se asume “3”.

 

 

  • LCD_EREG: Define a que puerto del PIC tenemos conectado el pin E del LCD. Los valores permitidos son PORTA, PORTB, PORTC, etc. Por defecto se asume PORTB.

 

 

  • LCD_EBIT: Define a que pin del puerto tenemos conectado el pin E del LCD. Por defecto se asume “2”.

 

 

  • LCD_RWREG: Define a que puerto del PIC tenemos conectado el pin RW del LCD. Los valores permitidos son 0, PORTA, PORTB, PORTC, etc. Por defecto se asume “0”, que significa “no usamos el pin RW”.

 

 

  • LCD_RWBIT: Define a que pin del puerto tenemos conectado el pin RW del LCD. Por defecto se asume “0”, que significa “no usamos el pin RW”.

 

 

  • LCD_COMMANDUS: Define cuantos microsegundos demora la escritura de un comando en el display. Por defecto, este valor es de 5000. La mayoría de los LCD funcionan bien con un valor de 2000, lo que hace más rápidos nuestros programas.

 

 

  • LCD_DATAUS: Define cuantos microsegundos demora la escritura de un dato en el LCD. Por defecto, este valor es de 100.

 

 

  • LCD_INITMS: Define cuantos microsegundos demora la inicialización e la electrónica del LCD. Por defecto, este valor es de 100.

 

 

Toda esta sintaxis es completamente funcional, pero PBP para hacernos las cosas más fáciles, si lo deseamos podemos obviar todas las instrucciones anteriores (siempre que incluyamos al menos un comando LCDout), asumiendo PBP que el display funcionara en modo 4 bits, estando conectado a las siguientes pines:

  • RA0,RA1,RA2,RA3  a los pines de DATOS(PINES 11,12,13,14)

 

  • RB3=al pin ENABLE   (PIN 6)

 

 

  • RA4=al pin RS     (PIN 4)

 

 

  • vcc (pin 2)

 

 

  • gnd (pin 1)

 

 

  • vee(pin 3)   a vcc

 

 

Por ultimo  tenemos una serie de instrucciones que manejan el envío de comandos e instrucciones al display:

  • LCDINIT debe utilizarse antes de enviar cualquier comando o dato al LCD. La forma de esta instrucción es al siguiente: LCDINIT n (donde “n” es el tipo de cursor que queremos que muestre el display. “0” significa que el cursor estará oculto, “1” significa que el cursor parpadeara, “2” nos mostrara un cursor subrayado, y “3” un cursor subrayado y parpadeando).
    • LCDClear: Borra el contenido del LCD.

 

  • LCDHome: Lleva el cursor a la primera posición del primer renglón del LCD.
  • LCDLine2Home: Lleva el cursor a la primera posición del segundo renglón del LCD.
  • LCDLeft: Mueve el cursor una posición a la izquierda.
  • LCDRight: Mueve el cursor una posición a la derecha.
  • LCDShiftLeft: Desplaza el contenido del LCD una posición a la izquierda.
  • LCDShiftRight: Desplaza el contenido del LCD una posición a la derecha.
  • LCDLine1Clear: Borra la primera línea del LCD.
  • LCDLine2Clear: Borra la segunda línea del LCD.
  • LCDLine1Pos(x): Coloca el cursor en la posición “x” del primer renglón del LCD. “X” puede tener cualquier valor entre 1 y 40
  • LCDLine2Pos(x): Coloca el cursor en la posición “x” del segundo renglón del LCD. “X” puede tener cualquier valor entre 1 y 40
  •  

    • LCDOUT envía datos al display. Si son caracteres, simplemente los ponemos entre comillas a continuación del comando. Si se trata de mostrar el contenido de una variable, se escribe la variable (precedida por “#”) a continuación del comando. Si se necesitan imprimir varias variables, se pueden separar por “comas”.

     

    A continuación, mostramos  como se ha gestionado un  display LCD de dos líneas en el programa que proponemos

    LCDout $fe, 1 ‘  se inicializa el LCD

    pause 20 ‘retardo

    LCDout $FE,2 ‘nos situamos en la primera línea

    LCDout dEC2 hora,”:”,DEC2 minuto ,”:”,DEC2 SEGUNDO,” ” ‘escribe en el LCD la hora

    LOOKUP semana,[“0″,”L”,”M”,”X”,”J”,”V”,”S”,”D”,”M”] ,pattern

    LCDout pattern ‘escribe en el LCD el contenido de patern

    LCDout $FE,2’posiciona el LCD en la segunda linea

    LCDOut $FE, $C0 ‘Nos situamos en Principio de la segunda línea

    LCDout dEC2 horaAL,”:”,DEC2 minutoAL ,” “’escribe en el LCD ka hora de alarma

    RETURN

    TEMPORIZADOR

    Por  ultimo, PPB también es capaz de gestionar el TIMER interno a  través del comando OPTION_REG  seguido  del prescaler, ayudándose además de las funciones INTCON (que habilitara las interrupciones por hardware) y de la función  ON INTERRUPT (que hará que con llegada de una interrupción el programa pare, donde se encuentre y se salte a la rutina de servicio de interrupción, para luego volver al punto donde se paro)

    Por ejemplo en el programa que presentaremos lo haremos así:

    OPTION_REG=$05  ‘timer prescaler es cargado a 64 a través de option_reg  00000101

    ON INTERRUPT GOTO ISR

    INTCON=$A0           ‘habilita INTERRUPCIONES POR TMR0

    Lo cual significa que se generara una interrupción que provocara que PBP llame a una rutina especial (llamada rutina de interrupción) marcada con la etiqueta ISR

    Para esto el prescaler se ha puesta al valor  64 y a TMR se le permite que cuente desde 0 hasta 255, de modo que con la frecuencia de reloj de  4Mhz cada interrupción será generada cada 256 *64=16.384ms

    En cuanto al código que debe  contener dicha rutina de interrupción, este debe ser lo más breve posible (para que no ralentice la ejecución del programa), y sobre todo debe venir precedida por DISABLE (para evitar que haya una nueva interrupción sin terminar el código de servicio de la primera) y debe ir  terminada por ENABLE y un END.

    Para poder contar segundos la rutina ISR contara TICS hasta que alcance el valor 61 pues en ese momento 61*16,384=999.424ms, es  decir aproximadamente seg. , Con lo cual  podremos ir incrementando la cuenta de segundos, minutos, horas y días de semana sucesivamente.

    A continuación se describe la rutina de servicio empleada en el programa :

    DISABLE       ‘desactiva interrupciones

    ISR:   ‘ comienzo de rutina de interrupciones

    TICKS=TICKS +1  ‘incrementa el contador

    if ticks<61 THEN SINACTUALIZAR ‘ se escapa hasta que el contador no supere el valor de 61

    TICKS=0

    SEGUNDO=SEGUNDO+1  ‘se incrementa los segundos

    IF SEGUNDO=60 THEN ‘un minuto tiene 60 segundos

    SEGUNDO=0

    MINUTO=MINUTO+1 ‘se incrementan los minutos

    IF MINUTO=60 THEN ‘una hora tiene 60 minutos

    MINUTO=0

    HORA=HORA+1

    IF HORA=24 THEN  ‘un dia son 24 horas

    HORA=0

    semana=semana+1

    if semana=7 then ‘cada semana son 7 días

    semana=0

    endif

    ENDIF

    ENDIF

    ENDIF

    SINACTUALIZAR:

    INTCON.2=0   ‘   REACTIVA TMR0

    RESUME

    ENABLE  ‘reactiva interrupciones

    END  ‘fin rutina interrupciones

    DESCARGA  DIRECTA DEL FICHERO HEX PROGRAMADOR_SEMANAL_CON_LCD -hex(al descargarlo renombrar como .hex)

    Un despertador muy perspicaz


    circuito_funcionando

    Realmente la electrónica evoluciona a un ritmo  frenético y la verdad es que lo queramos o no, la electrónica del siglo XXI es difícil de entender sin la ayuda de los elementos programables, ocupando sin  duda un lugar crucial  en este apartado, los microcontroladores, por su gran flexibilidad, bajo precio y altísimas prestaciones, por lo que cada vez mas, dispositivos corrientes  (incluso  de relativa sencillez), integran en gran parte de su electrónica un microcontrolador  o un microprocesador, siendo cada vez mayor la lista de dispositivos y aparatos  que  utilizan esta tecnología: electrodomésticos, periféricos para ordenadores, teléfonos móviles, etc.

    La verdad es que si bien la electrónica en general se ha visto muy mejorada por la simplificación de los componentes necesarios  en cualquier proyecto complejo ( piénsese que  un microcontrolador  integra prácticamente todo lo necesario: CPU, memoria, timers, puertos de E/S, controladores de LCD, etc. ), no lo ha sido  así  el software requerido para  que estos  cumplan con el cometido deseado, pues tradicionalmente este  se creaba   basándose en   ensamblador, el cual es  un lenguaje  muy  potente  por ser muy cercano a la maquina, si bien como contrapartida, es muy dependiente de esta, y además es  de relativa  dificultad  para todos los aficionados que desean empezar en este mundo y no poseen los conocimientos de programación que se requieren.

    Afortunadamente  en el mundo de los dispositivos programables recientemente han aparecido nuevos lenguajes más próximos al lenguaje natural (en C  o en Basic)   que nos pueden ayudar  en el desarrollo del software de estos dispositivos: precisamente   desde estas líneas intentaremos demostrar la gran sencillez  para realizar un proyecto electrónico medianamente  complejo basándonos en un simple y barato microcontrolador (en esta ocasión usaremos el PIC16F84A)   desde cero usando el sencillísimo   lenguaje  PIC-BASIC-PRO (en adelante PBP).

    A  continuación intentaremos  transmitir los conocimientos mínimos para que cualquiera que no haya programado  ningún PIC, simplemente  estudiando  las explicaciones siguientes, junto con los ejemplos  de porciones del proyecto, pueda iniciarse progresivamente  en la comprensión  de la programación de estos dispositivos tan potentes, de modo que  al final como colofón pueda comprender  el programa definitivo, el cual es plenamente funcional, y será encargado de gestionar por completo el proyecto  del reloj-temporizador semanal con salida a LCD que se  propone.

    Tal  y como se ha adelantado, el proyecto versara sobre  un  reloj con display LCD de dos líneas en el que mostraremos información de la hora actual  ,el día de la semana y el modo de temporización  seleccionado) contando para su control de  varios pulsadores ( para ajustes de  día de semana, hora y día actual, ajuste de hora  de activación y ajuste de modalidad de activación) y dos salidas independientes ( una para la luz de fondo del display y otra para usos varios:  buzzer, relé, etc.).

    El corazón del circuito tal y como hemos expuesto Serra un PIC16F84 el cual programemos con el código en PBP   que más adelante  citaremos (aunque la mayoría de las partes de este ya han sido comentadas.

    A este conectaremos por un lado  los cinco pulsadores, las dos salidas  y por otro lado el display LCD.

    Respecto a las entradas utilizaremos pulsadores normalmente abiertos  conectados  a su vez a resistencias de 10k para asegurar que en  reposo hay un valor alto.

    En cuanto al display, para esta ocasión utilizaremos cualquier LCD de dos líneas compatible con Hitachi 44780, el cual conectaremos al PIC  en modo 4 bits (utilizando los 4 bits altos) .El resto de  las conexiones del LCD lo haremos según la recomendación de PBP:

    Pin 1àgnd

    Pin2à+5V

    Pin3  à+5v

    Pin4(RS) àRA4

    Pin5 àN.C.

    Pin6(EN) àRB3

    Pines7,8,9.10 àN.C.

    Pin 11àRA0

    Pin 12à RA1

    Pin 13à RA2

    Pin 14àRA3

    Por ultimo, todo el circuito podemos  alimentarlo o bien con alimentador filtrado  a cuya salida conectaremos un regulador tipo 78L05  y dos condensadores de filtro  tanto en la entrada como en la salida de este o bien en su lugar una económica fuente conmutada de 5V ya montada( en cuyo caso no necesitaremos el citado  regulador y el circuito será aun más compacto.

    El circuito se completa con un diodo de protección a la entrada  para evitar  cambios de polaridad dado que  el circuito lo alimentaremos con un simple alimentador externo  reciclado  que  entregue  5V.
    diseño despertador

    Lista de componentes

    R1=47K

    R2,R3,R4 ,R5 y R8=10K

    R6,R7=470ohm

    C1,C2=10Mf/16v

    C3,C4=10nF

    C5,C6=27pf

    Q1=XTAL 4Mhz

    U1=78L05

    IC1= PIC16F84A

    DIS2=display 16 caracteres y 2 lineas (POWERTIP PC1602F)

    Varios:

    Bloque Diodos leds tricolor( se puede reciclar  de una economica lamparita decorativa alimentada con pilas de botón fácilmente localizable en tiendas de decoración) .

    S1, S2, S3, S4, S5= pulsadores miniatura normalmente abiertos.

    Un zumbador de 5V.

    Fuente conmutada de 5v 100mA( por  ejemplo se puede recuperar de un cargador de teléfono móvil en desuso).

    Caja: usaremos una vieja caja de plástico de disquetes de 3 ½” .

    Circuitos Impresos

    Dada la sencillez del circuito este circuito puede realizarse muy  fácilmente sobre una placa  de puntos, o bien sobre una placa de prototipos o si lo desea sobre una simple  placa de una cara cuyo diseño se adjunta:

    circuito_impreso

    Diseño  a doble cara

    Dada la extrema sencillez del circuito no se aconseja  realizar un circuito impreso de doble cara, pero para el lector que le interese se presenta a continuación junto con las conexiones de este con el resto de componentes.

    Conexiones placa doble cara

    Conector FUNCIÓN CONEXIÓN A
    1 GND  
    2 +5V  
    3 +5V  
    4 RA0 PIN 11 LCD
    5 RA1 PIN12 LCD
    6 RA2 PIN13 LCD
    7 RA3 PIN14 LCD
    8 RA4 PIN 4 LCD
    9 RB0 SALIDA 1
    10 RB1 SALIDA2
    11 RB2 PULSADOR1
    12 RB3 PIN6 LCD
    13 RB4 PULSADOR2
    14 RB5 PULSADOR3
    15 RB6 PULSADOR4
    16 RB7 PULSADOR5
    17 N.C.  
    18 N.C.  
    19 +5V  
    20 GND  

    Pasos para la construcción del prototipo

    Paso 1: Compilación del código fuente

    El código  generado en PBP  por si mismo  no es apto para ser  cargado en el PIC,  ya que este solo  entiende su propio lenguaje máquina, para lo cual deberemos convertir  con un complilador nuestro código escrito en PBP a un código que el micro pueda procesar.

    Existe una versión gratuita  limitada de  PIC Basic Pro  en su web oficial http://www.melabs.com/pbpdemo.htm

    Como el lector adivinara el  entorno del compilador   PIC-BASIC-PRO es algo austero (requiere trabajar en línea de comandos y un editor de texto),  por lo que por lo general lo normal será usar un entorno de desarrollo Grafico (IDE) donde el editor, grabador, compilador,  etc. estén  integrados  como por ejemplo el MicroCode Studio  de la casa Mecanique ,el cual se puede descargar de la siguiente url: http://www.mecanique.co.uk/products/compiler/pbp.html

    NOTA: Para aquellos lectores que  deseen adquirir directamente el código del proyecto ya compilado y no deseen compilarlos por ellos  mismos pueden solicitarlo gratuitamente a: [email protected]

    Paso 2: Simulación del código fuente

    Con objeto de no estar continuamente programando  el PIC, existen simuladores para no tener que realiza ningún  prototipo  físicamente y de esta manera evaluar  el comportamiento global de este  antes de estudiar su realización real.

    Existen muchos simuladoras, por software (por ejemplo Proteus es el más famoso),  pero existe uno especifico para PIC’s: el PIC Simulator de  OshonSoft (se puede descargar una versión limitada en http://www.oshonsoft.com/downloads.html )

    Suponiendo  instalado el software para la simulación del código,  realizaremos los siguientes pasos:

    1. FileàLoad Programà .hex
    2. ToolsàLCD ModuleàChange LCD Module Color SchemeàLCDtype 2x:2×16,data lines:portA.interface 4 bits Low,RS:A4,E line=B3,r/W:no used
    1. Tools àMicrocontroller View
    2. RateàFast
    3. SimulationàStart

    Paso 3: Grabación del PIC

    Una vez obtenido el código ensamblado y simulado necesitaremos  un simple circuito llamado programador  para salvar el .hex en la flash del PIC. Normalmente los programadores más simples están   basados  en el diseño JDM, siendo el más usual el TE20 (  se puede conseguir fácilmente    en http://todoelectronica.com ).

    Para poder emplear nuestro grabador, necesitaremos un software grabador que lo permita. Uno de los programas para grabación de PIC’s mas conocidos es  el Ic-Prog, el cual se puede descargar gratuitamente de http://www.ic-prog.com/index1.htm

    Proceso de Grabación  a través  del ICPROG  con el TE20

    Ponemos en marcha en ICPROG 1.06b, si lo iniciamos por primera vez, nos saldrá una pantalla de configuración, si no es el caso, pulsamos la tecla F3 (settingsàHardware), una vez en ella, colocaremos las siguientes opciones:

    ·        Programmer: JDM Programmer

    ·        Ports: Com1 o Com2 dependiendo de donde hallamos colocado el TE20

    ·        I/O Delay: Normalmente, tiene que estar a 5, pero si nos da problemas al programar la eeprom, lo colocaremos en 4.

    ·        Interface: Direct I/O

    ·        Communication: Todas sin activar

    Ahora nos vamos a SettingsàOptions, y chequearemos las pestañas:

    ·        I²C: Ambas tienen que estar desactivadas

    ·        Misc: Desactivar la opción de “Enable Vcc control for JDM”

    ·        Programming: Tiene relación con el fuse “CP”   (Code Protection) para la protección del PIC tendremos que desactivar ambas casillas, pero si queremos verificar que nuestro PIC o eeprom ha sido bien grabado tendremos que desactivar el fuse “CP” y activaremos cualquiera de la dos casillas, la primera lo verifica al acabar de programar y la segunda mientras programa (se aconseja dejar la primera opción). Si activamos el verificado y el fuse “CP” nos dará el 0000h.

    Seguidamente en la parte izquierda de la pantalla  seleccionamos los  fuses y Oscilator:

    FUSES

    ·        “WDT” :Perro Guardián. Cuando el programa entra en un bucle infinito, el WDT se desborda y resetea el PIC

    ·        “PWRT”:Power on Reset. Hasta que el PIC no alcance una tensión de funcionamiento correcta lo mantiene en reset

    ·        “CP”: Code Protection. Protege el código contra lectura.

    OSCILATOR

    ·        “LP”:Oscilador de bajo consumo, de frecuencia de 35 a 200Khz.

    ·        “XT”:Oscilador para frecuencias estándar, de 100Khz a 4Mhz

    ·        “HS”:Oscilador de alta velocidad de 4Mhz a 10Mhz (Cristal de Cuarzo) àlo seleccionaremos

    ·        “RC”:Oscilador de bajo coste formado por condensador y resistencia

    Finalmente, una vez llegado ha este punto, vamos a comenzar la programación del PIC en nuestro TE20 que debe de estas desenchufado del cable ext. RS232, con las muescas del chip que coincida con las muescas del  zócalo de 18 pines. Una vez colocado, enchufamos el TE20 al cable, elegimos el chip (en nuestro caso  PIC 16F84) en el menú superior   abrimos el archivo compilado (.hex), el oscillator debe de estar en XT y los fuses todos desactivados, el CP lo podemos activar o no, dependiendo de las necesidades.

    Ya sólo nos queda cruzar los dedos y darle a Commandà Program all o al icono que tiene un chip con un rayo…

    Si tuviéramos algún problema en la grabación del chip  bajaríamos la velocidad del puerto donde estuviera enchufado el TE20 a 2400 bits por segundo, pero si persiste el problema consultar  en esta URL: http://soloelectronicos.wordpress.com/2008/07/24/como-grabar-un-PIC16fxx-desde-un-portatil-con-el-te20jdm/).

    Paso4: Realización del circuito

    Como el lector  habrá comprobado a lo largo de todos los apartados anteriores, tras el  paso de  grabación del PIC, ya solo  nos queda alimentar este  y  conexionar  todos sus periféricos para que nuestro proyecto cobre vida

    En este proyecto, la realización práctica incluye  tres  partes:

    • La placa de control en la que incluiremos los siguientes elementos:

    –          El circuito del resonador formado por el cristal de cuarzo de 4Mhz  y los dos condensadores cerámicos conectados a este .

    –          La fuente de alimentación  de 5voltios 50mA(opcional si o se cuenta con una fuente externa de estas características ), formada por un regulador  tipo 75L05(de baja potencia) y lo respectivos condensadores de desacople .

    –          El zumbador  ( que conectaremos a B1).

    –          Las resistencias de 10K  que nos aseguran en valor alto en las entradas asociadas a los pulsadores.

    –          El microcontrolador programado con el programa descrito.

    • La placa del display LCD de dos líneas que  se conectara a la  placa de control de la siguiente forma:

    Pin 1àgnd

    Pin2à+5V

    Pin3  à+5v

    Pin4(RS) àRA4

    Pin5 àN.C.

    Pin6(EN) àRB3

    Pines7,8,9.10 àN.C.

    Pin 11àRA0

    Pin 12à RA1

    Pin 13à RA2

    Pin 14àRA3

    • La placa de entradas: tal y como se ha descrito en nuestro caso estará constituido por  cinco  pulsadores normalmente abiertos, los cuales conectaremos directamente a la placa de control   a B7, B6, B5, B4, B2, B3 ( recuerde que en esta ya hemos incluido las resistencias de 10K.

    Paso 5: Comprobación de resultados

    Normalmente si el  micro está bien grabado y las conexiones de éste a sus periféricos son correctas el circuito debiera funcionar a  la primera sin problemas.

    Un buen indicador de funcionamiento es el display LCD, de modo que si este no visualiza nada en su pantalla  lo más normal es que sea por  de falta de alimentación, en cuyo caso  comprobaremos   con un polímetro si la tensión de alimentación llega tanto  al micro como al LCD.

    Si aún llegando alimentación al LCD, en el display de este  aparecen solos unos bloques oscuros en las primeras columnas  de la primera fila es señal de que o el micro no esta funcionando o las conexiones de este no son correctas, para lo cual comprobaremos  en primer lugar que las  conexiones del LCD a la placa de control son las correctas: echo esto deberían ya verse caracteres correctos en el LCD.

    Si persiste aún el mensaje en el LCD es señal que las conexiones internas son incorrectas por lo que comprobaremos  que la resistencia de 47k esta correctamente conectada al pin 6 así como el cristal y los dos condensadores lo están  a los pines 15 y 16 del micro.

    Una vez el circuito este funcionando ya solo cabe ajustar el reloj interno a la hora actual por lo que en primer lugar ajustaremos el día de semana y  la hora  actual  pulsando sobre el pulsador de  días/horas (al pasar 24 horas automáticamente se cambia al día de la semana siguiente hasta llegar al domingo que se vuelve a repetir el ciclo) y  después ajustaremos  los minutos pulsando directamente sobre el botón de  minutos ( al pulsar se va incrementando su valor hasta llegar a 60,momento en el cual vuelve a empezar desde 1.

    Seguidamente ajustaremos  la hora de alarma pulsando el botón  de hora y minutos  de la hora de activación de la  alarma ( por simplificar el número de pulsadores  este  ajusta los minutos y también las horas de modo que presionando este se van incrementando los minutos de la hora de activación de modo que si se llega hasta los 60 minutos automáticamente se incrementa el valor  de las horas hasta llegar a las 24 h, momento en el que se vuelve a repetir el proceso.

    Finalmente elegiremos el modo de activación, presionando sucesivamente el botón de modo , el cual definirá la periodicidad  semanal de activación, mostrando los siguientes mensajes en el lcd:

    1. ‘Off’: desactiva el circuito de temporización.
    2. ‘Tod’= lo activa para todos los días de  la semana.
    3. ‘Lab’= solo lo activa para los días laborales ( de Lunes a Viernes).
    4. ‘NoL’ =lo activa para todos los días excepto los Lunes.
    5. ‘Mañ’ =lo activa puntualmente para el día siguiente.

    Para finalizar para desactivar tanto la luz de cortesía como el buzzer pulsaremos simplemente el botón “stop”.

    Como detalle de cortesía, como puede verse en el código, pulsando cualquier pulsador se encenderá la luz del display aproximadamente un minuto.

    Por ultimo animo desde estas líneas a que el lector experimente con el código en PBP que a continuación  se adjunta  adoptándolo y personalizando a las necesidades y exigencias particulares  que se crean oportunos a nuevos proyectos, pues como habrá podido observar realmente programar un PIC no es tan complicado ¿verdad?

    Listado del programa en PBP

    ‘****************************************************************

    ‘***********************************************

    ‘***  PROGRAMADOR SEMANAL CON SALIDA a rele

    ‘***     Por Carlos Rodríguez Navarro

    ‘***    [email protected]

    ‘****    procesador PIC16F84

    ‘****  28/octubre/2008

    ‘ DISPLAY LCD HD 44480

    ‘RA0,RA1,RA2,RA3=DATOS(PINES 11-14)

    ‘RB3=ENABLE   (PIN 6)

    ‘RA4=RS     (PIN 4)

    ‘vcc (pin 2)

    ‘gnd (pin 1)

    ‘vee(pin 3)   a vcc

    ‘SALIDAS

    ‘alarma1   portb.0    ‘salida

    ‘ luz portb.1     ‘salida

    ‘PULSADORES

    ‘alarma_boton portb.2    ‘ent

    ‘solo_hora_boton portb.7  ‘ent

    ‘hora_boton portb.4    ‘ent

    ‘prog_boton portb.5    ‘ent

    ‘periodo_boton portb.6  ‘ent

    ‘***********************************************

    symbol alarma1=portb.0    ‘salida

    symbol luz=portb.1     ‘salida

    SYMBOL alarma_boton=portb.2    ‘ent

    SYMBOL  solo_hora_boton=portb.7 ‘ ent

    symbol  hora_boton=portb.4    ‘ent

    symbol  prog_boton=portb.5    ‘ent

    symbol periodo_boton=portb.6  ‘ent

    ticks var byte

    hora var byte

    horaal VAR BYTE

    minuto var byte

    minutoal VAR BYTE

    segundo var byte

    semana VAR BYTE

    delay var byte

    DESC VAR BYTE

    desc1 var byte

    lunes var bit

    martes var bit

    miercoles var bit

    jueves var bit

    viernes var bit

    sabado var bit

    domingo VAR Bit

    PATTERN VAR BYTE

    i var byte

    minutoluz var byte

    TRISA=0      ‘PORTA COMO SALIDAS         ( 0=output,1=input)

    TRISB= $f4  ‘116   ‘RB0,RB1,rb3 COMO SALIDAS   resto entradas   1110100=  116

    ‘PONER A CERO HORA,MIN,SEG Y TICLS

    HORA=0

    horaal=0

    MINUTO=0

    minutoal=0

    SEGUNDO=2

    semana= 1

    TICKS=0

    DESC=0

    DESC1=0

    Lcdout $fe, 1 ‘ Clear LCD screen

    lcdout $FE,2

    lcdout “CRN”   ‘mensaje de cortesia

    pause 10

    ‘INICIALIZAR VECTOR INTERRUPCOPN

    OPTION_REG=$05  ‘timer prescaler es cargado a 64 a traves de option_reg  00000101

    ON INTERRUPT GOTO ISR

    INTCON=$A0           ‘habilita INTERRUPCIONES POR TMR0

    ‘BORRAR DISPLAY

    LOOP:           ‘bucle principal de ejecucion

    ‘bloque de ajuste minutos,hora, segundos y dia de la semana

    IF solo_hora_boton=0 THEN      ‘si se pulsa el boton de ajuste

    GOSUB RETARDO

    IF solo_hora_boton=0 THEN      ‘si se pulsa el boton de ajuste

    MINUTO=MINUTO+1               ‘se incrementan minutos

    gosub minuto60

    endif

    endif

    ‘bloque de ajuste minutos,hora, segundos y dia de la semana

    IF HORA_boton=0 THEN      ‘si se pulsa el boton de ajuste

    GOSUB RETARDO

    IF HORA_boton=0 THEN      ‘si se pulsa el boton de ajuste

    minuto=60

    ‘  hora=hora+1

    GOSUB minuto60 ‘HORA24

    endif

    endif

    ‘bloque de ajuste hora de alarma

    IF PROG_boton=0 THEN      ‘si se pulsa el boton de ajuste    hora alarmas

    GOSUB RETARDO

    IF PROG_boton=0 THEN      ‘si se pulsa el boton de ajuste    hora alarmas

    MINUTOAL=MINUTOAL+1               ‘se incrementan minutos

    IF MINUTOAL>59 THEN            ‘horas

    MINUTOAL=0

    horaAL=horaAL+1

    endif

    if horaal>23 then horaal=0

    endif

    endif

    ‘bloque ajuste periodicidad  de alarma ( 6 modos)

    IF periodo_boton=0 THEN      ‘si se pulsa el boton de ajuste de semanas

    GOSUB RETARDO

    IF periodo_boton=0 THEN

    DESC=DESC +1

    DESC1=DESC

    IF DESC=6 THEN

    desc=0

    DESC1=0

    ENDIF

    endif

    endif

    ‘bloque apagado de alarma y de la  luz

    IF alarma_boton=0 THEN      ‘si se pulsa el boton de ajuste de semanas

    pause 150

    IF alarma_boton=0 THEN

    desc=desc1 ‘restara modalidad alarmqa

    low alarma1     ‘resetea alarma

    low luz

    endif

    endif

    ‘condicion de alarma

    if hora=horaal and minuto=minutoal and segundo=1  and ( semana=   lunes*1  or   semana=martes*2 or  semana=miercoles*3 or     semana=jueves*4 or      semana=viernes*5 or   semana=sabado*6 or  semana=domingo *7)   then

    GOSUB LUZON       ‘ enciende luz de fondo

    HIGH ALARMA1      ‘activa alarma

    desc=5         ‘PINTA EN PANTALLA

    ENDIF

    ‘apaga la luz de fondo al minuto

    if minutoluz=minuto then

    gosub  luz_fondo_off

    endif

    gosub display

    goto loop             ‘bucle principal de ejecucion

    ‘RUTINA DE SERVICIO

    DISABLE

    ISR:

    TICKS=TICKS +1

    if ticks<61 THEN SINACTUALIZAR

    TICKS=0

    SEGUNDO=SEGUNDO+1

    IF SEGUNDO=60 THEN

    SEGUNDO=0

    MINUTO=MINUTO+1

    gosub minuto60

    ENDIF

    SINACTUALIZAR:

    INTCON.2=0   ‘   REACTIVA TMR0

    RESUME

    ENABLE

    END

    display:

    lcdout $FE,2

    lcdout dEC2 hora,”:”,DEC2 minuto ,”:”,DEC2 SEGUNDO,” ”

    LOOKUP semana,[“0″,”L”,”M”,”M”,”J”,”V”,”S”,”D”,”M”] ,pattern

    LCDOUT PATTERN

    LOOKUP semana,[“F”,”U”,”A”,”I”,”U”,”I”,”A”,”O”,”A”] ,pattern

    lcdout pattern

    lcdout $FE,2

    LcdOut $FE, $C0 ‘Principio segunda linea

    lcdout dEC2 horaAL,”:”,DEC2 minutoAL ,” ”

    select case desc

    case 0:       LCDOUT “OFF”

    gosub borra

    case 1:     ‘todos los dias

    gosub llena

    LCDOUT “Tod “‘”LMXJVSD”

    case 2: ‘laborales

    gosub llena

    sabado=0

    domingo=0

    LCDOUT “Lab”‘ LMXJV  ”

    case 3 :   ‘libra lunes

    gosub llena

    lunes=0

    LCDOUT “NoL”

    case 4:         lcdout “Mañ”

    GOSUB BORRA

    IF  SEMANA=1 then martes=1

    if semana=2 then  miercoles=1

    if semana=3 then jueves=1

    if semana=4 then viernes=1

    if semana=5 then sabado=1

    if semana=6 then domingo=1

    if semana=7 then lunes=1

    case 5:

    lcdout “ON ”

    end select

    return

    llena:               ‘inicializa a 1 los indicadores semanales

    lunes=1

    martes=1

    miercoles=1

    jueves=1

    viernes=1

    sabado=1

    domingo=1

    return

    borra:         ‘inicializa a 0 los indicadores semanales

    lunes=0

    martes=0

    miercoles=0

    jueves=0

    viernes=0

    sabado=0

    domingo=0

    return

    LUZON:

    HIGH LUZ      ‘activa la luz de fondo guardando el minuto

    minutoluz = minuto+1

    if minutoluz>60 then minutoluz=1

    RETURN

    RETARDO:  ‘antirebotes de 150ms  pulsadores activando tambien la  luz de fondo

    PAUSE 250

    GOSUB LUZON         ‘ enciende luz de fondo

    RETURN

    HORA24:      ‘si se incrementan las horas mas de 24h

    IF HORA=24 THEN

    HORA=0

    semana=semana+1

    if semana>7 then    semana=1

    endif

    RETURN

    minuto60:  ‘ si se incrementan los minutos mas de 60

    IF MINUTO=60 THEN

    MINUTO=0

    HORA=HORA+1

    GOSUB HORA24

    ENDIF

    return

    luz_fondo_off:      ‘apaga luz de fondo

    low luz

    minutoluz=61

    return

    PULSA AQUI PARA ACCEDER AL FICHERO HEX—
    PROGRAMADOR_SEMANAL_CON_LCD -hex

    ATENCION:COPIAR Y PEGAR EL CODIGO AL BLOC DE NOTAS Y LUEGO RENOMBRAR A .HEX