Matriz de leds

Desarrollo de Proyectos de Electrónica con Microcontroladores PIC

Re: Matriz de leds

Notapor Jcm » Mié Jul 07, 2010 1:49 am

Hola
trasteando un poco, esto.
Código: Seleccionar todo
      hora[1]=(horas&0x0f)+0x30;//convertimos horas a ascii
      hora[0]=(horas>>4)+0x30;
      hora[4]=(minutos&0x0f)+0x30;//convertimos minutos a ascii
      hora[3]=(minutos>>4)+0x30;
      hora[2]=":";

Se puede sustituir con la función sprintf por esto.Nos convierte nuestras variables en una cadena.
Código: Seleccionar todo
sprintf(hora,"%X:%X"horas,minutos);


Saludos!!!
La ignorancia me persigue desde que nací, siempre acaba encontrándome,la muy p.......... El menda
Avatar de Usuario
Jcm
 
Mensajes: 33
Registrado: Sab Abr 17, 2010 10:33 pm

Re: Matriz de leds

Notapor biblioman » Mié Jul 07, 2010 2:21 pm

Enhorabuena Javier por tus progresos, aún no he tenido tiempo de verlo en detalle pero me parece una excelente aportación. Gracias por compartirlo.

Un saludo
Avatar de Usuario
biblioman
 
Mensajes: 220
Registrado: Vie Mar 20, 2009 4:58 pm

Re: Matriz de leds

Notapor Jcm » Sab Jul 17, 2010 1:24 am

Gracias biblioman.
Como ya he dicho alguna vez,compartir lo poco que se, no es nada comparado con lo que aprendo gracias a vosotros.
He depurado un poco el código,ya puedo mostrar la temperatura con el símbolo en ascii de los grados que esta incluido en el nuevo adjunto,por que no puedo editar los post anteriores,también puedo pasar cualquier cadena a la función de visualizar el texto y la velocidad con la que pasa.El Proteus sigue haciendo cosas raras,imagino que lo tengo mal configurado.
Aun falta la función para cambiar la hora y la fecha,por eso se ve mal en el video.

Nuevo código:
Código: Seleccionar todo
#include "16F876.h"
#FUSES NOWDT,HS,NOPUT,NOPROTECT,NOBROWNOUT
#use delay(clock=8000000)
#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)
#include "ds1307.c"
#include "1wire.c"
#include "24256.C"
#include "ds1820.c"

#byte port_a=0x05
#byte port_b=0x06
#byte port_c=0x07

#define clk PIN_A3
#define dato PIN_C0

int32 fila[7];//array que contiene la matriz
int caracter[7];//contiene el caracter a mostrar
int minutos,horas,segundos,diasw,meses,dia,ano;//variables rtc
char texto[32];//contendra el mensaje
char hora[6],diaw[4],mes[4],fecha[18];//cadena con la hora
float temp;//contiene la lectura del ds1820



void datos_rtc()
{
      //segundos=read_ds1307(0);
      minutos=read_ds1307(1);//obtenemos minutos y hora
      horas=read_ds1307(2);
      diasw=read_ds1307(3);
      switch(diasw)
      {
      case 1:diaw="Lun";break;
      case 2:diaw="Mar";break;
      case 3:diaw="Mie";break;
      case 4:diaw="Jue";break;
      case 5:diaw="Vie";break;
      case 6:diaw="Sab";break;
      case 7:diaw="Dom";break;
      }
      dia=read_ds1307(4);
      meses=read_ds1307(5);
      switch(meses)
      {
      case 1:mes="Ene";break;
      case 2:mes="Feb";break;
      case 3:mes="Mar";break;
      case 4:mes="Abr";break;
      case 5:mes="May";break;
      case 6:mes="Jun";break;
      case 7:mes="Jul";break;
      case 8:mes="Ago";break;
      case 9:mes="Sep";break;
      case 10:mes="Oct";break;
      case 11:mes="Nov";break;
      case 12:mes="Dic";break;
      }
      ano=read_ds1307(6);
      sprintf(hora,"%X:%X"horas,minutos);
      sprintf(fecha"%s %X %s 20%X",diaw,dia,mes,ano);
      Printf(hora);
      printf("%s",fecha);
}

