Autor Tema: 74hc595.c  (Leído 4110 veces)

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

Desconectado Tomás Godino

  • PIC10
  • *
  • Mensajes: 16
74hc595.c
« en: 25 de Septiembre de 2015, 19:49:13 »
Hola, estoy haciendo una matriz 8x8 con el integrado cd4094 y quisiera saber si lo puedo controlar con la misma libreria con la que se controla el 74hc595 y como hacerlo
Gracias
Tomás Godino

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: 74hc595.c
« Respuesta #1 en: 25 de Septiembre de 2015, 20:15:11 »
Es muy complicado saber que hace una libreria sin el codigo.

Pero si. deberia funcionar con algunos cambios.

- la habilitacion de salida (OE) en uno de los integrados esta negado
- el 74hc posee una entrada de Master reset. tenes que fijar que no utilize esta entrada tu libreria.

Desconectado Tomás Godino

  • PIC10
  • *
  • Mensajes: 16
Re: 74hc595.c
« Respuesta #2 en: 25 de Septiembre de 2015, 20:45:35 »
yo pensaba que el output enable (OE) era el strobe del 4094

este es el código de la librería:

Código: [Seleccionar]
#IFNDEF EXP_OUT_ENABLE

#define EXP_OUT_ENABLE  PIN_B0
#define EXP_OUT_CLOCK   PIN_B1
#define EXP_OUT_DO      PIN_B2
#define NUMBER_OF_74595 1

#ENDIF


void write_expanded_outputs(BYTE* eo) {
  BYTE i;

  output_low(EXP_OUT_CLOCK);
  output_low(EXP_OUT_ENABLE);

  for(i=1;i<=NUMBER_OF_74595*8;++i) {  // Clock out bits from the eo array
    if((*(eo+(NUMBER_OF_74595-1))&0x80)==0)
      output_low(EXP_OUT_DO);
    else
      output_high(EXP_OUT_DO);
   shift_left(eo,NUMBER_OF_74595,0);
   output_high(EXP_OUT_CLOCK);
   output_low(EXP_OUT_CLOCK);
  }
  output_high(EXP_OUT_ENABLE);
  output_low(EXP_OUT_ENABLE);

}
« Última modificación: 25 de Septiembre de 2015, 20:47:38 por Tomás Godino »
Tomás Godino

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: 74hc595.c
« Respuesta #3 en: 25 de Septiembre de 2015, 21:43:48 »
http://www.midondesign.com/Documents/4094BC.PDF

Claramente no son los mismos el OE = Output Enable pone las salidas en alta impedancia que esta que esta deshabilitado. El strobe es el que latchea los datos.


#define EXP_OUT_ENABLE  .... Este seria el Strobe
#define EXP_OUT_CLOCK   ....   Este seria el Clock
#define EXP_OUT_DO      ... Este el Data

Debo imaginar como no toca nada mas, que el pin que queda que es el Output Enable, esta conectado directamente a VDD (5V , 3.3V segun la tension que estes manejando) Y los demas pines lo maneja el micro.

Desconectado Tomás Godino

  • PIC10
  • *
  • Mensajes: 16
Re: 74hc595.c
« Respuesta #4 en: 25 de Septiembre de 2015, 22:22:45 »
si, ya tengo todo conectado y un breve código:

Código: [Seleccionar]
#include <16f84.h>
#use delay(clock=4000000)

#fuses XT
#fuses NOWDT
#fuses NOPROTECT
#fuses NOPUT

#include <74595.c>

void main(){

   while(true){
      int8 numero = 49;
      write_expanded_outputs(numero);
      delay_ms(1000);
   }
}

el problema esta en la linea:
write_expanded_outputs(numero);

en algunos ejemplos lo escriben así:
write_expanded_outputs(&numero);

pero de esa forma funciona aunque coloca un valor cualquiera, por ej: al poner 49 los leds prenden como se hubiera un 140.
« Última modificación: 25 de Septiembre de 2015, 22:26:02 por Tomás Godino »
Tomás Godino

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: 74hc595.c
« Respuesta #5 en: 25 de Septiembre de 2015, 22:38:28 »
cuantos display tienes en cascada?

Código: [Seleccionar]
#define NUMBER_OF_74595 1

esa linea debe coincidir con dicho numero.

debes pasar la direccion del dato (&) por que la funcion espera un puntero al dato...
-
Leonardo Garberoglio

Desconectado Tomás Godino

  • PIC10
  • *
  • Mensajes: 16
Re: 74hc595.c
« Respuesta #6 en: 25 de Septiembre de 2015, 22:57:30 »
Tengo uno solo
entonces como quedaría la linea finalmente?
Tomás Godino

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: 74hc595.c
« Respuesta #7 en: 25 de Septiembre de 2015, 23:12:04 »
Deberia ser asi:

