Sunteți pe pagina 1din 15

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

Introduccin a La Programacin De Los Microcontroladores Psoc


Este pequeo tutorial est enfocado a la programacin bsica de la referencia CY8C29466 (lo cual no significa que no sirva para otro Psoc), para algunos de los mdulos tpicos y sus configuraciones normales, por ello todos los ejemplos han sido probados. Por otro lado se prev que hay un entendimiento del lenguaje C y de Digitales no a un nivel avanzado pero algo de conocimientos claros, esto evita que este pequeo tutorial no se haga extenso. Se pretende desarrollar poco a poco los siguientes temas: Cap 1 Introduccin al entorno de trabajo. 1.1 Manejo de Entradas/Salidas Discretas, Retardos por Software y LCD Cap 2. Mdulo Timer, Interrupciones. Cap 3. Mdulo PWM, Mdulo Counter (Contadores). Cap 4. Mdulo PGA (op-amp), Mdulo CMPPRG (Comparador). Cap 5. Mdulo ADC, Mdulo DAC. Cap 6. Comunicacin Serie Asncrona Mdulos RX/TX. Cap 7. Filtros: Mdulo LPF2 (Pasa bajo), Mdulo BPF2 (Pasa Banda). Cap 8. Reconfigurabilidad. Este tutorial no abarca todos los aspectos de la potencia del Psoc, pero sirve como una introduccin a este mundo, por lo que cualquier aporte al tutorial ser vlido, cualquier duda me puedes escribir al foro responder siempre y cuando tus dudas no sobrepasen mis conocimientos, por otro lado me imagino que instalaste PSoC Designer versin 5, este ya trae un compilador de C gratis para psoc llamado HI-TECH C PRO, si no lo instalaste es mejor que lo hagas para poder continuar, sin ms prembulos empecemos.

1 Alexander Senz U.

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

Cap 1 Introduccin al entorno de trabajo.


En la versin 5 la que yo utilizo PSoC Designer viene incorporado con PSoC Express; PSoC Express se utiliza para crear programas sin una sola lnea de cdigo esto es programacin grfica, el inconveniente es que no tenemos mucho control sobre nuestro sistema, en cambio PSoC Designer permite programar en C o en assembler, yo me centrare en C porque no se assembler para Psoc.

Crear un proyecto
Abramos PSoC Designer 5, nos apareci la pgina de inicio, proyecto, damos file New Project: bueno creemos un

Le damos de nombre Proyecto1, seleccionamos la carpeta y muy importante seleccionar Chip-level Project, luego ok, Nos aparece:

Bueno este cuadro de dialogo nos dice en que lenguaje vamos a programar y cual dispositivo programaremos, lgico seleccionaremos a C y no assembler.
2 Alexander Senz U.

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

Si observamos nos apareci una referencia de un Psoc que no es la de nosotros para buscarla oprimimos view Catalog y buscamos la referencia CY8C29466-24PXI

Lo seleccionamos y le oprimimos select, ahora ya tenemos nuestra referencia del dispositivo y tambin que vamos a programar en C.

Luego OK
3 Alexander Senz U.

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

Por fin tenemos nuestro IDE, si no aparecen todos estos cuadros, en men View, podemos habilitarlos todos:

Referencias globales: Aqu se configuran el reloj, divisores de frecuenciadespus lo veremos mejor

Se observa la carpeta donde estn ubicados los archivos los mdulos que estemos utilizando y por supuesto nuestro Cdigo en C.

Propiedades: Cuando agregamos los mdulos esta ventana nos permite cambiar las caractersticas del dispositivo, por ejemplo si tenemos un PWM, desde aqu podemos cambiarle el ancho del pulso

[Pinout]: al hacer doble click nos permite ver los pines del Psoc, una gua a la hora de montar los proyectos.

Mdulos de usuario Aqu estn Todos los mdulos soportados por nuestro psoc, mdulos Anlogos y Digitales. Tabla de puertos (GPIO): Desde aqu podemos seleccionar que pines son entrada y cuales son de salida y cambiarles el nombre Espacio de trabajo: es la parte del fondo de esta imagen.

