TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ciberik en 16 de Septiembre de 2020, 19:03:56

Título: Problema para desarrollar una rutina que guarde 5 Activaciones PIC18F4550 EN C
Publicado por: ciberik en 16 de Septiembre de 2020, 19:03:56
Estimado, saludos; tengo que desarrollar un sistema en donde pueda activar dos bombas_1 y bomba_2 con un máximo de 5 activaciones cada  una y configurarías su hora de activación y cuando se active que dure aprox 2 minutos. lo desarrollo en pic18f4550 en
tienen algún ejemplo en donde pueda comenzar o algunos tips por favor

Bomba 1: rango de activaciones de 0 a 10 y cuando se activen 10 a 50 segundos debe durar la activación
ejemplo : cuantas activaciones?: 5 ;
               act_1: 10 :50,
               act_2: 11 :50
              ,act_3: 13 :40,
               act_4: 16 :50,
               act_5: 20 :50,

Bomba 2: rango de activaciones de 0 a 3 y cuando se activen 10 a 50 segundos debe durar la activacion
               act_1: 12 :50,
               act_2: 18 :50
              ,act_3: 21 :40,

después debe seguir indefinidamente
Título: Re:Problema para desarrollar una rutina que guarde 5 Activaciones PIC18F4550 EN C
Publicado por: KILLERJC en 16 de Septiembre de 2020, 19:42:49
Y comenzaría por encontrar un RTC que si posiblemente tenga alarmas mejor. Así poder configurar la alarma a una hora que uno desee.
Luego crearía una estructura con horas y tiempo de encendido. Y un array de 10 de estas estructuras para navegarlo.

El resto es
Comprobar que el inicio sea por un sleep y no un reinicio. Esto implica luego revisar los horarios cargados en la alarma ( toma de decisiones respecto a si activar horarios pasados y te podes guiar del horario que lleva el RTC + ultima alarma cargada).
Comparar cual se debe activar antes, cargar la nueva alarma, ¿ir a dormir?
¿despertó o detecto la alarma?
- comparar cuales son las que se cumplen (en caso que sean dos) activar el tiempo necesario.
- Cargar la próxima alarma
- La precisión no es tanto en unos segundos, mas en una bomba así que este tiempo lo manejas con tu PIC.

Todo de forma asíncrona, es decir NO a los delays. Manejate con Timers para controlar el tiempo de encendido de las bombas. El Timer siempre corriendo, al detectar la alarma que cargue en una variable el tiempo, y luego el Timer se encarga de activar y desactivar las salidas, si es distinto de 0 activo, cuando llego a 0 desactivado. Solo se va a poner en marcha al cargarle un valor nuevo a este "contador de tiempo" de cada bomba.


Perdon... usualmente programo en C, y veo que esta en el foro de BASIC, por lo que las "estructuras" no es valido, ni tampoco el tema de arrays, pero era para un tema de "organizacion".
Vas a poder hacerlo de otra forma pero en BASIC.


PD: Asi como vas a tener que tener una forma de cargar los horarios, tambien vas a tener que cargar la hora inicial. Asi que la parte de la interfaz es por otro lado e independiente de lo anterior escrito.
Título: Re:Problema para desarrollar una rutina que guarde 5 Activaciones PIC18F4550 EN C
Publicado por: ciberik en 16 de Septiembre de 2020, 20:52:37
KILLERJC gracias por responder y tomarte el tiempo, desde luego ya modifique el lugar donde publicar el dilema, seria posible que pudieras orientarme de una forma mas accesible  con esa rutina , yo tengo avanzado un programa en donde muestro un menu , pero quedo enredado cuando quiero configurar las activaciones, envio la rutina de en c de los pulsadores