void pongo_dato(int1 bit)//funcion que pone 1 o 0 en el registro de desplaza
{                        //miento
output_bit(dato,bit);
output_high(clk);
//delay_us(1);
output_low(clk);
//delay_us(1);
}

void m_texto(Char estatico[])//funcion que monta texto estatico con cinco
{                           //caracteres
int y,z,i;
long x;
long direc;
for(x=0;x<7;x++)fila[x]=0x0000;//borramos la matriz
for(y=0;y<5;y++)//para los cinco caracteres de la hora
   {
   x=0;
   x=x|estatico[y];
   direc=x*7;//calculamos la direccion del caracter en la eeprom
   for(i=0;i<7;i++)//leemos los datos del caracter
      {
      caracter[i]=read_ext_eeprom(direc);
      printf("%X\r",caracter[i]);
      direc++;
      }
   for(i=0;i<7;i++)//introducimos el caracter en la matriz
      {
      for(z=0;z<6;z++)
        {
        if(bit_test(caracter[i],7))bit_set(fila[i],0);
        fila[i]=(fila[i]<<1);
        caracter[i]=(caracter[i]<<1);
        }
      //printf("g\r",fila[i]); 
      }
   }

}

void ver(long tiempo)//funcion que muestra el contenido de la matriz y hace el refresco
{
int x,i,y;
signed int z;
for(i=tiempo;i>0;i--)
   {
   y=1;
   for(x=0;x<7;x++)
      {
      port_b=0;
      for(z=31;z>-1;z--)pongo_dato(bit_test(fila[x],z));
      y=y*2;
      port_b=y;
      delay_us(700);//refresco
      }
   }
   port_b=0;
}

void ver_texto(char cadena[],int velo)//Funcion para visualizar los caracteres
{                            //uno seguido de otro
int a,b,c,d;
long e;
long direc;

for(b=0;b<7;b++)fila[b]=0x0000;//borra la matriz

for(a=0;a<96;a++)
   {
   if(cadena[a]=='\0')return;//comprobamos si termino la cadena
   e=0;
   e=e|cadena[a];
   direc=e*7;
      for(b=0;b<7;b++)//leemos el caracter
      {
      caracter[b]=read_ext_eeprom(direc);
      printf("%X\r",caracter[b]);
      direc++;
      }
      for(c=0;c<6;c++)    //vamos introduciendo los bit mas significativos del
      {                   //caracter y desplazando este y las filas de la matriz
        for(d=0;d<7;d++)
        {
        fila[d]=fila[d]<<1;
        caracter[d]=caracter[d]<<1;
        }
        for(d=0;d<7;d++)
        {
        if(bit_test(caracter[d],7))bit_set(fila[d],0);         
        }
      ver(velo);
       
      }   

    }   

}

void c_datos()
{
}

void main()
{

   set_tris_a(0x0f);
   set_tris_b(0x01);
   //set_tris_c(0x00);
   
   init_ds1307();          // iniciamos ds1307
   segundos=read_ds1307(0);
   write_ds1307(0,segundos & 0x7F); // Habilitamos oscilador bit 7 a 0
   
   init_ext_eeprom();
   
   
   
   do{
   datos_rtc();          //leemos datos del ds1307
   m_texto(hora);        //montamos la hora en la matriz
   ver(400);             //vemos por x tiempo
   //datos_rtc();
   temp=ds1820_read();   //leemos el sensor de temperatura
   sprintf(texto"%2.1f%cC %s   ",temp,248,fecha);//montamos el texto a mostrar
   printf(texto);
   ver_texto(texto,1);   //pasamos el texto que contiene la temperatura,la
                         //fecha completa y la velocidad
   texto="AquiHayApuntes";
   ver_texto(texto,3);
   }while(1);
}


http://www.youtube.com/watch?v=eFtgF4PzqL0

Saludos!!

