Autor Tema: SEMAFORO CONFIGURABLE  (Leído 5593 veces)

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

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
SEMAFORO CONFIGURABLE
« en: 06 de Septiembre de 2015, 21:03:20 »
Un saludo amigos del foro.

Recientemente e estado desarrollando un semáforo peatonal de tiempo configurable por el usuario (Ya llevo un 90% de avances).

El usuario puede configurar los tiempos de encendido de cada led, según sea la necesidad, no necesariamente seria par un semáforo.
Este tiempo se configura por medio de un menú y este tiempo configurado es almacenado en la eeprom del pic18F4550.

Esta es la parte que no me gusta aun como a quedado y necesito de su ayuda:

Código: Text
  1. void arranque(void)        
  2.          {
  3.          if(!input(pin_b3))  { while(!input(pin_b3)) enable_interrupts(INT_TIMER1); led_verde }
  4.          if(segundos_1==0 & minutos_1==0) { segundos_1=0; minutos_1=0; disable_interrupts(INT_TIMER1); enable_interrupts(INT_TIMER3); led_naranja}
  5.          if(segundos_2==0 & minutos_2==0 || segundos_2==59 & minutos_2==59) { segundos_2=0; minutos_2=0; disable_interrupts(INT_TIMER3); enable_interrupts(INT_TIMER0); led_rojo}
  6.          if(segundos_0==0 & minutos_0==0) { segundos_0=0; minutos_0=0;  disable_interrupts(INT_TIMER0); diSable_interrupts(global); led_off }
  7.          }            
  8.  
  9.  
  10. Esta parte anteriormente escrita es donde le doy el arranque a los timer para que inicien el conteo del tiempo de manera decendente, solo que no me gusta como queda, necesito de su ayuda o sugerencias.
  11.  
  12. Anexo el code en ccs

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: SEMAFORO CONFIGURABLE
« Respuesta #1 en: 06 de Septiembre de 2015, 21:11:14 »
Solo una cosa, en el afan de hacer el codigo mas "pequeño" se pierde legibilidad, asi que si podes mantener un codigo "expandido" seria mejor. Al menos es lo que me parece ami, me resulta mas complejo ver un if asi cuando existen 5/6 lineas dentro que uno asi:

Código: C
  1. void arranque(void)        
  2. {
  3.          if(!input(pin_b3))
  4.          {
  5.                 while(!input(pin_b3))
  6.                 enable_interrupts(INT_TIMER1);
  7.                 led_verde
  8.          }
  9.          if(segundos_1==0 & minutos_1==0)
  10.          {
  11.                 segundos_1=0;
  12.                 minutos_1=0;
  13.                 disable_interrupts(INT_TIMER1);
  14.                 enable_interrupts(INT_TIMER3);
  15.                 led_naranja
  16.          }
  17.          if(segundos_2==0 & minutos_2==0 || segundos_2==59 & minutos_2==59)
  18.          {
  19.                 segundos_2=0;
  20.                 minutos_2=0;
  21.                 disable_interrupts(INT_TIMER3);
  22.                 enable_interrupts(INT_TIMER0);
  23.                 led_rojo
  24.          }
  25.          if(segundos_0==0 & minutos_0==0)
  26.          {
  27.                 segundos_0=0;
  28.                 minutos_0=0;
  29.                 disable_interrupts(INT_TIMER0);
  30.                 diSable_interrupts(global);
  31.                 led_off
  32.          }
  33. }

Con respecto al codigo, para no mirar toda la otra parte del codigo y tratar de encontrar que hace cada cosa, podrias explicar que queres que haga tu codigo exactamente.
Tambien de que se tratan las variables que tenes definidas. ese boton de que es ?. Para que estas usando los timers? etc etc

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re: SEMAFORO CONFIGURABLE
« Respuesta #2 en: 06 de Septiembre de 2015, 21:54:25 »
Gracias por responder tan rápido.

