Autor Tema: ayuda con un par de dudas  (Leído 2257 veces)

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

Desconectado JorgitoFRyOle

  • PIC12
  • **
  • Mensajes: 79
ayuda con un par de dudas
« en: 26 de Marzo de 2005, 16:16:00 »
Buenas a tos:

Tengo un par de dudas:

1) Trabajo con un lcd de 16x2 y he construido una libreria para trabajar con el, y como es logico en ella tengo una funcion que coloca el cursor en la posicion que kiero escribir, pasandole x e y, el problema que tengo es que la primera vez que escribo en el programa principal me escribe en la posicion (1,1) aunque yo haya determinado la posicion del cursor en cualquier otro lugar. Esto me pasa siempre, porque puede ser? A que es debido? A alguien le ha pasado?

2) Trabajo tb con un reloj en tiempo real, el ds1305, y tb he construido una librería para trabajar con el, el problema que tengo aki es que cuando accedo al registro para los minutos o segundos o ... otra cosa, cuando quiero obtener dicho dato, siempre me devuelve 255, que es lo que estoy haciendo mal? He probado mil cosas y no se de que puede ser?

A ver si alguien me puede ayudar a resolver estas dudas, son importantes.

1Saludo, Muxas gracias por to

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: ayuda con un par de dudas
« Respuesta #1 en: 26 de Marzo de 2005, 16:26:00 »
Que onda JorgitoFRyole,
Con respecto a el lcd, seria mas facil si postearas el codigo de tu libreria, por lo menos la funcion donde ubica el punero en la posicion..... ya que se me ocurren muchas cosas que puedan ser......
Con el  ds1305 , tienes problemas de acceso a la lectura????????? dices que te devuelve siempre 255.. no sera que esta desbordando la variable donde guardas el dato leido????? habria que revizar tu libreria o tu codigo para poder resolver con precision el error que se produce...

Salu2 pana!

Desconectado JorgitoFRyOle

  • PIC12
  • **
  • Mensajes: 79
RE: ayuda con un par de dudas
« Respuesta #2 en: 28 de Marzo de 2005, 01:08:00 »
Buenas, gracias por contestarme

La libreria del lcd es la siguiente, no te la mando toda, solo lo que interesa, si necesitas alguna parte mas tb te la mando

//                                                    //
// Coloca el cursor en las coordenadas deseadas       //
//  x = columna (1-16)                                //
//  y = columna (1-2)                                 //
void LCD_posicion(int x, int y)                       //
{                                                     //
   int direccion;                                     //
                                                      //
   if (y != 1)    //segun el valor de y coloca la     //
                  // correspondiente direccion        //
      direccion = LCD_LINEA2;                         //
   else                                               //
      direccion = LCD_LINEA1;                         //
   direccion = direccion + (x-1); //xq pos(1,1) se    //
      // corresponde con la direccion 00 y la pos(7,1)//
      // se corresponde con la direccion 06           //
   LCD_enviar(LCD_COMANDO,LCD_DDRAM | direccion);     //
      // direccion los ultimos 7bits                  //
}                                                     //
//                                                    //
//----------------------------------------------------//
//                                                    //
// Inicializar los puertos E y D y los bits de control//
void LCD_preparar()                                   //
{                                                     //
   set_tris_e(0xF8); // pone los 3bits de control como//
                     // salidas                       //
   set_tris_d(0x00); // pone el puertoB como salida   //
                                                      //
   output_low(LCD_EN); // inicializa a 0 los bits de  //
                       // control                     //
   output_low(LCD_RW);                                //
   output_low(LCD_RS);                                //
   delay_ms(20);                                      //
}                                                     //
//                                                    //
//----------------------------------------------------//

