Autor Tema: Reloj por I2C  (Leído 1896 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado piflis

  • PIC10
  • *
  • Mensajes: 3
Reloj por I2C
« en: 21 de Marzo de 2010, 12:00:13 »
Hola, estamos haciendo un proyecto final, de un reloj que muestra horas y minutos y tambien muestra la temperatura pero con displays de 7 segmentos. Utilizamos el
PIC16f876, y para hacer la transmision de datos utilizamos el integrado 74HC164.
El tema de la temporizacion del reloj lo tenemos ya solucionado, pero tenemos problemas con el sensor de temperatura.
Estamos utilizando un LM35, y hemos acotado el rango de temperatura de 0ºC a 50ºC.
No somos capaces a avanzar y a conseguir que la salida del LM35 (hamos solucionado la tension de salida para adecuarla a la escala de temperaturas con 2 LM324), no sabemos como enviarlo apra que nos aparazca en los displays correspondientes a las Horas. Muestro reloj solo tendra 4 displays, 2 para las horas y 2 para los minutos.

Os dejo el programa (es de momento solo un esqueleto ya que vamos haciendolo por aprtes y os subo una foto del diseño en proteus....) Muchisimas gracias y haber si podeis ayudarme!



PROGRAMA EN C
#include <16f876.h>
#byte PA=0x05
#byte PB=0x06
#byte PC=0x07
#DEVICE ADC=8
#FUSES NOWDT,HS,NOPUT,NOPROTECT
#USE delay(clock=20000000)
#DEFINE EDAT PIN_C0
#DEFINE CLK PIN_C1
#DEFINE LEDS PIN_B3
#DEFINE TEMP PIN_A0

int traduce7seg(int display)
{
   switch(display)
   {
      case 0: return 0b11111100;Break;
      case 1: return 0b01100000;Break;
      case 2: return 0b11011010;Break;
      case 3: return 0b11110010;Break;
      case 4: return 0b01100110;Break;
      case 5: return 0b10110110;Break;
      case 6: return 0b10111110;Break;
      case 7: return 0b11100000;Break;
      case 8: return 0b11111110;Break;
      case 9: return 0b11100110;Break;
   }
}
int Enviar_Dato_serie(int dato)
{
   int i;
   for(i=0;i<8;i++)
   {
      if(!bit_test(dato,i)) output_low(EDAT);
      if(bit_test(dato,i)) output_high(EDAT);
      output_low(CLK);
      delay_us(1);
      output_high(CLK);
   }
}
parpadeo_led(int parpadeo)
{
      output_high(PIN_B3);//SE ENCIENDE el LED
      delay_ms(200);//RETARDO 200ms.
      output_low(PIN_B3);//Apago el LED
      delay_ms(200);//RETARDO 200ms.
}
char traducetemp(char displaytemp)
{
   switch(displaytemp)
   {
     case 0: return 0b11000110;Break;//muestra los º
   }
}
char traducetemp2(char displaytemp2)
{
   switch(displaytemp2)
   {
    case 0: return 0b10011100;Break;//muestra la C
   }
}

 void main (void)
{
   float tv,tr,y;   //variables de ecuacion
   int16 value;
   int mcontador=0,munidades=0,mdecenas=0,hunidades=0,hdecenas=0,hcontador=0;
   set_tris_a(0b00011111);
   set_tris_b(0b00000001);
   set_tris_c(0b00011000);
   PA=0;
   PB=0;
   PC=0;
   
   setup_port_a(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
   delay_us(10);
   {
      value = read_adc();
      tv=5.0*value /256.0;
      y=41.0*tv-0;
   }
 
while(1)
{
   parpadeo_led(1);

   Enviar_dato_serie(traducetemp2(munidades));
   Enviar_dato_serie(traducetemp(mdecenas));

   Enviar_dato_serie(read_adc());
   Enviar_dato_serie(read_adc());

}

}
« Última modificación: 21 de Marzo de 2010, 15:05:11 por piflis »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Reloj por I2C
« Respuesta #1 en: 21 de Marzo de 2010, 12:05:44 »
Hola.

Pues,  guarda el dato de la temperatura en la variable donde guardan el dato de las horas.

Saludos
El papel lo aguanta todo

Desconectado piflis

  • PIC10
  • *
  • Mensajes: 3
Re: Reloj por I2C
« Respuesta #2 en: 21 de Marzo de 2010, 12:10:07 »
El problema es que no se como hacerlo, y no se como pasar el dato que sale del lm35 para que lo entienda el pic en lo de traducira 7 segmentos y enviarlo......llevamos una semana dandole vueltas y esque ya estamos amargados.....

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Reloj por I2C
« Respuesta #3 en: 21 de Marzo de 2010, 12:16:01 »
Hola.

Debes crear una rutina de entero a BCD para descomponer el numero y de esa manera visualizarlo.

Saludos
El papel lo aguanta todo

Desconectado piflis

  • PIC10
  • *
  • Mensajes: 3
Re: Reloj por I2C
« Respuesta #4 en: 21 de Marzo de 2010, 12:54:22 »
Ya, pero como encajo todo eso dentro del programa que tenemos hecho???esque ya hemos probado de todo y nada fuenciona.....muchisimas gracias por contestar!

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Reloj por I2C
« Respuesta #5 en: 21 de Marzo de 2010, 16:36:11 »
Hola.

Antes de usar la función Enviar_dato_serie();, debes poner la rutina de entero a BCD, sería algo asi:

Código: CSS
  1. while(1)
  2. {
  3.    parpadeo_led(1);
  4.  
  5.    Enviar_dato_serie(traducetemp2(munidades));
  6.    Enviar_dato_serie(traducetemp(mdecenas));
  7.  
  8.    value = read_adc();
  9.    tv=5.0*value /256.0;
  10.    Entero2BCD(tv);
  11.  
  12.    Enviar_dato_serie(traduce7seg(hunidades));
  13.    Enviar_dato_serie(traduce7seg(hdecenas));
  14.  
  15. }

Saludos
El papel lo aguanta todo

Desconectado MarkKnopfler81

  • PIC12
  • **
  • Mensajes: 64
    • PICs, Electrónica y Robótica
Re: Reloj por I2C
« Respuesta #6 en: 21 de Marzo de 2010, 17:40:36 »
Para pasar a BDC lo puedes hacer mas o menos asi:

Código: [Seleccionar]
unidad=grados;
decena=unidad/10;
unidad-=decena*10;

saludos.