martes, 31 de diciembre de 2013

PROGRAMADOR PARA PSOC 1 POR PUERTO PARALELO

En algunas ocasiones cuando se está comenzando a trabajar con algún componente programable y queremos explorarlo antes de llevar a cabo una inversión monetaria mayor o simplemente si no se tienen los recursos económicos suficientes para adquirir un programador original, es bastante útil poder contar con un programador genérico o que sea de acceso libre y mucho mejor aun si es de fácil construcción.

Este es el caso de un programador para PSoC 1 que quiero compartir con ustedes, este dispositivo sirve más específicamente para las referencias CY8C27433 y CY8C29466, es importante aclarar que este proyecto no fue desarrollado por mí en ningún momento y tampoco lo he probado, lo encontré hace algún tiempo en una de las tantas discusiones que se pueden encontrar en la pagina foros de electrónica, aprovecho para recomendarles un hilo de discusión que tienen abierto sobre PSoC el cual me parece que tiene cosas que pueden ser de beneficio para todos.

Este programador tiene como ventaja la simplicidad de su diseño, lo cual lo hace de fácil construcción y bajo costo, sin embargo también tiene como desventaja que la conexión al computador se hace por medio de un puerto paralelo, lo cual hace que su uso en un computador portátil sea prácticamente imposible, sin embargo si se cuenta con un equipo de escritorio esta se convierte en una buena forma de comenzar en la programación de microcontroladores PSoC de las referencias antes mencionadas. El link de donde encontré dicho programador es el siguiente:


Dentro de este aporte pueden encontrar el diagrama del circuito del programador, el software necesario para llevar a cabo la carga del archivo .hex y posterior programación del PSoC y los archivos de texto donde explican cómo hacer uso del programador.

(Figura 1. Diagrama programador PSoC)

(Figura 2. Vista del software del programador)

Espero que les sea de ayuda, lo prueben y comenten su experiencia con este proyecto.

sábado, 13 de julio de 2013

RECEPCIÓN DE DATOS CON MÓDULO UART DE PSoC

En esta entrada se va a trabajar la recepción de datos por medio del protocolo UART con un microcontrolador PSoC, por lo tanto es recomendable primero revisar y leer una publicación anterior en la cual se hizo la introducción y un primer trabajo de envío de datos por medio de este protocolo con el modulo de usuario UART con el que cuenta PSoC Designer, la entrada en mención es la siguiente: COMUNICACIÓN UART CON PSoC.


En la práctica que se va a mostrar en esta entrada se trata de enviar un dato por medio de protocolo UART desde el computador, recibir este dato en el microcontrolador PSoC para luego mostrarlo en un display LCD de 16 caracteres por 2 columnas. Antes de comenzar con la muestra del desarrollo de la práctica es necesario mostrar algunos métodos que tiene el módulo UART de PSoC para la recepción de caracteres como son los siguientes:

UART_IntCntl: Esta función habilita o deshabilita las interrupciones de recepción y transmisión de manera independiente, la sintaxis es:

  • UART_IntCntl(); dentro del paréntesis se debe colocar el tipo de interrupción que se desee habilitar o deshabilitar teniendo las siguientes opciones:

·         UART_ENABLE_RX_INT: Habilita la recepción
·         UART_ENABLE_TX_INT: Habilita la transmisión
·         UART_DISABLE_RX_INT: Deshabilita la recepción
·         UART_DISABLE_TX_INT: Deshabilita la transmisión

Por ejemplo para habilitar la recepción, la línea de código quedaría escrita de la siguiente manera:

·       UART_IntCntl(UART_ENABLE_RX_INT);

   UART_CmdReset: Resetea el buffer del modulo UART, dejándolo preparado para recibir las siguientes instrucciones. La sintaxis de esta función es:

·                    UART_CmdReset();
  
    UART_szGetParam: Toma el dato guardado en el buffer de recepción del modulo UART, luego de tomar este dato lo guarda en un puntero. La sintaxis de a función es la siguiente:

·                    Char * UART_szGetParam();


Para que esta función pueda guardar el dato dentro de un puntero, se coloca la función dentro de una condición if, por ejemplo:

·                    If(dato = UART_szGetParam()){}

Donde dato es el puntero en el cual se va a guardar el dato que ha recibido el buffer del módulo  UART del PSoC.

DESARROLLO DE LA PRÁCTICA:

Como ya se había mencionado en esta práctica se va a enviar un dato por medio del computador para que posteriormente sea recibido por el modulo UART del microcontrolador PSoC y sea mostrado en un display LCD 16*2.