Código: C
  1. void leerBotones(void){
  2.    if(input(BUT_START_STOP) == 1 && but_start_stop_ant == 0){
  3.       output_high(PIN_C5); cont_back_light = 0;
  4.       but_start_stop_ant = 1;
  5.       if(pantallaActual == PANTALLA_RESUMEN && input_state(LED_START) == 0){
  6.          output_high(LED_START); pantallaActual = PANTALLA_CTRL_NIVEL; cont_buzzer = 0;
  7.       }else if(pantallaActual == PANTALLA_RESUMEN && input_state(LED_START) == 1){
  8.          output_low(LED_START); pantallaActual = PANTALLA_RESUMEN;
  9.       }else if(pantallaActual == PANTALLA_TERMINADO){
  10.          pantallaActual = PANTALLA_RESUMEN;
  11.       }else if(pantallaActual == PANTALLA_CTRL_NIVEL || pantallaActual == PANTALLA_CTRL_TEMPERATURA){
  12.          pantallaActual = PANTALLA_RESUMEN; output_low(LED_START);
  13.       }
  14.    }else if(input(BUT_START_STOP) == 0 && but_start_stop_ant == 1){
  15.       but_start_stop_ant = 0;
  16.    }
  17.    if(input(BUT_IZQUIERDA) == 1 && but_izquierda_ant == 0){
  18.       output_high(PIN_C5); cont_back_light = 0;
  19.       but_izquierda_ant = 1;
  20.       if(pantallaActual == PANTALLA_CTRL_COMIDA && N_porc > 0){ N_porc--; }
  21.       if(pantallaActual == PANTALLA_CTRL_AGUA && N_agua > 0){ N_agua--; }
  22.    }else if(input(BUT_IZQUIERDA) == 0 && but_izquierda_ant == 1){
  23.       but_izquierda_ant = 0;
  24.    }
  25.    if(input(BUT_DERECHA) == 1 && but_derecha_ant == 0){
  26.       output_high(PIN_C5); cont_back_light = 0;
  27.       but_derecha_ant = 1;
  28.       if(pantallaActual == PANTALLA_CTRL_COMIDA && N_porc < 5){ N_porc++;}
  29.       if(pantallaActual == PANTALLA_CTRL_AGUA && N_agua < 2 ){ N_agua++;}
  30.    }else if(input(BUT_DERECHA) == 0 && but_derecha_ant == 1){
  31.       but_derecha_ant = 0;
  32.    }
  33.    if(input(BUT_MENU_ACEPTAR) == 1 && but_aceptar_ant == 0){
  34.       output_high(PIN_C5); cont_back_light = 0;
  35.       but_aceptar_ant = 1;
  36.       if(pantallaActual == PANTALLA_RESUMEN){
  37.          pantallaActual = PANTALLA_CTRL_COMIDA;
  38.          write_eeprom(EEP_PORC_1, N_porc);   /* aca se guardo el n° de  activaciones que uno quiere!!  rango de (0 a 10)*/
  39.       }
  40.  
  41.       if(n_porc > i){
  42.       porciones(); /* si n_porc (N° activaciones) es mayor que i ve a la rutina de porciones*/
  43.       }
  44.      
  45.    }else if(input(BUT_MENU_ACEPTAR) == 0 && but_aceptar_ant == 1){
  46.       but_aceptar_ant = 0;
  47.    }
  48. }
  49.  
  50. /* aca quiero hacer la rutina en donde configuro las activaciones , lo que esta esta malo,era un intento de algo*/
  51. void porciones(void)
  52.       {
  53. for(i=1;i<= n_porc; i++){
  54.      if(i==1){
  55.      output_low(PIN_C5);
  56.      printf(LCD_PUTC, "\f");
  57.      lcd_gotoxy(1,1); printf(LCD_PUTC, "revisar > %02u < ",i);
  58.      }else if(i==2){
  59.      printf(LCD_PUTC, "\f");
  60.      lcd_gotoxy(1,1); printf(LCD_PUTC, "revisar > %02u < ",i);
  61.      }else if(i==3){
  62.      printf(LCD_PUTC, "\f");
  63.      lcd_gotoxy(1,1); printf(LCD_PUTC, "revisar > %02u < ",i);
  64.      }
  65. }
  66.  
  67. }