Controlar display de DVD a través de un PIC

Hola

Recientemente empezé con los microcontroladores PIC y quería probar de controlar un display que saqué de un reproductor de DVD. Se basa en el driver PT6964 y investigando el datasheet he visto se controla con tres pines (CLK STB y DATA), a través de los cuales se envían "comandos". Viene un listado de estos comandos, pero no se como interpretarlos para probar de programar el código. ¿Alguna pista de por donde empezar?

Este es el datasheet del PT6964
https://cdn.instructables.com/ORIG/FFL/MQ98/IOEKA8HD/FFLMQ98IOEKA8HD.pdf

Un saludo

D@rkbytes dijo:
Si te gusta el Arduino, mira por aquí: TM1638 LED controller
https://developer.mbed.org/components/TM1638-LED-controller-80-LEDs-max-Keyboa/
El autor menciona que el TM1638 es muy similar al PT6964

Y si no te gusta el Arduino, mira por aquí: PT6964 Test
http://en.pudn.com/downloads399/sourcecode/embedded/detail1705302_en.html
El segundo link es justamente lo que estoy buscando, pero para descargar el archivo necesitas tener cuenta en la página y no tengo. Si alguien lo pudiera descargar iria perfecto

TRILO-BYTE dijo:
mira no se si estas usando CCS

esta la verdad muy facil es practicamente SPI
solo mandas el la direccion y el dato.
muy facil
Estoy usando MPLAB, descargado desde la página de Microchip. Segun he entenddido en el datasheet, tienes que poner el pin STROBE en estado bajo para enviar un -comando-, y después por cada pulso en CLOCK poner DATA en estado alto para mandar un 1 y en estado bajo para mandar un 0. De momento la primera duda es si para enviar un comando has de empezar por el bit 0 (LSB) o el 8 (MSB) y que frecuencia de CLOCK debo usar.

Buscando por internet casi todos los tutoriales son de controlar un 16x2, si sabes de alguno que me pueda ser útil para esto pasamelo.

pepibho dijo:
si, solo que los led del display estan del rebes... (asi que se te va a complicar) lo se por experiencia propia... es mas facil usar el mismo pic con un serial paralelo por ahorrar pines en el pic y un 4017 para seleccional el display o un 74hc138. asi reduces a 6 pines el control de los 8 display con sus 8 segmentos... ma lo, que el pic tiene que generar los barridos de continuo... pero hay maneras de poder regular el brillo con la pwm del pin y la interruccion pwm ajustando el postscaler entre 8 o 16 (que seria para controlar el brillo de cada display)
Ya probé de conectar un 4 displays de 7 segmentos usando la técnica del multiplexado y me funcionó bien. La idea que tenia ahora era aprender a comunicarme desde el PIC con otros integrados y he elegido este para empezar porque el datasheet venia bien explicado y es muy facil de conectar y comprobar que lo estas haciendo correctamente. Hay diferentes cosas que usan buses similares como sintonizadores de radio, controladores de motores, ecualizadores... y si consigo manejar el display seguro que el resto son parecidos.


PD: Ya abrí este hilo hará unas tres semanas y fue enviado a moderación por inactividad. Usé el formulario de contacto para avisar de que si no había respondido antes era por haber estado ocupado y no haber dispuesto de tiempo, pero fué ignorado. Así que vuelvo a reabrir el hilo. ...
 

D@rkbytes

Moderador
El segundo link es justamente lo que estoy buscando, pero para descargar el archivo necesitas tener cuenta en la página y no tengo. Si alguien lo pudiera descargar, iría perfecto.
Nadie lo hará por ti, crea tu cuenta y si tienes conocimientos en programación, lo resuelves.

Y recuerda que si vuelves a dejar un tema reciente sin actividad, será eliminado.
En éste Foro siempre estamos verificando los temas de los usuarios.
Por lo tanto, si un tema carece de información relevante, y si el que lo publica no regresa, tal post será eliminado.

Ahora, por favor, muestra lo que llevas hecho, (Código) y quizás se te pueda brindar colaboración.
 
¿como se hace para ser moderador o como revisan los temas?

bueno cambiando de tema.

un ejercicio que puedes hacer y te ayuda a entender SPI y lo reconiendo mucho es usar el integrado 74HC595 este es un convertidor de serie a paralelo, funciona perfectamente como SPI.

lo que puedes hacer es conectarle unos leds y con el pic envias un dato, debe aparecer en los leds el dato que enviaste, si pones en cascada los 74hc595 envias 2 veces el dato y debe aparecer un dato de 16 bits.

para leer puedes usar el CD4021 es parecido al anterior pero en lugar de ser salidas son entradas.

bueno eso es para que aprendas a mandar y leer unos datos, ya que puedas ahora si puedes enviar un comando al chip que mencionas y ver si funciona o no
 
¿como se hace para ser moderador o como revisan los temas?

bueno cambiando de tema.

un ejercicio que puedes hacer y te ayuda a entender SPI y lo reconiendo mucho es usar el integrado 74HC595 este es un convertidor de serie a paralelo, funciona perfectamente como SPI.

lo que puedes hacer es conectarle unos leds y con el pic envias un dato, debe aparecer en los leds el dato que enviaste, si pones en cascada los 74hc595 envias 2 veces el dato y debe aparecer un dato de 16 bits.

para leer puedes usar el CD4021 es parecido al anterior pero en lugar de ser salidas son entradas.

bueno eso es para que aprendas a mandar y leer unos datos, ya que puedas ahora si puedes enviar un comando al chip que mencionas y ver si funciona o no
Hola

Visto que no tenia ni idea del funcionamiento de SPI me he puesto a probar con los HC595 como me recomiendas. Buscando he encontrado un panel de control de una impresora HP con dos HC595 en cascada, uno con 8 leds y otro con un display de 7 segmentos; y un HC165 con 8 pulsadores. El esquema de la placa es el que adjunto abajo.

