Autor Tema: Hacer tablero electronico mediante spi y max7219?  (Leído 12424 veces)

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

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Hacer tablero electronico mediante spi y max7219?
« en: 09 de Marzo de 2010, 23:45:08 »
Hola amigos, el proyecto consiste en realizar un tablero electronico con 8 display de 7 segmentos y para la interfaz utilizare un  MAX7219, este es un driver que se le envia el dato mediante SPI y lo decodifica para activar los correspondientes LEDs. A continuación muestro el esquema del circuito.


By bigluis at 2010-03-09

y a continuación escribo el codigo que he realizado en MikroC, no importa si las respuestas son en CCS.

Código: [Seleccionar]
unsigned short i;

void main() {
  Spi_Init();               // Standard configuration
  PORTC &= 0xFD;
  TRISC &= 0xFD;        // Select max7219
  Spi_Write(0xc);       //Elige el registro shutdwon
  Spi_Write(1);         //Enciende el max7219
  Delay_ms(10);
  Spi_Write(9);         //Elige el registro Decode_Mode
  Spi_Write(0xFF);      //Elige modo de decodificacion BCD

  for (i = 1; i <= 8u; i++) {
    PORTC &= 0xFD;          // Select max7219
    Spi_Write(i);           // Send i to max7219 (digit place)
    Spi_Write(8 - i);       // Send i to max7219 (digit)
    PORTC |= 2;             // Deselect max7219
    Delay_ms(200);
  }
  TRISB = 0;
  PORTB = i;
}

Parte de este codigo es sacado de la ayuda de MikroC.

La otra opción que deseo implementar es hacerlo con matices de leds de 5x7 y con el driver MAX6952.
« Última modificación: 09 de Marzo de 2010, 23:53:23 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Hacer tablero electronico mediante spi y max7219?
« Respuesta #1 en: 10 de Marzo de 2010, 09:41:00 »
El MAX7219 tambien puede manejar matrices...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Hacer tablero electronico mediante spi y max7219?
« Respuesta #2 en: 10 de Marzo de 2010, 13:38:14 »
 :? Supongo que no, el max7219 solo sirve para display de 7 segmentos. Por eso estaba pensando utilizar el Max6952 para realizar la interfaz con el display.

 :( Me interesaria saber si la conexiones entre el PIC y el MAX estan correctas o hay algunas invertidas, como la de SDO y SDI.

 :( Otra cosa que me interesa saber es si esta correcto el código, ya que tengo entendido que la funciones SPI de MikroC estan hechas para transmitir 8 bits, y el MAX esta hecho para recibir 16 bits. Es decir, ¿Para manejar este driver necesito implementar una nueva función de SPI o lo puedo hacer con las funciones propias de MikroC o CCS?

 :-/ No me importa en cual de los 2 compiladores trabajen
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Hacer tablero electronico mediante spi y max7219?
« Respuesta #3 en: 10 de Marzo de 2010, 15:42:36 »
:? Supongo que no, el max7219 solo sirve para display de 7 segmentos. Por eso estaba pensando utilizar el Max6952 para realizar la interfaz con el display.

 :( Me interesaria saber si la conexiones entre el PIC y el MAX estan correctas o hay algunas invertidas, como la de SDO y SDI.

 :( Otra cosa que me interesa saber es si esta correcto el código, ya que tengo entendido que la funciones SPI de MikroC estan hechas para transmitir 8 bits, y el MAX esta hecho para recibir 16 bits. Es decir, ¿Para manejar este driver necesito implementar una nueva función de SPI o lo puedo hacer con las funciones propias de MikroC o CCS?

 :-/ No me importa en cual de los 2 compiladores trabajen

A) El max7219 también sirve para generar una especie de matriz. Ya que tiene un modo de operación en el cual indicás que bit querés encender de cada dígito. Si bien se mira, esto es similar a decir que es una matriz de 8 x 8.   8 Leds por dígito x 8 dígitos.

B) El circuito parece estar bien.

C) Al hacer dos Spi_Write consecutivos (sin que haya cambio de estado en el pin de habilitación) estás mandando 16 bits al dispositivo
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Hacer tablero electronico mediante spi y max7219?
« Respuesta #4 en: 10 de Marzo de 2010, 16:01:11 »
Citar
A) El max7219 también sirve para generar una especie de matriz. Ya que tiene un modo de operación en el cual indicás que bit querés encender de cada dígito. Si bien se mira, esto es similar a decir que es una matriz de 8 x 8.   8 Leds por dígito x 8 dígitos.