//                                                    //
//Iniciar el lcd con las caracteristicas propias del  //
// modelo y en la funcion deseada                     //
void LCD_inicio()                                     //
{                                                     //
   int i;                                             //
                                                      //
   LCD_preparar();                                    //
                                                      //
   for(i=0; i<3; i++)                                 //
   {                                                  //
      LCD_enviar(LCD_COMANDO,LCD_CONFIGURAC);         //
      delay_ms(5);                                    //
   }                                                  //
   LCD_encender_display();                            //
   LCD_borrar();                                      //
   LCD_enviar(LCD_COMANDO,LCD_INCREM_NO_DESPLAZ);     //
}                                                     //
//                                                    //
//----------------------------------------------------//


A ver si encuentras tu el fallo. Y respecto al ds1305 como compruebo si ocurre un desbordamiento en la variable que guarda el resultado de la lectura?

La libreria es:

void DS1305_escribe_byte(BYTE contenido)
{
   int i;

   for(i = 0; i <= 7; i++)
   {
      output_bit(DS1305_SDO, shift_right(&contenido,1,0));
      // desplaza 8 bits y los saca por el Patilla_sdo; primero sale el LSB
      output_high(DS1305_SCLK);
      output_low(DS1305_SCLK); //probar si funciona bien
   }
}


void DS1305_escribe(BYTE direccion, BYTE dato)
{
   output_high(DS1305_CS); //activacion
   DS1305_escribe_byte(direccion);
   DS1305_escribe_byte(dato);
   output_low(DS1305_CS); //desactivacion
}


BYTE DS1305_lee(BYTE contenido)
{
   int i;
   BYTE dato;

   output_high(DS1305_CS);
   DS1305_escribe_byte(contenido);

   for(i = 0; i <= 7; i++)
   {
      shift_right(&dato,1,input(DS1305_SDI));
      output_high(DS1305_SCLK);
      delay_us(2);
      output_low(DS1305_SCLK); //probar
      delay_us(2);
   }

   output_low(DS1305_CS);
   return(dato);
}


void DS1305_inicio()
{
   BYTE x;

   output_low(DS1305_CS);  //seleccionamos el dispositivo
   delay_us(2);
   output_low(DS1305_SCLK);
   DS1305_escribe(DS1305_REGISTRO_CONTROL_ESCRITURA,0); //deshabilita proteccion escritura
   DS1305_escribe(DS1305_REGISTRO_TRICKLE_ESCRITURA,0xA6);
    //TCS = 1010 (solo este codigo permite charger)
    //DS = 01 (seleccionamos un diodo)
    //RS = 10 (seleccionamos resistencia R1 = 2k)
   x = DS1305_lee(DS1305_REGISTRO_CONTROL_LECTURA);
   if (bit_test(x,7) != 0)  //(x & 0x80) != 0)  comprobamos el valor del bit +significativo
                                                //bit de puesta en marcha
                                                //si esta a 1 esta parado
      DS1305_escribe(DS1305_REGISTRO_CONTROL_ESCRITURA,0);
      //pone en marcha el reloj
      //creo que no haria falta xq ya lo ago en la 4linea codigo funcion
}

A ver si me pudieses echar una mano. Gracias

1saludo

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: ayuda con un par de dudas
« Respuesta #3 en: 28 de Marzo de 2005, 13:10:00 »
Que onda pana, tratare de ayudarte
Haber tienes esta funcion:
void LCD_posicion(int x, int y)
{int direccion;
if (y != 1)
direccion = LCD_LINEA2;
else
direccion = LCD_LINEA1;
direccion = direccion + (x-1);
LCD_enviar(LCD_COMANDO,LCD_DDRAM | direccion);
}

