Autor Tema: Problema con programacion de la alarma  (Leído 7101 veces)

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con programacion de la alarma
« Respuesta #15 en: 15 de Febrero de 2010, 15:36:34 »
Gracias por la ayuda ASTROCAR, francamente me tiene  :angry: pero no me vencera o eso espero, me pongo con el programa de grabar la eeprom y una vez hecho lo posteare para que me digais si voy por buen camino.

PD: Suerte que lo hago para aprender, que con las horas que llevo con el si tuviera que venderlo  :D

Gracias de nuevo y un saludo
   
      Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con programacion de la alarma
« Respuesta #16 en: 16 de Febrero de 2010, 18:18:40 »
Hola de nuevo, siguiendo el consejo de ASTROCAR empece con el programa para grabar la eeprom cogiendo parte del codigo de BrunoF. Lo he simulado con PIC Simulator y creo tenerlo correcto.
Pero me surge una duda: ¿Debo hacer la conversion de BCD a BINARIO antes de hacer la comparacion con el ds1307?

Os dejo el programa para que me digais si voy por buen camino.

Código: CSS
  1. #include <16f877a.h>
  2. #fuses XT,NOWDT,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT,NOLVP,PUT
  3. #use delay(clock=4000000)
  4.  
  5. void write_string_eeprom(int address,char *data){
  6.    while(*data!=0){
  7.       write_eeprom(address++,*data);
  8.       data++;
  9.    }
  10.    write_eeprom(address,0);
  11. }
  12.  
  13. void read_string_eeprom(int address,char *sl){
  14.      sl--;
  15.    do{
  16.       sl++;
  17.       *sl=read_eeprom(address++);
  18.    }
  19.    while(*sl!=0);
  20. }
  21.  
  22. void main(){
  23.    char alarma1[6]="0830";
  24.    char alarma2[6]="0900";
  25.    char *leido;
  26.    //....
  27.    
  28.    write_string_eeprom(0x00,alarma1);
  29.    delay_ms(5);
  30.    write_string_eeprom(0x05,alarma2);
  31.    delay_ms(5);
  32.    read_string_eeprom(0x00,leido);
  33.    //....
  34. }


 Gracias
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con programacion de la alarma
« Respuesta #17 en: 17 de Febrero de 2010, 19:48:53 »
Buenas noches, una pregunta:
Repitiendo un poco el post anterior ¿es correcto almacenar las horas de la forma que expongo mas abajo?

Código: CSS
  1. #include <16f877a.h>
  2. #fuses XT,NOWDT,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT,NOLVP,PUT
  3. #use delay(clock=4000000)
  4. #define LCD_DB4 PIN_B4                    //Configuramos pines...
  5. #define LCD_DB5 PIN_B5
  6. #define LCD_DB6 PIN_B6
  7. #define LCD_DB7 PIN_B7
  8. #define LCD_E   PIN_B0
  9. #define LCD_RS  PIN_B1
  10. #define LCD_RW  PIN_B2                    //...para el LCD
  11.  
  12. #include <flex_lcd.0.c>               //Libreria manejo LCD
  13.  
  14. void write_string_eeprom(int address,char *data){
  15.    while(*data!=0){
  16.       write_eeprom(address++,*data);
  17.       data++;
  18.    }
  19.    write_eeprom(address,0);
  20. }
  21.  
  22. void read_string_eeprom(int address,char *sl){
  23.      sl--;
  24.    do{
  25.       sl++;
  26.       *sl=read_eeprom(address++);
  27.    }
  28.    while(*sl!=0);
  29. }
  30.  
  31. void main(){
  32.    char mystr[40];
  33.    char alarma1[]="08:30";
  34.    char alarma2[]="09:00";
  35.    char alarma3[]="09:25";
  36.    char alarma4[]="10:00";
  37.    char alarma5[]="10:20";
  38.    char alarma6[]="10:30";
  39.    char *leido=mystr;
  40.    //....
  41.    
  42.    write_string_eeprom(0x00,alarma1);
  43.    write_string_eeprom(0x06,alarma2);
  44.    write_string_eeprom(0x0C,alarma3);
  45.    write_string_eeprom(0x12,alarma4);
  46.    write_string_eeprom(0x18,alarma5);
  47.    write_string_eeprom(0x1E,alarma6);
  48.    
  49.    read_string_eeprom(0x00,leido);
  50.    delay_ms(1000);
  51.  
  52.  
  53.    lcd_init();
  54.    printf(lcd_putc,"LISTA ALARMAS");
  55.    printf(lcd_putc,"\n%s",leido);
  56.    //....
  57. }

 Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado septiembre_negro

  • PIC18
  • ****
  • Mensajes: 310
