Autor Tema: Configuración de un Sistema de riego con temporizador digital (TECLADO MATRICIAL  (Leído 152 veces)

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

Desconectado Dante

  • PIC10
  • *
  • Mensajes: 11
Hola compañeros programador, y una bonita tarde, en este dia vengo a ustedes en busca de su ayuda o consejo, estoy empezando a utilizar la plataforma pic c compiler, para realizar trabajos con programadores pic, ya que soy nuevo y dispongo de conocimientos muy básicos, es normal que en mi existan dudas con respecto a algunos conocimientos de programacion, me gustaria que si ustedes lo desean por favor me den una sugerencia sobre como corregir mi error, en este momento estoy programando un sistema de riego, con un temporizador digital(cuenta regresiva) con una pantalla lcd  se le muestra al usuario las 4 opciones diferentes para realizar el tiempo, mi problema recae en el momento de realizar la lectura de los datos tomados del teclado matricial, esta parte sucede a partir del condicional case, ya que se me despliega todo lo programado con anterioridad en la simulación, pero al momento de introducir un valor este no responde, si alguien es tan amble para poder ayudarme se lo agradeceria mucho.


#INCLUDE <16F877a.h>
#fuses nowdt,hs
#use delay(clock = 20M)
#include <lcd.c>
#define use_port_kbd true
#include <KBD4x4_1.c>
void main()
{
   int h,j,tiempo,m,s;
lcd_init();
set_tris_a(0xFF);
set_tris_b(0b00001111);
tiempo=0;
m=0;
s=0;

while(True)
{
for(j=16;j>=1;j--)
{
lcd_gotoxy(j,1);
printf(lcd_putc, " PROYECTO V 1.0  ");
delay_ms(100);
}

for(j=16;j>=1;j--)
{
lcd_gotoxy(j,2);
printf(lcd_putc,"  TEMPORIZADOR  ");
delay_ms(100);
}
 
///TITULO MENU
lcd_gotoxy(1,1);
printf(lcd_putc, "[1] 60 minutos");
lcd_gotoxy(1,2);
printf(lcd_putc, "[2] 30 minutos");
lcd_gotoxy(21,1);
printf(lcd_putc, "[3] 15 minutos");
lcd_gotoxy(21,2);
printf(lcd_putc, "[4] 5 minutos");
char k;
port_b_pullups(true);
kbd_init();

while(true)
{
k=kbd_getc();
if(k!=0)
{
 switch(k)
     {
       case '1':
       printf(lcd_putc, "\fINICIANDO.");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO..");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO...");
       delay_ms(1000);
       //valor de motor
       output_high(pin_B4);
 for(j=60;j>=1;j--)
 {
    for(h=60;h>=1;h--)
    {
     printf(lcd_putc,"\fCUENTA REGRESIVA\n  %i : %i ",j-1,h-1);
     delay_ms(1000);
     }
 }

output_low(pin_B4);

printf(lcd_putc, "\fFINALIZADO");
delay_ms(1000);
break;
   case (2):
       printf(lcd_putc, "\fINICIANDO.");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO..");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO...");
       delay_ms(1000);
       //valor de motor
       output_high(pin_D3);
 for(j=30;j>=1;j--)
 {
    for(h=60;h>=1;h--)
    {
     printf(lcd_putc,"\fCUENTA REGRESIVA\n  %i : %i ",j-1,h-1);
     delay_ms(1000);
     }
 }

output_low(pin_D3);

printf(lcd_putc, "\fFINALIZADO");
delay_ms(1000);
break;
   case (3):
       printf(lcd_putc, "\fINICIANDO.");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO..");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO...");
       delay_ms(1000);
       //valor de motor
       output_high (pin_D3);     
for(j=15;j>=1;j--)
 {
    for(h=60;h>=1;h--)
    {
     printf(lcd_putc,"\fCUENTA REGRESIVA\n  %i : %i ",j-1,h-1);
     delay_ms(1000);
     }
 }

output_low(pin_D3);

printf(lcd_putc, "\fFINALIZADO");
delay_ms(1000);
break;
}


       } 
 
}



}
}



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6160
Re:Configuración de un Sistema de riego con temporizador digital (TECLADO MATRICIAL
« Respuesta #1 en: 19 de Noviembre de 2017, 09:24:06 »
No vas a tener demasiada precision con delays, pero funciona por igual si no lo necesitas.

Tu problema son:

- El case 2,3, son numeros, mientras que el 1 es un caracter ASCII '1', sino me equivoco kbd devuelve en ASCII, asi que deberias tener:

Código: C
  1. case '2':
  2. case '3':

- Agregar un "default" dentro del switch..case para cuando el boton no coincide con ninguno de los seleccionados..

Código: C
  1. default:

- El mayor problema de ese código, es que una ves iniciado el programa no se puede parar, ya que las demoras lo van a tener ocupado siempre. Pero si esto no es una molestia entonces va a funcionar igual. Si queres tener una opcion de parar, te sugiero que utilizes interrupciones, lo mejor es con el CCP en modo compare + Timer1, complicado de configurar al comienzo pero luego en el programa se vuelve mas simple.

-    kbd_init() y port_b_pullups(true) esta dentro de un while, deberias ponerlo arriba en la inicializacion ( fuera del while - junto al lcd_init)

Desconectado Dante

  • PIC10
  • *
  • Mensajes: 11
Re:Configuración de un Sistema de riego con temporizador digital (TECLADO MATRICIAL
« Respuesta #2 en: 19 de Noviembre de 2017, 13:08:18 »
muchas gracias de verdad me has facilitado mucho te agradezco de verdad, haré todas las recomendaciones que me has dado, se nota mucho que soy nuevo pues cometo errores que quizás en un principio no debería :lol: :lol:, pero agradezco mucho el tiempo tomado para ayudarme, y sobre todo gracias por contribuir a mi programa, tomare en cuento de lo las interrupciones, aunque todavía no me queda claro como hacerlas buscare en internet algún :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :mrgreen: :mrgreen: ejemplo

Desconectado Dante

  • PIC10
  • *
  • Mensajes: 11
Re:Configuración de un Sistema de riego con temporizador digital (TECLADO MATRICIAL
« Respuesta #3 en: 19 de Noviembre de 2017, 13:59:41 »
Hola amigo, ya he realizado los cambios pertinentes, pero todavía no me acepta el valor del teclado. o mas bien no sale del menu ;C

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6160
Re:Configuración de un Sistema de riego con temporizador digital (TECLADO MATRICIAL
« Respuesta #4 en: 19 de Noviembre de 2017, 14:55:59 »
Pone el ultimo codigo como quedo

Citar
Hola amigo, ya he realizado los cambios pertinentes, pero todavía no me acepta el valor del teclado. o mas bien no sale del menu ;C

Es decir... ¿del menu que indica los valores a presionar , si presionas no ocurre nada?.. ¿O es que una ves presionado luego no te hace mas caso y no vuelve al menu principal ?

Desconectado Dante

  • PIC10
  • *
  • Mensajes: 11
Re:Configuración de un Sistema de riego con temporizador digital (TECLADO MATRICIAL
« Respuesta #5 en: 21 de Noviembre de 2017, 00:21:52 »
hola amigo, disculpa ya vi mis errores y he modificado el código de manera pertinente solo que ahora me gustaría agregarle unos cambios por ejemplo cuando inicializo el contador me gustaría que al presionar una tecla en el teclado matricial esta se reiniciará o saliera del bucle, bueno ademas de ello tengo problemas con la parte de el sensor ultrasónico que es algo que todavía no logro configurar bien, esque no se como simularlo en proteus, quiero decir descargue las bibliotecas virtuales y todo pero en la parte comentada de mi codigo todavia no me muestra nada. mira te enseño, solo comente la parte del sensor porque si no la comentaba mi programa no seguía.



#include <16f877a.h>
#fuses hs,nowdt
#use delay(clock=20M)
#define lcd_data_port getenv("sfr:portd")
#define lcd_enable_pin pin_d0
#define lcd_rs_pin pin_d1
#define lcd_rw_pin pin_d2
#define use_portb_kbd true
#include <lcd.c>
#include <kbd4x4_1.c>
// sensor ultrasonico hs-sr04

#define trig pin_A1
#define echo pin_A0
int h,j,tiempo,m,s;
float distancia,t;
// arriba de esto es toda la configuracion, desde el adc, puertos de salida, la LCD, el pic,

void main()
{
   char k; //caracter de tipo caracter
   int x; 
   port_b_pullups(true);  //esto acctiva las resistecnais de pull ut para que ya no haya necesidad de ponerlas
                          //resistencias
   lcd_init();            //se llama a la lcd
   kbd_init();             // se llama al teclado matricial
   inicio:                //funcion para el uso de un goto
     
   printf(lcd_putc,"BIENVENIDO");  //primer
   delay_ms(2000);
   printf(lcd_putc,"\f");
   for(j=6;j>=1;j--)
{
lcd_gotoxy(j,1);
printf(lcd_putc, " PROYECTO V 1.0  ");
delay_ms(100);
}

for(j=6;j>=1;j--)
{
lcd_gotoxy(j,2);
printf(lcd_putc,"  TEMPORIZADOR  ");
delay_ms(100);
}
delay_ms(1000);

printf(lcd_putc,"\f");
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
//SENSOR HS-SR04
while(true)
{
 output_high(trig);
 delay_us(10);
 output_low(trig);
 while(!input(echo))
 {}
 set_timer1(0);
 while(input(echo))
 {}
 t=get_timer1();
 distancia=(tiempo/2)/(29.15);
 lcd_gotoxy(1,1);
 printf(lcd_putc,"distancia= %f",distancia);
 lcd_gotoxy(2,2);
 printf(lcd_putc,"tiempo=%f",t);
 delay_ms(500);
}

menu:
///TITULO MENU
lcd_gotoxy(1,1);
printf(lcd_putc, "[1] 60 Minutos");
lcd_gotoxy(1,2);
printf(lcd_putc, "[2] 30 Minutos");
lcd_gotoxy(21,1);
printf(lcd_putc, "[3] 15 Minutos");
lcd_gotoxy(21,2);
printf(lcd_putc, "[4] 05 Minutos");
   while(true)
   {
      k=kbd_getc();
      x=k-48;
      if(k!=0)
      {
        // lcd_gotoxy(1,1);
         //printf(lcd_putc,"tecla pulsada: %c",k);
     
 switch(k)
     {
     
     //aqui me gustaria poner interrupciones como cuando se toca cierto numero se sale del ciclo de temporizador
       case '1':
       printf(lcd_putc, "\fINICIANDO.");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO..");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO...");
       delay_ms(1000);
//       valor motor
       output_low(pin_D3);

for(j=60;j>=1;j--)
{
    for(h=60;h>=1;h--)
    {
     printf(lcd_putc,"\fCUENTA REGRESIVA\n  %i : %i ",j-1,h-1);
     delay_ms(1000);
    }
}
 printf(lcd_putc,"\f bomba Activada");
//Activar  el motor
output_high(pin_D3);
delay_ms (30000);
output_low(pin_D3);
printf(lcd_putc, "\fFINALIZADO");
delay_ms(1000);
break;
////
case '2':
       printf(lcd_putc, "\fINICIANDO.");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO..");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO...");
       delay_ms(1000);
       //valor de motor
       output_high(pin_D3);
 for(j=30;j>=1;j--)
 {
    for(h=60;h>=1;h--)
    {
     printf(lcd_putc,"\fCUENTA REGRESIVA\n  %i : %i ",j-1,h-1);
     delay_ms(1000);
     }
 }
  printf(lcd_putc,"\f bomba Activada");
//Activar  el motor
output_high(pin_D3);
delay_ms (30000);
output_low(pin_D3);

printf(lcd_putc, "\fFINALIZADO");
delay_ms(1000);
break;
///
  case '3':
       printf(lcd_putc, "\fINICIANDO.");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO..");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO...");
       delay_ms(1000);
//       valor motor
       output_low(pin_D3);

for(j=15;j>=1;j--)
{
    for(h=60;h>=1;h--)
    {
     printf(lcd_putc,"\fCUENTA REGRESIVA\n  %i : %i ",j-1,h-1);
     delay_ms(1000);
    }
}
 printf(lcd_putc,"\f bomba Activada");
//Activar  el motor
output_high(pin_D3);
delay_ms (30000);
output_low(pin_D3);
printf(lcd_putc, "\fFINALIZADO");
delay_ms(1000);
break;
////

case '4':
       printf(lcd_putc, "\fINICIANDO.");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO..");
       delay_ms(1000);
       printf(lcd_putc, "\fINICIANDO...");
       delay_ms(1000);
//       valor motor
       output_low(pin_D3);

for(j=1;j>=1;j--)
{
    for(h=59;h>=1;h--)
    {
     printf(lcd_putc,"\fCUENTA REGRESIVA\n  %i : %i ",j-1,h-1);
     delay_ms(1000);
    }
}
 printf(lcd_putc,"\f bomba Activada");
//Activar  el motor
output_high(pin_D3);
delay_ms (30000);
output_low(pin_D3);
printf(lcd_putc, "\fFINALIZADO");
delay_ms(1000);
break;
default:printf(lcd_putc, "\fError");
delay_ms(1000);
goto menu;
}
printf(lcd_putc, "\f");
goto inicio;
      }
   }

}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6160
Re:Configuración de un Sistema de riego con temporizador digital (TECLADO MATRICIAL
« Respuesta #6 en: 22 de Noviembre de 2017, 08:47:52 »
Creo que tenes un error de concepto de como funciona una interrupcion, una interrupcion ocurre cuando debe ocurrir, al momento de ocurrir el micro deja lo que estaba haciendo y ejecuta la rutina de interrupcion, termina esa rutina y vuelve a donde dejo.

Otra de las cosas, deberias tener unicamente 1 solo while(true) por el momento, limitate a esto ya que veo que usas demasiados.

Se que voy a sonar molesto con lo que te voy a pedir. Pero es para mejor y de alli vamos a trabajar, create un programa donde configuras algun Timer (tal ves el TMR1 con el CCP en modo compare) para que genere una interrupcion cada 100ms o 500ms o 1000ms. Mientras mas grande mejor. De alli en adelante vamos a trabajar.

- Es decir, vas a tener que configurar el Timer para tener su Preescaler correcto y ponerlo a 0.
- Vas a tener que configurar el CCP como CCP_COMPARE_RESET_TIMER y con la funcion set_pwm1_duty darle la "frecuencia", es decir el valor que va a reiniciar el TMR1, cuando ambos sean iguales.
- Activar la interrupcion del CCP1
- Por ultimo usar el #INT_CCP1 y creas tu funcion del CCP, que la unica instruccion por ahora que vas a tener es la de un output_toggle de algun PIN, para corroborrar que la frecuencia es la correcta.

Entonces... Para configurar los tiempos necesitas: Elegir bien el preescaler del TMR1 y cargar el valor correcto en set_pwm1_duty (el nombre es de PWM, pero carga los registros del CCP en modo comparador, se usan los mismos)

Y listo, ese es tu programa que te pido. Luego le vamos a agregar:

- Habilitacion para que cuente.
- Que decremente el tiempo alli.
- Y comenzar a modificar el menu, para que responda, ya que ahora no vamos a tener todos esos delays que teniamos antes.

Desconectado Dante

  • PIC10
  • *
  • Mensajes: 11
Re:Configuración de un Sistema de riego con temporizador digital (TECLADO MATRICIAL
« Respuesta #7 en: 22 de Noviembre de 2017, 19:55:04 »
 :-/ :mrgreen: :mrgreen: :mrgreen: :-/ :-/ Muchas gracias compañero, empezare a realizar las mejoras al programa, yo agradezco todos los comentarios y al contrario no son una molestia, son de gran ayuda, y sobre todo que te tomes tu tiempo para poder ayudarme.