Es lo que quise decir...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Hacer tablero electronico mediante spi y max7219?
« Respuesta #5 en: 10 de Marzo de 2010, 17:01:36 »
Citar
A) El max7219 también sirve para generar una especie de matriz. Ya que tiene un modo de operación en el cual indicás que bit querés encender de cada dígito. Si bien se mira, esto es similar a decir que es una matriz de 8 x 8.   8 Leds por dígito x 8 dígitos.

Es lo que quise decir...

Sí, yo lo entedí así. Por eso lo escribí de otra forma para que lo pueda interpretar más claramente Bigluis
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Hacer tablero electronico mediante spi y max7219?
« Respuesta #6 en: 10 de Marzo de 2010, 17:51:57 »
 :-/ Gracias MGLSOFT y AngelGris por sus respuestas,  :( pero ocurre que el driver no trabaja para nada con el codigo que he escrito anteriormente.

A) El max7219 también sirve para generar una especie de matriz. Ya que tiene un modo de operación en el cual indicás que bit querés encender de cada dígito. Si bien se mira, esto es similar a decir que es una matriz de 8 x 8.   8 Leds por dígito x 8 dígitos.

Pero aun asi para matris de 5x7 prefiero usar el MAX6952, ya que este sirve para cuatro de estas matrices.

Abajo adjunto el codigo fuente y el Esquema.
« Última modificación: 10 de Marzo de 2010, 17:56:56 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Hacer tablero electronico mediante spi y max7219?
« Respuesta #7 en: 10 de Marzo de 2010, 19:15:35 »
Te dejo un pequeño código hecho en C (compilador HiTech). Lo simulé en Proteus y, al menos la simulación, funciona bien.

Cada vez que se accede a algún registro y se le envia el dato (serían los 16 bits de trasmisión) hay que llevar a 1 el pin CS para que el MAX7221 procese la señal (esto lo dice en el Datasheet). Y en tu caso no lo estás haciendo. Fijate que en tu código antes del ciclo "For..." hacés varias escrituras.....


Código: C
  1. /*************************************
  2. *
  3. * Display SPI (Max7221)
  4. *
  5. /*************************************/
  6.  
  7. #include <htc.h>
  8. #include "Def16f87xa.h"
  9. #define PIC_CLK 20000000
  10.  
  11.  
  12. #include "Hardspi.c"
  13. #include "delayhd.h"
  14.  
  15. void main()
  16. {
  17.         TRISC0 = 0;
  18.         RC0 = 1;
  19.         setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV16);
  20.  
  21.  
  22.         RC0 = 0;                        // habilito el dispositivo
  23.         write_spi(0x09);        // Registro "DecodeMode"
  24.         write_spi(0x0F);    // dígitos de 0 a 3
  25.         RC0 = 1;                        // deshabilito el dispositivo
  26.  
  27.  
  28.         RC0 = 0;                        // habilito el dispositivo
  29.         write_spi(0x0B);        // Registro "ScanLimit"
  30.         write_spi(3);           // Digitos 0, 1, 2 y 3
  31.         RC0 = 1;                        // deshabilito el dispositivo
  32.        
  33.  
  34.         RC0 = 0;                        // habilito el dispositivo
  35.         write_spi(0x0C);        // Registro "ShutDown"
  36.         write_spi(1);           // Enciendo los display
  37.         RC0 = 1;                        // deshabilito el dispositivo
  38.  
  39.  
  40.         RC0 = 0;                        // habilito el dispositivo
  41.         write_spi(0x0A);        // Registro "Intensity"
  42.         write_spi(9);           // Nivel de brillo
  43.         RC0 = 1;                        // deshabilito el dispositivo
  44.  
  45.  
  46.         RC0 = 0;                        // habilito el dispositivo
  47.         write_spi(1);           // Registro "Digit 0"
  48.         write_spi(0);           // Numero 0
  49.         RC0 = 1;                        // deshabilito el dispositivo
  50.  
  51.  
  52.         RC0 = 0;                        // habilito el dispositivo
  53.         write_spi(2);           // Registro "Digit 1"
  54.         write_spi(1);           // Numero 1
  55.         RC0 = 1;                        // deshabilito el dispositivo
  56.  
  57.         while (1);
  58. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Hacer tablero electronico mediante spi y max7219?