Re: Problema con programacion de la alarma
« Respuesta #18 en: 17 de Febrero de 2010, 20:52:17 »
Hola de nuevo, siguiendo el consejo de ASTROCAR empece con el programa para grabar la eeprom cogiendo parte del codigo de BrunoF. Lo he simulado con PIC Simulator y creo tenerlo correcto.
Pero me surge una duda: ¿Debo hacer la conversion de BCD a BINARIO antes de hacer la comparacion con el ds1307?

Os dejo el programa para que me digais si voy por buen camino.

Código: CSS
  1. #include <16f877a.h>
  2. #fuses XT,NOWDT,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT,NOLVP,PUT
  3. #use delay(clock=4000000)
  4.  
  5. void write_string_eeprom(int address,char *data){
  6.    while(*data!=0){
  7.       write_eeprom(address++,*data);
  8.       data++;
  9.    }
  10.    write_eeprom(address,0);
  11. }
  12.  
  13. void read_string_eeprom(int address,char *sl){
  14.      sl--;
  15.    do{
  16.       sl++;
  17.       *sl=read_eeprom(address++);
  18.    }
  19.    while(*sl!=0);
  20. }
  21.  
  22. void main(){
  23.    char alarma1[6]="0830";
  24.    char alarma2[6]="0900";
  25.    char *leido;
  26.    //....
  27.    
  28.    write_string_eeprom(0x00,alarma1);
  29.    delay_ms(5);
  30.    write_string_eeprom(0x05,alarma2);
  31.    delay_ms(5);
  32.    read_string_eeprom(0x00,leido);
  33.    //....
  34. }


 Gracias

Hola
Si estas utilizando alguna librería para el ds1307 estas por lo general realizan la conversión de bcd a binario por lo cual no es necesario.
Si  por el contrario tu la estas desarrollando si debes realizar la conversión para que puedas trabajar con la información (comparar, mandarla a un lcd etc.)
Con respecto a la otra pregunta no puedo ayudarte por que miro que lo estas asiendo por string y eso es algo que tengo pendiente. :mrgreen: :mrgreen:

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con programacion de la alarma
« Respuesta #19 en: 19 de Febrero de 2010, 05:54:17 »
Hola de nuevo sigo posteando los avances, de momento puedo grabar la eeprom interna para luego leerla y visualizar en el lcd, ahora a por la comparacion con las horas del ds1307.