Utilizó 3 timer. Cada uno para contar el tiempo de un segundo y con ello hacer tres contadores de segundos y minutos. Estos tiempos los configuró con un menú.h, ejemplo le indicó cuantos segundos quiero que cuente y cuantos minutos quiero que cuente el primer timer de manera descendente. Hasta ahí todo bien.

La parte de código que coloque y que tu expandiste. Es para que una vez configurados los tres tiempos (tres timer), realice la función de darle el arranque, es decir, para que inicie la cuenta descendente con la siguiente lógica: primero desciende el timer1 hasta llegar a cero minutos y cero segundos, después el timer3 hasta llegar a cero y por último timer0 hasta llegar a cero. Cada led va encendiendo cuando inicia la cuenta descendente y apaga cuando llega a cero. Como si fuera un semáforo.

La funció void arranque() la utilizó para esa lógica ya descrita. Y el !input(pin_b3); es quien libera los timer para realizar la cuenta atras.

Sólo que esta función no me gusta y se que se puede mejorar quizás con un #int ext en vez de utilizar el !input(pin_b3).

Es lo que quiero. Mejorar esta función del arranque.
« Última modificación: 06 de Septiembre de 2015, 21:58:12 por mariacontenis »

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: SEMAFORO CONFIGURABLE
« Respuesta #3 en: 07 de Septiembre de 2015, 00:26:05 »
con un solo Timer podrías hacer las temporizaciones, estableces una base de tiempo definida y a partir de allí, incrementas o decrementas contadores vigilados por banderas independientes según el tiempo para cada color del semáforo.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: SEMAFORO CONFIGURABLE
« Respuesta #4 en: 07 de Septiembre de 2015, 04:34:49 »
Asi como dice PalitroqueZ, no hay necesidad de tener 3 timers, utiliza el de 16 bits ya que te permite mas facilmente llegar al segundo.

Dentro de la interrupcion deberias tener la comparaciones, el restado de las variables del tiempo,y la activacion de la salida. Eso habilitado por el boton

         if(!input(pin_b3))
    {
      while(!input(pin_b3))
      arraque=1
      led_verde
    }

luego en la interupcion que siempre estara corriendo, preguntas, si arranque es 1 y haces lo que tengas que hacer. Tambien otra cosa


Citar
         if(segundos_1==0 && minutos_1==0)
    {
      segundos_1=0;
      minutos_1=0;

      disable_interrupts(INT_TIMER1);
      enable_interrupts(INT_TIMER3);
      led_naranja
    }

Señale 2 cosas en ese codigo. le faltaba un & , uno es un bitwise AND, entre bits ( & ) y el otro un logical and ( && ) entre condiciones True/False, no se como funcionara en ese caso pero por las dudas me aseguro.
Y la otra que sentido tiene poner  segundos_1 y minutos_1 a 0 si la condicion para entrar es que sean esos valores?,

En tu interrupcion quedaria algo asi:

Código: C
  1. if(arranque))
  2.          {
  3.                 if(segundos_1==0)
  4.                 {
  5.                         if(minutos_1!=0)
  6.                         {
  7.                                 segundos_1=59;
  8.                                 minutos_1--;
  9.                         }
  10.                 }      
  11.                 else
  12.                 {
  13.                         segundos_1--;
  14.                 }
  15.          }

Aunque si notas vas a tener el mismo codigo 3 veces, podrias hacer una funcion


Código: C
  1. void disminuirtiempo(*seg,*min)
  2. {
  3.         if(*seg==0)
  4.         {
  5.                 if(*min!=0)
  6.                 {
  7.                         *seg=59;
  8.                         *min--;
  9.                 }
  10.         }      
  11.         else
  12.         {
  13.                 *seg--;
  14.         }
  15. }

Y llamarla:

Código: C
  1. if(arranque)
  2. {
  3.         disminuirtiempo(&segundos_1,&minutos_1);
  4.         disminuirtiempo(&segundos_2,&minutos_2);
  5.         disminuirtiempo(&segundos_2,&minutos_3);
  6. }

