Autor Tema: Hola, grave problema....  (Leído 7487 veces)

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

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Hola, grave problema....
« Respuesta #15 en: 19 de Febrero de 2009, 23:19:35 »
Hola.

La idea de disminuir el codigo en las interrupciones no es solo reemplazar todo el codigo por una funcion, ya que, igual, se esta evaluando todo el codigo de la funcion, me explico:

si tu tienes en el codigo de la interrupcion:
Código: [Seleccionar]

#INT_EXT
EXT_isr()
{
   while(input(pin_B3)!=0 && input(pin_B4)!=0)
   {
   /////////////////////////////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 - RB3");                   // Imprimo en pantalla
    printf(lcd_putc,"95 octanos - RB4");                   // Imprimo en pantalla
    delay_ms(250);                                         // Tiempo de espera para que de chance de presionar el botón.
    }
/////////////////////////PULSADOR QUE SELECCIONA LA GASOLINA DE 91 OCTANOS/////////////////////////////
    printf(lcd_putc,"\f");                                  // Borro pantalla
    if(input(pin_B3)==0)                                    // Si RC0 está en 0, entonces...
       {
          delay_ms(20);                                     // Verifica sino es rebote
          if(input(pin_B3)==0)                              // Verifico otra vez si RC0 está en 0
             {
                while(input(pin_C7)!=0 && input(pin_C6)!=0 && input(pin_C5)!=0 && input(pin_C4)!=0)
                   {
                      printf(lcd_putc,"Ingrese BsF      "); // Imprimo en pantalla
                      delay_ms(1000);                       // Tiempo de espera para que de chance de presionar el botón.
                      printf(lcd_putc,"\f");                // Borro pantalla
                   }
                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
                output_c(0);                                // Limpio el puerto C
                delay_ms(1000);                             // Tiempo de espera para que de chance de presionar el botón.
                while(input(pin_C7)!=0 && input(pin_C6)!=0 && input(pin_C5)!=0 && input(pin_C4)!=0)
                   {
                   }
                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
                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);
                      //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",litros);  // Imprimo en pantalla
                      lcd_gotoxy(1,2);                       // Posiciona el cursor en la línea 2
                      printf(lcd_putc,"BsF= %g",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=w+1.00;                              // Incremento contador
                   }
             }
       }
/////////////////////////PULSADOR QUE SELECCIONA LA GASOLINA DE 95 OCTANOS/////////////////////////////
       if(input(pin_B4)==0)                                  // Si RC0 está en 0, entonces...
       {
          delay_ms(20);                                      // Verifica sino es rebote
          if(input(pin_B4)==0)                               // Verifico otra vez si RC0 está en 0
             {
                 while(input(pin_C7)!=0 && input(pin_C6)!=0 && input(pin_C5)!=0 && input(pin_C4)!=0)
                   {
                      printf(lcd_putc,"Ingrese BsF      ");  // Imprimo en pantalla
                      delay_ms(1000);                        // Tiempo de espera para que de chance de presionar el botón.
                      printf(lcd_putc,"\f");                 // Borro pantalla
                   }
                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
                output_c(0);                                 // Limpio el puerto C
                delay_ms(1000);                              // Una demora para pulsar bien el teclado
                 while(input(pin_C7)!=0 && input(pin_C6)!=0 && input(pin_C5)!=0 && input(pin_C4)!=0)
                   {
                   }
                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_95=0.95;                                // 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_95);
                      //litros=(w/bsf_95)+litro;            // Saco la cuenta de los litros por el valor del litro de gasolina
                      //litro= litros;
                      printf(lcd_putc,"Litros= %g",litros); // Imprimo en pantalla
                      lcd_gotoxy(1,2);                      // Posiciona el cursor en la línea 2
                      printf(lcd_putc,"BsF= %g",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=w+1.00;                                  // Incremento contador
                   }
             }
       }

}

y solo cambias
Código: [Seleccionar]
EXT_isr()
{
  funcion();
}

y defines funcion como todo lo que esta en la interrupcion, pues daria igual.

Saludos

El papel lo aguanta todo

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Hola, grave problema....
« Respuesta #16 en: 20 de Febrero de 2009, 00:18:12 »
Ummm.... tu me dices dimnuir el número de instruccions!!!! o.k, voy a tratar de minorizar el código!

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Hola, grave problema....
« Respuesta #17 en: 20 de Febrero de 2009, 00:21:12 »
Hola.

Es mejor pasar todo ese codigo de la rutina de interrupcion en el programa principal, y habilitar ese codigo con un flag, el cual se habilitaria en la interrupcion.

Saludos
El papel lo aguanta todo

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Hola, grave problema....
« Respuesta #18 en: 20 de Febrero de 2009, 01:00:09 »
Ahhh o.k entiendo!!! bueno.... Dejame ver!

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 623
Re: Hola, grave problema....
« Respuesta #19 en: 20 de Febrero de 2009, 02:25:28 »
A ver , vamos por partes, no dijiste que en la simulacion te funcionaba bien? y que la primera vez que lo encendiste tambien funcionaba?, entonces para que revisas el codigo , deberias revisar primero el hardware y ver que no hayan ruidos que puedan estar afectandote las entradas del PIC, fijate que en los whiles que marcaste testeas pines y los testeas con una condicion and , entonces si a uno de estos pines les llega ruido y el pin no esta en el estado que deberia  esa condicion and no se cumple. esta mas parece que es la causa mas probable para que el PIC no haga caso al while, otra seria que algunos de esos pines del PIC esta dañado o que el CCS no genere el codigo correctamente .