En la práctica con módulo UART realizada anteriormente, para establecer la comunicación entre el computador y el microcontrolador se utilizo una tarjeta construida con un circuito integrado FT232 con el cual se lograba hacer la conversión de protocolo USB a UART mediante la emulación de un puerto COM, en esta ocasión no se va a utilizar la misma tarjeta sino que para mostrar una nueva posibilidad para establecer dicha conexión se utilizo un programador de microcontroladores PIC como interfaz y como software para enviar los datos se utilizo la herramienta UART (UART Tool) del programa PICkit 2 de Microchip.

Luego de haber enviado el dato, el encargado de recibir dicha información es el PSoC, para tal fin se utilizo un modulo UART y se configuraron los parámetros del reloj y de recepción del mismo tal como se muestra en la imagen a continuación.

(Figura 1. Parámetros globales del microcontrolador)


(Figura 2. Parámetros módulo UART)

Luego de guardar el dato para hacer la visualización del mismo se utilizo un display LCD 16*2, para utilizar este dispositivo se uso el módulo LCD que incluye PSoC Designer.

El código utilizado para esta práctica con sus respectivos comentarios se puede ver a continuación:

//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h>       
#include "PSoCAPI.h"   

void main(void)
{
char *dato; // Puntero donde se guardan los datos recibidos
UART_CmdReset(); //Resetea el buffer del modulo UART
UART_IntCntl(UART_ENABLE_RX_INT); //Habilita las interrupciones de RX
UART_Start(0); // Inicializa módulo UART
LCD_Start(); // Inicializa módulo LCD
M8C_EnableGInt;
       while(1)
       {
             if(dato = UART_szGetParam()) //Comprueba si el buffer del UART ha recibido un                                              Parametro y lo guarda en el puntero
             {
             LCD_Position(0,3); // Ubica la primera columna y el tercer caracter del display                                  LCD
             LCD_PrCString("PSoC RX UART"); // Escribe el texto en la posición anterior
             LCD_Position(1,0); // Ubica la segunda Columna y el tercer caracter del display                                   LCD
             LCD_PrString(dato); // Escribe el valor del puntero en la posición anterior
             UART_CmdReset();//Resetea el buffer del modulo UART
             }
       }
}


Por último los resultados obtenidos de la práctica se pueden observar en las siguientes imágenes:

(Figura 3. Envió de la palabra PSoC)

(Figura 4. Recepción y muestra de la palabra PSoC)
(Figura 5. Envió de la palabra Hola)
(Figura 6. Recepción y muestra de la palabra Hola)
(Figura 7. Envió de la palabra Prueba)
(Figura 8. Recepción y muestra de la palabra Prueba)
(Figura 9. Envió de símbolos :) )
(Figura 10. Recepción y muestra de símbolos :) )

sábado, 30 de marzo de 2013

PWM CONTROLADO POR VOLTAJE CON PSoC

Una aplicación utilizada comúnmente en electrónica son los PWM, para esta publicación de PSoC en Español se va a presentar como configurar el modulo de usuario PWM de PSoC Designer y la manera de cambiar el ciclo útil del mismo por medio de una entrada de voltaje análogo.

En primera instancia PSoC Designer dentro del catalogo de módulos de usuario ofrece módulos PWM de 8 y 16 bits, para este ejemplo se va a utilizar un modulo de 8 bits, sin embargo si quieren configurar un modulo de 16 bits no tienen de que preocuparse ya que los parámetros de configuración son prácticamente los mismos. Para comenzar en sí con el desarrollo de esta publicación se tienen que mostrar cuales son los parámetros de configuración de estos módulos y de que consta cada uno.

Clock:

Este parámetro de configuración se refiere al reloj con el cual se va a alimentar el modulo de usuario, la velocidad de este reloj es un factor determinante para determinar la frecuencia a la cual va a trabajar el PWM.



El “clock” se puede escoger entre los diferentes relojes de los que dispone PSoC como por ejemplo Sysclk*2 (Ya que estos módulos soportan reloj hasta de 48 MHz), VC2, VC2, VC3, además de relojes externos que pueden ser conectados por medio de las entradas digitales del microcontrolador.

Enable:

Con este parámetro se escoge la forma con la cual se va a activar el PWM, se puede escoger entre 16 fuentes diferentes entre las que se encuentran, high, low, los comparadores y las entradas digitales del microcontrolador, en caso de escoger la opción “High” significara que el modulo PWM permanecerá activo de manera permanente.

CompareOut:

Este parámetro es la salida del modulo, por lo tanto es de donde se obtiene el PWM que puede ser conectado a uno de los buses para que pueda estar a disposición de otros módulos de usuario o para su conexión a alguno de los pines de salida del microcontrolador.

TerminalCountOut:

Es una salida auxiliar a la “CompareOut”, con esta se puede conectar la respuesta del PWM a otro bus para futuras conexiones, en caso de no ser necesario se puede dejar deshabilitada.

Period:

Este parámetro permite configurar el periodo de la señal del PWM, los valores que puede tomar son de (0 - 255) para el caso de los PWM de 8 bits y de (0 - 65535) para el caso de los PWM de 16 bits.

PulseWidth:

A partir de este parámetro se puede configurar el ciclo útil del PWM, puede tomar al igual que para el parámetro “Period” puede tomar valores entre (0 -255 o 0-65535) dependiendo del tipo de modulo con el cual se esté trabajando, el ciclo útil se puede calcular a partir de las siguientes ecuaciones:

·         Con CompareType = “Less Than”


·         Con CompareType = “Less Than Or Equal”


Lo anterior aplica solamente cuando el valor de “PulseWidth” es menor al valor del parámetro “Periodo”, en caso de ser mayor o igual el ciclo útil del PWM es de 100%.

InterruptType:

Este parámetro permite configurar el tipo de interrupciones con las cuales se va a manejar el modulo.

CompareType:

Este tipo establece el tipo de comparación que se va a realizar y es el que se mencionaba en el parámetro “PulseWidth” como parte del cálculo del ciclo útil.

ClockSync:

Indica la fuente de reloj con la cual se debe sincronizar el modulo.

InvertEnable:

Invierta la señal de entrada que se había configurado previamente como señal de habilitación del modulo.

Así como estos parámetros pueden ser configurados de manera grafica sencillamente, también pueden ser configurados por medio de código ya sea en Assembler o en C mediante comandos que permiten activar o desactivar el modulo, modificar el periodo, el ancho del pulso, entre otras características, ejemplos de esto son los siguientes comandos:

PWM8_Start(); //Inicializa el modulo PWM
PWM8_WritePeriod(Valor del periodo); //Configura el periodo del PWM
PWM8_WritePulseWidth(Valor del ancho de pulso);// Configura el ancho de pulso del PWM
PWM8_bReadPulseWidth();// Lee el valor del ancho de pulso del PWM
PWM8_Stop(); //Detiene el modulo PWM8

DESARROLLO PRÁCTICA DE PWM CONTROLADO POR VOLTAJE:

El objetivo principal de esta publicación es desarrollar un circuito PWM cuyo ciclo útil sea modificado por medio del valor de una señal de voltaje análogo, para tal fin se va a utilizar el IDE de desarrollo de PSoC (PSoC Designer), los módulos de usuario ADCINC y PWM8. El procedimiento para desarrollar esta aplicación fue el siguiente:

1. Ingresar la señal de voltaje análogo al microcontrolador PSoC y convertirla a un valor digital. Para tal fin se utiliza con un convertidor análogo a digital (modulo ADCINC), personalmente antes del modulo convertidor, prefiero utilizar un modulo PGA para ingresar la señal análoga y de esta manera hacer una especie de acople o adaptación de la señal, luego de este modulo PGA si procedo a ingresar la señal análoga al convertidor ADC.

2. Configurar el modulo PWM según los criterios que se mostraron anteriormente y las necesidades de frecuencia que tenga cada uno.

3. Utilizando el valor digital entregado por el convertidor ADC y el comando “PWM8_WritePulseWidth();” del modulo PWM, se re-escribe el valor del ancho de pulso y por lo tanto el del ciclo útil del PWM, esta cambio de ciclo útil es proporcional al cambio de voltaje que se presente en la señal análoga de la entrada del circuito.

Como se puede apreciar por el procedimiento descrito, la práctica es bastante sencilla y así mismo el código también lo es, tal como se puede apreciar a continuación.

//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h>    
#include "PSoCAPI.h"


void main(void)
{
BYTE resultado;// Variable para alojar el resultado del ADC
M8C_EnableGInt;// Interrupciones M8C Habilitadas
Acople_Start(3);// Inicialización del Modulo PGA (Acople)
PWM8_Start();//Inicialización del Modulo PWM
Convertidor_Start(3);//Inicialización del Modulo ADCINC (Convertidor)
Convertidor_GetSamples(0);//Se inicia la toma de muestras del ADC

while(1)
{
if(Convertidor_fIsDataAvailable()!=0)//se revisa que el DAC tenga una conversión disponible
{
resultado=Convertidor_bGetData();//se guarda el valor de la conversión en la variable resultado
}
PWM8_WritePulseWidth(resultado);//Se escribe el ancho de pulso con el valor de la variable resultado
}
}

Por último pueden observar el siguiente vídeo en el cual se muestra el resultado obtenido por esta práctica.