Autor Tema: problema con temporizador  (Leído 1008 veces)

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

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
problema con temporizador
« en: 30 de Junio de 2016, 18:59:21 »
* PROTEUS.zip
(34.76 kB - descargado 133 veces)
* PROTEUS.zip
(34.76 kB - descargado 133 veces)
Hola a todos, preciso ayuda con el codigo de este temporizador, el mismo tiene un ds1307 que da la hora y que permite programar la hora en que se va a activar una salida para activar una carga. el funcionamiento se divide en el de estado de programacion y el estado normal, el los dos se puede ajustar la hora pero en el de programacion solo ajusta la hora de activacion no la que da el reloj, mediante un boton selecciono el digito de la hora a modificar signo pregunta abajo (?) y con otro boton lo incremento, otro me permite entrar en programacion, el tema es que no se porque no se modifica la hora cuando apreto el boton de incrementar y estoy en la posicion de algun digito, me ayudan?
* MainAgitador.c
(4.14 kB - descargado 146 veces)
* PROTEUS.zip
(34.76 kB - descargado 133 veces)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:problema con temporizador
« Respuesta #1 en: 30 de Junio de 2016, 19:44:30 »
Si te dieran la tarea de clavar un clavo con un martillo y te dan el martillo, creo que hubieras agarrado una tenaza, un serrucho, una forga, tratado de crear un martillo y recien alli tratar de clavarlo.

Me refiero a esto:

Código: C
  1. #byte port_A=0x05
  2. #byte port_B=0x06
  3. #byte port_C=0x07
  4. #byte port_D=0x08
  5. bit_test(port_C,4)
  6.    set_tris_c(0xF0);

Hubieras puesto:

Código: C
  1. #USE FAST_IO(C)

y tenias para usar sin que se cambie a entrada:

Código: C
  1. input(PIN_C4)

-----------------------------------------

   if(Prog==1)Programar();else Normal();

Y luego dentro preguntas nuevamente por prog ?

Código: C
  1. void Normal()
  2. {
  3. if(Prog==0)
  4.    {
  5.    lcd_gotoxy(6,1);
  6.    printf(lcd_putc,"  N");
  7.    }

Es obvio que se va a ejecutar, por que entro alli ya con Prog == 0

----------------------------------------

Miremos la funciones de actualizacion:

Código: C
  1. void ActualizarPrograma()
  2. {
  3.    disable_interrupts(int_ext);

Código: C
  1. void ActualizaHora()
  2. {
  3.    enable_interrupts(int_ext);

Estas son llamadas desde la interrupcion int_ext, una ves ejecutado el Actualizar_Programa, nunca mas podes ejecutar el ActualizaHora! por que estan deshabilitadas!

------------------------------------------------------------

Esto es un asesinato:
Código: C
  1. if((!(bit_test(port_D,3)))&&(Seleccion==1))
  2.    {  
  3.    DHora++;
  4.    if(DHora=3)DHora=0;
  5.    }
  6. if((!(bit_test(port_D,3)))&&(Seleccion==2))
  7.    {  
  8.    UHora++;
  9.    if(UHora=10)UHora=0;
  10.    }
  11. if((!(bit_test(port_D,3)))&&(Seleccion==3))
  12.    {  
  13.    DMinutos++;
  14.    if(DMinutos=6)DMinutos=0;
  15.    }
  16. if((!(bit_test(port_D,3)))&&(Seleccion==4))
  17.    {  
  18.    UMinutos++;
  19.    if(UMinutos=10)UMinutos=0;

Problemas en ese solo pedazo de texto:

- repetir 4 veces el bit_test
- Todos los if de adentro no son igualdades sino asignaciones, les falta un =.
- Todos if separados lo cual es ilogico, ya que si Seleccion tiene un valor va a entrar en el que corresponda y no deberia preguntar por los demas.

Usando el FAST_IO

Código: C
  1. if(!input(PIN_D3)
  2. {
  3.         switch(Seleccion)
  4.         {
  5.                 case 1:
  6.                         DHora++;
  7.                         if(DHora==3) DHora=0;
  8.                         break;
  9.                 case 2:
  10.                         UHora++;
  11.                         if(UHora==10) UHora=0;
  12.                         break;
  13.                 case 3:
  14.                         DMinutos++;
  15.                         if(DMinutos==6) DMinutos=0;
  16.                         break;
  17.                 case 4:
  18.                         UMinutos++;
  19.                         if(UMinutos==10) UMinutos=0;
  20.                         break;
  21.                 case 5:
  22.                         // Aca codigo
  23.                         break;
  24.                 default:
  25.                         break;
  26.         }
  27. }

---------------------------------------------------------

Código: C
  1. void  TIMER1_isr(void)//Función de interrupción por desbordamiento TMR1  
  2. {
  3. if(!(bit_test(port_C,4)))Prog=!Prog;
  4. if(!(bit_test(port_D,2)))

No existe ninguna restriccion para que esto se ejecute o no, si tenes presionado el PIN_C4 , cada 200ms va a estar cambiando Prog, dije 200ms por lo que pusiste en comentarios.

-------------

El loop while esta continuamente escribiendo el LCD unos espacios y signos de pregunta, sin ninguna necesidad.

El codigo de tu while, con el Normal y el Programacion juntos:

Código: C
  1. while(1)
  2. {
  3.         lcd_gotoxy(6,1);
  4.         if(Prog==1)
  5.         {
  6.                 printf(lcd_putc,"  P");
  7.         }
  8.         else
  9.         {
  10.                 printf(lcd_putc,"  N");
  11.         }
  12.  
  13.         lcd_gotoxy(1,2);
  14.         switch(Seleccion)
  15.         {
  16.                 case 1:
  17.                         printf(lcd_putc,"?");
  18.                         break;
  19.                 case 2:
  20.                         printf(lcd_putc," ?");
  21.                         break;
  22.                 case 3:
  23.                         printf(lcd_putc,"   ?");
  24.                         break;
  25.                 case 4:
  26.                         printf(lcd_putc,"    ?");
  27.                         break;
  28.                 case 5:
  29.                         printf(lcd_putc,"     ");
  30.                         break;
  31.                 default:
  32.                         break;
  33.         }
  34. }

Aunque no lo haria asi, solo escribiria cuando fuese necesario en el LCD, pero bueno es para que te des cuenta toda la informacion redundante que hay

-------------

Finalmente. Esta todo como muy rebuscado para hacer las cosas, podria hacerse mucho mas claro todo. Y eso ya depende de vos.
« Última modificación: 30 de Junio de 2016, 19:47:20 por KILLERJC »

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:problema con temporizador
« Respuesta #2 en: 30 de Junio de 2016, 20:02:54 »
Gracias por tus apreciaciones, algunas no las comparto pero no importa, gracias igual


 

anything