Código: [Seleccionar]
write_expanded_outputs(&numero);
void write_expanded_outputs(BYTE* eo)

Claramente es un puntero, si observas ahi y luego accede a traves de esa direccion

 if((*(eo+(NUMBER_OF_74595-1))&0x80)==0)

Presupone que si tenes mas de 1 74595 los datos los guardas en un array y pasas la direccion, que en el caso del array es simplmente el nombre y que por eso te habras confundido

Desconectado Tomás Godino

  • PIC10
  • *
  • Mensajes: 16
Re: 74hc595.c
« Respuesta #8 en: 25 de Septiembre de 2015, 23:27:00 »
listo, muchas gracias por tu tiempo
Tomás Godino

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: 74hc595.c
« Respuesta #9 en: 26 de Septiembre de 2015, 07:24:05 »
pero de esa forma funciona aunque coloca un valor cualquiera, por ej: al poner 49 los leds prenden como se hubiera un 140.

esto es lo que no entiendo. El 4094 esta conectado a que? a un display de 7 segmentos? por que si tienes un solo 4094 podrías mostrar numeros del 0 al 9. porque pones numero=49 y que significa que muestra como si hay 140?

saludos!
-
Leonardo Garberoglio

Desconectado Tomás Godino

  • PIC10
  • *
  • Mensajes: 16
Re: 74hc595.c
« Respuesta #10 en: 26 de Septiembre de 2015, 10:31:20 »
es que por alguna razón yo ponía para que mostrara un 49 en binario y los leds prendían como si estuviera colocando un 140 en binario pero eso ya lo solucione lo que ahora intento es poner un array de 3 integrados (conectados entre si con la salida serie de uno y la entrada de datos del segundo) y no encuentro nada sobre como hacer esto.
Tomás Godino

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: 74hc595.c
« Respuesta #11 en: 26 de Septiembre de 2015, 11:55:00 »
Citar
to es lo que no entiendo. El 4094 esta conectado a que? a un display de 7 segmentos? por que si tienes un solo 4094 podrías mostrar numeros del 0 al 9. porque pones numero=49 y que significa que muestra como si hay 140?

No si lo representas de forma binaria. 0x31 = 0011 0001


es que por alguna razón yo ponía para que mostrara un 49 en binario y los leds prendían como si estuviera colocando un 140 en binario pero eso ya lo solucione lo que ahora intento es poner un array de 3 integrados (conectados entre si con la salida serie de uno y la entrada de datos del segundo) y no encuentro nada sobre como hacer esto.

Pones
Código: [Seleccionar]
#define NUMBER_OF_74595 3
En el main usas un array y llamas:

Código: [Seleccionar]
int8 valores[3];

main(){
   valores[0]=0x30;
   valores[1]=0x58;
   valores[2]=0xAA;
   write_expanded_outputs(valores);
}
« Última modificación: 26 de Septiembre de 2015, 11:57:22 por KILLERJC »

Desconectado Tomás Godino

  • PIC10
  • *
  • Mensajes: 16
Re: 74hc595.c
« Respuesta #12 en: 26 de Septiembre de 2015, 12:10:56 »
Funciona perfecto muchas Gracias por su ayuda.
Tomás Godino

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: 74hc595.c
« Respuesta #13 en: 26 de Septiembre de 2015, 12:26:37 »
2 cosas mas

Citar
es que por alguna razón yo ponía para que mostrara un 49 en binario y los leds prendían como si estuviera colocando un 140 en binario

Esto por que esperaba un puntero, si vos le pasabas el valor asi nomas de una variable ejemplo el 49, el micro iba a buscar en la posicion 49 de memoria lo que habia. Por eso mismo en una variable le pasas la direccion con &variable.
En un array el puntero al valor array[0] esta dado o por &array[0] o simplemente array. Eso es la direccion del valor 0 del array


Lo segundo que te estaba por decir. No probaste usar el SPI ? ya que seria enviar 3 datos:

spi_write(0x11);
spi_write(0x22);
spi_write(0x33);
output_high(strobe);
output_low(strobe);

fin

Desconectado Tomás Godino

  • PIC10
  • *
  • Mensajes: 16
Re: 74hc595.c
« Respuesta #14 en: 26 de Septiembre de 2015, 12:54:02 »
perfecto ahora entiendo lo del puntero a lo que se refería elgarbe en sus respuestas y no prove con spi, pero no creo que sea necesario ya que esta funcionando muy bien ahora voy a seguir para implementarlo en la matriz, Gracias
Tomás Godino