Es tu decision como lo vas a hacer, yo di algunos "ejemplos" por no decir tire codigo por tirar xD

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re: SEMAFORO CONFIGURABLE
« Respuesta #5 en: 07 de Septiembre de 2015, 10:43:04 »
Gracias KILLERJC y PalitroqueZ por sus sugerencias y Opinión acerca de este código, de verdad, me es de gran ayuda.

Estaré pasteando el código con sus aportaciones que han mencionado, aunque aun tengo algunas dudas de como realizar el código para que con un solo timer pueda configurar tres tiempos diferentes, pero bueno lo estaré intentando y como les menciono pondré los avances.

con respecto al & no sabia el utilizarlo de manera independiente o &&

Todo lo mencionado me amplio un panorama mejor. Muchas gracias.

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re: SEMAFORO CONFIGURABLE
« Respuesta #6 en: 15 de Septiembre de 2015, 23:14:30 »

Ya realice algunos cambios en los cuales realizo el conteo de los tres tiempos con una sola interrupción del timer0, eso por medio de banderas, como ya me habian sugirieron KILLERJC y Pali
Así quedo...


    
         void arranque(void)        
         {
         if(!input(pin_b3)) {delay_ms(300); programa=1; enable_interrupts(INT_TIMER0);}        
         if (programa==1)   { seg_0=seg; min_0=min; led_verde   if(segundos_0==seg_0 && minutos_0==min_0){seg=0; min=0; programa=2;}}
         if (programa==2)   { seg_1=seg; min_1=min; led_naranja if(segundos_1==seg_1 && minutos_1==min_1){seg=0; min=0; programa=3;}}
         if (programa==3)   { seg_2=seg; min_2=min; led_rojo    if(segundos_2==seg_2 && minutos_2==min_2){seg=0; min=0; programa=0; led_off}}                                  
         }          
          
         #int_timer0                                                    // Interrupcion para 1S
         void timer0(void)
         { seg++; if(seg>59){seg=0; min++;} if(min>59){min=0;} set_timer0(49911);}              
« Última modificación: 17 de Septiembre de 2015, 17:59:16 por mariacontenis »

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re: SEMAFORO CONFIGURABLE
« Respuesta #7 en: 06 de Octubre de 2015, 03:51:32 »
Nuevamente requiero de su consejo ó ayuda.

Como puedo hacer para sumar el total de minutos y segundos de estos tres tiempos establecidos

minutos_0,segundos_0
minutos_1,segundos_1
minutos_2,segundos_2

que cada uno tiene el siguiente formato:  printf(lcd_putc,"  %02u:%02u"minutos_0,segundos_0);
                                                         printf(lcd_putc,"  %02u:%02u"minutos_1,segundos_1);
                                                         printf(lcd_putc,"  %02u:%02u"minutos_2,segundos_2);

Por ejemplo, si la sumatoria de:   (segundos_0+segundos_1+segundos_2)=63, entonces pase a ser 1 min, 3 seg
Lo mismo para minutos ejemplo:   (minutos_0+minutos_1+minutos_2)=34 min

De esto obtener: 35 minutos, 4 segundos

Alguna ayuda por favor
« Última modificación: 06 de Octubre de 2015, 03:55:38 por mariacontenis »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: SEMAFORO CONFIGURABLE
« Respuesta #8 en: 06 de Octubre de 2015, 05:36:09 »
Suponiendo que son todos de 60 segundos y son 3 los cuales la suma maxima es de 177 y entra en 8 bits

Código: C
  1. short int segundos_total,miuntos_total,aux;
  2.  
  3.         segundos_total = segundos_0 + segundos_1 + segundos_2;
  4.         minutos_total = minutos_0 + minutos_1 + minutos_2;
  5.         aux = segundos_total/60;                //Solo divido una ves ya que es lo mas consumidor
  6.         minutos_total += aux;
  7.         segundos_total -= aux*60;

Esto para que sea mas legible y es valido para la cantidad que quieras de valores de segundos a sumar. solo le cambias el tipo si necesitas mas.

Ahora si te preocupas por el tamaño del codigo y posiblemente la rapides, vas a necesitar algo menos bello a la vista.