Saludos
« Última modificación: 20 de Febrero de 2009, 02:29:46 por sander »
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3214
Re: Hola, grave problema....
« Respuesta #20 en: 20 de Febrero de 2009, 04:33:24 »
Tal vez puede sprobar en los whiles con solo input(pin_c)  <-- Si esto es verdadero = 1
Ya que !=0 es igual a 1.

Lo dle LCD que te comente no es que este mal conectado sino que aterrizar los pines flotantes.

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Hola, grave problema....
« Respuesta #21 en: 20 de Febrero de 2009, 13:14:22 »
Hola, en efecto sander la simulación funciona perfectamente!!!! Ruido.??? bueno he hecho de todo para minimizarlo, como colocar capacitores y todo eso... Wao, pero imaginate, el ruido estará presente siempre!!!! Es más he medido los valores del voltaje cuando está a punto de entrar a esa rutina y siempre el valor se conserva en uno lógicop, al menos que cambie tan rapidamente que el voltimetro no lo detecte!!!!  :shock:

Los pines est{an buenos porque los he probado de pana!!!! Y la condición la hago con AND porque al parecer el compilador no me toma la condición OR.... Lo intente muchas veces y nada...

Lo de que el CCS no genere correctamente el código., pues lo creo más factible....

Akenafab ya los aterre!!!!

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Hola, grave problema....
« Respuesta #22 en: 20 de Febrero de 2009, 19:55:53 »
Es muy extraño cuando la 1ra funcionaba y después dejó de hacerlo, para esperar una tensión correcta, yo uso el fuse PUT, creo que en algo puede ayudar.

Para mi que tiene algo de ruido y algo de software

veo que utilizas varias interrupciones, como bien sabes, si en una de esas realmente interrumpe cuando el LCD esta visualizando probablemente meterá datos incorrectos al LCD, lo que provoca que en el LCD veamos basura, me ha pasado eso, cuando multiplexaba LCD yt teclado.

La solución que le dí:

- tener el código necesario para intentar disminuir el ruido presente, más que todo en los pulsadores y teclados matriciales.
- deshabilitar todas las interrupciones cuando se visualice cualquier cosa:
       disable_interrups(global);
       printf(lcd_putc,"\fMenu\n1234%u",ent);
       enable_interrupts(global);
- El consejo de todos: mientras menos código en las interrupciones, mucho mejor, y prohibido usar delays del orden de los ms en las interrupciones.
- Tienes que hacer que esos warnings desaparezcan, a mi me aparecían porque estaba usando delays del orden de ms en una rutina de interrupción.

No logré que se vaya todo, había alguna vez un colado dato extraño, pero funcionó mucho mejor que sin esas correcciones que le hice. Y si fuera mejor programador, seguramente que las hubiera eliminado completamente :mrgreen:.

Aah una cosa más el MCLR, conéctalo como te recomienda la hoja de datos, con un condensador de .1u y con las 2 resistencias

Espero puedas arreglarlo, un saludo.
.

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Hola, grave problema....
« Respuesta #23 en: 21 de Febrero de 2009, 01:44:02 »
vamos llanerita tu puedes amiga  :-/ :-/ :-/ :-/ :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Hola, grave problema....
« Respuesta #24 en: 21 de Febrero de 2009, 11:06:23 »
se me estaba olvidando, después del lcd_init(); si podes colocar un retardo de 5ms o 10 ms quizá pueda ayudar al lcd a inicializarse correctamente.

un saludo
.

Desconectado nico

  • PIC16
  • ***
  • Mensajes: 180
Re: Hola, grave problema....
« Respuesta #25 en: 21 de Febrero de 2009, 12:13:58 »
Verifica en el codigo generado por el compilador en ASM que los pines pin_c7 a pin_c4 esten realmente como entradas...

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Hola, grave problema....
« Respuesta #26 en: 23 de Febrero de 2009, 00:25:11 »
Ummm bueno, he quitado los delays de las interrupciones, y bueno me muestra l mensaje de inicio, pero luego vueleve a mopstrar el garabatero!!!! :(.... El MCLR, pues no es, Lo tengo conectado como indica el Datacheet  :).... Ya coloque el delay despues de el lcd_init...
Y los pines en efecto si están configurados como entrada!!!!

Sinceramente creo que es un grave problema de ruido.... Sigo intentando resolver el problema!!!!!!!!!!!! :shock:

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Hola, grave problema....
« Respuesta #27 en: 23 de Febrero de 2009, 03:24:27 »
Hola.

Tambien quitaste el codigo que hay en las interrupciones?
El papel lo aguanta todo


 

anything