Autor Tema: Problema con lcd y pic16f873  (Leído 6186 veces)

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

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema con lcd y pic16f873
« Respuesta #15 en: 26 de Mayo de 2006, 09:24:39 »
Hemos probado a modificar la librería declarando el puerto A como digital con la instrucción de CCS "setup_adc_ports (no_analogs). Hemos puesto esta instrucción cada vez que aparecía un set_tris_a pero aún así sigue sin funcionar.

Si usas esa instrucción que configuras a los pines como digitales  me parece bien para las operaciones de lectura.

No quiero ser insistente pero para mi un puerto analógico usado como salida es una salida y no debiera interferir en las operaciones de escritura del display (pero aclaré que si en las de lectura).

Para mi el problema esta en otro lado.

En cuanto a que la memoria empiece en la dirección 20 en lugar de la 00 como en el 84 no sé cómo podría modificarse ni si será ese el problema que tenemos.

Creo que probaremos si no a cambiar los pines de control de la LCD al puerto C, aunque el problema es que tenemos una placa de pruebas para comprobar el funcionamiento y está conectada al puerto A sin posibilidad de modificación.

Muchas gracias por todo

Vanesa no entiendo lo de las memorias reservadas... si usas el C debiera este saber perfectamente donde ubicar el código y las variables en memoria.

No veo declaraciones en posiciones 'fijas' de memoria en las rutinas del display.  Tampoco veo declaraciones de memorias globales todas son locales a las diferentes funnciones.

Respecto a lo que dices que la función te funciona con un string, realmente me dejaste anonadado.  Para mi un char es un simple byte y si se le pasa un string como parámetro solo puede hacer 2 cosas: o que sea descartado el resto , o que sobreescriba memorias locales de la subrutina. 
Sencillamente no veo en ningun lado que el software trate el envio de strings, salvo que el compilador se las ingenie para mandar varios chars ... lo cual lo considero medio extraño y hasta nada 'estandard' ya que el compilador debiera enviar lo que uno le dice y del otro lado recibir lo que espera recibir --> un char.
Ahora bien si un char a secas para el C que usas es un string.... no he dicho nada.

Que haría yo si fuera tu.

1) Es posible que tu pic16F873 no esté bien configurado en el compilador?

2) Es posible que el pic16F873 esté funcionando a mayor frecuencia que el 16F84? Si es asi --> aumentar los delays en las funciones de display.   Donde dice delay_cycles  aumentale a 10, a 20.  Eso no hará nada dañino.

3) Si el compilador funciona bien yo descartaría toda posibilidad de eso de las memorias reservadas porque sencillamente para que está el compilador con su linker si no es para conocer esas cosas ;)

4) Porque no pruebas con mandar un bucle de 10 caracteres? Y no un string? Es decir porqeu no llamas con un for, 10 veces a la rutina lcd_putc con una letra a? 


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Problema con lcd y pic16f873
« Respuesta #16 en: 26 de Mayo de 2006, 12:12:10 »
Hola, mira esta libreria, para usar la LCD con los pines puerto D para enviar los datos y E para controlar los demas.

tal vez te ayude a encontrar el error.

//Definicion de instruccion de la LCD
#define  clear_display 1      //Borra LCD y coloca el cursor en la primera posicion
/*-------------------------------------------------------------------------------------------------------
HOME
Coloca el cursor en la posición de inicio (dirección 0) y hace que el display comience a
desplazarse desde la posición original. El contenido de la memoria RAM de datos de
visualización (DD RAM) permanecen invariables. La dirección de la memoria RAM de
;datos para la visualización (DD RAM) es puesta a 0.*/
#define  home 0b10
/*------------------------------------------------------------------------------------------------------
ENTRY MODE SET
Establece la dirección de movimiento del cursor y especifica si la visualización
se va desplazando a la siguiente posición de la pantalla o no. Estas operaciones se
ejecutan durante la lectura o escritura de la DD RAM o CG RAM. Para visualizar
normalmente poner el bit S a " 0 ".

   ;(I/D)Establece la direccion de movimiento del cursor
         I/D=1 Incremento del cursor

   ;(S)    Especifica si la visualizacion se va desplazando a la sgte posicion de la pantalla o no
         S=1 Desplaza la visualización cada vez que se escribe un dato.      S=0 Modo normal

   ;1 I/D S   */