Javi.
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
La ignorancia me persigue desde que nací, siempre acaba encontrándome,la muy p.......... El menda
Avatar de Usuario
Jcm
 
Mensajes: 33
Registrado: Sab Abr 17, 2010 10:33 pm

Re: Matriz de leds

Notapor biblioman » Sab Jul 17, 2010 12:53 pm

Hola Javi, ya he simulado tú proyecto con Proteus, la simulación es bastante aceptable aunque algunos caracteres no se visualizan correctamente, por el vídeo que muestras veo que en el circuito real todo te funciona correctamente.
Jcm escribió:Aun falta la función para cambiar la hora y la fecha

Encontré esta librería en el foro de CCS, que incluye una función para ajustar la hora y la fecha. Como por lo visto algunos usuarios les daba problemas la he probado según las características de tú Proyecto (PIC, frecuencia de reloj, pines, etc) y los resultados han sido satisfactorios, quizás te pueda servir para modificar la librería que estás usando o utilizar la librería completa modificando tu archivo principal. Aquí está la librería junto con la demo de demostración, espero que te sirva.

Librería DS1307.C
Código: Seleccionar todo

////////////////////////////////////////////////////////////////////////////////
///                               DS1307.C                                   ///
///                     Driver for Real Time Clock                           ///
///                                                                          ///
/// ds1307_init() - Enable oscillator without clearing the seconds register -///
///                 used when PIC loses power and DS1307 run from 3V BAT     ///
///               - Disable squarewave output                                ///
///                                                                          ///
/// ds1307_set_date_time(day,mth,year,dow,hour,min,sec)  Set the date/time   ///
///                                                                          ///
/// ds1307_get_date(day,mth,year,dow)               Get the date             ///
///                                                                          ///
/// ds1307_get_time(hr,min,sec)                     Get the time             ///
///                                                                          ///
////////////////////////////////////////////////////////////////////////////////

#define RTC_SDA  PIN_C4
#define RTC_SCL  PIN_C3

#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)
BYTE bin2bcd(BYTE binary_value);
BYTE bcd2bin(BYTE bcd_value);

void ds1307_init(void)
{
   BYTE seconds = 0;

   i2c_start();
   i2c_write(0xD0);      // WR to RTC
   i2c_write(0x00);      // REG 0
   i2c_start();
   i2c_write(0xD1);      // RD from RTC
   seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307
   i2c_stop();
   seconds &= 0x7F;

   delay_us(3);

   i2c_start();
   i2c_write(0xD0);      // WR to RTC
   i2c_write(0x00);      // REG 0
   i2c_write(bin2bcd(seconds));     // Start oscillator with current "seconds value
   i2c_start();
   i2c_write(0xD0);      // WR to RTC
   i2c_write(0x07);      // Control Register
   i2c_write(0x80);     // Disable squarewave output pin
   i2c_stop();

}

void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec)
{
  sec &= 0x7F;
  hr &= 0x3F;

  i2c_start();
  i2c_write(0xD0);            // I2C write address
  i2c_write(0x00);            // Start at REG 0 - Seconds
  i2c_write(bin2bcd(sec));      // REG 0
  i2c_write(bin2bcd(min));      // REG 1
  i2c_write(bin2bcd(hr));      // REG 2
  i2c_write(bin2bcd(dow));      // REG 3
  i2c_write(bin2bcd(day));      // REG 4
  i2c_write(bin2bcd(mth));      // REG 5
  i2c_write(bin2bcd(year));      // REG 6
  i2c_write(0x80);            // REG 7 - Disable squarewave output pin
  i2c_stop();
}

void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
{
  i2c_start();
  i2c_write(0xD0);
  i2c_write(0x03);            // Start at REG 3 - Day of week
  i2c_start();
  i2c_write(0xD1);
  dow  = bcd2bin(i2c_read() & 0x7f);   // REG 3
  day  = bcd2bin(i2c_read() & 0x3f);   // REG 4
  mth  = bcd2bin(i2c_read() & 0x1f);   // REG 5
  year = bcd2bin(i2c_read(0));            // REG 6
  i2c_stop();
}

