Autor Tema: Driver "BETA" MAX6952  (Leído 2263 veces)

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

Desconectado magoblin

  • PIC10
  • *
  • Mensajes: 3
Driver "BETA" MAX6952
« en: 23 de Junio de 2009, 23:55:08 »
Señores, primera vez que participo activamente con ustedes....siempre son un punto de referencia para mis proyectos y dudas, pero hoy quiero hacer un "aporte".
Dentro de mi Proyecto de Tesis, me he visto en la necesidad de desarrollar una pequeña libreria, o mas bien Driver para el MAX6952, ya que he buscado por todas partes y no he logrado encontrar nada. La unica informacion disponible es el Driver para su hermano, el MAX6953, pero utiliza otro tipo de configuración de trama y protocolo de comunicacion (I2C), a diferencia del 52 que utiliza SPI.

El tema es el siguiente, desarrolle un pequeño Driver, pero se presenta un error. Las rutinas estan en un archivo x.C, que debieran funcionar correctamente, ya que las probe de forma independiente, pero al ser llamadas, tengo problemas con los registros argumentos.

aqui les dejo el codigo, por si le sirve a alguien mas y si alguien tiene el mismo problema, y sabe como solucionarlo :P.....
buenp, para eso esta el foro...
el compilador es el CCS PCW.


/*-----------------------------------------------------------------------------
        ------------------ Driver MAX6952 ----------------------
   
   antes se debe iniciar setup_spi()
   init_display();   //inicia la funcion SPI y la intensidad al maximo
   write_config_register(config_byte); //Escribe registro de configuracion
   shutdown(state,R/!W);   //Low Power Shutdown. (False,True) Enciende Display
   display_test(state);   //True enciende TEST
   set_intensity(intens);   //0xAB, A:Digito 1 y 3; B:Digito 0 y 2
   //length=4, start=0x60 -Escribe P0 y P1
   //start=0x20 -Escribe P0 Digito 1,2,3,4
   //start=0x40 -Escribe P1 Digito 1,2,3,4
   write_display_character(start,length,string);
   clear_digit();   //borra todos los caracteres
   
   
   SECUENCIA
   main()
   cadena["hola"];
   init_display();
   .
   .
   .
   shutdown(FALSE,TRUE);
   display_test(TRUE);
   delay_ms(100);
   display_test(FALSE);
   write_display_character(0x60,4,cadena);
   
   
-----------------------------------------------------------------------------*/

#DEFINE SS PIN_C2

int config_byte;



//Funcion que escribe en el registro
//de CONFIGURACION, dato viene en
// "config_byte"
void write_config_register( int &config_bytes )
{
   output_low(SS);
   spi_write(0x04);
   spi_write(config_byte);
   output_high(SS);
}

//Pone al display en Low Power Shutdown
void shutdown( short state, short wrt )
{
   if( !state ) config_byte |= 0x01;
   else config_byte &= 0xFE;
   if( wrt ) write_config_register( config_byte );
}

//TEST MODE
void display_test(short state)
{
   output_low(SS);
   spi_write(0x07);
   if(state)
      {
         spi_write(1);     
      }
   else
      {
         spi_write(0);
      }
   output_high(SS);
}

//Configurar la intensidad
//configura todos los registros con la misma
//intensidad. 0xAB
// A: Digito 1 y 3
// B: Digito 0 y 2

//MAXIMA
void set_intensity()
{
   output_low(SS);
   spi_write(0x01);
   spi_write(0xff);
   spi_write(0xff);   //Auto incremento
   output_high(SS);
}

//Configura el Plane0
//Para escribir en Plane0 y Plane1, usar
//start= 0x60, length=4
//Para escribir cada Plane por separado
//Plane0 Digito 1,2,3,4
//start= 0x20 , length= 4
//Plane1 Digito 1,2,3,4
//start= 0x40 , length= 4
void write_display_character(int start, int length, char* string)
{
   int n;
   output_low(SS);
   for(n=0;n<length;n++)
   {
      spi_write(string[n]);
   }
   output_high(SS);
}

//Borra todos los caracteres
void clear_digit(void)
{
  // write_config_register(config_byte | 0x20);
}

//Inicia la funcion SPI y configura la intensidad al maximo
void init_display()
{
   SETUP_SPI(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_64);
   config_byte=0;
   set_intensity();
}



Desconectado magoblin

  • PIC10
  • *
  • Mensajes: 3
Re: Driver "BETA" MAX6952
« Respuesta #1 en: 24 de Junio de 2009, 21:46:07 »
Señores, como veo que no tiene mucha concurrencia, y ademas es de urgencia propia... :P
La noche pasada creo que en vez de dormir....programe en mi cabeza :P
y creo haber encontrado la solucion.....

La libreria esta correcta, peeeero la forma en la que se llama y se ejecuta es el problema, por lo que propongo la siguiente solucion. No los quiero ofender al realizar una especie de "clase" de programacion, pero debe haber muuuuucha mas gente como yo, que como los administradores de este foro, que deben ser programadores veteranos.


/*-------------------------------*/
PUNTEROS

Paso de parámetros por referencia.

Es bien conocida la utilidad de los punteros en la programacion con lenguaje C, y en este caso creo no es la excepción.
Cuando se pasa como parametro una variable a una funcion, esta no logra modificar el valor de la variable, eso es dado que fue pasada por valor. Para lograr que se modifique el contenido de una variable debe pasarse por referencia, para ello se pasa a la funcion la direccion de la variable y no el dato.

Ejemplo:
una funcion que imprima en primer caracter en el MAX6952

en al programa principal tendriamos lo siguiente

VOID MAIN()
{
   setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_4);
   output_high(SS);

//Funcion que agrupa subfunciones para dar inicio a los MAX6952 segun libreria anteriormente expuesta.
   output_low(ss);
   inicio();
   output_high(ss);
   
   ch=0x41;
   p=0x60;
   imp(&p,&ch);
}

se debe hacer notar que los parametros "p" y "ch", donde "p" es la direccion del PANE y "ch" es el caracter ASCII (A), van precedidos por el operador &, es decir, no se pasa los valores 0x60 y 0x41, sino que la direccion de las variables.
Luego, como las variables son int, y a la funcion se le entregan las direcciones de ellas, entonces en la cabecera de la funcion debeb declararse parametros como punteros a int.

//Variables
int *ch;
int *p;
int k;
int j;

void imp(int *i,int *j);

Luego, como los parametros son punteros, entonces debemos trabajar con el contenidos de dichos punteros (o los contenidos de las direcciones a la que apuntan los punteros), para ello debemos usar el operadon * (asterisco). Y aqui es donde viene la parte importante.

void imp(int *i,int *j)
{
   output_low(ss);
   for(k=0;k<5;k++)
   {
      spi_write(*i);
      spi_write(*j);
   }
   output_high(ss);
}

en la funcion anterior, como es una funcion de prueba, lo unico que logra es mostrar el caracter A (0x41) en el PANE0 de una array de 5 integrados MAX6952 conectados en serie, como lo propone el fabricante en el datasheet.

y bueno, almenos con eso evite que proteus me arrojara un error de perdida de bit en el buffer y algunos otros errores mas.

Nota: No quiero llevarme todos los creditos, pero esta informacion la encontre en un manual de programacion de lenguaje C, ademas en el HELP del CCS se expone esto mismo, pero muuuuucho menos argumentado, por lo que no me sirvio mucho.

Espero esto ayude a algunos otros como yo....que nos matamos a cabezasos en las murallas cuando no nos funcionan nuestros modestos programas.

.-Magoblin-.


 

anything