« Respuesta #8 en: 10 de Marzo de 2010, 23:22:58 »
 :oops: Gracias AngelGris tenias toda la razon, lo unico que me hacia falta era activar y desactivar el CS. A continuacion muestro una libreria para usar este tipo de driver

Código: [Seleccionar]
#ifndef MAX7219_CS                 //Si no se ha definido el Pin para el CS del driver
  #define MAX7219_CS PORTC.F0      //Definirle el pin 0 del PORTC
#endif

#ifndef MAX7219_CS_Tris                 //Si no se ha definido el Pin para el CS del driver
  #define MAX7219_CS_Tris TRISC.F0      //Definirle el pin 0 del PORTC
#endif

#define BCD_0to7 0xFF
#define BCD_0 1
#define BCD_0to3 0xF
#define No_BCD 0

void MAX7219_Send(short Address,short Data){
  MAX7219_CS=0;               //Habilitar el Driver
  Spi_Write(Address);         //Enviar Direccion del registro
  Spi_Write(Data);           //Enviar el Dato del registro
  MAX7219_CS=1;              //Desabilitar el CS del Driver
  }

void MAX7219_Init(short DecodeMode,short ScanLimit, short Intensity){
  MAX7219_CS_Tris = 0;       //Poner Pin de CS como Salida
  MAX7219_CS=1;              //Poner Pin CS a 1
  MAX7219_Send(9,DecodeMode);
  MAX7219_Send(0xB,ScanLimit);
  MAX7219_Send(0xC,1);       //Registro "ShutDown", Enciendo los display
  MAX7219_Send(0xA,Intensity);
  }
  


void MAX7219_Out(short digit_pos,const char *cadena){
  do{
    if(!*cadena)return;                   //Si el caracter a enviar es 0 retornar
    if(digit_pos>8) return;               //Si la posicion del digito es mayor a 8 retornar
    MAX7219_Send(digit_pos++,*cadena++);  //Enviar posicion del digito y caracter y luego incrementar
  }while(1);
  }

y el codigo de ejemplo

Código: [Seleccionar]
unsigned short i;

#include "MAX7219.c"

void main() {
          //Inicializar el Modulo SPI
  Spi_Init_Advanced(MASTER_OSC_DIV4,DATA_SAMPLE_MIDDLE,CLK_IDLE_LOW,HIGH_2_LOW);
  MAX7219_Init(BCD_0to7,7,16);    //Iniciar el Driver con: DecodeMode = dígitos de 0 a 7
                                                         //ScanLimit = Digitos 0 al 7
                                                         //Intensity = 16
  MAX7219_Out(1,"12345678");
  Delay_ms(200);
  MAX7219_Out(1,"9");
  }


Posiblemente podamos agregar mas cosas a la libreria  :-/
« Última modificación: 11 de Marzo de 2010, 14:04:11 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Hacer tablero electronico mediante spi y max7219?
« Respuesta #9 en: 11 de Marzo de 2010, 14:05:16 »
 :( Otra cosa que me inquieta es que si necesito conectar algun otro driver para conectar los display o es suficente con el MAX, es decir, ¿el MAX puede disipar toda la corriente que demandan estos display?
« Última modificación: 11 de Marzo de 2010, 14:18:21 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Hacer tablero electronico mediante spi y max7219?
« Respuesta #10 en: 11 de Marzo de 2010, 14:44:01 »
Lo recomendable es que la alimentacion de energia que des a los MAX sea aparte de la del micro.
Una particularidad de estos chip es que permiten regular el brillo de los displays, por lo tanto hasta puedes hacer efectos de difuminado en forma muy sencilla.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.