void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec)
{
  i2c_start();
  i2c_write(0xD0);
  i2c_write(0x00);            // Start at REG 0 - Seconds
  i2c_start();
  i2c_write(0xD1);
  sec = bcd2bin(i2c_read() & 0x7f);
  min = bcd2bin(i2c_read() & 0x7f);
  hr  = bcd2bin(i2c_read(0) & 0x3f);
  i2c_stop();

}

BYTE bin2bcd(BYTE binary_value)
{
  BYTE temp;
  BYTE retval;

  temp = binary_value;
  retval = 0;

  while(TRUE)
  {
    // Get the tens digit by doing multiple subtraction
    // of 10 from the binary value.
    if(temp >= 10)
    {
      temp -= 10;
      retval += 0x10;
    }
    else // Get the ones digit by adding the remainder.
    {
      retval += temp;
      break;
    }
  }

  return(retval);
}


// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value)
{
  BYTE temp;

  temp = bcd_value;
  // Shifting upper digit right by 1 is same as multiplying by 8.
  temp >>= 1;
  // Isolate the bits for the upper digit.
  temp &= 0x78;

  // Now return: (Tens * 8) + (Tens * 2) + Ones

  return(temp + (temp >> 2) + (bcd_value & 0x0f));
}


Demo

Código: Seleccionar todo
#include <16F876.h>
#FUSES NOWDT,HS,NOPUT,NOPROTECT,NOBROWNOUT
#use delay(clock=8000000,RESTART_WDT)
#include "ds1307.c"
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PC)


void main()
{
  BYTE sec;
  BYTE min;
  BYTE hrs;
  BYTE day;
  BYTE month;
  BYTE yr;
  BYTE dow;

  ds1307_init();

  // Set date for -> 15 June 2005 Tuesday
  // Set time for -> 15:20:55
  ds1307_set_date_time(17,7,10,2,13,35,55);

  while(TRUE)
  {
    delay_ms(1000);
   
    ds1307_get_date(day,month,yr,dow);
    ds1307_get_time(hrs,min,sec);
     
    printf("\f\%02d/\%02d/\%02d\r\n",day,month,yr);
    printf("\%02d:\%02d:\%02d", hrs,min,sec);
  }
}



Saludos
Avatar de Usuario
biblioman
 
Mensajes: 220
Registrado: Vie Mar 20, 2009 4:58 pm

Re: Matriz de leds

Notapor Jcm » Mié Ago 11, 2010 1:26 am

Hola biblioman.
Como siempre agradezco el interés y dedicación que nos prestas.
Lo del proteus me tiene loco,le cambio la eeprom,le cargo el bin y simula bien durante un rato,después los caracteres se transforman en cosas raras,en fin,no le voy a dar mas vueltas,en la realidad funciona ok.
En cuanto a la rutina de cambiar los datos,no me refería a hacerlo por soft sino utilizando los pulsadores del circuito,este driver lo utilice al principio pero consumía mucha ram,el amigo Dany en unos posts mas atrás me proporciono uno mas sencillo,aunque,este tiene algunas funciones bastante interesantes:bin2bcd() y bcd2bin(),que he incluido en mi programa.
Otra cosa curiosa es que el CCS no reconoce los caracteres ascii mayores de 127.
Mi intención con este proyecto era migrar de basic a CCS,por mi parte me dio por satisfecho,ya tengo un reloj,termómetro,calendario y publik programado en C y todavía me sobra ron,uhhh digo, rom para convertirlo en despertador o programarlo por el puerto serie o quien sabe.
Adjunto el código y el ascii.bin de la eeprom con la ñ.

Cualquier sugerencia,corrección o duda sera bien recibida por mi parte.

Un saludo a todos.
Javi
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
La ignorancia me persigue desde que nací, siempre acaba encontrándome,la muy p.......... El menda
Avatar de Usuario
Jcm
 
Mensajes: 33
Registrado: Sab Abr 17, 2010 10:33 pm

Re: Matriz de leds

Notapor biblioman » Mié Ago 11, 2010 11:03 am

