Autor Tema: Reloj Nixie con DS1307  (Leído 2994 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Wirry85

  • PIC10
  • *
  • Mensajes: 11
Reloj Nixie con DS1307
« en: 18 de Marzo de 2010, 18:41:13 »
Os cuento, estoy diseñando un reloj Nixie. Primero lo estoy simulando con el Proteus, utilizo un PIC 16F876A, un DS1307 y una pantalla LCD 16x2. Me funciona a la perfección me muestra la hora y la fecha.
Vale el problema es que tengo el código para una pantalla LCD pero claro los tubos Nixie no es una LCD, por eso debo cambiar la pantalla LCD.
Me gustaría que me dijeran exactamente como conectar el PIC a los tubos Nixie, ya que voy a multiplexar.
Respecto el código decidme un ejemplo de como sacar la informacion del DS1307 y mandarla a los tubos. Solo quiero un ejemplo.
Yo hago esto pero la mando a la pantalla LCD con un printf y claro no sera lo mismo para los tubos
Muchísimas gracias.
Código: [Seleccionar]
#include <16F876A.h>
                   #fuses XT,NOWDT,NOLVP,NOPROTECT
                   #use delay (clock=4000000)
                   #use i2c (Master, sda=PIN_C4, scl=PIN_C3)
                   #define use_portb_lcd TRUE
                   
                   #include <lcd.c>
                   
                   int ano,mes,dia,dia_set,hor,min,sec;
                 
/******************************************************************************
                              DS1307
******************************************************************************/

int BCDaBIN(int bcd) //Conversion a BCD a Binario
{
   int varia;
   varia = bcd;
   varia >>= 1;
   varia &= 0x78;
   return (varia + (varia >> 2) + (bcd & 0x0f));
}

void tiempo (byte &ano, byte &mes, byte &dia, byte &dia_set, byte &hor, byte &min, byte &sec)
{
   i2c_start();                        //Escritura
   i2c_write(0xD0);                    //Código de escritura
   i2c_write(0x00);                    //Puntero a la primera dirección
   i2c_start();                        //Lectura
   i2c_write(0xD1);                    //Código de lectura
   sec = BCDaBIN (i2c_read()&0x7f);    //Lectura de los 7 bits de los segundos
   min = BCDaBIN (i2c_read()&0x7f);    //Lectura de los 7 bits de los minutos
   hor = BCDaBIN (i2c_read()&0x3f);    //Lectura de los 6 bits de los horas
   dia_set=BCDaBIN (i2c_read()&0x7);   //Lectura de los 3 bits de los dias
   dia = BCDaBIN (i2c_read()&0x7f);    //Lectura de los 6 bits de los dias
   mes = BCDaBIN (i2c_read()&0x1f);    //Lectura de los 5 bits de los meses
   ano = BCDaBIN (i2c_read(0)&0xff);   //Lectura de los 8 bits de los años
   i2c_stop();
}
/******************************************************************************
                              PROGRAMA PRINCIPAL
******************************************************************************/
                   void main()
                   {
                   lcd_init();
                   while(1)
                     {
                     tiempo(ano,mes,dia,dia_set,hor,min,sec);     //Lee tiempo del DS1307
                     lcd_gotoxy(1,1);
                     printf(lcd_putc,"%2u/%2u/%2u",dia,mes,ano);
                     lcd_gotoxy(1,2);
                     printf(lcd_putc,"%2u:%2u:%2u",hor,min,sec);  //Visualiza la hora
                     }
                   }
 
 
 

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Reloj Nixie con DS1307
« Respuesta #1 en: 18 de Marzo de 2010, 18:57:20 »
Bienvenido Wirry.

Para conectar los Tubos al PIC vas a necesitar un 74141 por cada grupo de multiplexación. Por ejemplo, si tu reloj es con 6 nixies y quieres multiplexarlos de 3 en 3 (como he hecho yo en el mío) necesitarás 6:3=2 74141.
El 74141 es un conversión BCD a decimal que se conecta directamente a los cátodos de los nixie.
Cada uno de estos 74141 se controla a través de 4 pines del PIC, de modo que tendrás que conectar sus pines 3,4,6 y 7 a 4 pines de cualquier puerto del PIC.

Respecto a los ánodos de los nixies necesitas meterles unos 180V, de modo que lo primero que necesitarás es una fuente de alimentación con esta tensión (si te fijas en mi diseño verás que yo la he creado usando el 555). Una vez que tengas esa tensión, combinando un MPSA92 con un MPSA42 podrás dar tensión o quitársela a los ánodos. Cada una de estas combinaciones MPSA92+MPSA42 requiere un pin del PIC... de modo que si tu reloj es con 6 nixies necesitas otros 6 pines.

Si echas un ojo a mi esquemático (o a cualquiera que veas por la web, pues son todos muy similares) creo que te quedará más claro.

Una vez que tengas el hardware, respecto al software, simplemente tendrás que crear un bucle que vaya abriendo un ánodo en cada iteración y presentando mediante los 4 pines del 74141 correspondiente el valor BCD que quieras mostrar en ese tubo.
Básicamente sería cambiar la función BCD aBIN que usas ahora por un simple portB=bcd, suponiendo que tuvieras uno de los 74141 en los 4 pines más bajos del puerto B.

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Reloj Nixie con DS1307
« Respuesta #2 en: 18 de Marzo de 2010, 18:59:00 »
Por cierto, ¿qué modelo de tubo Nixie piensas usar?

Desconectado Wirry85

  • PIC10
  • *
  • Mensajes: 11
Re: Reloj Nixie con DS1307
« Respuesta #3 en: 18 de Marzo de 2010, 19:58:02 »
Gracias por contestar

Utilizo estos Nixies:
http://cgi.ebay.es/ws/eBayISAPI.dll?ViewItem&item=390160217164&ssPageName=STRK:MEWAX:IT

He visto 74141 en ebay:
http://cgi.ebay.es/74141-K155ID1-NIXIE-TUBE-DRIVER-IN-18-IN-8-12-pcs_W0QQitemZ330413928883QQcmdZViewItemQQptZLH_DefaultDomain_0?hash=item4cee3471b3

Es obligatorio utilizar los 74141 o hay otros modelos que hagan lo mismo, se que este modelo es aposta para los nixies pero ya no los fabrican. He visto otros conversores de BCD a decimal.
Respecto la fuente lo tengo claro y la conexión también, ahora falta el programa. Veremos como lo hago.
Gracias.

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Reloj Nixie con DS1307
« Respuesta #4 en: 18 de Marzo de 2010, 20:11:11 »
Me temo que lo más cómodo es usar el 74141 o el KM155ID1, que es su equivalente ruso.

Porque las alternativas son:
  • Unos chips con la misma función pero que se fabrican actualmente de la marca Supertex, pero que son aún más difíciles de conseguir que los 74141
  • Sustituir los 74141 por transistores MPSA42, pero necesitarás 10 para sustituir a cada 74141 y esto te va a complicar el PCB. Al final de este documento proponen una alternativa que requiere sólo 5 transistores: http://nixietube.info/NixieTransistors.pdf

En principio no es difícil encontrar los 74141 en ebay (http://cgi.ebay.es/6-PCS-74141-TTL-IC-Bargain-Pack-SN74141-DM74141A-DIP_W0QQitemZ220542780942QQcmdZViewItemQQptZUK_BOI_Electrical_Components_Supplies_ET?hash=item33595fc60e), e incluso en tiendas de electrónica. Yo compré algunos en una tienda de Madrid y, si necesitas un par de ellos y no eres capaz de encontrarlos te los mando desinteresadamente (creo que aún me quedan algunos).


Desconectado Wirry85

  • PIC10
  • *
  • Mensajes: 11
Re: Reloj Nixie con DS1307
« Respuesta #5 en: 18 de Marzo de 2010, 20:18:29 »
Vale gracias, compraré los KM155ID1 y los transistores por el ebay.
¿Has visto los tubos? ¿Te gustan?

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Reloj Nixie con DS1307
« Respuesta #6 en: 18 de Marzo de 2010, 20:25:30 »
Ya lo creo que me gustan... yo compré la versión in8-2, que son parecidos, con el 2 distinto del 5.

Desconectado Wirry85

  • PIC10
  • *
  • Mensajes: 11
Re: Reloj Nixie con DS1307
« Respuesta #7 en: 18 de Marzo de 2010, 20:55:32 »
Los mios son así? No lo se porque todavia no los he puesto en marcha.

Desconectado Wirry85

  • PIC10
  • *
  • Mensajes: 11
Re: Reloj Nixie con DS1307
« Respuesta #8 en: 21 de Marzo de 2010, 18:48:17 »
¿Alguien me puede ayudar con el código?
Muchas gracias.

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Reloj Nixie con DS1307
« Respuesta #9 en: 22 de Marzo de 2010, 10:42:11 »
Si Wirry, los tuyos también tienen el 2 y el 5 distintos.

Encantado colaboraré contigo en el código, pero yo creo que tendrías que empezar por tener el hardware listo, para que así en el código sepamos exactamente que pines del PIC van conectados a los ánodos y cuáles a los 74141. Yo espero poder terminar de taladrar mi PCB esta semana e iniciar la soldadura y primeras pruebas durante Semana Santa.

Desconectado Wirry85

  • PIC10
  • *
  • Mensajes: 11
Re: Reloj Nixie con DS1307
« Respuesta #10 en: 22 de Marzo de 2010, 15:31:55 »
Gracias por contestar, ya he solucionado algunas cositas. Y me he encontrado con otros problemas.
La multiplexión de los tubos lo hago con 2 integrados, entonces en un mismo integrado hay 3 tubos con lo cual envio la informacion del tubo 1 y los otros tubos el 3 y el 5 tambien la reciben, pero el anodo lo controla el PIC, es el PIC el que se encarga de encender y apagar los anodos de cada tubo para así actualizar la datos. ES ESTO LO QUE NO SE HACER.
¿Me podeis ayudar?
Pongo el código y el esquematico.
Muchas gracias.
Código: [Seleccionar]
#include <16F876A.h>
#fuses XT,NOWDT,NOLVP,NOPROTECT
#use delay (clock=4000000)
#use i2c (Master, sda=PIN_C4, scl=PIN_C3)
#use standard_io(C)
#BYTE TRISC = 0x87
#BYTE PORTC = 0x07
                 
                   
int ano,mes,dia,dia_set,hor,hor_2,min,min_2,sec,sec_2;
                 
/******************************************************************************
                              DS1307
******************************************************************************/


void tiempo (byte &ano, byte &mes, byte &dia, byte &dia_set, byte &hor, byte &hor_2, byte &min, byte &min_2, byte &sec, byte &sec_2)
{
   i2c_start();                //Escritura
   i2c_write(0xD0);            //Código de escritura
   i2c_write(0x00);            //Puntero a la primera dirección
   i2c_start();                //Lectura
   i2c_write(0xD1);            //Código de lectura
   
   sec = (i2c_read()&0x7f);     //Lectura de los 4 bits de los segundos
   sec_2 = sec>>4;
   min = (i2c_read()&0x7f);    //Lectura de los 7 bits de los minutos
   min_2 = min>>4;
   hor = (i2c_read()&0x3f);    //Lectura de los 6 bits de los horas
   hor_2 = hor>>4;
   dia_set=(i2c_read()&0x7);   //Lectura de los 3 bits de los dias de la setmana
   dia = (i2c_read()&0x7f);    //Lectura de los 6 bits de los dias
   mes = (i2c_read()&0x1f);    //Lectura de los 5 bits de los meses
   ano = (i2c_read(0)&0xff);   //Lectura de los 8 bits de los años
   i2c_stop();
}
/******************************************************************************
                              PROGRAMA PRINCIPAL
******************************************************************************/
   void main()
   {
                   
    while(1)
    {
      tiempo(ano,mes,dia,dia_set,hor,hor_2,min,min_2,sec,sec_2);     //Lee tiempo del DS1307
                   
      output_high(PIN_C6);
      output_high(PIN_C7);
      output_A(sec_2);
      output_B(sec);
      output_low(PIN_C6);
      output_low(PIN_C7);
      output_high(PIN_C2);
      output_high(PIN_C5);
      output_A(min_2);
      output_B(min);
      output_low(PIN_C2);
      output_low(PIN_C5);
      output_high(PIN_C0);
      output_high(PIN_C1);
      output_A(hor_2);
      output_B(hor);
      output_low(PIN_C0);
      output_low(PIN_C1);
                   
     
     }
    }

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Reloj Nixie con DS1307
« Respuesta #11 en: 22 de Marzo de 2010, 15:43:49 »
Hola Wirry. la imagen no se ve muy bien ¿podrías adjuntar el DSN del ISIS?

En cualquier caso, la multiplexión no la puedes hacer así, sino que tienes que introducir pequeñas demoras entre cambio y cambio de ánodo para que la "persistencia de la visión" permita ver los nixie.

El pseudocódigo sería algo así:
Código: [Seleccionar]
while (true){
   //Horas
   Colocar las decenas de las horas en los cátodos del primer grupo de multiplexión
   Colocar las unidades de las horas en los cátodos del segundo grupo de multiplexión
   Dar tensión a los ánodos de las decenas y las unidades de las horas
   Realizar una breve pausa (esto lo tendrás que determinar experimentalmente)
   Retirar tensión a los ánodos de las decenas y las unidades de las horas

   //Minutos
   Colocar las decenas de los minutos en los cátodos del primer grupo de multiplexión
   Colocar las unidades de los minutos en los cátodos del segundo grupo de multiplexión
   Dar tensión a los ánodos de las decenas y las unidades de los minutos
   Realizar una breve pausa (esto lo tendrás que determinar experimentalmente)
   Retirar tensión a los ánodos de las decenas y las unidades de los minutos

   //Segundos
   Colocar las decenas de los segundos en los cátodos del primer grupo de multiplexión
   Colocar las unidades de los segundos en los cátodos del segundo grupo de multiplexión
   Dar tensión a los ánodos de las decenas y las unidades de los segundos
   Realizar una breve pausa (esto lo tendrás que determinar experimentalmente)
   Retirar tensión a los ánodos de las decenas y las unidades de los segundos

}


Desconectado Wirry85

  • PIC10
  • *
  • Mensajes: 11
Re: Reloj Nixie con DS1307
« Respuesta #12 en: 22 de Marzo de 2010, 15:54:14 »
Gracias.
Te adjunto el ISIS.