He estado investigando como programar para manejar estos integrados y si no voy mal hay funciones que solo les tienes que dar el dato a mandar y los pines. Pero para empezar he querido probar a hacerlo "a mano" y este es el código que he escrito para que los leds se enciendan uno-si, uno-no:

Código:
#define _XTAL_FREQ 4000000

// PIC16F72 Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config CP = OFF         // FLASH Program Memory Code Protection bit (Code protection off)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

#include <stdio.h>
#include <stdlib.h>

/*
 * 
 */
int main()
{
  TRISA2 = 0; //RB0 as Output PIN (LED)
  TRISA3 = 0; //RB0 as Output PIN (LED)
  TRISB0 = 0; //CLOCK
  TRISB1 = 0; //LATCH
  TRISB2 = 0; //DATA
  
    RB0 = 0; //CLOCK BAJO
    RB1 = 1; //AL INICIAR, EL LATCH EN ALTO
    RB2 = 0; //DATA BAJO
  
//ENCIENDO Y APAGO DOS LEDS NORMALES PARA MOSTRAR QUE EL PROGRAMA ESTA FUNCIONANDO
 
    RA2 = 1;  // LED ON
    RA3 = 1;  // LED ON
    __delay_ms(1000); // 1 Second Delay
    RA2 = 0;  // LED OFF
    RA3 = 0;  // LED OFF
    __delay_ms(1000); // 1 Second Delay
    
//AHORA SI EMPEZAMOS CON LOS HC595 (DOS CONECTADOS EN CASCADA)

    RB1 = 0; //BAJAMOS EL LATCH
     __delay_ms(10);
             
             
    RB2 = 1; //PONEMOS UN DATA POSITIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
     __delay_ms(10);
    
    RB2 = 0; //PONEMOS UN DATA NEGATIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
      __delay_ms(10);
    
    
     RB2 = 1; //PONEMOS UN DATA POSITIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
     __delay_ms(10);
    
    RB2 = 0; //PONEMOS UN DATA NEGATIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
      __delay_ms(10);
    
    
    RB2 = 1; //PONEMOS UN DATA POSITIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
     __delay_ms(10);
    
    RB2 = 0; //PONEMOS UN DATA NEGATIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
      __delay_ms(10);
    
    
    RB2 = 1; //PONEMOS UN DATA POSITIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
     __delay_ms(10);
    
    RB2 = 0; //PONEMOS UN DATA NEGATIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
      __delay_ms(10);
    
    
    RB2 = 1; //PONEMOS UN DATA POSITIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
     __delay_ms(10);
    
    RB2 = 0; //PONEMOS UN DATA NEGATIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
      __delay_ms(10);
    
    
    RB2 = 1; //PONEMOS UN DATA POSITIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
     __delay_ms(10);
    
    RB2 = 0; //PONEMOS UN DATA NEGATIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
      __delay_ms(10);
    
    
    RB2 = 1; //PONEMOS UN DATA POSITIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
     __delay_ms(10);
    
    RB2 = 0; //PONEMOS UN DATA NEGATIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
      __delay_ms(10);
    
    
    RB2 = 1; //PONEMOS UN DATA POSITIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
     __delay_ms(10);
    
    RB2 = 0; //PONEMOS UN DATA NEGATIVO
     __delay_ms(10);
    RB0 = 1; //SUBIMOS EL CLOCK PARA QUE LEA EL DATA
     __delay_ms(10);
    RB2 = 0; //YA HEMOS MANDADO EL DATA. bAJAMOS!
     __delay_ms(10);
    RB0 = 0; //BAJAMOSEL CLOCK
      __delay_ms(10);
    
    RB1 = 1; //SUBIMOS EL LATCH

  return 0;
}
Una vez que esta todo conectado y enchufo, los leds "normales" del principio del programa parpadean y de los conectados a los HC595 se encenden los que quieren. Desenchufo y enchufo y ahora los leds que se encienden son otros, pero nunca como debería de ser. ¿Que estoy haciendo mal? Lo que me estraña es que los leds normales no deberían de parpadear, no hay ningun while. Deberian encenderse solo una vez al principio y quedarse apagados.

Comentar también que la placa la estoy alimentando con 3.3v porque si la alimento a 5v, por las resistencias que llevan los leds, cada uno consumiría unos 40mA, y me parece excesivo para unos leds SMD y para las salidas del HC595. El PIC está a 5v y las patillas de clock, latch y data con resistencias de 1K a RB0, RB1 y RB2

Saludos y muchas gracias
 

Adjuntos

bueno como veo que le estas hechando galleta te voy a pasar una funcion para escribir en un registro de corrimiento.

esta funcion escribe un dato con su respectivo cock, debes declarar tu tus pines DATA Y CLOCK, LATCH se usa cuando llamas la funcion.
void _74HC595(char dato)
{
char i,dat=0;


for(i=0; i!=8 ; i++)
{


dat=dato<<i;
dat=dat&0b10000000;

if(dat==0)
{
DATA=0;
}
else
{
DATA=1;
}

CLOCK=0;
CLOCK=1;
}

}

aqui un ejemplo de como usar la funcion y como usar LATCH.

para enviar solo 1 byte

Código:
  LATCH=0;
_74HC595(0xAE); //envio un DATO al azar
LATCH=1;
ahora enviamos 3 bytes

Código:
  LATCH=0;
_74HC595(0xF3); [B]//en HEX[/B]
_74HC595(45); [B]//en decimal[/B]
_74HC595(0b00011010); [B]//en binario[/B]
LATCH=1;

con ese ejemplo sencillo puedes ya darte una idea de como usar el integrado del DVD
 

Arriba