TODOPIC

FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: Enigma en 18 de Febrero de 2009, 01:36:19

Título: Hola, grave problema....
Publicado por: Enigma en 18 de Febrero de 2009, 01:36:19
Hola que tal muchachos, me encuentro aquí por un problema que no es muy común, al menos para mi caso... Explico...

Tengo un diseño el cual he simulado y me funciona perfectamente en la simulación.... Lo monte, y la primera vez que le meti tensión funcionaba bien, luego lo desconecte y volvi a conectar y pues allí vinieron los problemas... El circuito es la bomba de gasolina, compuesto por LCD; teclado y PIC 18f4550...

Probe la LCD, está buena.
Probe el pic, está bueno.
Medi tensión en cada pin, todo esta bien.

Pero la LCD cuando enciendo el circuito me muestra todo el tiempo esto:

(http://img403.imageshack.us/img403/7388/a011rw3.jpg)

Modifique el programa tres veces, es decir cambiando la LCD de puerto al igual que el teclado. Nada que funciona. :x
Arme y desarme el montaje 3 veces... Nada de nada que funciona. :x
Cambie de componentes, nada de nada que funciona :shock:
Cambie de PIC, naadaaaaaa!!! :shock:
Cambie la LCD, nadaaaaaaaaaa!! :?
Cambie el proto Board, y nada que funciona...

El programa inicialmente estaba con el reloj interno, es decir, tenia en el fuse el INTRC_IO, nada que funcionaba, pense que era por eso y decidi colocar el cristal y colocarlo en modo XT... NADA!!!!!!!!! :x

Configure bien el programador!!!!!!!!!! nada........ :z)

Ya no encuentro más que hacer... He hecho de todo... Hasta lo golpee y nadaaaaaaaaaa!!!!!! :5]

A alguien le ha pasado esto alguna vez??? alguien podría sugerirme que más revisar para ver que puede estar afectando al circuito....

Aquí les dejo el circuito en proteus y el C. Pero les digo en Proteus funciona todo belllo!!!!!!!!!

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Hola, grave problema....
Publicado por: Nocturno en 18 de Febrero de 2009, 03:12:00
¿No se habrá jodido el pic?
Título: Re: Hola, grave problema....
Publicado por: Javicho en 18 de Febrero de 2009, 03:17:21
Hola:

Según comentas todos tus perifericos estan bien, pero el lcd no. Graba en el pic un programa de prueba de mensajes en el lcd en un circuito aparte, asi descartas si el lcd está en buen estado. Si esto funciona bien debe ser un problema de ruido al momento de conectar la alimentación, tal vez esas bombas de gasolina están afectando al circuito en el transitorio sobretodo al lcd que parece que se queda bloqueado.

Puedes probar en iniciar tu programa en el pic luego de 1seg por ejemplo, es decir al iniciar tu programa debes llamar a un delay de 1seg y a partir de ahi recien inicializar todos tus periféricos incluyendo al lcd y a ver como te va.

Prueba tambien usando una fuente independiente del sistema de la bomba de gasolina, tal vez una fuente switching sirva.

Javicho.
Título: Re: Hola, grave problema....
Publicado por: ALE1973 en 18 de Febrero de 2009, 08:33:06
Hola multiplexas el LCD con el teclado?, si es asi.. de que valor son las resistencias de pull ups, el otro dia tuve un problema parecido y eran las resistencias de pull ups que tenian un valor bajo (1k), coloque de (4k7) y todo a la perfeccion.
Pareciera ser que no inicia bien el LCD.

Saludos.
Alejandro
Título: Re: Hola, grave problema....
Publicado por: Marioguillote en 18 de Febrero de 2009, 09:05:07
Hola Enigma !

No veo en la imagen los capacitores de desacoplo de 100nF, ni ningún electrolítico de 10uF, ó 47uF montados sobre el protoboard. Yo acostumbro a cargar el proto con todos ésos capacitores al iniciar un montaje. Tal vez éso te esté faltando. Coloca un par de 103, 104 y 10uF ó 47uF en las líneas de alimentación del protoboard y luego prueba lo que dice Javicho, de armar un mini-programa con muestras elementales de mensajes, limpieza del LCD (CLS se dice en Basic) y de a poco llegarás a la fuente del problema.

