Autor Tema: Forma de ampliar I/O de un PIC utilizando registros de desplazamiento  (Leído 13763 veces)

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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Hola a todos.

Esta es una forma de conseguir más entradas y salidas si nuestro PIC no tiene suficientes (caso del 16F84).

Se utiliza en la simulación un registro de desplazamiento paralelo-serie para la toma de datos de las entradas y uno serie-paralelo para mandar la información a las salidas.

Se puede ampliar el número de entradas y salidas con solo añadir más registros de desplazamiento.

Solo se usan 5 líneas del PIC y posiblemente el reloj se podría hacer común para ambos registros y entonces serían 4 líneas.

Existe una forma más elegante de hacer esto y gastando menos líneas, y es a través del bus I2C, pero claro hay que saberse la teoría del I2C.

Os dejo el archivo fuente .C y todos los generados al hacer la simulación con PROTEUS.

Un saludo

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Forma de ampliar I/O de un PIC utilizando registros de desplazamiento
« Respuesta #1 en: 11 de Agosto de 2003, 00:50:00 »
Si alguien desea que aplique la rutina anterior a un automatismo real, contestar en este subforo.

Me voy al Congo a comprar tabaco, estaré fuera unos días ... no os canseis mucho.

Saludos

Desconectado arlex

  • PIC10
  • *
  • Mensajes: 49
Re: Forma de ampliar I/O de un PIC utilizando registros de desplazamiento
« Respuesta #2 en: 29 de Abril de 2007, 12:45:15 »
hola potcher estoy interesado en vr el esquema para ampliar entradas y salidas de un pic con registros, lo puedes colocar en este foro

Desconectado mincho

  • PIC12
  • **
  • Mensajes: 81
Re: Forma de ampliar I/O de un PIC utilizando registros de desplazamiento
« Respuesta #3 en: 12 de Julio de 2007, 19:32:17 »
Hola Pocher, no hay nada para simular.
Si puedes podrias subir otra vez el ejemplo...

Un Saludo...

:-/ Saludos  :-/ Desde  :-/ Colombia  :-/

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Forma de ampliar I/O de un PIC utilizando registros de desplazamiento
« Respuesta #4 en: 31 de Julio de 2007, 03:07:06 »
Hola.

Os envio un ejercicio de aplicación, es posible que no sea el mismo que envié antiguamente ... de eso hace tanto.

Si teneis alguna duda preguntarmela.

Un saludo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Forma de ampliar I/O de un PIC utilizando registros de desplazamiento
« Respuesta #5 en: 31 de Julio de 2007, 05:26:30 »
¡Hombre, gran Pocher!, cuánto tiempo sin saber de ti. ¿Va todo bien?

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5538
    • Picmania by Redraven
Re: Forma de ampliar I/O de un PIC utilizando registros de desplazamiento
« Respuesta #6 en: 31 de Julio de 2007, 05:36:13 »
¡Maestro Pocher! Encantado de tenerte por aquí. Un abrazo.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Forma de ampliar I/O de un PIC utilizando registros de desplazamiento
« Respuesta #7 en: 31 de Julio de 2007, 12:08:27 »
Hola amiguetes. Que tal os va todo, a mí bien no me puedo quejar.

Ya veo que seguis superengachados al FORO, lo mismo un día de estos me entra el gusanillo y vuelvo a reencontrarme con nuestros amigos los PICs.

Un abrazo muchachos.

Desconectado okapi

  • PIC12
  • **
  • Mensajes: 53
Re: Forma de ampliar I/O de un PIC utilizando registros de desplazamiento
« Respuesta #8 en: 31 de Agosto de 2007, 14:35:12 »
Saludos Pocher,

Soy un principiante en esto de los PIC, me intersó mucho el articulo tuyo sobre "Forma de ampliar I/O de un PIC", el asunto es que yo no se por donde empezar para hacer el programilla en PicBasic. Si no es abusar de tu confianza, por favor,¿ Podrías orientarme un poquitin para poder realizarlo?
Gracias de antemano.
okapi

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Forma de ampliar I/O de un PIC utilizando registros de desplazamiento
« Respuesta #9 en: 10 de Septiembre de 2007, 12:48:16 »
Me pongo a ello.

Enviaré el enunciado completo del automatismo, el GRAFCET y una explicación de la toma de datos de los registros.

Un saludo

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5538
    • Picmania by Redraven
Re: Forma de ampliar I/O de un PIC utilizando registros de desplazamiento
« Respuesta #10 en: 10 de Septiembre de 2007, 14:22:12 »
Casi Off-Topic:

Ave, Pocher, qui electronitur te salutant.  :D
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Forma de ampliar I/O de un PIC utilizando registros de desplazamiento
« Respuesta #11 en: 11 de Septiembre de 2007, 02:45:03 »
En el fichero word que adjunto está el PROBLEMA 21 completo. Este problema forma parte de un conjunto de 24 que realicé en el 2002 para que me lo editaran, pero no hubo suerte, me lo tiraron "pa trás", resulta que los de la Paraninfo querían que también incluyese en él la teoría de los PICs y la verdad no me apetecía escribir sobre algo que no tiene emoción y sobre lo que hay ríos de información ... resolver un problema sí que tiene emoción.

Mediante los bucles for se van enviando pulsos a los registros para ir metiendo secuencialmente en direcciones de memoria el valor de las entradas.

El GRAFCET es un gráfico que se usa para diseñar automatismos en autómatas (OMRON, SIEMENS, HITACHI etc). Su dibujo se realiza leyendo el enunciado del problema y añadiendo etapas secuencialmente a medida que aparecen condiciones de transición. Cada etapa dá lugar a  una (o más) acción (es)  determinada (s), por ejemplo conectar un relé.

Yo lo que hice fué coger las reglas básicas del GRAFCET y aplicarlas al lenguaje C. Son estas:

- La etapa 0 (E0) se activará automáticamente al conectar la alimentación (lo podemos hacer de varias formas).

- Una etapa se activa si estando en la etapa anterior a esta llega la correspondiente condición de transición.

- Una etapa se desactiva al activarse la etapa posterior.

Entonces, todos los if que hay en la programación son la aplicación de las 2 últimas reglas. Por ejemplo:

if (E3 && S4)
{
       E6=1;
       E3=0;
}

La E6 se activa (E6=1) si estando en la etapa anterior (la E3) llega la condición de transición, en este caso el sensor S4. Una vez activada la E6 se desactiva la etapa anterior a esta, en este caso E3.

El dibujo del GRAFCET es en la mayor parte de los casos muy sencillo, lo único que requiere es una buena interpretación del enunciado.

Por último una vez tenemos hechos los if de las etapas, solo nos queda mirar en el GRAFCET que etapas corresponden a una determinada salida, sumarlas y aplicarlas a esa salida mediante output_bit.

El pasar a Picbasic no te será dificil puesto que las instrucciones que se utilizan son muy parecidas en ambos lenguajes, de todas formas concrétame, si lo deseas, aquellas líneas de la programación que no entiendas.

Un saludo

PD. joer ... el directorio de subidas está lleno y no me deja subir el archivo del P21 completo. A ver si lo hago de otra forma.
« Última modificación: 11 de Septiembre de 2007, 06:25:41 por pocher »

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Forma de ampliar I/O de un PIC utilizando registros de desplazamiento
« Respuesta #12 en: 11 de Septiembre de 2007, 04:45:27 »
PROBLEMA 21:

Diseñar un automatismo que clasifique tres tamaños de paquetes diferentes, con las siguientes indicaciones:

Al pulsar sobre marcha (m) arrancará la CINTA1, la cual contiene paquetes de diferentes tamaños. Esta CINTA1 podrá pararse, si se desea, mediante un pulsador de paro (p). En caso de activación simultánea de ambos pulsadores, p tiene prioridad sobre m.
 
Al llegar el primer paquete al sensor S1 se parará la CINTA1 y arrancará la CINTA2.

Para averiguar el tamaño del paquete se dispone de tres sensores S1, S2 y S3. Si solo un sensor es el que está activo el paquete será pequeño. Si solo dos sensores estan activos al mismo tiempo el paquete será mediano y si los tres sensores estan activos al mismo tiempo el paquete será grande.

Al llegar el paquete al sensor S4 se para la CINTA2 y se activa el cilindro de doble efecto (C.D.E.) A, el cual si el paquete es pequeño o mediano lo eleva hasta el final de carrera a1. Sin embargo si el paquete es grande lo eleva hasta a2.

Al llegar el C.D.E. A, a a1 se detiene y se activa el C.D.E. B si el paquete es pequeño o se activa el C.D.E. C si el paquete es mediano.

Si el paquete es grande al llegar el C.D.E. A a a2 se activa el C.D.E. D.

Cuando cualquiera de los tres cilindros B, C o D hayan llegado a su final de carrera destino (b1, c1 y d1) deben retroceder tanto ellos como el cilindro A.

Cuando tanto el cilindro A como uno de los cilindros B, C o D hayan regresado a sus finales de carrera origen (a0,b0,c0,d0) la CINTA1 arrancará de nuevo para clasificar otro paquete.

Los distribuidores para los cilindros de doble efecto B, C y D son de 5 vías/2 posiciones con entradas B, BN, C, CN, D y DN respectivamente.

El distribuidor para el cilindro de doble efecto A es de 4 vías/3 posiciones con entradas A y AN.




SOLUCION por GRAFCET:




En el GRAFCET se ha utilizado para los motores de las cintas transportadoras y para las entradas a los distribuidores, la siguiente notación:

CIN1: activación del motor de la CINTA1
CIN2: activación del motor de la CINTA2

A: avance del cilindro A                                 B: avance del cilindro B                                                     
AN: retroceso del cilindro A                          BN: retroceso del cilindro B                                                           

C: avance del cilindro C                               D: avance del cilindro D
CN: retroceso del cilindro C                        DN: retroceso del cilindro D

Asignación de entradas y salidas a los ports, a las direcciones 0x20, 0x21 de la RAM  y a los registros de desplazamiento paralelo-serie 74LS165

El automatismo posee 15 entradas (m,p,S1,S2,S3,S4,a0,a1,a2,b0,b1,c0,c1,d0,d1) y 10 salidas (CIN1,CIN2,A,AN,B,BN,C,CN,D,DN). Se utilizaran dos registros de desplazamiento para meter en ellos todas las entradas. Las salidas se repartiran entre el PORTA y el PORTB.






Programa:

Código: [Seleccionar]
//                 P21_1.C

#include <16f84a.h>

#use delay(clock=4000000)

#use fast_io(A)
#use fast_io(B)

#byte DIRent20 = 0x20 // Variable para almacenar los valores de m, p, S1, S2, S3,
// S4, a0 y a1
#bit DIRent20_0 = 0x20.0 // Variable auxiliar para introducir datos del registro al PIC
#bit m = 0x20.0                    // Entrada: pulsador de marcha m
#bit p = 0x20.1                    // Entrada: pulsador de paro p
#bit S1 = 0x20.2                    // Entrada: sensor S1
#bit S2 = 0x20.3                    // Entrada: sensor S2
#bit S3 = 0x20.4                    // Entrada: sensor S3
#bit S4 = 0x20.5                    // Entrada: sensor S4
#bit a0 = 0x20.6                    // Entrada: final de carrera a0
#bit a1 = 0x20.7                    // Entrada: final de carrera a1

#byte DIRent21 = 0x21
#bit DIRent21_0 = 0x21.0
#bit a2 = 0x21.0                    // Entrada: final de carrera a2
#bit b0 = 0x21.1                    // Entrada: final de carrera b0
#bit b1 = 0x21.2                    // Entrada: final de carrera b1
#bit c0 = 0x21.3                    // Entrada: final de carrera c0
#bit c1 = 0x21.4                    // Entrada: final de carrera c1
#bit d0 = 0x21.5                    // Entrada: final de carrera d0
#bit d1 = 0x21.6                    // Entrada: final de carrera d1


#byte port_a = 5
#byte port_b = 6                   

main()
{
     static short Si,CIN1,CIN2,A,AN,B,BN,C,CN,D,DN;
     static short I,E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14;
     static char n;
 
 
     set_tris_a(0x10);                  // Si entrada, CK, PL, D y DN salidas
     set_tris_b(0x00);                  // CIN1,CIN2,A,AN,B,BN,C y CN salidas
     port_a=0;
     port_b=0;

     I=1;                              // Inicialización del GRAFCET   

     while(1)
     {
       
// TOMA DE DATOS: DESPLAZAMIENTO DE LAS ENTRADAS A LAS
// DIRECCIONES 0x20 Y 0x21

          output_bit(PIN_A2,0);      // Se activa la entrada de carga en || de los dos 74165,
                                              // (PL=0)
          delay_us(1);               //Retardo de 1µs
          output_bit(PIN_A2,1);        // Se desactiva la entrada de carga en || de los dos
                                                 // 74165, (PL=1)
         
          for(n=0;n<=6;n++)                    // Entran  en 0x20: a1,a0,S4,S3,S2,S1,p
          {
    DIRent20_0=input(PIN_A4); // PIN_A4 (entrada Si) conectado a
                                                               // Q7 del registro
        DIRent20=DIRent20 << 1;        // Desplazamiento izquierda de 0x20
        output_bit(PIN_A3,1);              // Nivel alto del pulso de reloj (CK=1)
                delay_us(1);         //Retardo de 1µs
                output_bit(PIN_A3,0);              // Nivel bajo del pulso de reloj (CK=0)
                delay_us(1);                          //Retardo de 1µs
          }
          DIRent20_0=input(PIN_A4);            // Entra en 0x20: m
       
          output_bit(PIN_A3,1);                      // Se manda un pulso de reloj para dejar
          delay_us(1);                        // preparado  para entrar en 0x21 al
          output_bit(PIN_A3,0);                  // bit Q7 del 2º registro (este bit, en este         
          delay_us(1);            // problema no tiene entrada asignada)
         
          for(n=0;n<=6;n++)                    // Entran en 0x21: -,d1,d0,c1,c0,b1,b0
         {
        DIRent21_0=input(PIN_A4); // PIN_A4 (entrada Si) conectado a
                                                                               // Q7 del registro
        DIRent21=DIRent21 << 1; // Desplazamiento izquierda de 0x21
        output_bit(PIN_A3,1);            // Nivel alto del pulso de reloj (CK=1)
                delay_us(1);                            //Retardo de 1µs
                output_bit(PIN_A3,0);            // Nivel bajo del pulso de reloj (CK=0) 
                delay_us(1);                          //Retardo de 1µs
         }
         DIRent21_0=input(PIN_A4);         // Entra en 0x21:  a2
       
//------------------------------------------------------------------------------------------------------------

        if (I || E1 && p )           // ETAPA 0
{
E0=1;
E1=0;
I=0;    
}

// ------------------------------------- ACTIVACIÓN CINTA1 ---------------------------------------

        if (E0 && m && !p || E12 && a0 && b0 || E13 && a0 && c0 || E14 && a0 && d0)                              // ETAPA 1

        {
E1=1;
                E0=0;
E12=0;
E13=0;
E14=0;
}

// ---------------------------------------- ACTIVACIÓN CINTA2 ------------------------------------
               
if (E1 && S1)                            // ETAPA 2
{
E2=1;
E1=0;
}

// -------------------------------- CICLO PAQUETES PEQUEÑOS --------------------------------

if (E2 && S3 && !S2 && !S1)                     // ETAPA 3
{
E3=1;
E2=0;
}

if (E3 && S4)                                  // ETAPA 6
{
E6=1;
E3=0;
}

if (E6 && a1)                                  // ETAPA 9
{
E9=1;
E6=0;
}

if (E9 && b1)                                  // ETAPA 12
{
E12=1;
E9=0;
}

// --------------------------------- CICLO PAQUETES MEDIANOS -------------------------------

if (E2 && S3 && S2 && !S1)                    // ETAPA 4
{
E4=1;
E2=0;
}

if (E4 && S4)                                  // ETAPA 7
{
E7=1;
E4=0;
}

if (E7 && a1)                                  // ETAPA 10
{
E10=1;
E7=0;
}

if (E10 && c1)                                  // ETAPA 13
{
E13=1;
E10=0;
}

// ------------------------------ CICLO PAQUETES GRANDES -----------------------------------

if (E2 && S3 && S2 && S1)                  // ETAPA 5
{
E5=1;
E2=0;
}

if (E5 && S4)                                  // ETAPA 8
{
E8=1;
E5=0;
}

if (E8 && a2)                                  // ETAPA 11
{
E11=1;
E8=0;
}

if (E11 && d1)                                  // ETAPA 14
{
E14=1;
E11=0;
}
         
// --------------------------------------------- SALIDAS ------------------------------------------------

    CIN1 = E1;
    CIN2 = E2 || E3 || E4 || E5;
    A = E6 || E7 || E8;
    AN = E12 || E13 || E14;
    B = E9;
    BN = E12;
    C = E10;
    CN = E13;
    D = E11;
    DN = E14;

        output_bit(PIN_B0,CIN1);           
    output_bit(PIN_B1,CIN2);         
    output_bit(PIN_B2,A);   
    output_bit(PIN_B3,AN);           
    output_bit(PIN_B4,B);           
    output_bit(PIN_B5,BN);           
    output_bit(PIN_B6,C);
    output_bit(PIN_B7,CN);         
    output_bit(PIN_A0,D);         
    output_bit(PIN_A1,DN);
         }
}
                         

« Última modificación: 11 de Septiembre de 2007, 06:20:50 por pocher »


 

anything