TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Enigma en 10 de Febrero de 2009, 23:47:11

Título: Que estoy haciendo mal?
Publicado por: Enigma en 10 de Febrero de 2009, 23:47:11
Hola muchachos que tal.?, tengo un problema vale, les explico... Estoy haciendo una bomba de gasolina con interrupciones externas... Mi progrma tiene dos opciones: Echar gasolina introduciendo los litros o introduciendo los BsF (la moneda Venezolana), RB1, lo uso para echar gasolina introduciendo por teclado los litros, y RB2 lo uso para echar gasolina introduciendo los BsF por teclado. Si por ejemplo presiono RB1, pues aquí hay otras do opciones, las cuales son, echar gasolina de 91 octanos o de 95 octanos. Si por ejempo le doy a 91 el cual es RC0, pues introduzco los litros y el saca la cuenta!!! O.k todo eso funciona fino!!!!

El problema está cuando hago lo mismo pero con RB2, la interrupción externa 2, ella entra al menú para seleccionar la gasolina de 91 o de 95, pero cuando voy a elegir entre esas dos, pues no elige nada!!!! no se porque.... que será....?????

Aquí les dejo el código y la simulación......

#int_ext2
void interrupt_service_rutine_ext2(void)
{
   funcion_int2();
}


void funcion_int2(void)
{
   /////////////////////////////RUTINA QUE SELECCIONA LA GASOLINA POR BsF/////////////////////////////
    printf(lcd_putc,"\f");                               // Borro pantalla
    printf(lcd_putc,"T. de gasolina");                 // Imprimo en pantalla
    lcd_gotoxy(1,2);                                     // Posiciona el cursor en la linea 2
    printf(lcd_putc,"91 octanos - RC0");                 // Imprimo en pantalla
    printf(lcd_putc,"95 octanos - RC1");                 // Imprimo en pantalla
    delay_ms(3000);                                      // Tiempo de espera para que de chance de presionar el botón.

Hasta aquí llega bien, pero despues no quiere pasar a preguntar por el puerto C0 o C1.....

De aquí para abajo, como que no lo ve!!!
/////////////////////////PULSADOR QUE SELECCIONA LA GASOLINA DE 91 OCTANOS/////////////////////////////
    if(input(pin_C0)==0)                                    // Si RC0 está en 0, entonces...
       {
          delay_ms(20);                                     // Verifica sino es rebote
          if(input(pin_C0)==0)                              // Verifico otra vez si RC0 está en 0
             {
                printf(lcd_putc,"Ingrese BsF");             // Imprimo en pantalla
                delay_ms(3000);                             // Tiempo de espera para que de chance de presionar el botón.
                teclado();                                  // Llamo a la función que me lee el teclado
                var1=resul;                                 // Guardo lo que recogi del teclado
                printf(lcd_putc," BsF= %d",var1);           // Imprimo en pantalla la variable recogida del teclado
                delay_ms(3000);                             // Una demora para pulsar bien el teclado
                teclado();                                  // LLamo a la función que me lee el teclado
                var2=resul;                                 // Guardo lo que recogi del teclado
                printf(lcd_putc,"%d     \n\r",var2);        // Imprimo en pantalla la variable recogida del teclado
                delay_ms(2000);                             // Una demora para que se vean los datos de teclado
                cantlitros();                               // Llamo a la función que me calcula los litros que se han de pedir
                printf(lcd_putc,"\f");                      // Borro pantalla
                w=0;                                        // Inicializo la variable contador
                bsf_91=0.87;                                // El litro de gasolina de 91 octanos está en 0.87 BsF
                //printf(lcd_putc,"\f");                    // Borro pantalla
                while(w!=resul2)                            // Repetir mientras  el contador sea distinto de los litros y los BsF a pagar no pasen de 5BsF
                   {                                        // Si esto es cierto, entonces....
                      litros=(w/bsf_91)+litro;              // Saco la cuenta de los litros por el valor del litro de gasolina
                      litro= litros;
                      printf(lcd_putc,"Litros= %g",litro);  // Imprimo en pantalla
                      lcd_gotoxy(1,2);                      // Posiciona el cursor en la línea 2
                      printf(lcd_putc,"BsF= %1.2d",w);      // Imprimo en pantalla
                      delay_ms(1000);                       // Una demora para que se visualice el contaje de los litros
                      printf(lcd_putc,"\f");                // Borro pantalla
                      w++;                                  // Incremento contador
                   }
             }
       }
}