No me pusiste con que cargas LCD_LINEA1-1 , asi que quiero pensar que los estas cargando con LCD_LINEA1=0 y LCD_LINEA2= 0X40 que es la direccion ram de la mayoria de los lcds de la linea 2..... tambien debes asegurarte que LCD_COMANDO(ya que lo usas como variable en esta funcion, seria mas facil si lo dejaras fijo como cero) sea CERO cuando entras a esta funcion y la LCD_RAM(lo mismo para esta.. deberia ser constante para evitar conflictos de estar cargando el valor cada rato.....) sea 0X80
Estos detalles solo para esta funcion... no e revizado  las otras funciones ya que de todas fromas estan incompletas por que hacen falta las llamadas que haces(otras funciones)... suponiendo que inicializas bien el lcd(ese puede ser tambien el problema) con lo que te comente se deberia de resolver el problema del puntero del lcd...
Un detalle mas, por que no usas la libreria que trae por defaul ccs?? LCD.C es muy parecida a la que estas elaborando y asi dedicarias tiempo a otros detalles de tu proyecto.
p.s.- Al rato revizo el del reloj, Sonrisa
Salu2 pana

Desconectado JorgitoFRyOle

  • PIC12
  • **
  • Mensajes: 79
RE: ayuda con un par de dudas
« Respuesta #4 en: 29 de Marzo de 2005, 21:02:00 »
Buenas

He comprobado lo que me has dicho y creo que ese no es el problema, todos los datos estan como tu dices. Puede ser que sea de la inicializacion pero yo juraria que tb esta correcta.

Aqui te mando toda la libreria:

/******************************************************/
//                      LCD.H                         //
//                                                    //
// Librería con funciones de alto nivel para manejar  //
// un display LCD de 16x2 caracteres.                 //
//                                                    //
// Realizado por: Jorge Fernandez Ramil               //
// Última modifificacion: Enero 2005                  //
//                                                    //
/******************************************************/
//         DEFINICION DE LIBRERIAS                    //
//                                                    //
//#include "18f452.h"                                 //
//                                                    //
/******************************************************/
//         DEFINICION DE CONSTANTES                   //
//                                                    //
// LISTA DE COMANDOS DE LA PANTALLA LCD               //
//                                                    //
// Borra pantalla y coloca cursor posicion1 linea1    //
#define LCD_BORRAR 0x01                               //
// Coloca cursor posicion1 linea1                     //
#define LCD_PRINCIPIO 0x02                            //
// Establece la direccion del movimiento del cursor   //
// (I/D) y desplaza la visualizacion cada vez q se    //
// escribe un dato(S)                                 //
// Si I/D = 0 y S = 0                                 //
#define LCD_DECREM_NO_DESPLAZ 0x04                    //
// Si I/D = 0 y S = 1                                 //
#define LCD_DECREM_DESPLAZ 0x05                       //
// Si I/D = 1 y S = 0                                 //
#define LCD_INCREM_NO_DESPLAZ 0x06                    //
// Si I/D = 1 y S = 0                                 //
#define LCD_INCREM_DESPLAZ 0x07                       //
// Activa la pantalla(D = 1)                          //
#define LCD_ENCENDER_DISPLAY 0x0C                     //
// Desactiva la pantalla(D = 0)                       //
#define LCD_APAGAR_DISPLAY 0x08                       //
// Activa el cursor(C = 1) -> D = 1                   //
#define LCD_ENCENDER_CURSOR 0x0E                      //
// Desactiva el cursor(C = 0) -> D = 1                //
#define LCD_APAGAR_CURSOR 0x0C                        //
// Cursor en parpadeo(B = 1) -> C = 1 y D = 1         //
#define LCD_CURSOR_PARPADEO 0x0F                      //
// Cursor no parpadeo(B = 0) -> C = 1 y D = 1         //
#define LCD_CURSOR_NO_PARPADEO 0x0E                   //
// Mueve el cursor a la izquierda sin desplazar       //
// visualizacion                                      //
#define LCD_CURSOR_IZQ_NO_DESPLAZ 0x10                //
// Mueve el cursor a la izquierda y desplaza          //
// visualizacion                                      //
#define LCD_CURSOR_IZQ_DESPLAZ 0x18                   //
// Mueve el cursor a la derecha sin desplazar         //
// visualizacion                                      //
#define LCD_CURSOR_DCHA_NO_DESPLAZ 0x14               //
// Mueve el cursor a la derecha y desplaza            //
// visualizacion                                      //
#define LCD_CURSOR_DCHA_DESPLAZ 0x1C                  //
// Establece interfaz 8bits(DL = 1), 2 lineas(N = 1), //
// 5x7 pixels(F = 0)                                  //
#define LCD_CONFIGURAC 0x38                           //
// Generador caracteres usuario RAM                   //
#define LCD_CGRAM 0x40                                //
// Establece la direccion de la DDRAM                 //
#define LCD_DDRAM 0x80                                //
//                                                    //
// DIRECCIONES DE MEMORIA DE LINEAS                   //
//                                                    //
// Coloca cursor posicion1 linea1                     //
#define LCD_LINEA1 0x00                               //
// Coloca cursor posicion1 linea2                     //
#define LCD_LINEA2 0x40                               //
//                                                    //
// DEFINICION DE LINEAS DE CONTROL DE LA PANTALLA LCD //
//                                                    //
// Seleccion de modo (comandos o caracteres)          //
// 1-> Caracteres                                     //
// 0-> Comandos                                       //
#define LCD_RS PIN_E0                                 //
// Escritura o lectura                                //
// 1-> Lectura                                        //
// 0-> Escritura                                      //
#define LCD_RW PIN_E1                                 //
// Habilita o deshabiliata                            //
// 1-> Habilita LCD                                   //
// 0-> Deshabilita LCD                                //
#define LCD_EN PIN_E2                                 //
//                                                    //
// DEFINICION DE LINEAS DE DATOS DE LA PANTALLA LCD   //
#define LCD_DATOS PORTD //IMPORTANTE                  //
//                                                    //
// SELECCION DE MODO(INDICA SI ES DATO O COMANDO)     //
#define LCD_COMANDO 0                                 //
#define LCD_CARACTER 1                                //
//                                                    //
// CONSTANTES DEBIDO A CODIGO                         //
#define MAX_ESPERA 250                                //
#define CERO_ASCII 0x30                               //
#define MAX_TEXTO 16                                  //
//                                                    //
/******************************************************/
//          DEFINICION DE TIPOS                       //
//                                                    //
typedef char cadena[MAX_TEXTO];                       //
//                                                    //
/******************************************************/
//          DEFINICION DE VARIABLES                   //
//                                                    //
int lcd_cont;  //indica la posicion dentro del numero //
int cont_ocupado; //contador para evitar que se quede //
//                 colgado en la espera               //
/******************************************************/
//          FUNCIONES DE CONTROL                      //
//                                                    //
#inline                                               //
//----------------------------------------------------//
//                                                    //
// Indica si el controlador del LCD esta ocupado o no //
short LCD_ocupado()                                   //
{                                                     //
   int valor;                                         //
                                                      //
   cont_ocupado++;                                    //
                                                      //
   set_tris_d(0xFF);                                  //
   output_low(LCD_RS);                                //
   output_high(LCD_RW);                               //
   output_high(LCD_EN);                               //
   delay_cycles(1);                                   //
   valor = bit_test(LCD_DATOS,7);                     //
   output_low(LCD_EN);                                //
   delay_cycles(1);                                   //
                                                      //
   return(valor);                                     //
}                                                     //
//                                                    //
//----------------------------------------------------//
//                                                    //
// Controla la espera mientras el LCD esta ocupado    //
void LCD_espera()                                     //
{                                                     //
   cont_ocupado = 0;                                  //
                                                      //
   do                                                 //
   {                                                  //
      cont_ocupado++;                                 //
   }                                                  //
   while ((LCD_ocupado())&(cont_ocupado<MAX_ESPERA)); //
}                                                     //
//                                                    //
//----------------------------------------------------//
//                                                    //
// Envia un dato o un comando al controlador del LCD  //
//  modo: indica si es un dato o un comando           //
//  valor: dato o comando a enviar                    //
void LCD_enviar(BOOLEAN modo, BYTE valor)             //
{                                                     //
   LCD_espera();                                      //
   set_tris_d(0x00); //ponemos el puertoD como salida //
                     //      IMPORTANTISIMO AKI       //
   if (modo)                                          //
      output_high(LCD_RS);                            //
   else                                               //
      output_low(LCD_RS);                             //
   delay_cycles(1);                                   //
                                                      //
   output_low(LCD_RW); //ponemos en modo escritura    //
   LCD_DATOS = valor;                                 //
   output_high(LCD_EN);                               //
   delay_cycles(1);                                   //
   output_low(LCD_EN);                                //
   delay_cycles(1);                                   //
}                                                     //
//                                                    //
//----------------------------------------------------//
//                                                    //
// Muestra una cadena de caracteres en el LCD         //
//  valor: cadena de caracteres a mostrar             //
void LCD_texto(char *valor)                           //
{                                                     //
   int i = 0;                                         //
                                                      //
   while (valor != 0)                              //
   {                                                  //
      LCD_enviar(LCD_CARACTER,valor);              //
      i++;                                            //
   }                                                  //
}                                                     //
//                                                    //
//----------------------------------------------------//
//                                                    //
// Muestra un numero entero en el LCD                 //
//  valor: valor del numero a mostrar                 //
void LCD_entero(int valor)                            //
{                                                     //
   long aux;                                          //
   int lcd_string[6];   //6=maximo num de digitos de  //
                        // entero                     //
                                                      //
   aux = valor; //para guardar la variable valor      //
   lcd_cont = 0;                                      //
                                                      //
   if (valor == 0)                                    //
   {                                                  //
      lcd_string[0] = CERO_ASCII;   //equivale al sim-//
                           // bolo 0 en codigo ascii  //
      lcd_cont = 1;                                   //
   }                                                  //
   else                                               //
   {                                                  //
      while (valor > 0)                               //
      {                                               //
         lcd_string[lcd_cont]=CERO_ASCII+(valor % 10);//
         // al sumarle CERO_ASCII (0x30) al valor que //
         // resulta de resto al dividir el valor por  //
         // 10 se corresponde con el simbolo de valor //
         // igual a resto en codigo ascii             //
         valor = valor / 10;  //nos quedamos con el   //
                              //cociente              //
         lcd_cont++;                                  //
      }                                               //
   }                                                  //
                                                      //
   for( ; lcd_cont > 0; lcd_cont--)                   //
      LCD_enviar(LCD_CARACTER,lcd_string[lcd_cont-1]);//
                                                      //
}                                                     //
//                                                    //
//----------------------------------------------------//
//                                                    //
// Coloca el cursor en las coordenadas deseadas       //
//  x = columna (1-16)                                //
//  y = columna (1-2)                                 //
void LCD_posicion(int x, int y)                       //
{                                                     //
   int direccion;                                     //
                                                      //
   if (y != 1)    //segun el valor de y coloca la     //
                  // correspondiente direccion        //
      direccion = LCD_LINEA2;                         //
   else                                               //
      direccion = LCD_LINEA1;                         //
   direccion = direccion + (x-1); //xq pos(1,1) se    //
      // corresponde con la direccion 00 y la pos(7,1)//
      // se corresponde con la direccion 06           //
   LCD_enviar(LCD_COMANDO,LCD_DDRAM | direccion);     //
      // direccion los ultimos 7bits                  //
}                                                     //
//                                                    //
//----------------------------------------------------//
//                                                    //
// Inicializar los puertos A y B y los bits de control//
void LCD_preparar()                                   //
{                                                     //
   set_tris_e(0xF8); // pone los 3bits de control como//
                     // salidas                       //
   set_tris_d(0x00); // pone el puertoB como salida   //
                                                      //
   output_low(LCD_EN); // inicializa a 0 los bits de  //
                       // control                     //
   output_low(LCD_RW);                                //
   output_low(LCD_RS);                                //
   delay_ms(20);                                      //
}                                                     //
//                                                    //
//----------------------------------------------------//
//                                                    //
// Borra la pantalla del LCD                          //
void LCD_borrar()                                     //
{                                                     //
   LCD_enviar(LCD_COMANDO,LCD_BORRAR);                //
}                                                     //
//                                                    //
//----------------------------------------------------//
//                                                    //
// Enciende el LCD                                    //
void LCD_encender_display()                           //
{                                                     //
   LCD_enviar(LCD_COMANDO,LCD_ENCENDER_DISPLAY);      //
}                                                     //
//                                                    //
//----------------------------------------------------//
//                                                    //
// Apaga el LCD                                       //
void LCD_apagar_display()                             //
{                                                     //
   LCD_enviar(LCD_COMANDO,LCD_APAGAR_DISPLAY);        //
}                                                     //
//                                                    //
//----------------------------------------------------//
//                                                    //
//Iniciar el lcd con las caracteristicas propias del  //
// modelo y en la funcion deseada                     //
void LCD_inicio()                                     //
{                                                     //
   int i;                                             //
                                                      //
   LCD_preparar();                                    //
                                                      //
   for(i=0; i<3; i++)                                 //
   {                                                  //
      LCD_enviar(LCD_COMANDO,LCD_CONFIGURAC);         //
      delay_ms(5);                                    //
   }                                                  //
   LCD_encender_display();                            //
   LCD_borrar();                                      //
   LCD_enviar(LCD_COMANDO,LCD_INCREM_NO_DESPLAZ);     //
}                                                     //
//                                                    //
//----------------------------------------------------//