F6 compilamos y generamos el .hex para quemar el psoc.

Estas opciones nos permiten movernos dentro del espacio de trabajo, all es donde quedan plasmados los mdulos que hemos agregado, esas lneas y cuadros que aparecen al fondo de la imagen.

4 Alexander Senz U.

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

Ahora abramos el archivo donde vamos a programar en C:

Vemos:

Siempre hay que dejar esas lneas de cdigo. Presionemos Ctrl+F6 (el cual compila todos los cdigos fuentes y tambin el proyecto) y observemos que se ha generado el archivo .hex en la carpeta output dentro de la carpeta del proyecto, yo lo tengo en: D:\Curso de Psoc\Proyecto1\Proyecto1\Proyecto1\output All hay varios archivos en particular, y uno llamado Proyecto1 y su extensin es .HEX, este es el que nos sirve para programar el Psoc. Tambin esta Ctrl+F7 este solo nos compila el cdigo pero no el proyecto completo por lo tanto no hay el .hex, solo nos sirve para saber si no tenemos errores en cdigo.

5 Alexander Senz U.

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

Programar el Psoc (con CYP)


Abrimos el CYP.exe : Le damos click en Settings y configurar: (El puerto paralelo donde lo tengas habilitado)

Luego ponemos el Integrado (psoc) en el Programador (Hardware), le damos click en ChkSum y nos tiene que aparecer la referencia del psoc en:

6 Alexander Senz U.

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

Si no aparece la referencia no se puede quemar (no lo reconoce ),tiene que aparecer. Luego le damos click en load y abrimos nuestro archivo Proyecto1.hex que est ubicado en la carpeta output en mi caso ser: D:\Curso de Psoc\Proyecto1\Proyecto1\Proyecto1\output

Le damos programar y esperar

y listo ya puedes sacar el psoc, aunque ste ya quedo grabado, no har nada porque no le programamos nada en C, pero ya sabes quemar as ser siempre en todos los proyectos que hagamos. Bueno por ahora dejemos as y pasemos un poco a la teora.

7 Alexander Senz U.

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

Cap 1.1 Manejo de Entradas/Salidas Discretas, Retardos por Software y LCD.


Entradas/Salidas Discretas
Para leer o escribir un bit de algn puerto se utiliza el registro PRTXDR, donde X es el puerto. (Este Psoc tiene 3 puertos, el 0,1,2). Personalmente utilizar el PRTXDR directamente en el cdigo fuente principal, no me gusta porque toca escribir lneas de cdigo como estas: #define Bit(bitNumber) (1<<(bitNumber)) #define encender_led1(PRT1DR|=Bit(0)) // escribe #define leer_boton1(PRT0DR&Bit(0)) // lee #define encender_led2(PRT1DR|=Bit(1)) // escribe #define leer_boton2(PRT0DR&Bit(1)) // lee ... void main(void){ while(1){ if(leer_boton1) encender_led1; // pone en 1 if(leer_boton2) encender_led2; // pone en 1 } }

Y si llegramos a utilizar todo el PORT0, tocara definir muchos macros por esto decid realizar un archivo de cabecera que nos facilitara este trabajo, una parte la saque de un documento AN2033 (ubicado en www.cypress.com) que lo vamos a utilizar para escribir y otra que yo realice para poder leer cualquier bit de cualquier puerto, todo esto lo integre en un archivo llamado puertos.h (dispuesto a compartir con ustedes); ahora para leer y escribir se proceder: LEER: Este macro devuelve '0' si la entrada esta en '0', devuelve un nmero distinto a '0' si la entrada esta en '1' LPortX_B, donde X es el puerto y B es el bit a leer. ESCRIBIR: b es el valor a escribir puede ser solo 1 o 0 EPortX_B(b), donde X es el puerto y B es el bit en donde se va escribir
Alexander Senz U. 8

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

El mismo ejemplo anterior pero utilizando los macros del puertos.h, y agregndole la lectura de otros bits, (se puede hacer muchas ms comprobaciones sin necesidad de tantos macros en nuestro cdigo fuente principal): #include puertos.h ...//sin necesidad de los macros comunes void main(void){ while(1){ if(LPort0_0) EPort1_0(1); // pone if(LPort0_1) EPort1_1(1); // pone if(LPort0_2) EPort1_2(0); // pone if(LPort0_3) EPort1_3(0); // pone } }