Código: CSS
  1. #include <16f877a.h>
  2. #fuses XT,NOWDT,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT,NOLVP,PUT
  3. #use delay(clock=4000000)
  4. #use i2c(Master, sda=PIN_C4, scl=PIN_C3)
  5. #define LCD_DB4 PIN_B4                    //Configuramos pines...
  6. #define LCD_DB5 PIN_B5
  7. #define LCD_DB6 PIN_B6
  8. #define LCD_DB7 PIN_B7
  9. #define LCD_E   PIN_B0
  10. #define LCD_RS  PIN_B1
  11. #define LCD_RW  PIN_B2                    //...para el LCD
  12.  
  13. #define DAL_SCL   PIN_A0
  14. #define DAL_SDA   PIN_A1
  15.  
  16. #include <flex_lcd.0.c>               //Libreria manejo LCD
  17. #include <_ds1307.c>             //Libreria manejo RTC
  18. #include <ds1621.c>              //Libreria sensor Temp
  19.  
  20.  
  21.  //FUNCIONES ESCRITURA Y LECTURA EEPROM INTERNA
  22.  void write_string_eeprom(int address,char *data){
  23.    while(*data!=0){
  24.       write_eeprom(address++,*data);
  25.       data++;
  26.    }
  27.    write_eeprom(address,0);
  28. }
  29.  
  30. void read_string_eeprom(int address,char *sl){
  31.      sl--;
  32.    do{
  33.       sl++;
  34.       *sl=read_eeprom(address++);
  35.    }
  36.    while(*sl!=0);
  37. }
  38.  
  39.  byte hr,min,sec,day,month,yr,dow;
  40.  char sdow[11];
  41.  byte value;
  42.  
  43.  void main(){
  44.    char mystr[40];
  45.    char alarma1[]="08:30";
  46.    char alarma2[]="09:00";
  47.    char alarma3[]="09:25";
  48.    char alarma4[]="10:00";
  49.    char alarma5[]="10:20";
  50.    char alarma6[]="10:30";
  51.    char *leido=mystr;
  52.    //....
  53.    
  54.  //MENU DE PRESENTACION  
  55.    lcd_init();
  56.    lcd_gotoxy(2,1);
  57.    printf(lcd_putc,"Reloj Alarma");      //Menu de presentacion.
  58.    lcd_gotoxy(2,2);
  59.    printf(lcd_putc,"Miquel_S");
  60.    delay_ms(1500);
  61.    lcd_putc("\f");  
  62.  
  63. //ESCRITURA ALARMAS
  64.    write_string_eeprom(0x00,alarma1);
  65.    write_string_eeprom(0x06,alarma2);
  66.    write_string_eeprom(0x0C,alarma3);
  67.    write_string_eeprom(0x12,alarma4);
  68.    write_string_eeprom(0x18,alarma5);
  69.    write_string_eeprom(0x1E,alarma6);
  70.    
  71. //LECTURA ALARMAS
  72.    lcd_init();
  73.    printf(lcd_putc,"LISTA ALARMAS");
  74.    delay_ms(800);
  75.    read_string_eeprom(0x00,leido);
  76.    printf(lcd_putc,"\n%s",leido);
  77.    delay_ms(1000);
  78.    read_string_eeprom(0x06,leido);
  79.    printf(lcd_putc,"\n%s",leido);
  80.    delay_ms(1000);
  81.    read_string_eeprom(0x0C,leido);
  82.    printf(lcd_putc,"\n%s",leido);
  83.    delay_ms(1000);
  84.    read_string_eeprom(0x12,leido);
  85.    printf(lcd_putc,"\n%s",leido);
  86.    delay_ms(1000);
  87.    read_string_eeprom(0x18,leido);
  88.    printf(lcd_putc,"\n%s",leido);
  89.    delay_ms(1000);
  90.    read_string_eeprom(0x1E,leido);
  91.    printf(lcd_putc,"\n%s",leido);
  92.    delay_ms(1000);
  93.    
  94.  //INICIALIZA DS1307
  95.    ds1307_init(DS1307_ALL_DISABLED);
  96.    printf(lcd_putc,"\fInicializando\nDS1307...");
  97.    delay_ms(1000);
  98.    ds1307_set_date_time(11,2,10,3,22,05,0);
  99.    
  100.  //LEE FECHA Y HORA ACTUAL DS1307
  101.    ds1307_get_day_of_week((char*) sdow);
  102.    ds1307_get_date(day,month,yr,dow);
  103.    ds1307_get_time(hr,min,sec);
  104.    printf(lcd_putc,"\f%s  %02d-%02d-%02d",sdow,day,month,yr);
  105.    printf(lcd_putc,"\n%02d:%02d:%02d",hr,min,sec);
  106.    
  107.  //INICIALIZA Y LEE TEMPERATURA DS1621
  108.    init_temp();
  109.    read_temp();
  110.    value=read_temp();
  111.    lcd_gotoxy(10,2);
  112.    printf(lcd_putc,"Temp:%u  ",value);
  113.    //delay_ms(1000);
  114.  }

 Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 664
