Autor Tema: Multiplexor o Registro de desplazamiento en C para pic  (Leído 13260 veces)

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

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Multiplexor o Registro de desplazamiento en C para pic
« en: 06 de Septiembre de 2005, 09:04:00 »
Buenas

Alguno tiene algun programa hecho para usar algun tipo de multiplexor?

Estoy haciendo un circuito con el 16f628 que pretende iluminar unos leds a través de un 74hc164 con entrada de serie y salida paralela. El problema es que no entiend bien su funcionamiento.

Segun lo que he entendido el 74hc164 se conecta al pic con dos pines...el primero con el pin clock que conecto al clk-in del pic y como data utilizo cualquier puerto de salida del pic. Supongo que tengo que pasarle un high o un low por la patilla data en cada pulso de reloj. Pero cómo hago en c para coordinarme con el reloj? es que no lo hago bien y simplemente se me encienden todos los leds...


Otra cosa ya que estamos... tengo un 7805 alimentando el pic... tendría que ponerle un condensador entre masa y la entrada o la salida del 7805? es que he puesto un 100uf35v entre la entrada (+9v) y masa de este y veo q el comportamiento del multiplexor cambia. Se lo puse pq si ponia un dedo entre los conectores del transformador al 7805 hacia el mismo comportamiento que cuando le puse el condensador...

Gracias de antemano y espero haberme explicado minimamente

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #1 en: 06 de Septiembre de 2005, 10:31:00 »
Mira a ver si te sirve, creo que sí: http://miarroba.com/foros/ver.php?foroid=85505&temaid=955040

Un saludo

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #2 en: 06 de Septiembre de 2005, 11:35:00 »
Escrito originalmente por pocher
Mira a ver si te sirve, creo que sí: http://miarroba.com/foros/ver.php?foroid=85505&temaid=955040

Un saludo


Me pongo a ello ya te comento. Muchas gracias

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #3 en: 06 de Septiembre de 2005, 15:24:00 »
Si miras el datasheet del 7805 veras que recommienda poner un condensador en paralelo a la entrada y otro a la salida, el de entrada es de 330nf y el de la salida es de 100nf, yo te recomiendo que los pongas, yo en algun circuito he tenido problemas de ruidos debido a la falta de estos dos condensadores.

Salu2

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #4 en: 07 de Septiembre de 2005, 04:43:00 »
Bueno no me funciona después de muchos intentos. A ver si me podeis ayudar. Explico inicialmente el conexionado.

Pic 16f628 con oscilador interno activado a 4mhz
74HCT164 como registro de desplazamiento tiene conectado 5 leds de las salidas q0 a q4.

Patilla RB3 del pic como data al pin 1 data in del 74hc164
Patilla RB4 del pic como clock al pin 8 clk del 74hc164
Patilla RB2 del pic (con resistencia 10k) al pin 9 (clr) del 74hc164

Programa en c

#include <16F628.h>

#fuses NOWDT, INTRC_IO, PUT, NOPROTECT, NOMCLR, NOBROWNOUT, NOLVP

#use delay(clock=4000000)

#use fast_io(B)



void main()

{

byte i[8]= 1,0,1,1,0,0,0,0;
byte n;

      delay_ms(5000); // Dejamos un retardo antes del inicio del programa para evitar fallo con el programador
      set_tris_b(0x00); //activamos puerta b como salida

while (true)

{
         output_bit(PIN_B2,0);      //clear
         delay_us(1);
         output_bit(PIN_B2,1);
         output_bit(PIN_B4,0);     // clock low

         for (n=0;n<7;n++)
         {
          output_bit(PIN_B3,i[n]);     //data
          output_bit(PIN_B4,1);     // clock high
          delay_us(1);                           //
          output_bit(PIN_B4,0);     // clock low
         }


}

}

Lo que se pretende como se podrá observar es que se iluminen los leds 1, 3,4 y 5. Si le quito el clear en cada while hace exactamnte lo mismo.


Con todo esto se encienden todos los leds sin más. He conseguido con otras modificaciones encender los leds con parpadeos muy rápidos pero sin sentido.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #5 en: 07 de Septiembre de 2005, 04:51:00 »
Ummmmm los vectores no se declaran asi?:
byte i[8]={1,0,1,1,0,0,0,0};
y prueba a poner #use standard_io(B) en vez de #use fast_io(B) o si es todo el portb de salida esta y define los pin de salida:#use fixed_io(b_outputs=PIN_x,..)
Asi por encima lo que me ha extrañado es la declaracion del vector i[] sin los corchetes.....Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #6 en: 07 de Septiembre de 2005, 05:33:00 »
el array no lanza ningun error pero para descartar... esto que sigue hace exactamente lo mismo... ilumina todos los leds. Me tiene frito estoy ya la verdad es q llevo varios dias y no doy con la tecla



#include <16F628.h>

#fuses NOWDT, INTRC_IO, PUT, NOPROTECT, NOMCLR, NOBROWNOUT, NOLVP

#use delay(clock=4000000)

#use standard_io(B)



void main()

{

byte i[8]= {1,0,1,1,0,0,0,0};
byte n;

      delay_ms(5000); // Dejamos un retardo antes del inicio del programa para evitar fallo con el programador
      set_tris_b(0x00); //activamos puerta b como salida

         output_bit(PIN_B2,0);      //clear
         delay_us(1);
         output_bit(PIN_B2,1);
         output_bit(PIN_B4,0);     // clock low

while (true)

{

          output_bit(PIN_B3,1);     //data
          output_bit(PIN_B4,1);     // clock high
          delay_us(1);                           //
          output_bit(PIN_B4,0);     // clock low

          output_bit(PIN_B3,0);     //data
          output_bit(PIN_B4,1);     // clock high
          delay_us(1);                           //
          output_bit(PIN_B4,0);     // clock low

          output_bit(PIN_B3,1);     //data
          output_bit(PIN_B4,1);     // clock high
          delay_us(1);                           //
          output_bit(PIN_B4,0);     // clock low

          output_bit(PIN_B3,1);     //data
          output_bit(PIN_B4,1);     // clock high
          delay_us(1);                           //
          output_bit(PIN_B4,0);     // clock low

          output_bit(PIN_B3,1);     //data
          output_bit(PIN_B4,1);     // clock high
          delay_us(1);                           //
          output_bit(PIN_B4,0);     // clock low

          output_bit(PIN_B3,0);     //data
          output_bit(PIN_B4,1);     // clock high
          delay_us(1);                           //
          output_bit(PIN_B4,0);     // clock low

          output_bit(PIN_B3,0);     //data
          output_bit(PIN_B4,1);     // clock high
          delay_us(1);                           //
          output_bit(PIN_B4,0);     // clock low

          output_bit(PIN_B3,0);     //data
          output_bit(PIN_B4,1);     // clock high
          delay_us(1);                           //
          output_bit(PIN_B4,0);     // clock low

}

}

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #7 en: 07 de Septiembre de 2005, 07:09:00 »
A ver, varias cosas. Cuando dices que quieres que se iluminen los LEDS 1, 3, 4 y 5 ¿a qué te refieres? ¿a los pines del 74164? Si eso es así lo tienes mal, ya que el pin 1 es entrada, no salida. Además en el array solo hay 3 unos ¿?

Fundamental que el pin 2 lo pongas a VCC ¿lo has hecho?

Estas cosas a bote pronto, esta tarde, repaso el programa con más detenimiento.

Un saludo

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #8 en: 07 de Septiembre de 2005, 07:30:00 »
A ver los leds están conectados entre sí por el cátodo y el ánodo a cada una de las salidas del 74hc164... a las salidas q0 al q4 que corresponden a las patillas 4,5,6,7 y 10 del 74hc164.

Me dices que conecte el pin 2 del 74hc164 vcc?? no veo nada en el datasheet sobre eso... vaya lo que pone es que está como entrada B. Se me ocurre que fueran entradas lógicas tipo AND o NAND y por eso me lo digas pero me gustaria que me lo confirmases. Ahora que miro en el esquema que me pasaste no tienes conectada la patilla 14 del 74hc164 que se define como vcc. Te lo pongo para que lo mires AQUI



He intentado hacerte un esquema en el proteus pero por lo visto no tenfo el 16f628... sabes cómo podria añadirselo?

y sí, hay tres 1 en el array porque pretendo que se enciendan solo tres leds... porque ahora se me encienden todos

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #9 en: 07 de Septiembre de 2005, 09:50:00 »
Ok acabo de ver esto en el datasheet... es q mi ingles es bastante malo.

Both inputs must be connected together or an unused input must
be tied HIGH.

traducido supongo que sera así

 Ambas entradas deben ser conectadas juntas o una entrada sin usar debe estar en HIGH

Por eso supongo que me propones conectarla a vcc.

Voy a experimentar a ver si doy con la tecla.

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #10 en: 07 de Septiembre de 2005, 10:04:00 »
Bueno solo deciros que ya lo he solucionado... era problema mio de timers... lo hacía tan rápido que los leds parecían siempre encendidos.

1 saludo gracias a todos por vuestro tiempo.

Desconectado rogeliogamberro

  • PIC10
  • *
  • Mensajes: 34
Re: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #11 en: 27 de Diciembre de 2008, 07:09:30 »
Disculpen que los moleste con una consulta referida con este tema:

Estoy trabajando con CCS y pic16f877 y nesecito desplazar un 1 por este shift register. Es decir, cada 1 segundo mi salida deberá ser:

10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001

Les agradeceria quien me aporte datos sobre la temporizacion del integrado o una rutina ya que no he podido lograr el desplazamiento. Saludos a Todos y Gracias!

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #12 en: 27 de Diciembre de 2008, 09:10:17 »
El mas vital.
Porque no usas la libreria propia de CCS para los registros de dezplazamiento?? :lol: :lol:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #13 en: 27 de Diciembre de 2008, 11:07:14 »
El mas vital.
Porque no usas la libreria propia de CCS para los registros de dezplazamiento?? :lol: :lol:

Es un post de 2005 :-P esto está mas que superado.

Lo ha rescatado rogeliogamberro.

A ver rogelio pon aqui el codigo que usas tu para manejarlo en ccs a ver que fallo tiene

1 saludo

Desconectado rogeliogamberro

  • PIC10
  • *
  • Mensajes: 34
Re: Multiplexor o Registro de desplazamiento en C para pic
« Respuesta #14 en: 27 de Diciembre de 2008, 14:20:23 »
Muchas Gracias responder. Son muy amables todos. Estoy comenzando a realizar con el 74LS164 un barrido de teclado de 9 lineas (ocho del integrado y una adicional llamada PIN_ADICIONAL). Basicamente debo hacer recorrer un 1 por el Shift  Register y PIN_ADICIONAL y leer el estado de las teclas desde T0 a T8, Mi problema surge que al intentar hacer recorrer el 1 por el Shift Register en la primer pasada se visualizan "varios leds encendidos que rotan". Luego, desde la segunda pasada todo se normaliza. Aqui les dejo parte del codigo con el que estoy tratando de desplazar el 1 por le 74ls164 unicamente y leer el contenido del pin T6 para simplificar. En la pantalla siempre se visualizan 7 caracteres en vez de 8 (Faltaría el Primero). Por Que? Nuevamente Muchas Gracias!
 
PIC16f877 en CCS

#define SHIFT_CLOCK     PIN_C0
#define SHIFT_IN1          PIN_C2
#define SHIFT_CLEAR     PIN_E2

#define PIN_ADICIONAL   PIN_C1  // linea 9

#define T0              PIN_D7
#define T1              PIN_B0
#define T2              PIN_B1
#define T3              PIN_B2
#define T4              PIN_B3
#define T5              PIN_B4
#define T6              PIN_A5
#define T7              PIN_E0
#define T8              PIN_E1

void init74164(void)
{
  // Inicializa la Linea de Cloxk
  output_high(SHIFT_CLOCK);
  output_low(SHIFT_IN1);
  // Borra todas las entradas
  output_low(SHIFT_CLEAR);
  delay_us (10);
  output_high(SHIFT_CLEAR);
  output_low(SHIFT_CLOCK);
}

void write_74164(BYTE eo)
{
  int8 i;
 int1 aux1bit;
  for (i=0; i<8; i++) // Envia los datos del Array
  {
    if ((eo & 0x80) == 0)
      output_low(SHIFT_IN1);
    else
      output_high(SHIFT_IN1);

    shift_left(&eo,1,0);
    output_high(SHIFT_CLOCK);
    output_low(SHIFT_CLOCK);
   
    delay_ms (1000);

    aux1bit = input (T6);

    if (aux1bit ==  TRUE)
      lcd_putc("1");
    else
      lcd_putc("0");     
  }
}

void main()
{
 Configuracion de Micro
   lcd_init();
   init74164();

While (1)
      {
       lcd_gotoxy(0,0);
       write_74164(0x01);
      }
}

PD: al encender es circuito sucede lo siguiente:

100000000 -> Aparece un Parpadeo muy rapido y pasa a... (puede ser un transitorio en la conexion, pues no se alcanza a ver bien)
 
01101100 -> por un segundo
00110110 -> por un segundo
00011011 -> por un segundo
00001101 -> por un segundo
00000110 -> por un segundo
00000011 -> por un segundo
00000001 -> por un segundo
y comienza la secuencia correctamente :D
« Última modificación: 27 de Diciembre de 2008, 16:30:50 por rogeliogamberro »


 

anything