en en en en

1 1 0 0

Retardos por Software


Los retardos por software simplemente hay que agregar a delay.h (otro archivo de cabecera que compartir con ustedes) el cual tiene dos funciones a nuestro alcance:

void Delay50u(void); // Solo hace un retardo de 50us void Delay50uTimes(BYTE Multiple); El valor que ingresemos como BYTE Multiple se multiplica por 50us y da como resultado el retardo. Este archivo se consigue en la pgina de cypress.

Visualizacin por LCD


Bueno ya casi nuestro primer programa, aqu se explicara como agregar al proyecto a delay.h y puertos.h ya que ambos no se agregan de la misma forma, porque uno fue escrito en asm y el otro en C, respectivamente. Tambin veremos cmo publicar en LCD, bueno empecemos. Empecemos a ver cuales son las funciones principales que se utilizan para poder publicar, ya que la forma de publicar un integer, es diferente a un char y menos un float.
9 Alexander Senz U.

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

Bien para publicar en el LCD tenemos los siguientes prototipos: void void void void LCD_1_Start(void); LCD_1_Position(BYTE bRow, BYTE bCol); LCD_1_PrString(char *sRamString); LCD_1_PrCString(const char *sRomString); (1) (2) (3) (4)

En (1) se utiliza para inicializar el mdulo LCD, luego como es lgico le damos las coordenadas con (2), ya si queremos publicar una constante utilizamos (4) de lo contrario utilizamos (3) esto es para publicar texto: ... void main(void){ char var[9] = variable LCD_1_Start(); while(1){ LCD_1_Position(0,1); LCD_1_PrCString(constante); LCD_1_Position(1,1); LCD_1_PrString(var); ...//var es un puntero que apunta a var[0] } } Como nos dimos cuenta estas funciones solo permiten publicar char, entonces habr que hacer algo para poder publicar un integer o un long osea convertir integer/long a char, miremos los prototipos: char *ltoa(char *buf, long i, int base); char *itoa(char *buf, int i, int base); /* -i : Es el nmero que queremos convertir a char -*buf : Puntero que guarda el dato convertido -base : Generalmente trabajamos en base 10. -itoa y ltoa devuelven un puntero a char - Se encuentran en la librera stdlib.h */
10 Alexander Senz U.

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

Veamos: ... #include <stdlib.h> void main(void){ int num = 14; char nuevo[3]= ; LCD_1_Start(); while(1){ itoa ( nuevo, num, 10 ); LCD_1_Position(0,1); LCD_1_PrString(nuevo); } } O tambin da lo mismo hacer: ... while(1){ LCD_1_Position(0,1); LCD_1_PrCString( itoa(nuevo,num,10) ); } Vamos ahora con un float: char *ftoa(float f, int *status); /* -f : Es el nmero que queremos convertir a char -*Status : Puntero que guarda el estado de la conversin. -ftoa devuelven un puntero a char el de la conversion. - Se encuentran en la librera stdlib.h Su uso correcto es as: int estado; const char *c = ftoa(12.67, &estado); if (estado == 0) // si es cero, la conversin // se realizo con xito
11 Alexander Senz U.

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

Pero yo omito la comprobacin de la conversin y confi que todo salga bien : ... #include <stdlib.h> void main(void){ int estado = 0; float num = 14.24; const char *nuevo; LCD_1_Start(); while(1){ nuevo = ftoa( num, &estado ); LCD_1_Position(0,1); LCD_1_PrString(nuevo); } }

Por ltimo falta tener alguna funcin que nos reset todo el display, yo no la he encontrado pero suelo hacer: void borra_LCD(){ int i = 0; int j = 0; for (j=0; j<=1; j++){ for ( i=0; i<=15; i++){ LCD_1_Position(j,i); LCD_1_PrCString(" "); } }

Nuestro primer programa


El programa va hacer algo sencillo (no es la mejor forma de hacer esto pero es de una forma didctica), pondremos todo lo que hemos aprendido hasta ahora y ya con esto terminamos el cap1 y despus si nos dedicaremos algunos de los mdulos del psoc, porque lo hecho hasta ahora tambin lo puede hacer un PIC.

12 Alexander Senz U.

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

El ejemplo consiste; con un dipswitch de 3 posiciones hacer con cada switch: 100 Encender un led y este dure encendido cada 0.5 segundos. 010 Publicar texto en el LCD (PrString y PrCString). 001 Publicar integer y float en el LCD. Crear un nuevo proyecto con el nombre ej1 y configurar en el GPIO:

-DIP1/2/3 fueron los nombre que yo le quise asignar a cada bit de puerto 0 respectivamente. -StdCPU significa que lo vamos a controlar desde cdigo a ese pin. - High Z significa que es una entrada Digital Strong significa que es una salida Digital Ahora sacamos (doble clic) el mdulo del LCD que est en (mdulos de usuario)

13 Alexander Senz U.

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

Despus del doble clic, seleccionar el mdulo recin plasmado al proyecto:

Esto con el fin de que nos deje ver las propiedades de este mdulo:

Y cambiar a:

Con esto hacemos que el LCD quede ubicado en el puerto 1, por pura curiosidad hacer doble clic en Pinout y observar la distribucin de pines que acabamos de hacer, para regresar al nuestro espacio de trabajo hacer doble clic en chip. Antes de escribir el cdigo quiero que vean como es la distribucin de pines del LCD de una forma ms clara entonces hacer clic derecho en LCD_1 y seleccionar datasheet luego dar cualquiera de las tres opciones que aparece; ya entonces nos muestra el datasheet del LCD y la distribucin de pines la cual se ve de manera ms clara y es la que siempre yo utilizo de gua para hacer mis montajes con LCD. Agregar los archivos "puertos.h", delay.h, delay.asm en el directorio raz del proyecto en una carpeta llamada lib, en mi caso fue: D:\\Ej1\Ej1\Ej1\lib
14 Alexander Senz U.

Cap1 Introduccin al entorno de trabajo, Manejo de Entradas/Salidas, Retardos por Software y LCD.

Y ahora se procede SOLO para delay.asm de la siguiente manera: -Abrir la hoja para escribir cdigo (main.c). -Seleccionar ProjectAdd File y abrir delay.asm el que acabamos de copiar en la carpeta lib. Ahora si escribir el cdigo:
#include <m8c.h> // part specific constants and macros #include <stdlib.h> //---------------------------------------------------------------------------... ABRIR EL PROJECTO EJ1 QUE HE ENVIADO AL FORO EL CUAL TIENE ESTE EJEMPLO COMPLETO Y LOS ARCHIVOS DELAY.ASM, DELAY.H Y PUERTOS.H QUE HE MENCIONADO, ALL EST EL CDIGO, QUE NO COMENTARIE MUCHO YA QUE ES SENCILLO,

Bueno por fin queda concluido este cap1 que es la introduccin esperando ser claro con lo que digo, pero eso si hay que tener en cuenta los prototipos de las funciones esto lo digo porque escrib ejemplos con punteros otro no mejor dicho yo supongo que saben algo de punteros :--), y para todos, si hay algn error avisar en el foro. Con este captulo estoy seguro que es suficiente para que empiecen averiguar ms, pero con este contenido bsico no he tenido la necesidad de utilizar ms cosas en mis proyectos, porque lo que viene que son los mdulos se trata es de hacer la parte electrnica desde hardware y no por software, Pongo un ejemplo; el retardo que hicimos con la funcin Delay50uTimes() es por software y puede fallar ya que depende de la velocidad del procesador u otros motivos, pero esto mismo lo podemos hacer con un mdulo timer el cual si es preciso . nos vemos en la otra entrega. Aaaa por ltimo quiero que vean solo la polarizacin del psoc

El pin 14 y 9 van a GND y el 28 va +5vdc, el resto el de color rojo, verde despus lo veremos.
15 Alexander Senz U.

S-ar putea să vă placă și