Hola Javi, en cuanto pueda pruebo el código para ver las mejoras que has introducido.
Jcm escribió:Otra cosa curiosa es que el CCS no reconoce los caracteres ascii mayores de 127.
.
El compilador es Made in USA, como fueron los americanos quien inventaron la codificación ASCII lo hicieron a semejanza de su idioma que no tiene ñ ni acentos, así que muchos compiladores dan problemas con el código ASCII extendido ( a mi me ha pasado en Visual C++ 6, y eso que es de Microsoft), el problema se soluciona utilizando secuencias de escape.

Por ejemplo si utilizo la siguiente sentecia que imprime una cadena que incluye la letra ñ minúscula (código ASCII 164) se representará mal en la Terminal:

printf("El tamaño de y es: %d bytes\r",sizeof(y));

Pero prueba y utiliza esta otra, verás que la letra ñ ahora se muestra correctamente en la terminal (sustituye la ñ por \a4)

printf("El tama\xa4o de y es: %d bytes\r",sizeof(y));

Espero que sea este el problema que tienes, si no lo es, pues lo seguimos comentando.

Un Saludo
Avatar de Usuario
biblioman
 
Mensajes: 220
Registrado: Vie Mar 20, 2009 4:58 pm

Re: Matriz de leds

Notapor Jcm » Mié Ago 11, 2010 11:58 pm

Gracias biblioman.
Esto me dio algunos dolores de cabeza,aunque lo solucione de esta manera.
Código: Seleccionar todo
sprintf(texto"A%co  ",164);

Tu codigo es mucho mas elegante y practico,lo he probado y funciona ok.
Código: Seleccionar todo
texto="A\xa4o  ";


Igual me paso con el caracter de los grados.

Saludos!!
Javi.

Edito:Mi intencion es que texto="Año ";
La ignorancia me persigue desde que nací, siempre acaba encontrándome,la muy p.......... El menda
Avatar de Usuario
Jcm
 
Mensajes: 33
Registrado: Sab Abr 17, 2010 10:33 pm

Re: Matriz de leds

Notapor Jcm » Vie Ago 13, 2010 2:27 am

Hola.
Os dejo un vídeo de la rutina para cambiar el año,perdonad la calidad,los pulsadores están en la placa de control y tenia que activar estos mientras hacia el vídeo(mi mujer siempre dice que los tíos no podemos hacer dos cosas a la vez,uhmm,voy a tener que empezar a creerlo).
http://www.youtube.com/watch?v=w74lhcNzrJo&feature=channel

Saludos!!
Javi.
La ignorancia me persigue desde que nací, siempre acaba encontrándome,la muy p.......... El menda
Avatar de Usuario
Jcm
 
Mensajes: 33
Registrado: Sab Abr 17, 2010 10:33 pm

Re: Matriz de leds

Notapor Dany » Vie Ago 13, 2010 1:16 pm

Hola Javi. Veo que al final lo has conseguido, te quedo muy bien. Yo he estado ultimamente un poco desconectado :oops: :oops: Estudio, trabajo y ahora esta calor que me esta matando, pero en cuanto pueda me pongo a revisar tú código, mas que nada por si aprendo algo que falta me hace.

Un saludote
Dany
 
Mensajes: 12
Registrado: Lun Oct 05, 2009 1:43 pm

Re: Matriz de leds

Notapor Jcm » Sab Ago 14, 2010 12:10 am

Hola Dany.

Me alegra verte de nuevo por aquí,espero que sea con fuerzas renovadas,aunque,la combinación de; estudio,trabajo y calor,no es buena ni para las fuerzas ni para el animo.
Ya nos queda poco para dejar de pasar calor,el trabajo que no falte y el estudio engrandece al hombre(o eso dicen).

Un saludo.
Javi
La ignorancia me persigue desde que nací, siempre acaba encontrándome,la muy p.......... El menda
Avatar de Usuario
Jcm
 
Mensajes: 33
Registrado: Sab Abr 17, 2010 10:33 pm

Anterior

Volver a Proyectos con PIC

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron