Translate

Mostrando entradas con la etiqueta pic18f4520. Mostrar todas las entradas
Mostrando entradas con la etiqueta pic18f4520. Mostrar todas las entradas

miércoles, 4 de marzo de 2009

Interacción del Usuario via Terminal Parte II

Hola, después de una larga ausencia continuamos con la segunda parte de la interacción del usuario y el PIC vía terminal. Esta vez vamos a configurar la hora y fecha, recibeindo los datos via el puerto serie.

Seguiremos usando como base el código anterior, solo añadiremos unas funciones necesarias; la primera es la siguiente:

void flush_buffer(void)
{
if ( RCSTAbits.OERR ) // Si se activa el bit de overflow
{
RCSTAbits.CREN=0; // toggleo de CREN para limpiar le buffer
W= RCREG; // flush del registro
W= RCREG;
W= RCREG;
RCSTAbits.CREN=1; // toggleo de CREN
}

}

Esta función es necesaria ya que el buffer de recepcion de los PICs fácilmente se llega a llenar y ocurre desbordamiento ocasionando un mal funcionamiento en la recepcion de datos. El bit 4 del registro RCSTA -registro encargado de la configuracion RX serial- es el OERR, este bit indica si existe un desbordamiento en el buffer cuando esta en estado alto.  Cuando dicho bit esta en estado alto es necesario vaciar el buffer de recepción y esto se logra haciendo un toggle en el bit CREN que es el que recibe. Es por esto que esa función es llamada antes de recibir algo para asegurar la integridad de los datos.

La segunda función añadida es:

unsigned char user_data(void)
{ unsigned char link[2]; // array para datos de usuario 

  while(!DataRdyUSART()); // esperamos caracter de usuario  
  getsUSART(link,2); // Obtenemos el dato del usuario
  return atoi(link); // convertimos los caracteres en byte
}

La cual nos sirve para obtener los datos del usuario a través del puerto serie. Para ello usamos una funcíon de la librería usart.h: getsUSART(cadena, longitud); Esta funcion lleva como parametros la cadena donde sera guardados los datos y la longitud de estos datos. Es decir, esta funcion es útil para recibir una cadena de caractéres cuando conocemos su longitud y como nosotros recibimos solamente 2 caracteres que equivalen a los dato de fecha y hora nos viene como anillo al dedo.

Asi pues recibimos 2 caractéres que son guardados en la variable LINK que es un array de 2 posiciones, posteriormente convertimos la cadena en un byte para poder trabajar con él. Recordemos que lo que viene del puerto serie son asciis y no bytes. Una vez que se realiza la conversion se retorna el valor convertido para su uso posterior.

Otra función agregada es:

unsigned char DEC2BCD(unsigned char aux)  

aux += (aux/0x0A)*0x06; // Procedimiento para convertir a BCD
return aux; 
}

Esta función es la que nos ayuda a pasar los datos recibidos desde el puerto serie a codigo BCD o HEX para poder escribir correctamente el RTC, si no usamos esta función los datos escritos en el RTC serían incorrectos pues recordemos que se escribe en HEX los registros del RTC. Esta función es un regalito de ANDRE LUIZ del foro de C18 de Microchip. Nunca dejen de buscar ahí, generalmente lo que deseamos alguien más ya lo ha hecho.

Y aquí esta el código que se utilizo para este fin, queda como tarea pendiente asegurar los máximos números de la hora y fecha; ademas de programar la eeprom del PIC para que una vez que ha sido grabado el RTC no nos ida de nuevo la configuración y esto puede servir para un mini-datalogger añadiendo una EEPROM al bus I2C.




domingo, 4 de enero de 2009

Usando un LCD

Al programa anterior le vendría bien mostrar el valor del ADC sin usar un PC, para ello podemos usar un LCD de 16x2.


Para este fin será necesario usar la libreria xlcd.h,  esta se encarga de mostrar los textos por nosotros. Esta librería posee varias funciones, pero nosotros nos enfocaremos especifcamente en 3 de ellas: openXLCD(); putrsXLCD(); putsXLCD;


Antes de empezar a usar esta función es necesario hacer unos cambios a la librería, pero antes debemos pasarla a nuestra carpeta de proyecto.


Lo primero sera copiar la librería que se encuentra en Directorio_de_instalación\MCC18\h\xlcd.h a nuestra carpeta en mi caso será E:\Microchip Solutions\Proyectoblog\h\xlcd.h.


Después de eso copiaremos los archivos fuente de la libreria que se encuentran en Directorio_de_instalación\MCC18\src\extended\pmc\XLCD\*.c  a la carpeta de nuestro proyecto en nuestro caso será E:\Microchip Solutions\Proyectoblog\src\XLCD\ Nos aseguramos de copiar todos los archivos *.c a nuestra carpeta de proyecto.


Esto se hace para respaldar la libreria original y realizar modificaciones sin moderación alguna en nuestro proyecto, así evitamos daños a la librería original.


Posteriormente debemos configurar nuestro proyecto para que compile desde nuestra ruta la librería recien copiada. Para ello accedemos a Menú Project--->Build Option-->Project y se abrira la siguiente ventana:



Daremos click en la opción Show directories for  y posteriormente en Include search path:



Eliminaremos el path default y añadimos uno nuevo con nuestra ruta.

Posteriormente vamos añadir las fuentes de la librería, esto lo hacemos dando click derecho sobre la carpeta de y click en add:



Y seleccionaremos todos los archivos en ..\src\XLCD\  Por último añadimos el Header xlcd.h con el mismo procedimiento.


Ahora que ya tenemos preparado el entorno de trabajo lo primero que vamos a hacer es modificar la libreria para poder usar el LCD en el PORTD a 4 bits para eso abrimos el archivo xlcd.h  dando doble click. Una vez abierto es muy sencillo ya que esta completamente comentado los modos de trabajo asi que para nuestro ejemplo el archivo queda de la siguiente forma. Ubicamos esta porcion de codigo en la librería:



En este caso la librería ya fue editada para que trabaje como deseamos, pero es tan transparente que es bastante sencillo poder modificarla para llevarla a otro puerto del PIC.


Una vez que hemos modificado nuestra librería a nuestro gusto podemos empezar a programar. La idea es mostrar un mensaje incial, despues presionar el boton y mostrar el valor del ADC tanto serialmente como en el lcd, podemos basarnos en el siguiente codigo:



Como podemos apreciar en el código las funciones de la librería xlcd.h  que mas usamos fueron: openXLCD(); putrsXLCD(); putsXLCD;


openXLCD(); Sirve para incializar el LCD con los argumentos de 4bits y el tamaño de cada caracter. Una vez que se llama esta función es necesario añadir 3 pausas para inicializar el LCD, estas pausas estan debajo del alias de nuestro botón.


putrsXLCD(); Sirve para poner una cadena de texto desde la memoria de nuestro programa.


putsXLCD; Sirve para poner una cadena de texto desde la memoria de datos, estas dos funciones se implementaron en una funciçon que cree para poder usar el mismo comando sin atascar la memoria del PIC con la función writeLCD.


El circuito propuesto para este programa es el siguiente:



Y el video de la simulación: