Compuertas Lógicas con SmartIO

 Compuertas Lógicas con SmartIO

 Acá ire poniendo ejemplos sencillos de como implementar diferentes compuertas lógicas basicas con SmartIO.

AND

La placa que use para este ejemplo es la CY8CKIT-041-40XX que trae un CY8C4045AZI-S413, este PSoC pertenece a la nueva familia PSoC 4S, en especifico a la familia 4000S. En esta familia el periferico SmartIO solo esta presente en los puertos GPIO 2 y GPIO 3, para este ejemplo usaré el puerto GPIO 3 por que tengo disponible el LED rojo del kit en el pin 3[4].
LED RGB de Usuario en la 041
Hay que tener en cuenta que el LED rojo prende cuando "escribimos" un 0 logico en el pin que lo maneja.
¿Que hara el SmartIO?
El LED rojo va a prender solo cuando dos pulsadores externos sean presionados al mismo tiempo, equivalente a una compuerta AND, y estara apagado cuando no este presionado ningun pulsador o solo uno este presionado.

  1. Comenzamos con un proyecto nuevo y arrastramos el SmartIO al esquematico. Vamos a utilizar el pin 4 para el LED, y los pines 0 y 1 para las entradas de la compuerta. Vamos a tener que conectar dos pulsadores a estos pines, les vamos a poner resistencias de pull-up externas porque no se pueden añadir dentro de los pines :/ . Debido a las pull-up los pines 0 y 1 van a tener un 1 logico cuando el pulsador no este presionado asi que tenemos que invertir ese valor, lo vamos a hacer en la respectiva LUT.
  2. SmartIO y componentes externos.
  3.  Abrimos la ventana de configuracion, asignamos el port 3, y nuestro diseño es asincrono, asi que no le asignamos ningun clock.
  4. Configuracion SmartIO
  5.  Asignamos la opcion input a las terminales gpio0 y gpio1, y output a la terminal gpio4. Las señales de cada terminal pueden servir como entrada a la LUT correspondiente, vemos como cada terminal del lado derecho va a su respectiva LUT:
    Rutas SmartIO
  6. Las entradas llegan a sus LUT por la ruta asincrona, se puede ver en la imagen anterior que cuando llegan a las rutas de entradas de la LUT se forma una interseccion (circulo relleno), y las salidas de la LUT0 y LUT1 van a las entradas de la LUT4, la salida de la LUT0 la usamos en dos entradas de la LUT4 porque si dejamos una entrada sin asignar nos aparece un error.
  7. La asignacion de la LUT0 la podemos ver a continuacion, cuando en las entradas tenemos 0 logico a la salida tenemos un 1 logico.
    Asignaciones LUT0
  8. La asignacion de la LUT1 la podemos ver a continuacion, cuando en las entradas tenemos 0 logico a la salida tenemos un 1 logico.
    Asignaciones LUT1
  9. La entrada 0 de la LUT4 es la salida de la LUT1 y las entradas 1 y 2 corresponden a la salida de la LUT0, recordamos que el LED rojo de prende con un 0 logico, asi que, cuando en las tres entradas tenemos un 1 logico (ambos pulsadores presionados) a la salida tenemos un 0 logico, en todas las demás combinaciones tenemos un 1 lógico a la salida.
    Asignaciones LUT4
  10. En la asignacion de pines tengo lo siguiente, solo se puede asignar el pin a la salida correspondiente del SmartIO.
    Asignacion de pines.
  11. Y en el main solo inicializamos el periferico SmartIO.
  12.  1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    #include <project.h>
    
    int main()
    {
        CyGlobalIntEnable; /* Enable global interrupts. */
    
        SmartIO_Start();
    
        for(;;)
        {
    
        }
    }
    
    /* [] END OF FILE */
    

AND version 2

3-Octubre-2016

Despues de terminar a implementación anterior me di cuenta que puede hacerse usando solo 1 LUT, la LUT que controla el GPIO de salida. Al parecer las LUT estan divididas en dos bancos LUT0-LUT3 y LUT4-LUT7 (todavia lo tengo que confirmar en la documentacion), asi que asigne la salida al pin P3[4] y las dos entradas a los pines P3[5] y P3[7] como se ve en la siguiente imagen:
no use el pin P3[6] porque esta conectado al LED azul y no se veia bien cuando se prendia el led rojo que es el que controlamos con el pin P3[4].
Como vemos las señales gpio5 y gpio7 pueden ser conectadas directamente como entradas a las LUT4-LUT7, asi que conecte gpio5 a las entradas 1 y 2, y gpio7 a la entrada 0 de la LUT y la salida directo al gpio4.
La LUT4 esta configurada como sigue:
Sabemos que los pulsadores que estan conectados a gpio5 y gpio7 tienen un 0 lógico cuando los pulsamos, asi que cuando todas las entradas estan a 0 el led rojo debe prender, recordar que los leds del kit 048 prenden con un 0 lógico, en los demás estados de la LUT4 el led debe estar apagado, asi que le asignamos un 1 lógico.
Solo falta asignar los pines correspondientes e inicializar el SmartIO en el main.c, para hacer este proyecto diferente al anterior, puse el PSoC en Deep Sleep y el SmartIO sigue funcionando en este modo low power.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <project.h>

int main()
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    SmartIO_Start();

    for(;;)
    {
        CySysPmDeepSleep();
    }
}

/* [] END OF FILE */

OR

TODO

XOR

TODO


Todos estos proyectos estan en este repositorio de GitHub.
Saludos

Indice:

Comentarios

Entradas más populares de este blog

PSoC Creator Tools

sprintf en PSoC Creator 3.0 y 3.1