Si se fijan la rutina de la interrupción 1 es igual a la de la dos, la 1 funciona bien, pero cuando quiero entrar a la dos, pues nada! que estoy haciendo mal....? ya llevo todo el día en eo, estoy que me arranco los cabellos! :5]

Atte: Enigma... La llanerita de Guayana :D

Título: Re: Que estoy haciendo mal?
Publicado por: RALF2 en 11 de Febrero de 2009, 00:13:27
Que tal llanerita!
Mira no podrias probar colocando la rutina toda aqui:
#int_ext2
void interrupt_service_rutine_ext2(void)
{
   funcion_int2();
}
Es decir en vez de llamar a funcion_int2() , coloca toda la rutina alli adentro como hicistes con #int_ext1 a ver si ese podria ser el problema  :mrgreen:
Y nos cuentas

Título: Re: Que estoy haciendo mal?
Publicado por: Enigma en 11 de Febrero de 2009, 00:28:37
Hola Ralf2....

Si, de hecho originalmente lo tenía así.... Pero recorde que alguien me dijo que las rutinas de las interrupciones externas no deben ser tan largas! porque  puede ocacionar problemas, pense que eso era el problema... coloque la función pro nada siguio igual....

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Que estoy haciendo mal?
Publicado por: Suky en 11 de Febrero de 2009, 00:59:02
Te falta un printf(lcd_putc,"\f"); antes de printf(lcd_putc,"Ingrese BsF");.
En realidad lo hacia pero no se veia en el LCD.

Otras cositas que note:
Deberias esperar hasta que se pulse alguna opcion y no los 3 segundos, porque si me demore tengo que volver a empezar, y lo mismo con los datos del teclado matricial.
Saludos!!!
Título: Re: Que estoy haciendo mal?
Publicado por: RALF2 en 11 de Febrero de 2009, 01:05:36
Exacto suky!
Eso te me adelantaste  :D
Lo probe asi y me funciono   :-/

Pruebalo llanerita y nos dices
Título: Re: Que estoy haciendo mal?
Publicado por: Enigma en 11 de Febrero de 2009, 01:40:45
:shock:

Miercoles funcionó!!!!!!!!!!!  :D

Pero, porque deberia borrar pantalla?, no sería lo mismo si no lo colocara?, porque lo único es que borro la LCD.... o no?

Cita de: suky
Otras cositas que note:
Deberias esperar hasta que se pulse alguna opcion y no los 3 segundos, porque si me demore tengo que volver a empezar, y lo mismo con los datos del teclado matricial.
Saludos!!!

Si, lo intente hacer con un ciclo while, pero se me quedaba colgado!!!! :s... no supe que hacer allí y por eso coloque lo de los delays!!!, lo había hecho así:

while (input(pin_C0)==1)
{
.....}

