TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: elmasvital en 06 de Septiembre de 2005, 09:04:00

Título: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: elmasvital 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
Título: RE: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: pocher 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
Título: RE: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: elmasvital 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
Título: RE: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: piriots 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
Título: RE: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: elmasvital 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.
Título: RE: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: vszener 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
Título: RE: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: elmasvital 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

}

}
Título: RE: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: pocher 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
Título: RE: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: elmasvital 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
Título: RE: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: elmasvital 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.
Título: RE: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: elmasvital 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.
Título: Re: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: rogeliogamberro 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!
Título: Re: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: MGLSOFT 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:
Título: Re: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: elmasvital 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
Título: Re: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: rogeliogamberro 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
Título: Re: RE: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: yako en 26 de Noviembre de 2012, 12:59:16
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.
una pregunta si enviaste el pin 2 a vcc o que mas modificasiones hiciste por favor contesta tengo el mismo problema
Título: Re: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: CjS en 30 de Septiembre de 2015, 00:36:10
Para un proyecto de estudio, debo diseñar un programa cuya consigna es la siguiente:
Para controlar muchos elementos simples como magnetos, se le asigna a cada uno un bit. El conjunto de bit se envía en forma serial. Cada elemento está preparado para reconocer y aceptar el bit que le corresponde. El controlador maneja un registro de desplazamiento (shift register CD4094) con 4 líneas, una envía los bit (Dato), otra da la señal de reloj (el dato es valido con el flanco de subida) , otra para indicar que se activen los elementos (STROBE) y la cuarta para activar las salidas (OE).
Realizar un controlador para 48 elementos, con una señal de reloj de 100hz o más. Es manejado por 5 pulsadores.
Cuando el pulsador ACCIÓN es puesto a nivel L la señal de activación de elementos (OE) es puesta a nivel H.
Cuando el pulsador ARRIBA sea activado se enviaran 48 bit todos 1 (FFFFFFFFFFFFh).
Cuando el pulsador ABAJO sea activado se enviaran 48 bit todos 0 (000000000000h)
Cuando el pulsador ALTERNADO sea activado por primera vez se enviara el mensaje AAAAAAAAAAAh, la siguiente vez se enviara el mensaje 555555555555h, y así sucesivamente alternando la secuencia a enviar.
Cuando el pulsador DE A UNO sea activado se enviara el mensaje 000000000001h, la siguiente vez 000000000002h y así sucesivamente activando un magneto por vez hasta enviar el valor 800000000000h.
Despues de enviar la secuencia se manda un pulso por el pin STROBE para que la información se grabe en los flip-flop de salida.
(para PIC 16F628A)

Para comenzar necesito diseñar un generador de regidtro de desplazamiento sensillo, tal vez de 8 bit; necesitaria ayuda con esto. muchas gracias!
PD: No soy bueno ccon lo que respecta a pics y programacion.
Título: Re: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: KILLERJC en 30 de Septiembre de 2015, 01:32:45
Justamente es para un proyecto de estudio por el cual el codigo no creo que te lo vayan a dar facilmente, ya que estarian haciendo tu tarea.
Si tenes algo implementado seria bueno que lo pongas de esa forma es mas facil de decirte que necesitas cambiar para que luego vos lo hagas.

----------------------------

Como hacer el programa que pedis? Y depende.
Primero que nada va a depender de que lenguaje estes usando, si es C o ASM o BASIC. De eso va a depender la ayuda, la facilidad de codigo, etc. Y tambien hay que nombrar el compilador, ya que no es lo mismo usar XC8 que CCS para cuando programas en C.

Lo que se te pide es MUY simple. Y podes hacerlo de 2 formas.

Creando un SPI por software, o usando el SPI por hardware, lo bueno que cualquier que uses estos envian 8 bits.
A mi gusto usaria el SPI por hardware, se complicara un poco mas la configuracion, pero es muy simple luego para enviar datos.
Y si no queres meterte en aprender como configurar un modulo, entonces usas un SPI por software, para esto tal ves necesites un poco mas de conocimiento de programacion para entenderle, aunque no mucho.

------------------------

Hay algo que aun en la consigna no quedo claro:
Cuando OE se pone a 0 ? Ya que ACCION lo pone a 1, cuando o como se pone a 0 ?


PD: Todo esto es para que investigues y no que pienses que se te va a dar el codigo. El programa en el PIC es muy simple, solo tenes que hacer llenar casi una plantilla y funciona. Supongamos que estas en C y XC8

Código: [Seleccionar]
;Aca include
;Aca fuses ( te los hace solo el MPLAB)

main() {
  ;Aca configuracion de modulos ( I/O , SPI, ADC , etc )  //Mira el datasheet o ejemplos y lo vas a sacar
  while(1)
  {
    ;Aca programa principal (Leer entradas, esperar, enviar dato)
   }
}

eso es todo ...
Título: Re:RE: Multiplexor o Registro de desplazamiento en C para pic
Publicado por: Moechh en 23 de Abril de 2016, 23:24:40
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.
podrias comartir tu programacion