Que no utilice la del ccs es simplemente xq con la mia me entiendo bastante mejor y como soy bastante tozudo querria arreglarla

1Saludo y Gracias

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: ayuda con un par de dudas
« Respuesta #5 en: 29 de Marzo de 2005, 21:05:00 »
Pues entonces si puede ser problema al introducir el comando para ubicar el pontero... dices que despues de la primer ingresada via puntero despues te permite colocar lo que deseas donde sea???Enviame tu libreria a mi correo pana asi sera mas facil que lo revize rapidamente.
p.s o subelo al gmaletin y me avisas para bajarlo  rapidamente
Editado tienes algunos errores de sintaxis y de tipificacion, correcciones por ahora:
#byte portd=0xF83   // no lo tenias definido!!!!!!!!!111
No se como usaste esta libreria ya que me marca varios errores........
si puedes sube la libreria que estas usando para revizarla
Salu2 pana

Desconectado JorgitoFRyOle

  • PIC12
  • **
  • Mensajes: 79
RE: ayuda con un par de dudas
« Respuesta #6 en: 30 de Marzo de 2005, 21:53:00 »
Buenas:

Efectivamente solo falla la primera vez, el resto de las veces lo hace perfectamente.

Lo que me pones de #byte portd=0xF83 no entiendo donde esta el error, esto lo defino en la libreria del pic que utilizo, 18f452.h.

A que te refieres con que marca varios errores, no entiendo??

Te intente mandar las librerias como archivos adjuntos pero no me lo perimiten, como las puedo subir como tu dices? O si kieres dame tu email y te las mando a el.

1saludo y Gracias

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: ayuda con un par de dudas
« Respuesta #7 en: 30 de Marzo de 2005, 23:21:00 »
Ya te envie el correo pana, en cuento lo tenga lo revizo y posteo Rebotado
Salu2 pana!!

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: ayuda con un par de dudas
« Respuesta #8 en: 31 de Marzo de 2005, 12:31:00 »
Bueno pana, no es error de tu libreria es solo un pequeño descuido que tuviste con los FUSES.
Solo pon lo siguiente:
#fuses H4,NOOSCSEN,NOBROWNOUT,NOPROTECT,NOWDT,NOPUT,NOLVP,NODEBUG /*PLL*/

Ahora solo tienes que ajustar (solo para esta velocidad) la rutina de envio de datos( esta: void LCD_enviar(BOOLEAN modo, BYTE valor) ).. ya que si no solo te saldran algunos caracteres........
Pruebalo y me comentas pana
Un gran abrazo pana Sonrisa