TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: dkhiri en 01 de Abril de 2006, 10:27:00

Título: 16f873 y lcd
Publicado por: dkhiri en 01 de Abril de 2006, 10:27:00
Buenas a todos. Hace unos dias que estoy con un proyecto de mover 2 motores paso a paso y controlar un lcd. Primero hice los motores en un 16f628 y ningun problema. Ahora, para añadirle en lcd,he cambiado a un 16f873A. Segun la simulacion de proteus, todo esta correcto pero estoy haciendo las pruebas en placa y ni si quiera me enciende un led que tengo cuando se enciende todo. Haber si alguien puede ayudarme un poco.
Gracias de antemano.

#include <16F873A.h>

#device adc=8

#FUSES NOWDT, XT,  NOPROTECT,NOLVP,NODEBUG, BROWNOUT,NOCPD, NOWRT,NOPUT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use fixed_io(A_OUTPUTS=PIN_A0,PIN_A1,PIN_A2, PIN_A3)
#use fixed_io(C_OUTPUTS=PIN_C0,PIN_C1,PIN_C2,PIN_C3,PIN_C5)
#include <LCD.C>
#include <stdlib.h>

unsigned int leche()
{
   if(!input(PIN_C4))
   {
      output_low(PIN_A0);
      output_low(PIN_A1);
      output_low(PIN_A2);
      output_low(PIN_A3);
      output_low(PIN_C0);
      output_low(PIN_C1);
      output_low(PIN_C2);
      output_low(PIN_C3);
      lcd_putc("
"Giño;
      lcd_putc(" STOP  "Giño;
      return(0);
   }
   else
   return(1);
}


void main()
{
   unsigned char opcion[3], a[4];
   unsigned int i,j, velocidad=150;
   port_b_pullups(TRUE);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   lcd_init();
   lcd_putc("Empezamos"Giño;
   output_high(PIN_C5);
   while(TRUE)
   {
    if ( kbhit () )
     {
      j=1;
      lcd_putc("f"Giño;
      gets(opcion);
      if (opcion[1]=="")
         opcion[1]=1;
      if (opcion[0]=="V")
         velocidad=opcion[1];
      putc(opcion[0]);
      switch (opcion[0])    //adelante
      {
         case ("a"):
            lcd_gotoxy(1,2);
            lcd_putc("Avanza"Giño;
            lcd_gotoxy(8,2);
            if (opcion[1]==1)
                lcd_putc("1 paso"Giño;
            else
            {

               itoa(opcion[1],10,a);
               for(i=0; i<3; i++)
                   lcd_putc(a);
              lcd_putc(" pasos"Giño;
            }
         for(i=0; i<opcion[1]; i++)
         {
            j=leche();
            if(j==1)
            {
               output_low(PIN_A0);
               output_low(PIN_C0);
               output_high(PIN_A2);
               output_high(PIN_C2);
               delay_ms(velocidad);
               output_low(PIN_A2);
               output_high(PIN_A1);
               output_low(PIN_C2);
               output_high(PIN_C1);
               delay_ms(velocidad);
               output_low(PIN_A1);
               output_high(PIN_A3);
               output_low(PIN_C1);
               output_high(PIN_C3);
               delay_ms(velocidad);
               output_low(PIN_A3);
               output_high(PIN_A0);
               output_low(PIN_C3);
               output_high(PIN_C0);
               delay_ms(velocidad);
            }
            else
               i=opcion;
         }
         break;

      case ("b")://atras
            lcd_gotoxy(1,2);
            lcd_putc("Atras "Giño;
            lcd_gotoxy(7,2);
            if (opcion[1]==1)
                lcd_putc("1 paso "Giño;
            else
            {
               itoa(opcion[1],10,a);
               for(i=0; i<3; i++)
                   lcd_putc(a);
               lcd_putc(" pasos"Giño;
            }
         for(i=0; i<opcion[1]; i++)
         {
         j=leche();
         if (j==1)
         {
         output_low(PIN_A1);
         output_high(PIN_A2);
         output_low(PIN_C1);
         output_high(PIN_C2);
         delay_ms(velocidad);
         output_low(PIN_A2);
         output_high(PIN_A0);
         output_low(PIN_C2);
         output_high(PIN_C0);
         delay_ms(velocidad);
         output_low(PIN_A0);
         output_high(PIN_A3);
         output_low(PIN_C0);
         output_high(PIN_C3);
         delay_ms(velocidad);
         output_low(PIN_A3);
         output_high(PIN_A1);
         output_low(PIN_C3);
         output_high(PIN_C1);
         delay_ms(velocidad);
         }
         else
         i=opcion;
         }
         break;
         case ("c")://derecha
            lcd_gotoxy(1,2);
            lcd_putc("Derecha"Giño;
            lcd_gotoxy(9,2);
            if (opcion[1]==1)
                lcd_putc("1 paso"Giño;
            else
            {
               itoa(opcion[1],10,a);
               for(i=0; i<3; i++)
                   lcd_putc(a);
               lcd_putc(" pasos"Giño;
            }
         for(i=0; i<opcion[1]; i++)
         {
            j=leche();
            if (j==1)
            {
            output_low(PIN_A0);
            output_high(PIN_A2);
            output_low(PIN_C1);
            output_high(PIN_C2);
            delay_ms(velocidad);
            output_low(PIN_A2);
            output_high(PIN_A1);
            output_low(PIN_C2);
            output_high(PIN_C0);
            delay_ms(velocidad);
            output_low(PIN_A1);
            output_high(PIN_A3);
            output_low(PIN_C0);
            output_high(PIN_C3);
            delay_ms(velocidad);
            output_low(PIN_A3);
            output_high(PIN_A0);
            output_low(PIN_C3);
            output_high(PIN_C1);
            delay_ms(velocidad);
            }
            else
            i=opcion;
         }
         break;
         case ("d")://izquierda
            lcd_gotoxy(1,2);
            lcd_putc("Izquierda"Giño;
            lcd_gotoxy(11,2);
            if (opcion[1]==1)
                lcd_putc("1 paso"Giño;
            else
            {
               itoa(opcion[1],10,a);
               for(i=0; i<3; i++)
                   lcd_putc(a);
               lcd_putc("pasos"Giño;
            }
         for(i=0; i<opcion[1]; i++)
         {
            j=leche();
            if (j==1)
            {
            output_low(PIN_A1);
            output_high(PIN_A2);
            output_low(PIN_C0);
            output_high(PIN_C2);
            delay_ms(velocidad);
            output_low(PIN_A2);
            output_high(PIN_A0);
            output_low(PIN_C2);
            output_high(PIN_C1);
            delay_ms(velocidad);
            output_low(PIN_A0);
            output_high(PIN_A3);
            output_low(PIN_C1);
            output_high(PIN_C3);
            delay_ms(velocidad);
            output_low(PIN_A3);
            output_high(PIN_A1);
            output_low(PIN_C3);
            output_high(PIN_C0);
            delay_ms(velocidad);
            }
            else
            i=opcion[1];
         }
         break;
      }
     }

}
}
Título: RE: 16f873 y lcd
Publicado por: maunix en 01 de Abril de 2006, 16:58:00
Tienes el oscilador configurado como XT, e sto es para cristales 4Mhz o inferiores.

Si usas un cristal de mayor frecuencia usa HS.

Saludos
Título: RE: 16f873 y lcd
Publicado por: dkhiri en 02 de Abril de 2006, 05:34:00
Gracias maunix, ahi me he colado Avergonzado pero de todos modos sigue igual. Al principio pongo a nivel alto C5 pero no lo hace, pasa de mi, y del lcd ni hablemos. Quitando ese error, todo lo demas estaria bien no? Es que soy nuevo en este mundilloVacilando

Muchas gracias
Título: RE: 16f873 y lcd
Publicado por: RaDoN en 02 de Abril de 2006, 05:37:00
Puedes poner un esquema o detallar como conectaste el LCD?
Título: RE: 16f873 y lcd
Publicado por: dkhiri en 02 de Abril de 2006, 08:11:00
He intentado adjuntar el archivo pero no me deja. Las conexiones son:
RB0= enable
RB1= RS
RB2=R/W
RB4 a RB7 datos

Las salidas las testeo con el tester y a veces hay tension y a veces no. No lo entiendo.Enfurruñado
Título: RE: 16f873 y lcd
Publicado por: RaDoN en 02 de Abril de 2006, 08:22:00
Pues no veo en tu programa la linea:

Codigo:
#define use_portb_lcd


Verificame si falta Flash
Título: RE: 16f873 y lcd
Publicado por: dkhiri en 02 de Abril de 2006, 09:32:00
La tengo la linea. Cuando activas la lcd.c hay un comentario que te dice que si controlas el lcd por el puerto B, que active esa linea y ya lo hice en la libreria.
Lo bueno es que acabo de probar lo del lcd con un 16f628 y el lcd funciona. No lo entiendo
Título: RE: 16f873 y lcd
Publicado por: RaDoN en 02 de Abril de 2006, 11:47:00
Pues entonces solo falta que pruebes con un 873 distinto, puede ser que alguna pata este estropeada...
Título: RE: 16f873 y lcd
Publicado por: dkhiri en 02 de Abril de 2006, 12:34:00
Creo que te hare caso. Mañana cogere uno nuevo.
Gracias de todos modos Giño
Título: RE: 16f873 y lcd
Publicado por: Nocturno en 02 de Abril de 2006, 23:56:00
¿Has conectado el potenciómetro que regula el contraste en el lcd?, sin eso no funciona, eh
Título: RE: 16f873 y lcd
Publicado por: dkhiri en 04 de Abril de 2006, 09:22:00
Si que lo puse. Pero es que no me hace nada de nada. No pone a 1 C5 ni nada. Lo acabo de probar con un 16f870 y tampoco.
Hay algun sitio donde esten explicados los fuses. Es que hace un tiempo no me iban los motores con un 16f628 y era por un fuse. Haber si el problema lo tengo ahi porque no se que pensar
Título: RE: 16f873 y lcd
Publicado por: RaDoN en 04 de Abril de 2006, 09:49:00
Ahora que sacas el tema de los fuses ...

Codigo:

#FUSES NOWDT, XT, NOPROTECT,NOLVP,NODEBUG, BROWNOUT,NOCPD, NOWRT,NOPUT
#use delay(clock=20000000)



Quita XT (que es para cristales de 4 mhz) y pon HS (para cristales más rapidos). Quizás por esto el pic no realiza bien las rutinas de retardos que hay en el interior de la libreria de la LCD y no hace nada coherente...
Título: RE: 16f873 y lcd
Publicado por: dkhiri en 04 de Abril de 2006, 09:53:00
He puesto XT con clock a 4Mhz, HS con clock a 20Mhz, en la placa he puesto un cristal de 4 y uno de 20 y nada. No lo entiendo. Llevo todo el fin de semana y no me cuadra.
Título: RE: 16f873 y lcd
Publicado por: RaDoN en 04 de Abril de 2006, 10:09:00
Y dices que con otro Pic te funcionó?? Probaste ya con un 2º 873??
Título: RE: 16f873 y lcd
Publicado por: dkhiri en 04 de Abril de 2006, 10:18:00
Si. He probado con otro 873 y con un 870 y me hacen lo mismo. Ahora hare un codigo para encender led"s haber si eso al menos si me lo hace y luego ire poco a poco.
Gracias por echar un cable Flash
Título: RE: 16f873 y lcd
Publicado por: RaDoN en 04 de Abril de 2006, 10:23:00
Escrito originalmente por dkhiri

Lo bueno es que acabo de probar lo del lcd con un 16f628 y el lcd funciona. No lo entiendo


Pues haber, porque despues de lo visto yo tmpc lo entiendo ... loco
En mi caso recuerdo un problema con la libreria del LCD de CCS cuando usaba un cristal de 20 Mhz (a menor velocidad no me lo hacia) y era que escribia carácteres raros que no le mandaba en lugar de los que sí, se lo solucione subiendole un poco los restrasos de la libreria. Pero mientras no te de problemas a 4 mhz ...
Título: RE: 16f873 y lcd
Publicado por: dkhiri en 04 de Abril de 2006, 10:55:00
Radon, gracias por hacer el comentario de la libreria de ccs de lcd.c. Ahora si funciona todo, menos el lcd. He quitado todas las lineas del lcd y el include y funciona. Rebotado
Sabes alguna libreria alternativa que vaya bien para el lcd?? He visto algunas pero si me puedes recomendar algo mejor.
Muchas gracias!!!!!!Sonrisa Gigante
Título: RE: 16f873 y lcd
Publicado por: RaDoN en 04 de Abril de 2006, 11:09:00
En mi opinión deberias ahondar un poco mas para dar con el problema, esa librería funciona bien. ¿Estás seguro que trasteando con ella no la has podido modificar o algo similar?

Otra prueba más, usa la directiva #use fast_io y antes de inicializar el LCD configura todo el puerto B como salida.
Título: RE: 16f873 y lcd
Publicado por: RedPic en 04 de Abril de 2006, 12:52:00
Yo utilizo la Flex LCD y me funciona de maravilla.

Título: RE: 16f873 y lcd
Publicado por: RaDoN en 04 de Abril de 2006, 13:58:00
Olvidas inicializar el lcd ...
Título: RE: 16f873 y lcd
Publicado por: Nocturno en 04 de Abril de 2006, 16:06:00
No hacen falta pullups, se conectan directamente.
Título: RE: 16f873 y lcd
Publicado por: dkhiri en 04 de Abril de 2006, 16:08:00
Ya ta por fin!!! Eran los fuses. Mirando en otro foro, una contestacion de Radon a uno que tenia un problema con un 876 me ha servido.
LCD listo ahora falta depurar unas cosillas.
Muchas gracias a todos!!
Título: Re: 16f873 y lcd
Publicado por: X en 05 de Noviembre de 2009, 22:14:13
Hola khiri

Es un poco viejo el tema pero los problemas nuncan envejecen.
Tengo el mismo problema no logro hacer funcionar un LCD 2x16 y aun con las librerias de flex_lcd.
Podrias decirme cuales eran estos famosos fuse que te molestaron?
Ademas sabe si saco estas configuraciones que valores toman por defecto? OFF o ON.

Saludos y gracias por cualquier ayuda.