Re: Problema con programacion de la alarma
« Respuesta #20 en: 19 de Febrero de 2010, 07:17:45 »
ok  perfecto ya veo tu avance ahora haste  una rutina de comparacion con la alarma guardada y la hora actual y listo tomas decision segun tu caso y objetivo terminado.

Saludos y cualquier cosa has tgu comentario nuevamente.
Atten.
Alexander Santana.
Venezuela-Barcelona.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con programacion de la alarma
« Respuesta #21 en: 19 de Febrero de 2010, 14:19:46 »
Gracias ASTROCAR, con tu respuesta me quitas un peso de encima, me pongo con la rutina de comparacion a ver que sale y os trendre informados.

  :-/ :-/ :-/

 Miquel_S
 
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con programacion de la alarma
« Respuesta #22 en: 23 de Febrero de 2010, 19:03:15 »
Buenas noches, alguien puede decirme por que no reconoce el strcmp:
Undefined identifier strcmp

Código: CSS
  1. #include <16F877a.h>
  2. #fuses XT,NOWDT,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT,NOLVP,PUT
  3. #use delay(clock=4000000)
  4.  
  5. //FUNCIONES LECTURA/ESCRITURA EEPROM INTERNA
  6. void write_string_eeprom(int address,char *data){
  7.    while(*data!=0){
  8.       write_eeprom(address++,*data);
  9.       data++;
  10.    }
  11.    write_eeprom(address,0);
  12. }
  13.  
  14. void read_string_eeprom(int address,char *sl){
  15.      sl--;
  16.    do{
  17.       sl++;
  18.       *sl=read_eeprom(address++);
  19.    }
  20.    while(*sl!=0);
  21. }
  22.  
  23. void main(){
  24.    char alarmas[40];
  25.    char alarma1[]="0830";
  26.    char alarma2[]="0830";
  27.    
  28. //ESCRITURA/LECTURA EEPROM
  29.    write_string_eeprom(0x00,alarma1);
  30.    write_string_eeprom(0x06,alarma2);
  31.    
  32. //COMPARACION DE ALARMAS
  33.    if (strcmp(alarma1,alarma2)==1);
  34.       output_high(PIN_A0);
  35. }

Gracias
 Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema con programacion de la alarma
« Respuesta #23 en: 24 de Febrero de 2010, 01:00:55 »
Te falta incluir la libreria string.h.

Saludos
El papel lo aguanta todo

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con programacion de la alarma
« Respuesta #24 en: 25 de Febrero de 2010, 18:44:21 »
Hola de nuevo, creo poder leer y comparar strings solo falta adaptarlo al proyecto,  seria leer la hora del ds1307 leer la hora almacenada en la eeprom y hacer sonar el buzzer.
No se si como lo hago sera la forma correcta espero que si ya que habra sido como un parto  :D
 
 
Código: CSS
  1. #include <16F877a.h>
  2. #fuses XT,NOWDT,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT,NOLVP,PUT
  3. #use delay(clock=4000000)
  4. #include <string.h>
  5.  
  6. //FUNCIONES LECTURA/ESCRITURA EEPROM INTERNA
  7. void write_string_eeprom(int address,char *data){
  8.    while(*data!=0){
  9.       write_eeprom(address++,*data);
  10.       data++;
  11.    }
  12.    write_eeprom(address,0);
  13. }
  14.  
  15. void read_string_eeprom(int address,char *sl){
  16.      sl--;
  17.    do{
  18.       sl++;
  19.       *sl=read_eeprom(address++);
  20.    }
  21.    while(*sl!=0);
  22. }
  23.  
  24. void main(){
  25.    char alarmas[40];
  26.    char alarma1[]="0830";
  27.    char alarma2[]="0900";
  28.    char *leido=alarmas;
  29.    
  30. //ESCRITURA EEPROM
  31.    write_string_eeprom(0x00,alarma1);
  32.    write_string_eeprom(0x05,alarma2);
  33.    
  34. //LECTURA Y COMPARACION DE ALARMAS
  35.    read_string_eeprom(0x00,leido);
  36.    if(strcmp(alarma1,leido)==1)
  37.       output_high(PIN_A0);
  38.    else
  39.       output_low(PIN_A0);
  40.    read_string_eeprom(0x05,leido);
  41.    if(strcmp(alarma2,leido)==0)
  42.       output_high(PIN_A0);
  43.    else
  44.       output_low(PIN_A0);
  45.    
  46. }

 Gracias por su atencion y ayuda
 
 Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con programacion de la alarma