Pero no me funcionó....  :(.. alguna sugerencia????

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Que estoy haciendo mal?
Publicado por: Suky en 11 de Febrero de 2009, 02:04:54
lcd_putc("\f"); borra y regresa al origen.-

Podrias hacer asi:
Código: C
  1. puls=0;
  2. while(puls==0){
  3.    if(input(pin_C0)==1){
  4.    delay_ms(20);
  5.    if(input(pin_C0)==1){
  6.       puls=1; //Salgo de bucle.-
  7.    }
  8. }else if(input(pin_C1)==1){
  9.    delay_ms(20);
  10.    if(input(pin_C1)==1){
  11.       puls=1; //Salgo de bucle.-
  12.    }
  13. }
Título: Re: Que estoy haciendo mal?
Publicado por: Enigma en 11 de Febrero de 2009, 18:08:24
Voy a probar.... a ver si me da resultado!!! luego posteo como me fue!!!! jejejejeje

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Que estoy haciendo mal?
Publicado por: Enigma en 11 de Febrero de 2009, 20:36:37
Pensandolo bien....

No e, esa rutina me parece extraña o a lo mejor la estoy interpretando mal... a ver...

Si coloco esa variable puls en cero y pregunto por los puladores, pues ellos siempre stán en 1, por tanto la variable cambiará de valor, y eso hará que se me salga de la interrupción, no me serviria, no me mantendría las opciones en pantalla!!!!! :?


Una preguntica aparte... El OR en picc no funciona o que???, estoy colocando una rutina como está:

while(input(pin_C0)==1 || input(pin_C1)==1)
{
.....}

y cuando simula el proteus pues no me hace caso a eso!, en cambio si coloco solo esto:

while(input(pin_C0)==1)
{...
}
 pues si lo hace.... No creo que el operador OR este malo, pues sale en la ayuda del CCS, y bueno ese es el simbolo de la operación OR!

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Que estoy haciendo mal?
Publicado por: micro_cadaver en 12 de Febrero de 2009, 14:31:36
holaaaaaaaaa

a que te refieres con que no hace caso? entra al codigo dentro del while o nunca entra ?
Título: Re: Que estoy haciendo mal?
Publicado por: Enigma en 12 de Febrero de 2009, 19:22:23
Entra al caso, pero no le hace caso a la condici'on OR!!!!!!!


Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Que estoy haciendo mal?
Publicado por: micro_cadaver en 12 de Febrero de 2009, 20:18:08
while(input(pin_C0)==1 || input(pin_C1)==1)
{
.....}

intenta asi porsiaca:

while(  (input(pin_C0)==1) || (input(pin_C1)==1) )
{
.....}
Título: Re: Que estoy haciendo mal?
Publicado por: Enigma en 13 de Febrero de 2009, 23:25:36
Creeme micro_cadaver ya lo intente y no me funciono!!!!! Será poblema del compilador!!!!?? :?

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Que estoy haciendo mal?
Publicado por: Cryn en 14 de Febrero de 2009, 00:40:37
tus pulsadores normalmente están en 1 lógico y creo que esas sentencias siempre serán verdad y por tanto siempre se ejecutaría, o es un antirrebotes? :z) ya me confundí :D

nose, pero y si intentas con:

while(input(pin_c0)==0 || input(pin_c1)==0)

supongo que así puede ser, para que servirá este while or?
Título: Re: Que estoy haciendo mal?
Publicado por: Enigma en 14 de Febrero de 2009, 01:11:33
Ummm no funcionaria cryn, porque solo se ejecutaria la sentencia del while cuando de un pulsito... que es cuando los puladores del puerto C se hacen 0.... Y la idea es que se mantenga la sentencia hasta que yo aprete uno de los puladores!!!!  El While OR, lo uso porque estoy mostrando un menú de dos opciones que siempre quiero que este en pantalla al menos que elija una de las dos opciones... me entiendes? :lol:

Atte: Enigma... La llanerita de Guayana  :-)
Título: Re: Que estoy haciendo mal?
Publicado por: Cryn en 14 de Febrero de 2009, 14:05:07
aah ok, entonces lo mejor es usar un AND, y no un OR, porque el OR siempre será verdad a menos que presiones los 2 pulsadores simultáneamente

1+x=1  (esto en forma digital, el OR es la suma)

y lo que tenes que hacer es un AND (&&):

1*x=x

ya que uno de los pines pienso que siempre estará en 1 lógico, y el otro será el que determina la condición del while

espero sea eso, porque sino... :D

un saludo
Título: Re: Que estoy haciendo mal?
Publicado por: Enigma en 18 de Febrero de 2009, 01:19:47
Esa si me serviria, de hecho, me servió jejejejee

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Que estoy haciendo mal?
Publicado por: Cryn en 19 de Febrero de 2009, 17:31:27
bien :-/ :-/

un saludo y a prepararse llanerita, yo creo que no falta mucho... :mrgreen:

un abrazo
Título: Re: Que estoy haciendo mal?
Publicado por: Enigma en 19 de Febrero de 2009, 23:10:27
Jejejejeje ya casí, ya casí!!!! jejeje

Atte: Enigma... La llanerita de Guayana :-)