TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Tomás Godino en 25 de Septiembre de 2015, 19:49:13

Título: 74hc595.c
Publicado por: Tomás Godino 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
Título: Re: 74hc595.c
Publicado por: KILLERJC 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.
Título: Re: 74hc595.c
Publicado por: Tomás Godino 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);

}
Título: Re: 74hc595.c
Publicado por: KILLERJC 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.
Título: Re: 74hc595.c
Publicado por: Tomás Godino 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.
Título: Re: 74hc595.c
Publicado por: elgarbe 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...
Título: Re: 74hc595.c
Publicado por: Tomás Godino en 25 de Septiembre de 2015, 22:57:30
Tengo uno solo
entonces como quedaría la linea finalmente?
Título: Re: 74hc595.c
Publicado por: KILLERJC 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
Título: Re: 74hc595.c
Publicado por: Tomás Godino en 25 de Septiembre de 2015, 23:27:00
listo, muchas gracias por tu tiempo
Título: Re: 74hc595.c
Publicado por: elgarbe 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!
Título: Re: 74hc595.c
Publicado por: Tomás Godino 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.
Título: Re: 74hc595.c
Publicado por: KILLERJC 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);
}
Título: Re: 74hc595.c
Publicado por: Tomás Godino en 26 de Septiembre de 2015, 12:10:56
Funciona perfecto muchas Gracias por su ayuda.
Título: Re: 74hc595.c
Publicado por: KILLERJC 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
Título: Re: 74hc595.c
Publicado por: Tomás Godino 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
Título: Re: 74hc595.c
Publicado por: elgarbe en 26 de Septiembre de 2015, 16:31:42
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


eee? si afuera de cada 4094 hay un display de 7 segmentos podes sacar solo un dígito ya que hay un solo display... distinto es si despues de cada 4094 hay 2 bcd to seven segment (4511)...
Título: Re: 74hc595.c
Publicado por: KILLERJC en 27 de Septiembre de 2015, 00:29:43
sisisisi, pero vos estas pensando en un display 7 segmentos, yo estoy pensando en leer las entradas con un multimetro y ver cuales estan en 1 o en 0.
Título: Re: 74hc595.c
Publicado por: elgarbe en 27 de Septiembre de 2015, 01:08:56
sisisisi, pero vos estas pensando en un display 7 segmentos, yo estoy pensando en leer las entradas con un multimetro y ver cuales estan en 1 o en 0.

aaaaaa, jajaja, por eso le preguntaba lo que tenia conectado  :D