« Respuesta #25 en: 25 de Febrero de 2010, 20:44:44 »
Parece estar bien. Ahora ten cuidado cuando armes el string al leer el ds1307, que corresponda como has guardado la alarma  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con programacion de la alarma
« Respuesta #26 en: 26 de Febrero de 2010, 05:40:00 »
Gracias Suky lo tendre en cuenta, una cosa mas que se me olvido preguntar  :mrgreen:

Código: CSS
  1. //LECTURA Y COMPARACION DE ALARMAS
  2.    read_string_eeprom(0x00,leido);
  3.    if(strcmp(alarma1,leido)==0)
  4.       output_high(PIN_A0);
  5.    else
  6.       output_low(PIN_A0);
  7.    read_string_eeprom(0x05,leido);
  8.    if(strcmp(alarma2,leido)==0)
  9.       output_high(PIN_A0);
  10.    else
  11.       output_low(PIN_A0);

En las sentencias if como distingo si poner 0 o 1 (Verdadero o Falso) ya que si pongo 0 auque no coincida la lectura se me enciende el led

 Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con programacion de la alarma
« Respuesta #27 en: 26 de Febrero de 2010, 21:06:37 »
Lo siento, no acierto a saber como hacer la comparacion de las alarmas con el ds, alguien puede explicarme como.

 
Código: CSS
  1. //LECTURA ALARMAS Y COMPARACION DS1307
  2.    read_string_eeprom(0x00,leido);
  3.       if(strcmp(leido,hr)==0)
  4.       if(strcmp(leido,min)==0)
  5.          output_high(PIN_C0);
  6.       else
  7.          output_low(PIN_C0);

 Gracias
 Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con programacion de la alarma
« Respuesta #28 en: 27 de Febrero de 2010, 11:50:29 »
Lo que pasa que en la eeprom estás guardando las alarmas en ascii, osea por ejemplo para 0830, guardas 0x30,0x38,0x33,0x30. Ahora cuando leer la hora de un ds, lo recibes en BCD, por ejemplo al leer la hora 18, en realidad recibes el binario 0001 1000, entonces debes tratar ese dato para hacer la compración correctamente. Puede que la libreria que utilices ya te trabaje el dato recibido y te lo devuelva en binario, osea recibirias 00010010, pero este debes pasarlo a ascii.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con programacion de la alarma
« Respuesta #29 en: 27 de Febrero de 2010, 12:56:54 »
Gracias Suky por tu respuesta, referente a la libreria que estoy usando es la de Redpic, y si no la entiendo mal convierte los datos de binario a bcd y viceversa. Lo que no tengo claro es la forma de hacerlo, no se si para leer la hora del ds debo usar ds1307_get_time(hr,min,sec); y luego comparar los datos por separado o comparar el string completo, auque creo que es el string completo.
O si por otro lado deberia leer la hora del ds con otra instruccion para luego guardar los datos en una variable antes de hacer la comparacion, de todos modos no creo que lo publicado en el post anterior sea la forma correcta de hacerlo auque tenga los datos en ascii.

En las sentencias if como distingo si poner 0 o 1 (Verdadero o Falso) ya que si pongo 0 auque no coincida la lectura se me enciende el led.
PD:Perdon por repetir la pregunta del 0 o 1 pero necesito saberlo.

Gracias
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.