Saludos !
Mario
Título: Re: Hola, grave problema....
Publicado por: micro_cadaver en 18 de Febrero de 2009, 13:17:36
hola amiga:
1era observacion: pones mucho codigo en las interrupciones. (no creo q sea el problema pero ayuda)

2da observacion:

void main(void)
{
         delay_ms(100); // PONLE DELAY AL INICIO PORQUE EN LA REALIDAD DEMORA EN COGER EL VOLTAJE ADECUADO

         set_tris_b(0x1B);                        // Puerto B, como b'00011011 (entrada/salida)
         set_tris_c(0xF0);                        // Puerto C, como b'11111000 (Entrada/salida)
         set_tris_d(0x00);                        // Puerto D, como b'00000000 (salida)
         output_b(0);                             // Limpio el puerto B
         output_c(0);                             // Limpio el puerto C
         output_d(0);                             // Limpio el puerto D
         port_b_pullups(TRUE);                    // Activo las pullups
         setup_adc(ADC_OFF);                      // Conversores analógicos/digitales apagados
         setup_adc_ports(NO_ANALOGS);             // Puerto digitales
         setup_comparator(NC_NC_NC_NC);           // Comparadores apagados

         lcd_init();                              // Para inicializar el LCD
         //LO PUSE ACA PORQUE PUEDE SER QUE SE TE DISPAREN LAS INTERRUPCIONES Y NO VAN A DEJAR
         //QUE EL LCD INICIALIZE CORRECTAMENTE

         ext_int_edge (H_TO_L);                   // Flag INTF si flanco de bajada.
         ext_int_edge(1,H_TO_L);                  // Flag INTF si flanco de bajada.
         enable_interrupts(int_ext1);             // Habilito la interrupción externa de RB1
         enable_interrupts(global);               //Habilita máscara global de int.
         enable_interrupts(int_ext);              // Activa máscara INTE
.
.
.

3ra Observacion: puedes probar primero comentando las interrupciones de tal manera que no haya inteerrupciones y solo arranque la LCD

         lcd_init();                              // Para inicializar el LCD

//         ext_int_edge (H_TO_L);                   // Flag INTF si flanco de bajada.
  //       ext_int_edge(1,H_TO_L);                  // Flag INTF si flanco de bajada.
    //     enable_interrupts(int_ext1);             // Habilito la interrupción externa de RB1
      //   enable_interrupts(global);               //Habilita máscara global de int.
        // enable_interrupts(int_ext);              // Activa máscara INTE
.
.
.
Título: Re: Hola, grave problema....
Publicado por: MLO__ en 18 de Febrero de 2009, 15:44:40
Hola.

Recuerdo por ahi que a algun forero le sucedio que la LCD no le iba como queria y justamente era porque tenia mucho codigo en las interrupciones, asi que no descartaria esa opcion, ya que los tiempos que usa la LCD suelen ser algo criticos y si la interrupcion se genera mientras se esta gestionando alguna comunicacion con la LCD, ésta podria quedarse trabada.

Saludos
Título: Re: Hola, grave problema....
Publicado por: Enigma en 19 de Febrero de 2009, 01:16:03
Hola a todos, gracias por interearce en mi problema!!!!!

La LCD, está buena, probe tres  :shock:
El pic también lo cambie, y nada!!!!!! :shock:
Umm, lo capacitores??? pues, los coloque, pero luego los quite, porque no tenían efecto sobre el circuito....
Bueno no multiplexe la LCD con el teclado, coloque la LCD en el puerto D y el teclado en el puerto C
Bueno con respecto al mucho codigo en las interrupciones, si lo que hice fue que coloque una función en la interrupción, y todo ese poco de codigo lo meti en la función para liberar la interrupción.... Tampoco resulto!!!!! :(
Ummm bueno las resistencias pullup son de 390 ohm, pero antes las había colocado así y todo sirvia a la perfección....


Bueno, les explico que hice hoy....

Hice el programa pasito a pasito... Primero empece mandando el mensaje a la LCD... Todo excelente, se mostro el mensaje. Por ahí supe que no era ni la LCD ni el pic... Luego monte la interrupción, y que creen.... Las interrupciones me bloquean la LCD :shock:

Luego dije, bueno vamos a ver i es del todo cierto, quite las interrupciones e hice simple testeo del bit RB0 y RB1, y todo se mostró bien.... La LCD mostraba los mensajes, hacía algunas acciones, pero lo único es que el programa pues me saltaba una rutina, es decir, no me agarraba un while que tengo... Luego les explico cual while, a ver si alguien me da un consejito, pero primero lo primero... Porque las interrupciones me bloquean la LCD...? :?

La verdad no entiendo porque una interrupción externa me bloquea los comandos de la LCD... No se pienso, que es porque como es interrupción al programa no le da chance de ver las librerias de la LCD o algo así!!!! En vista de eso, pues decidi poner más atención en los warnings del CCS.... Miren...

(http://img6.imageshack.us/img6/1493/piccuw4.jpg)

Es decir, se me deshabilitan las funciones principales de la libreria de la LCD.... :shock:


Alguien me puede decir porque suceden estás cosas?

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Hola, grave problema....
Publicado por: MLO__ en 19 de Febrero de 2009, 01:33:24
Hola.

Esos warnings es porque usas funciones que toman mucho tiempo dentro de la interrupcion, como por ejemplo un printf(); o delays muy largos de mas de 1ms.

Es mejor usar flags y en el main habiltar este tipo de funciones.

Saludos
Título: Re: Hola, grave problema....
Publicado por: micro_cadaver en 19 de Febrero de 2009, 02:33:28
eso, usar banderines, evita cargar las interrupciones con codigo.
Título: Re: Hola, grave problema....
Publicado por: AKENAFAB en 19 de Febrero de 2009, 04:31:39
Lo que dices que los capacitores no tienen ningun efecto y los quitas xD , será mejor que los dejes y protejas en exceso que irle al tanteo , no pierdes nada.

Las resistencias de pullup a mi me van bien con las INternas y multiplexando con pantalla.ENotros casos he usado resistencias de pullup de 1K.

Tambien cuando uso protoboard agrego capacitores , los que te menciono Mario, en si en todas mis aplicaciones.
Tambien habilito el Power UP TIMER y agrego un delay de 500ms-1000ms.

Los tiempos del LCD son criticos solo al incio cunado se configura.No hay problema en eso con la libreria pues tiene bien los tiempos y lee el flag bussy.

He aprendido aqui a usar los flasg para salir rapido de interrupcion y es más organizado.

Saludos

Título: Re: Hola, grave problema....
Publicado por: cchhaa en 19 de Febrero de 2009, 09:38:23
yo tuve un problema idéntico hace tiempo, me salian caracteres así de raros todo el tiempo y si presionaba algún botón que afectara lo que se tiene que ver por el lcd cambiaban los caracteres raros por otros también raros. Al final me di cuenta del error, tenia los cables de entrada de datos cambiados, lo mismo no es tu caso, pero comprueba y asegúrate de que los cables están bien conectados y en el orden adecuado.

un saludo
cchhaa
Título: Re: Hola, grave problema....
Publicado por: Leon Pic en 19 de Febrero de 2009, 14:28:27
mmmmmmmmm, talvez sea una tontería lo que voy a decir pero bueno. Lo digo igual.

He visto que incluyes la librería lcd.c entre medio de las configuraciones de byte y configuración de la palabra de configuración. Si el compilador le hace caso al lugar pusto, lo pondrá a partir de la pocición de interrupción. El concejo es que muevas #include (lcd.c) después de las rutinas de interrupción, así el compilador, ubicará todo la librería después de las rutina de interrupción (valga la redundancia). Recuerda que esta rutina, se graba en el pic también y un lugar equivocado genera problemas.
Título: Re: Hola, grave problema....
Publicado por: AKENAFAB en 19 de Febrero de 2009, 15:31:49
yo tuve un problema idéntico hace tiempo, me salian caracteres así de raros todo el tiempo y si presionaba algún botón que afectara lo que se tiene que ver por el lcd cambiaban los caracteres raros por otros también raros. Al final me di cuenta del error, tenia los cables de entrada de datos cambiados, lo mismo no es tu caso, pero comprueba y asegúrate de que los cables están bien conectados y en el orden adecuado.

un saludo
cchhaa

Lo que yo hice en este caso fue poner una resistencia de 1k hacia tierra y tenoa habilitadas las pullups del pic.

Asi aunque presione cualquier boon no afecta el lcd , y para leer el teclado pongo los pines como entrada y habilito pullups.

Es como pones las resistencias del ICSP para que no interfiera con el trabajo del lcd dandole asi , prioridad.


Enigma tambien podrias poner los pines que no uses del LCD a tierra.Solo con fines de prueba , pero si te escrbie de un Inicio bien , seria descartado que se metiera ruido por ellos , pero por si las moscas.




Saludos amigos!
Título: Re: Hola, grave problema....
Publicado por: Enigma en 19 de Febrero de 2009, 23:06:31
Bueno, lo de mucho código de las interrupciones, pues lo había cambiado por funciones y pues no me afecto en nada, lo volvi a hacer y nada de nada! Por lo que percibo el exceso de código en los servicios de interrupción no s el problema!  :(

Bueno, complaciendo, pues deje los capacitores pero aún así el circuito sigue sin funcionar!!!!!
Bueno, con respecto a la mala conexión de la LCD, pues ese no e el problema, porque la misma está bien conectada!

Ahora lo que menciona León pic, no le he probado, voy a hacerlo a ver que tal....

Akenafab, la LCD no tiene problemas, porque luego para probar quite las interrupciones e hice un simple testeo del bit, y pues todo funciono muy bien.... El problema está cuando activo las interrupciones externas!!! pero voy a probar lo que dices de colocar los otro pines a tierra!!!

Todo es un problema vale, digo esto porque: En vista de que las interrupciones no me funcionaban decidi probar con testeo... O.k, el programa empieza muy bien, mostrando los mensajes, cuando presiono RBO o RB1 (por testeo), entra chevere al menú, muestra esto:

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.

Y bien se queda allí, todo muy bien, el problema etá cuando aprieto o RB3 o RB4, deberia quedarse esperando a que uno ingrese los bsF... pero no, el salta directamente!!! hasta aquí:

(http://img7.imageshack.us/img7/3789/dibujo23vz5.jpg)


No me le hace caso a las sentencias del while, con los and del pinc7 - al C4.... Y no entiendo, porque los voltajes de esos pines si están en 1 lógico, pero es como que el pic no ve eso!!!!

Rayos, este es el primer programa que me ha traido tantos problemas!!!!!! :x

Voy a probar lo que me dijeron de la LCD!!! ojala sea eso vale, porque ya estoy que me arranco las cabellos!

Cuando no me agarra el chingo, me agarra el in nariz!!!!!!!!! :?

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Hola, grave problema....
Publicado por: MLO__ 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

Título: Re: Hola, grave problema....
Publicado por: Enigma 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 :-)
Título: Re: Hola, grave problema....
Publicado por: MLO__ 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
Título: Re: Hola, grave problema....
Publicado por: Enigma en 20 de Febrero de 2009, 01:00:09
Ahhh o.k entiendo!!! bueno.... Dejame ver!

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Hola, grave problema....
Publicado por: sander 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
Título: Re: Hola, grave problema....
Publicado por: AKENAFAB 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.
Título: Re: Hola, grave problema....
Publicado por: Enigma 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 :-)
Título: Re: Hola, grave problema....
Publicado por: Cryn 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.
Título: Re: Hola, grave problema....
Publicado por: micro_cadaver en 21 de Febrero de 2009, 01:44:02
vamos llanerita tu puedes amiga  :-/ :-/ :-/ :-/ :-/
Título: Re: Hola, grave problema....
Publicado por: Cryn 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
Título: Re: Hola, grave problema....
Publicado por: nico 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...
Título: Re: Hola, grave problema....
Publicado por: Enigma 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 :-)
Título: Re: Hola, grave problema....
Publicado por: MLO__ en 23 de Febrero de 2009, 03:24:27
Hola.

Tambien quitaste el codigo que hay en las interrupciones?