#define entry_mode_set 0b100
/*-----------------------------------------------------------------------------
DISPLAY ON/OFF CONTROL
Activa o desactiva poniendo en ON/OFF tanto al display (D) como al cursor (C) y
se establece si este último debe o no parpadear (B).
   ;(D)      Activa o desactiva el display             D=1 Display ON
   ;(C)      Activa o desactiva el cursor                C=1 Cursor ON
   ;(B)      Activa o desactiva el parpadeo del cursor B=1 Parpadeo de cursor ON
   ;1 D C B*/
#define display_on_off_control 0b1100
/*-------------------------------------------------------------------------------------------------------
CURSOR OR DISPLAY SHIFT
Mueve el cursor y desplaza el display sin cambiar el contenido de la memoria de
datos de visualización DD RAM.
   (S/C)      Selecciona que quiere desplazar si el display o la pantalla
            S/C=1 Desplaza el display   S/C=0 Mueve el cursor

   (R/L)      Selecciona la direccion de desplazamiento
            R/L=1 A la derecha         R/L=0 A la izquierda
   No importa
   No importa
   1 S/C R/L x x    */
#define cursor_or_display_shift 0b11000
/*-------------------------------------------------------------------------------------------------------
FUNCTION SET
Establece el tamaño de interfase con el bus de datos (DL), número de líneas del display
(N) y tipo de carácter (F).
   (DL)      Establece el tamaño de interfase con el bus de datos
            DL=1 Bus de datos de 8 bits      DL=0 Bus de datos de 4 bits

   (N)      Numero de lineas del display
            N=1 LCD de dos líneas          N=0 LCD de una línea

   (F)      Tipo de caracter
            F=1 Carácter de 5 x 10 puntos    F=0 Carácter de 5 x 7 puntos

   1 DL N F x x*/
#define function_set 0b111000

//-------------- Funcion que envia byte a pantalla lcd --------------------
void lcd_send_byte(int1 cont_ascci, char n ) {

      output_bit(pin_e1,0);//Pin enable en 0
      output_bit(pin_e0,cont_ascci);//Pin RS como se indico antes de llamar
      output_d(n);

      delay_cycles(1);
      output_bit(pin_e1,1);//Pin enable en 1
      delay_ms(2);
      output_bit(pin_e1,0);//Pin enable en 0
}
//--------- Funcion que establece la posicion del cursor en la lcd ------------
void lcd_gotoxy(char columna,char fila) {
char posicion;

     switch (fila) {
     case 1   : posicion=(0x80+columna);
     break;
     case 2   : posicion=(0xc0+columna);
     break;
     case 3   : posicion=(0x90+columna);
     break;
     case 4   : posicion=(0xd0+columna);
     break;
   }
   lcd_send_byte( 0,posicion);
}
//----------- Funcion que envia secuencia de inicializacion a lcd --------------
void lcd_init() {
    delay_ms(50);
    lcd_send_byte(0,function_set);
    lcd_send_byte(0,display_on_off_control);
    lcd_send_byte(0,clear_display);
    lcd_gotoxy(0,1);
}
//---------------------- Escribe en la lcd la letra dada ----------------------
void lcd_putc( char letra) {
   switch (letra) {
     case '\f'   : lcd_send_byte(0,1);       //Borra la pantalla LCD
                   lcd_gotoxy( 0,1);
     break;
     case '\n'   : lcd_gotoxy(0,2);
     break;
     case '\b'   : lcd_send_byte(0,0x10);
     break;
     default     : lcd_send_byte(1,letra);
     break;
   }
}