Código: C
  1. short int segundos_total,miuntos_total,aux;
  2.  
  3.         segundos_total = segundos_0 + segundos_1 + segundos_2;
  4.         minutos_total = minutos_0 + minutos_1 + minutos_2;
  5.         while(1)
  6.         {
  7.                 if(segundos_total<60) break;
  8.                 segundos_total-=60;
  9.                 minutos_total++;
  10.         }

Esta ves quitamos la division por restas sucesivas, ya que la cantidad es de 0,1 o 2 loops por ser tener solo 3 valores a sumar.

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re: SEMAFORO CONFIGURABLE
« Respuesta #9 en: 06 de Octubre de 2015, 15:40:13 »
 ((:-)) Saludos KILLERJC

Gracias por responder. Ya probé de las dos maneras que me lo explicaste y funciona casi perfecto.

Digo casi por que me di cuenta de algo que expongo a continuación:

Si el tiempo que imprimo en la lcd es:

Tiempo_1 = 13:07
Tiempo_2 = 11:52
Tiempo_3 = 00:09

Y el tiempo total que imprime tambien en la pantalla lcd: Tiempo_total = 25:08  y es correcto por que son 68 seg y 24 min.

pero cuando pongo asi:

Tiempo_1 = 13:07
Tiempo_2 = 11:54
Tiempo_3 = 00:09

así imprime en la pantalla lcd: Tiempo_total = 25:10 y debería de ser: 26:00, es decir no pasa el dígito cuando seg termina en décima.





Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: SEMAFORO CONFIGURABLE
« Respuesta #10 en: 06 de Octubre de 2015, 17:37:18 »
Citar
pero cuando pongo asi:

Tiempo_1 = 13:07
Tiempo_2 = 11:54
Tiempo_3 = 00:09

así imprime en la pantalla lcd: Tiempo_total = 25:10 y debería de ser: 26:00, es decir no pasa el dígito cuando seg termina en décima.

Vas bien en matematicas :P

07s + 54s + 09s = 70s
13min + 11min = 24min

60s = 1min

70s = 1min 10s
Tiempo total= 25min 10segundos

es correcto

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re: SEMAFORO CONFIGURABLE
« Respuesta #11 en: 06 de Octubre de 2015, 18:21:39 »

Una disculpa Maestro KILLERJC, creo que me confundí. Y tienes toda la razón, tu código es perfecto.

Gracias por tu ayuda, en unos días estaré subiendo el vídeo para quien le interese verlo.

Nuevamente gracias KILLERJC  :-/

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:SEMAFORO CONFIGURABLE
« Respuesta #12 en: 16 de Noviembre de 2015, 04:19:28 »
KILLERJC

Ahora me surge la necesidad de hace la sumatoria de horas , ya me comentaste como se a haría con minutos y segundos

Citar
short int segundos_total,miuntos_total,aux;
 
        segundos_total = segundos_0 + segundos_1 + segundos_2;
        minutos_total = minutos_0 + minutos_1 + minutos_2;
        aux = segundos_total/60;                //Solo divido una ves ya que es lo mas consumidor
        minutos_total += aux;
        segundos_total -= aux*60;

Como le haría para sumar horas?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:SEMAFORO CONFIGURABLE
« Respuesta #13 en: 16 de Noviembre de 2015, 04:33:27 »
Citar
Como le haría para sumar horas?

No entiendo.. A que te referis con eso? Entiendo 2 cosas :

1 - Sumar horas:

        Sumar simplemente

2 - Tomar las horas de los minutos

        Dividir por 60 los minutos para obtener las horas

O lo podes hacer con restas. O lo podes hacer con una multiplicacion y una resta, etc.

Sigue siendo exactamente lo mismo que antes. Asi que realmente no se que necesitas. No pense en poner codigo por que es lo mismo que antes. Y deberias haber visto eso. A no ser que sea otra cosa.
« Última modificación: 16 de Noviembre de 2015, 04:38:59 por KILLERJC »


 

anything