Capítulo 5 - bibing.us.esbibing.us.es/proyectos/abreproy/11175/fichero/vol1%2Frv_T5_Software... ·...

33
Capítulo 5 Indice 1. Compiladores de C para microcontroladores Avr _______________________Pág. 69 1.1. Comparativa de Compiladores y Razones de Elección 2. El Entorno de Desarrollo Software (EDS) Utilizado _______________________ Pág.72 2.1. Descripción del EDS 2.2. Instalación del EDS 2.3. Utilización del EDS 2.4. Particularidades del código C para microcontroladores 2.5. Configuración y Utilización de periféricos 2.6. Proceso para la programación del microcontrolador 3. Módulos del programa del registrador ________________________________ Pág. 80 3.1. Enumeración de los Módulos del Programa 3.2. Configuración de los Pines de E/S de propósito general 3.3. Módulos de la Pantalla LCD 3.4. Salvado de datos en la Dataflash 3.5. La memoria EEprom 3.6. Conversión de Datos de 8 bits a 16 bits 3.7. Comunicación por el Puerto Serie a través de la UART 3.8. Modos de Ahorro de Energía 3.9. Captura de la señal analógica procedente del sensor El Software Resumen del Capítulo Este capítulo se centra a la parte en la que se invirtió más tiempo de ejecución en el proyecto, que es la parte de la programación del sistema electrónico de registro de datos. En él se comienza haciendo una comparación de los distintos compiladores de C para microcontroladores Avr de que se dispone en el mercado, y una vez elegido el Gnu-Gcc, se describe el entorno de desarrollo software utilizado, y se dice cómo instalarlo y utilizarlo eficientemente. Por último se describen los módulos que forman el programa del registrador de datos.

Transcript of Capítulo 5 - bibing.us.esbibing.us.es/proyectos/abreproy/11175/fichero/vol1%2Frv_T5_Software... ·...

Capítulo 5

Indice

1. Compiladores de C para microcontroladores Avr _______________________Pág. 691.1. Comparativa de Compiladores y Razones de Elección

2. El Entorno de Desarrollo Software (EDS) Utilizado _______________________ Pág.722.1. Descripción del EDS

2.2. Instalación del EDS

2.3. Utilización del EDS

2.4. Particularidades del código C para microcontroladores

2.5. Configuración y Utilización de periféricos

2.6. Proceso para la programación del microcontrolador

3. Módulos del programa del registrador ________________________________ Pág. 803.1. Enumeración de los Módulos del Programa

3.2. Configuración de los Pines de E/S de propósito general

3.3. Módulos de la Pantalla LCD

3.4. Salvado de datos en la Dataflash

3.5. La memoria EEprom

3.6. Conversión de Datos de 8 bits a 16 bits

3.7. Comunicación por el Puerto Serie a través de la UART

3.8. Modos de Ahorro de Energía

3.9. Captura de la señal analógica procedente del sensor

El Software

Resumen del Capítulo Este capítulo se centra a la parte en la que se invirtió más tiempo de ejecución en el

proyecto, que es la parte de la programación del sistema electrónico de registro de datos. En él se comienza haciendo una comparación de los distintos compiladores de C para microcontroladores Avr de que se dispone en el mercado, y una vez elegido el Gnu-Gcc, se describe el entorno de desarrollo software utilizado, y se dice cómo instalarlo y utilizarlo eficientemente. Por último se describen los módulos que forman el programa del registrador de datos.

Capítulo 1 Motivaciones del Proyecto

1. Compiladores de C para microcontroladores Avr

1.1. Comparativa de Compiladores y Razones de Elección Dadas las características del código que de deseaba implementar (no

requiere tiempo real y si versatilidad) de optó por utilizar un lenguaje de alto nivel C para la escritura del código del programa que correrá en el microcontrolador..

Dicho código es más versátil porque es más cómodo de programar y porque las modificaciones en él son más fáciles de realizar dado que es un lenguaje de más alto nivel.

Una característica que hace que los microcontroladores Atmel estén especialmente indicados para su programación con el Lenguaje C es que están diseñados y optimizados para su programación en C, y por ello presenta características tales como 32 registros acumuladores de uso general que le dan una gran libertad a los compiladores de C a la hora de compilar el código de C a ensamblador. Esta característica es de vital importancia ya que

A la hora de escoger un compilador disponemos de múltiples opciones disponibles:

• Codevision AVR

• Gcc-Avr

• ImageCraft Compiler

• IAR Embedded Workbench

• Otros

De estos 4 destacados el único que no es un producto comercial el es GCC-AVR, que se trata de un programa bajo licencia de Software Libre y de Libre Distribución y uso. El resto son programas cuya licencia pueden llegar a costar en su configuración básica 1.200€, como es el caso del compilador IAR.

Pasemos a enumerar las característica de cada uno de ellos:

CodeVision AVR El entorno IDE (Integrated Development Environment) es amigable y muy

fácil de usar.

69

Capítulo 1 Motivaciones del Proyecto

Está basado en proyectos, e incluye un generador de código automático llamado Codewizard AVR que genera todo el código necesario para la inicialización de los periféricos internos de los microcontroladores AVR, así como de algunos periféricos externos (usando librerías que también incluye). Dichas librerías dan soporte a un gran número de aparatos frecuentemente usados como son pantallas LCD, Relojes de Tiempo Real RTC, sensores de temperatura, la UART, el SPI, etc...

Codevision dispone también de un programa terminal que puede enviar y recibir archivos y también visualizar los datos recibidos o enviarlos en hexadecimal o ASCII.

GCC-AVREl compilador GNU para AVR es una versión del popular

compilador GNU C a la plataforma AVR.

Se ejecuta sobre MsDos o una consola MsDos bajo Windows32, o bajo Linux.

GCC-AVR no dispone de un entorno IDE (Entorno de Desarrollo Interactivo) o las herramientas que acompañan a

los otros compiladores. ES tan sólo un compilador C. Sin embargo, la Distribución WinAvr dispone de herramientas de este tipo, aunque no del IDE, ya que si bien el programa Programmers Notepad es un potente editor de código, no tiene la integración y especialización necesaria como para considerarlo un IDE propiamente.

En cualquier caso este compilador dispone de una gran ventaja sobre el resto de compiladores, y es que es completamente gratis y su código fuente está disponible en sourceforge.com bajo licencia de software libre.

GCC-AVR, como todos los compiladores GNU se suministra con el programa estándar de Unix make, usado para construir (build) los proyectos.

Pero aunque un en este compilador no dispone de un IDE, el programa de Atmel AVR Studio v3.28 puede ser utilizado como IDE para cualquier compilador basado en línea de código, y dicho AVR Studio incluso dispone de resaltado de código. Esto soluciona el problema prácticamente, aunque sigue habiendo la necesidad de gestionar los archivos makefile, aunque la mayoría de los usuarios pueden hacerlo sin problemas.

Es de resaltar que las actuales versiones de AvrStudio v4 en adelante no permiten la utilización de GCC, por tanto sólo se recomienda la versión v3.28.

No obstante, aunque AvrStudio puede utilizarse para la edición del código, el citado Programmers Notepad tiene unas opciones de resalado de código más potentes.

70

Capítulo 1 Motivaciones del Proyecto

IAR Embedded Workbench V4.12 for Atmel AVRSin duda es el compilador de más potencia, con más herramientas, más

profesional y que genera un código más eficiente, aunque por supuesto también es más caro (1.200€ por licencia)

• Posee un IDE con editor y herramientas de gestión del proyecto.• Genera un código muy optimizado que genera el mínimo número de instrucciones en ensambaldo una vez compilado, soportando C y C++• Incorpora archivos de configuración de los periféricos para AVR Classic, Atmega, incluyendo sus periféricos internos•Con soporte para el depurador JTAG ICE mkll• Dispone de librerías de funciones en tiempo real• Depurador C-SPY con simulador AVR y soporte para Hardware de depuración de Sistemas en Tiempo real RTOS-aware.• Proyectos de ejemplo AVR y plantillas de código• Guías de usuario y ayuda online

ImageCraft C CompilerEs un compilador totalmente compatible con ANSI C.

ImageCraft es una empresa muy asentada en el campo de los compiladores para arquitecturas con microcontroladores desde 1994 (tiene compiladores para Motorola 68HC11, Atmel AVR, PsoC, y otros)

El entorno IDE es muy fácil de usar. Está orientado a proyectos, e incluye un generador de código automático llamado Application Wizard que genera el código de inicialización para los periféricos internos de los microcontroladores AVR. Así pose librerías que dan soporte a periféricos como UART, SPI, EEPROM y también a funciones de comprobación de la pila.

71

Capítulo 1 Motivaciones del Proyecto

2. El Entorno de Desarrollo Software (EDS) Utilizado

2.1. Descripción del EDSEl entorno de desarrollo del AvrButterfly utilizando en compilador GNU

GCC está formado básicamente por dos programas:

La distribución WinAvr, que es una recopilación de programas de software libre diseñados para facilitar las tareas de programación y desarrollo de los microcontroladores Avr.

Dicha distribución WinAvr incorpora además del compilador gcc de consola, un editor de texto especialmente diseñado para ayudar al programador y hacer el código más legible mediante su resaltado con colores.

El programador vía puerto serie mprog.exe, que permite transferir el programa compilado, que se encuentra en un archivo llamado main.hex, a la memoria flash del microcontrolador utilizando únicamente un cable de tres líneas.

2.2. Instalación del EDS

Instalación de WinAvrLa distribución WinAvr surge como una iniciativa para impulsar el

desarrollo de software libre en el campo del desarrollo de los microcontroladores Avr de Atmel, a la vez de facilitar a sus potenciales usuarios el conocer la existencia de tales herramientas, y no sólo las más famosas, y también facilitar su actualización. Es por ello que dicho paquete de software incorpora no sólo dichas herramientas, sino además unos ficheros de ayuda y de descripción de cada una de las utilidades. Por supuesto, el soporte técnico es mayor según la herramienta tenga más importancia.

Como hemos dicho, WinAvr instala automáticamente Programmers Notepad como editor de código, por lo que tan sólo necesitaríamos configurarle unos detalles a este último para mejorar su rendimiento (y esta es una aportación original de este proyecto).

Instalación de mProg.exeLa distribución WinAvr incorpora todo lo necesario para la programación de los microcontroladores Avr, incluyendo un programa similar al mprog.exe, pero dado que este último tiene un interfaz de ventanas de Windows, y el que

72

Capítulo 1 Motivaciones del Proyecto

trae la distribución es en modo comando, se prefirió la utilización del original de Atmel. Para cuya instalación hubo que instalar la suite de desarrollo de Atmel AvStudio, que lo incluye.

Configuración Óptima de Programmers NotepadAdemás con macros diseñadas para que pulsando un botón se

a) Configurar los estilos de texto para una fácil programación A la hora de programar el código que se desea desarrollar, Programmers

Notepad 2 presenta una característica que hace el código mucho más legible que el editor Notepad de Windows, y aunque se necesitan unos minutos para configurar el entorno gráfico con este aspecto, merece la pena completamente.

Para configurarlo es necesario ir a la Barra de Menús de "Programmers NotePad2" y elegir:

----->/Tools/Options/

----------> Hacer Click en Styles/

-----------------> Base Style Settings: Font: Bitstream Vera Sans Mono Size: 10 (esta fuente de letra es altamente recomendable, al ser de libre distribución, y equiespaciada)

----------> Hacer Click en Styles/Schemes/

-----------------> Seleccionar el esquema (Scheme): C/C++ e insertar posteriormente los siguientes valores:

b) Teclas de Acceso directo

73

Style Text Colour BackGround FontStyleDefault Black White(default)

Default WhiteSpace

Black White (default)

Comment Green

Comment Line Green

Number DarkGreen

KeyWord Indigo

String Dark Green Bold & Italic

Character Sea Green

Operator Blue Bold

Identifier DarkGreen PaleYellow Bold

EndOfLineString

Doc Comments Black BrightGreen(fill to end of line)

/** */

UUID BrightGreen Bold //

Preprocessor Bold #define

Verbatim DarkRed Bold

Coment Line Doc

Green Lavender(fill to end of line)

///

Tabla 1: Configuración utilizada Estilos de Resaltado de Código del Programmers Notepad

Capítulo 1 Motivaciones del Proyecto

El programa Programmers NotePad tiene algunas teclas de acceso directo de gran utilidad, que merece la pena conocer cuando se emplea como sistema de desarrollo y por consiguiente vamos a utilizar exhaustivamente:

2.3. Utilización del EDS

Configurar el archivo makefilePara hacer una compilación del proyecto en el que trabajamos, es necesario

crear y configurar adecuadamente un archivo llamado makefile, que se encuentra en el mismo directorio de nuestro proyecto, y que contiene la información general del proyecto, como es el modelo de microcontrolador para el que se va a compilar el proyecto, y los archivos de código *.c que lo conforman, además del main.c.

Para facilitar esta tarea, WinAvr dispone de un programa especial de configuración de makefile, que permite su creación en un entorno de ventanas de Windows con cajas deslizantes de opciones, y espacios para rellenar con el listado de archivos del proyecto. No obstante, también se puede coger un archivo makefile de un proyecto y modificarlo, lo cual es bastante simple.

A continuación se muestra un extracto del principio del archivo makefile, que es la parte más importante que hay que configurar:

# -*- makefile -*-## On command line:## make all = Make software.## make clean = Clean out built project files.## make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB).## make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio# 4.07 or greater).## make program = Download the hex file to the device, using avrdude. Please# customize the avrdude settings below first!## make filename.s = Just compile filename.c into the assembler code only## To rebuild project do "make clean" then "make all".#

# MCU nameMCU = atmega169

# Output format. (can be srec, ihex, binary)FORMAT = ihex

74

Teclas AcciónCtrl+F2 Crea una marca de referencia para poder desplazar la pantalla a

ese punto rápidamente (estas marcas de referencia no se guardan en ningún archivo, por lo que al salir del programa se desaparecen)

F2 Salta a la siguiente marca de referencia creada

Ctrl+Tab Cambia de una pestaña de código de una archivo a otra.

F4 (hay que definirlo) Borra los archivos de salida de la compilación anterior

F5 (hay que definirlo) Guarda los archivos del proyecto definidos en el makefile y realiza la compilación de éstos, de acuerdo con los parámetros de makefile.

Tabla 2: Combinaciones de Teclas de Acción Directa en Programmers Notepad

Capítulo 1 Motivaciones del Proyecto

# Target file name (without extension).TARGET = main

# List C source files here. (C dependencies are automatically generated.)SRC = $(TARGET).cSRC += timer0.c \timer1_sound.c \timer2_RTC.c \powersave.c\system_clock.c\LCD_functions.c \LCD_driver.c \menu_date_time.c\menu_comm.c \menu_ADC_sensors.c\usart.c \eeprom.c \dataflash.c \button.c \BCD.c \conversions16b_8b.c\ADC.c \ram_atmega.c\windspeed.c

# Compiler flag to set the C Standard level.# c89 - "ANSI" C# gnu89 - c89 plus GCC extensions# c99 - ISO C99 standard (not yet fully implemented)# gnu99 - c99 plus GCC extensionsCSTANDARD = -std=gnu99

[...]

Programar Código C usando Programmers Notepada) Aspecto del Editor

El editor dispone de una pestaña lateral en la que podemos agregar los archivos de que está compuesto el proyecto, tal y como podemos ver en la figura 1. Esta lista no tiene efectos a la hora de compilar , siendo únicamente válida la lisa de archivos que se encuentra en el archivo makefile, pero sí hace más fácil la edición de múltiples archivos, o la búsqueda de términos léxicos el todo el proyecto.

b) Resaltado de código

75

Figura 1: Aspecto del Entorno de Programación con Programmers Notepad

Capítulo 1 Motivaciones del Proyecto

Con el fin de hacer más cómoda la programación, Programmers Notepad posee un sistema de resaltado de código que es configurable por el usuario.

En la página 5 se muestra la tabla 1, con los valores con los que hay que configurar el programa para que el código tenga el aspecto deseado.

Así los comentarios tendrán diferente color según su contenido. Para ver los usos que se le da a cada color se recomienda ver el capítulo 6, “Listado de Código del Proyecto”.

c) Consejos para facilitar la programación Se pueden crear dentro de Programers Notepad unas teclas rápidas muy

útiles, como son F4=make clean y F5=make all.

También a la hora de probar partes del código, en lugar de borrarlo o comentar cada lína, se puede hacer lo siguiente:

Crear una línea que empiece por //*

y después del código que funciona (COD1) pero que queremos sustituir poner otra línea con /*/

Escribir el nuevo código(COD2) a partir de la línea siguiente y tras él crear una nueva línea con la cadena //*/.

De esta forma, tal y como está escrito, COD1 será compilado, y COD2 está comentado. Y cuando queramos lo contrario, sólo tendremos que quitar el la primera barra inclinada de la primera línea para que COD2 se compile y COD1 se comente, como se puede ver en a figura 2.

76

Figura 2: Ejemplo de comentarios de código que sirve para activar partes de código que se quieren probar sin borrarlas

Capítulo 1 Motivaciones del Proyecto

2.4. Particularidades del código C para microcontroladoresA continuación explicamos para qué sirven tres tipos de prefijos que se

ponen en las definiciones de ciertas variables y que tienen repercusiones importantes en el resultado final e la implementación del código en ensamblador: const, volatile y static.

const La definición “const” sirve para definir una cadena de caracteres utilizando

sólo memoria ROM del microcontrolador, en el caso del AtMega169, no memoria Rom, sin la memoria flash destinada al código de programa, que a todos los efectos cuando el programa está en funcionamiento es como si fuese memoria ROM.

Esta definición tiene utilidad cuando se necesitan muchas cadenas de caracteres o tablas que nunca van a ser modificadas. En ese caso no hay necesidad de malgastar memoria RAM almacenando cadenas constantes.

La forma más obvia de hacer esta declaración (aunque esta forma es incorrecta) sería:

#include <avr/pgmspace.h>PGM_P array[2] PROGMEM = { "Foo", "Bar"};

int main (void){ char buf[32]; strcpy_P (buf, array[1]); return 0;}

Pero el resultado de este código no es el que se buscaba.

De esta forma (incorrecta) obtendríamos una tabla de cadenas de caracteres almacenada en ROM, y una cadena individual almacenada en RAM (en la sección .data de la memoria).

Para obtener el resultado realmente buscado, se necesita un código así:#include <avr/pgmspace.h>

const char foo[] PROGMEM = "Foo";const char bar[] PROGMEM = "Bar";

PGM_P array[2] PROGMEM = { foo, bar};

int main (void){ char buf[32]; strcpy_P (buf, array[1]); return 0;}

donde PGM_P es una definición macro (macro definition) usada en lugar del siguiente código:

PGM_P == const prog_char *

Esta macro se usa para declarar una variable que es un puntero a cadena en el espacio de memoria destinada a memoria de programa:

#define PGM_P const prog_char *

77

Capítulo 1 Motivaciones del Proyecto

volatileLa definición de “volatile” se utiliza como prefijo para que el programa

reconozca que esa variable será actualizada mediante una rutina de interrupción.

Así, cuando se utiliza un optimizador, en un bucle como el siguiente:uint8_t flag;

... while (flag == 0)

{ ... }

el compilador tradicionalmente optimizaría el código de manera que ignoraría la condición dada por la bandera como siempre cierta, ya que daría igual, ya que analizando del código se observa que nada dentro del bucle puede cambiar el valor de la bandera.

Para decirle al compilador qe es una variable que puede ser modificada fuera del ámbito del análisis de la ruta de código (por ejemplo mediante una rutina de interrupción), la variable debe ser declarada tal que así:

volatile uint8_t flag;

staticLas variables definidas como locales a una función desaparecen al final de la

ejecución de dicha función. E manera que cuando se llama a esa función de nuevo, se crea un nuevo espacio de almacenamiento para esa variable y los valores son reinicializados. Así que si se pretende que el valor de una variable local se extienda y no se pierda de una llamada a otra de esa función a lo largo de un programa, se puede definir esa variable local como “static”.

La inicialización de las variables static se hace sólo en la primera llamada a la función que las contiene, y ene l resto de llamadas no se hace, y conserva el valor de la última llamada. La diferencia respecto de las variables globales es que las static sólo pueden ser accedidas dentro del ámbito de la función que las llama, y por tanto otras funciones pueden tener el mismo nombre de variable, sin que se interfieran unas con otras. Además esta particularidad ayuda para la búsqueda de errores, ya que la variable no puede ser modificada fuera de esa función, y por lo tanto allí es donde debe buscarse dicho error.

static char letra;

2.5. Configuración y Utilización de periféricos En entornos con IDE se dispone de generadores automáticos de código,

lamentablemente en gcc no se dispone de tal facilidad, aunque sí pueden encontrarse librerías de inicialización y manejo e determinados periféricos, pero siempre se ha de mirar da hoja de catálogo del microcontrolador para configurarlo adecuadamente.

No obstante en el presente proyecto se ha tenido especial cuidado en intentar hacer el proyecto lo suficientemente generalista como para que su código pueda ser reutilizado en otros proyectos con la placa AvrButterfly, y otras funcionalidades, razón por la cual se invirtió mucho tiempo es estructurar lo todo modularmente y por funcionalidades, tal y como se verá en el siguiente apartado.

78

Capítulo 1 Motivaciones del Proyecto

2.6. Proceso para la programación del microcontroladorPara programar el microcontrolador con el código de nuestro programa se

debe compilar dicho código haciendo:

• make clean = Realiza una Limpieza de archivos de una construcción del proyecto anterior.

• make all = Realiza una compilación del código del proyecto utilizando make.

• En este punto, en el directorio del proyecto se han generados dos archivos que son los que habrían de transferirse al microcontrolador, y que son main.hex y main.eep, archivos de memoria de programa y de memoria EEprom respectivamente.

• Para transferir dichos archivos hemos de ser muy meticulosos en el procedimiento, que que aunque es bastante simple, como se han de sincronizar el Pc con el AvrButterfly, hay que pulsar los botones en su momento justo. Por ello debemos poner especial en hacer lo siguiente:

• Alimentar con 3.3v la placa AvrButterfly

• Pulsar el botón de Reset (si la placa ya estaba alimentada, si la acabamos de alimentar no es necesario)

• Al mismo tiempo pulsar el botón Enter del Joystick (presionarlo hacia adentro) y Hacer doble click sobre el icono de mprog.exe (ejecutarlo).

• Si esto se hizo correctamente, y el cable que une PC y AvrButterfly está bien construido, entonces en la pantalla del PC deberá aparecer la ventana del programa mprog.exe donde hay un espacio para elegir el archivo main.hex que se desea transferir.

• Una vez elegido el archivo a transferir, sólo hay que pulsar el botón aceptar, para iniciar el borrado, la programación y la verificación de la correcta programación del sistema.

• Concluida dicho proceso, el programa nos dirá si culminó satisfactoriamente. En cualquier caso hay que cerrar la ventana del programa para poder continuar, y hay que reinicializar el microcontrolador forzando un Reset.

• Si todo se hizo correctamente, el sistema está programado.

79

Capítulo 1 Motivaciones del Proyecto

3. Módulos del programa del registrador

3.1. Enumeración de los Módulos del ProgramaEl programa del registrador de datos consta de los siguientes módulos

funcionales:

• El Módulo Principal (es un programa que se ejecuta constantemente y que cada vez que acaba vuelve a empezar, y desde él se activa el funcionamiento de los restantes módulos de programa (subprogramas) que a continuación listaremos).

• El Módulo de Manejo y especificación de las funcionalidades de los pines del microcontrolador y de la placa de desarrollo.

• El Módulos de Menús de Carga de funciones e Interacción con el usuario

• El Módulos de Gestión de Temporizadores, Reloj en Tiempo Real y modos de ahorro de energía

• El Módulos de Adquisición de Datos

• El Módulo de visualización de datos en el Display LCD de 6 dígitos del Butterfly

• El Módulo USART

• El Módulo de digitalización de señales analógicas

• El Módulo de manejo del Joystick

• El Módulos de Almacenamiento de Datos

• El Módulo de manejo de la DataFlash

• El Módulo de manejo de la EEprom

• El Módulos Auxiliares de conversión de formato de datos

• El Módulos de procesado estadístico de los datos del encoder (sensor de viento).

3.2. Configuración de los Pines de E/S de propósito generalA la hora de codificar una nueva aplicación para el AvrButterfly es

importante conocer qué pines están libres y pueden ser utilizados de propósito general. Esta característica, que parece una tontería, tienen especial importancia en la placa AvrButterfly porque la mayoría de sus pines se encuentran ocupados por la pantalla LCD de 22 pines, utilizando la funcionalidad del periférico interno del AtMega llamado LCDdriver .

Por ello, el uso de esta pantalla utilizando dicho driver limita muchísimo las aplicaciones posibles con el AtMega. Y puede suceder que se desee utilizar un

80

Capítulo 1 Motivaciones del Proyecto

periférico interno del AtMega como el Comparador Analógico y no se puede porque los pines de entrada de dicho periférico estén siendo utilizados con otra funcionalidad.

Por estos motivos se creyó de importancia el poder plasmar en el mismo código del programa, aunque sea como comentario, la situación del patillaje de la placa AvrButterfly. En la figura 3 se puede ver una captura de pantalla del aspecto del comentario que s encuentra en el archivo pin_management.h

3.3. Módulos de la Pantalla LCDPara el manejo de la pantalla LCD se utilizan dos archivos:

El de más alto nivel es LCD_functions, que son unas funciones genéricas para cualquier pantalla LCD en modo alfanumérico.

La funciones de más bajo nivel se encuentran el archivo LCD_Driver, que contiene funciones específicas para la pantalla LCD que posee de fábrica la placa AvrButterfly (en caso de poner otra pantalla habría que crear otras funciones).

Con las funciones que tenían implementados los controladores de la pantalla LCD únicamente se podían activar los seis dígitos alfanuméricos que aparecen en la figura anterior, dado que los dígitos que están en blanco no están conectados físicamente al periférico DriverLCD.

Sin embargo, pese a que la hilera de números y sus respectivos subrayados sí están conectados físicamente con dicho periférico, su activación no viene

81

Figura 4: Segmentos de la pantalla LCD que es posible activar

Figura 3: Listado de pines y esquema de su distribución con su configuración

Capítulo 1 Motivaciones del Proyecto

implementada en el programa controlador, por lo que se procedió a la elaboración de funciones que habilitasen dicha funcionalidad:

Ello se consiguió manipulando los registros de los segmentos LCD y dándole valores a los bits que no se usaban siguiendo un método de prueba y error.

Para ello se tuvo que hacer un estudio intensivo y algo de ingeniería inversa para conocer la funcionalidad de cada bit de dicho registro, que a continuación pasamos a describir:

Dicho registro lo interpretaremos como una tabla cuyas filas las denominaremos por LCDDRxx, y cuyas columnas las llamaremos por un número de bit (de 0 a 7).

Ahora se establecerá una correspondencia entre los bits de este registro y los segmentos de cada dígito del LCD (ver Figura 6): así pues

las columnas 0, 1, 2 y 3 se corresponden con segmentos de los dígitos 0, 2 y 4,y las columnas 4, 5, 6 y 7 se corresponden con segmentos de los dígitos 1, 3 y 5.

82

Figura 6: Registro de los segmentos LCD (en el periférico driver LCD)

Figura 5: Intefaz entre Bits del Registro LCD y segmentos del LCD

Capítulo 1 Motivaciones del Proyecto

Por poner un ejemplo de correspondencia, podemos decir que los segmentos que se corresponden con el dígito 0 son:

Segmentos especiales del LCDUtilizando la información de la figura 6, y contrastándola con la de la Tabla 3, y utilizando un procedimiento que inicialmente fue a prueba y error, ya que en ninguna hoja de catálogo venía especificado que los segmentos X e Y se pudiesen utilizar, se definieron unos nuevos segmentos especiales gráficos del LCD como son los números y los subrayados del Display que incorpora el AvrButterfly.

La información relativa a las máscaras y las funciones para la utilización de tales segmentos se puede encontrar en la sección de”Display LCD” del capítulo 6 “Listado de Código”.

De esta forma de pueden activar o desactivar individualmente los siguientes segmentos:

• los números 1,2 4, 5, 9 y 10,

• los subrayados 1,2,3,4,9,10, y

• el número 3 conjuntamente con el subrayado 5.

Nuevos Caracteres LCD Además, utilizando las posibilidades que permitían los segmentos alfanuméricos del LCD, se diseñaron nuevo caracteres para mostrar mejor la información de pantalla.

Así se crearon “m” , “/” y “s” para la información en m/s.

Y unos caracteres que simulan un rotor en movimiento para dar sensación de captura de datos.

Los resultados de estas definiciones se pueden ver en la tabla 4 de la página 16, en la que a partir de los segmentos de cada dígito del LCD, y haciendo una combinación de éstos combinándola en una máscara, se logran diseñar estos nuevos caracteres especiales.

83

Tabla 3: Ejemplo de correspondencia entre los segmentos del LCD del dígito 0 y los bits del registro de segmentos del LCD que le corresponden

Fila bit 3 bit 2 bit 1 bit 0

fila LCDDR1 SEG311(K) SEG310(X) SEG309(Y) SEG308(A)

fila LCDDR6 SEG211(L) SEG210(F) SEG209(H) SEG208(B)

fila LCDDR11 SEG111(L) SEG110(E) SEG109(G) SEG108(C)

fila LCDDR16 SEG011(M) SEG010(P) SEG009(N) SEG008(D)

Figura 7: Segmentos especiales del LCD

Capítulo 1 Motivaciones del Proyecto

84

Simbolo Máscara {MPND} {LEGC} {JFHB} {KXYA}

* 0xEAA8 1110 1010 1010 1000

/ 0x4008 0100 0000 0000 1000

\ 0x8020 1000 0000 0010 0000

m 0x2F00 0010 1111 0000 0000

s 0x9800 1001 1000 0000 0000

_ 0x1000 0001 0000 0000 0000

JPM 0xC080 1100 0000 1000 0000

GNK 0x2208 0010 0010 0000 1000

HPL 0x4820 0100 1000 0010 0000

GJM 0x8280 1000 0010 1000 0000

HKN 0x2028 0010 0000 0010 1000

JLP 0x4880 0100 1000 1000 0000

KGM 0x8208 1000 0010 0000 1000

NLH 0x2820 0010 1000 0010 000

Tabla 4: Nuevos caracteres alfanuméricos creados especialmente para este proyecto

Capítulo 1 Motivaciones del Proyecto

Por último en lo relativo al LCD se describen las funciones que se tienen en sendos archivos de programación del LCD:

Funciones deLCDDriver.h – Manejador del Display específico que incorpora el AvrButterfly

LCD_Init(); Inicializa la pantalla LCD y prepara para su usoLCD_WriteDigit(2); Escribe un carácter en uno de los seis dígitos del LCD//SIGNAL(SIG_LCD)--> LCD Interrupt Routine

LCD_Num1_On(); // ENCIENDE el Numero_1 del LCDLCD_Num1_Off();LCD_Led1_On(); // ENCIENDE el Led_1 del LCDLCD_Led1_Off()

Funciones de LCDFunctions.h – Funciones genéricas para cualquier Display con caracteres alfanuméricos.

void LCD_put_u8b (unsigned char data);void LCD_put_u16b (unsigned int data);

void LCD_puts_f(const char *pFlashStr, char scrollmode);void LCD_puts(char *pStr, char scrollmode);void LCD_putc(uint8_t digit, char character);Cuando se carga en ellos nuevos datos, sólo cambiarán los bytes especificados para que se sobreescriban, no viéndose afectados los restantes bytes por dicha acción.

void LCD_UpdateRequired(char update, char scrollmode);void LCD_Clear(void);void LCD_Colon(char show);void LCD_FlashReset(void);char SetContrast(char input);

Se evita hacer una descripción pormenorizada de las unciones debido a que en el listado de código del programa, en el capítulo 6, se comenta exhaustivamente el código diciendo en el encabezado de cada función cual es su funcionalidad.

85

Capítulo 1 Motivaciones del Proyecto

3.4. Salvado de datos en la Dataflash

Descripción del Funcional de la DataflashLa placa de desarrollo AvrButterfly incorpora

como ya hemos mencionado un dispositivo de memoria externa no-volátil con capacidad de 512KBytes y con comunicación a través del puerto SPI con el AtMega.

A la hora de implementar el software especial de manejo de este dispositivo externo es necesario saber algunas particularidades de su construcción herdware que a continuación se exponen:

El AT45DB041B incorpora dos buffers bidireccionales para expedir el flujo de datos hacia y desde el dispositivo.

Cada buffer tiene una longitud de 264Bytes (la misma longitud que las páginas en que está dividida la memoria).

Estos buffers son memoria static RAM (volátil) y confieren una especie de memoria caché durante una operación de programación o borrado.

Por lo tanto a la hora de almacenar o recuperar datos de la memoria Dataflash no-volátil, dicha información pasará por uno de estos buffers antes de transferirse al AtMega por el interfaz SPI.

Por ello se crearon tres capas de manejo cuyas funcionalidades son:

• la capa 1 que maneja el interfaz SPI,

• la capa 2 que gestiona la transferencia de datos entre el AtMega y uno de los buffers, y la transferencia entre uno de los buffers y el banco e memoria Dataflash.

• La capa 3 que maneja la Dataflash como si se tratase de una pila de almacenamiento de información en paquetes de 8 bits con índices totalmente transparente al usuario, que se limita únicamente a enviar o recibir datos, y la gestión de páginas es completamente automática.

86

Figura 9: Funciones de almacenamiento y estructura de la memoria DataFlash

Página 2047

263

dato8b

Buffer #20

263

8bits

Buffer Write Byte

Buffer Read Byte

Buffer_to_Page

dato8b

Buffer #10

263

8bits263

263

Página 00

263

8bits

2048 páginas Flash

Page_to_Buffer2 bufferssRAM

Figura 8: Dataflash AT45DB041B montada en la Placa AvrButterfly

SPI

Capítulo 1 Motivaciones del Proyecto

En la Tabla 5 se muestra las definiciones de las funciones de manejo de la Dataflash separadas por capas, en las que se puede apreciar los parámetros necesarios para la utilización de cada una.

Funciones de Escritura y LecturaComo ya hemos mencionado, las funciones de la capa 3 hacen una gestión

integral del almacenamiento y restaurado secuencial de datos en el dispositivo de almacenamiento no volátil. Estas funciones DF_Write8() y DF_Read8() almacenan o leen un Byte de información y preparan el sistema para que próxima vez que sean llamadas se se coloque la información en el Byte que secuencialmente se encuentra después, aunque se cambie del Byte último de una página de memoria al primer Byte de la siguiente página.

Pero los datos de memoria que se guardarán en este proyecto (y en general) serán de 16bits (2Bytes), y no de 8bits(1Byte) , por lo que se crearon unas funciones auxiliares que se utilizan en varias funciones de periféricos del código dedicadas a la conversión de datos de 8bits a datos de 16bits, y viceversa. Estas funciones de describen en el siguiente apartado (Conversión de Datos de 8 bits a 16 bits) de la pág. 22. Con lo cual para almacenar en memoria un dato de 16bits, sólo habría que llamar previamente a una de estas funciones y

Encapsulado de los datos para su almacenamientoA la hora de escribir los datos en la memoria Dataflash d almacenamiento

masivo no-volátil, se hace necesario un sistema que los ordene. Afortunadamente tanto el proceso de lectura como el de escritura son secuenciales (siempre se escribirán o leerán los datos de menor a mayor dirección de memoria), lo que facilita considerablemente la labor.

Por otro lado, aunque gracias a esta característica el problema se reduce, hay que considerar los distintos datos que se escribirán en dicha memoria, y que una vez escritos, al leerse debe saberse qué significan los bits que se tienen, es decir, se debe tener capacidad para interpretar los datos tras ser recuperados. Por ello se desarrolló la idea de almacenar los datos en paquetes o contenedores de información, cada uno de ellos con un código gracias al cual se conoce implícitamente su contenido y su longitud.

Así pues, para esta aplicación se diseñaron 4 tipos de contenedores:

Los que fijan una referencia temporal “fecha” (se escribe uno al día y tienen una longitud de 2Bytes)

Fecha [2B]0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

0 1 - - - Mes y dia (mes12,dia30=1230) [11b]

87

///Funcions Layer3:______________________________________________________unsigned char DF_Write8 (unsigned char BufferNo ,unsigned int *TopBuf ,unsigned int *PageNum ,unsigned char Data );unsigned char DF_Read8 (unsigned char BufferNo ,unsigned int *PageNum ,unsigned int *TopBuf ,unsigned int PageNumLP, unsigned int TopBufLP ,unsigned char *Data );

///Funcions Layer2:______________________________________________________void Buffer_To_Page (unsigned char BufferNo ,unsigned int PageAdr );void Page_To_Buffer (unsigned int PageAdr ,unsigned char BufferNo );void Buffer_Write_Byte (unsigned char BufferNo ,unsigned int IntPageAdr ,unsigned char Data );unsigned char Buffer_Read_Byte (unsigned char BufferNo ,unsigned int IntPageAdr );

///Funcions Layer1:______________________________________________________void DF_SPI_init (void);unsigned char DF_SPI_RW (unsigned char output );unsigned char Read_DF_status (void);

Tabla 5: Definiciones de las funciones de manejo de la Dataflash separadas por capas

Capítulo 1 Motivaciones del Proyecto

Los que fijan una referencia temporal horaria y registran la temperatura ambiente “Hora_Temp”(se escriben 24 al día y tienen una longitud de 2Bytes)

Hora Temp[2B]0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

1 0 crc Hora(0h,23h) [5b] Temperatura(-25º,+60º) [8b]

Los que fijan una referencia temporal implícita y registran los datos estadísticos eólicos correspondientes a un período de 10 minutos (la media, varianza y valor máximo d la velocidad del viento en ese período), recibe el nombre de “Datos” (se escriben 144 al día y tienen una longitud de 4Bytes)

Datos [4B]

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

1 1 crc Media [9b] Varian..

... varianza [9b] Valor_pico [9b]

Por último hay un paquete de datos que se ha dejado reservado para almacenar datos varios, y para futuras mejoras del sistema.

Especial [2B]0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

0 0 op op

Para el correcto manejo de todos estos paquetes, se crearon unas funciones de escritura y lectura que gestionan la memoria Dataflash en forma de paquetes, y sin las cuales, el contenido de dicha memoria se convierte en una ristra de Bytes sin sentido. Dichas funciones se encuentran en el archivo df_encapsulation.c

Las cuatro primeras funciones son de escritura de paquetes en la Dataflash, y las tres es una función de lectura que extrae los datos del los paquetes interpretándolos, devolviendo como salida el tipo de datos leído, y actualizando los parámetros de salida con los datos extraídos, de manera que según fuese el tipo de contenedor de datos se actualizan unos parámetros u otros, y después con una condición “if” se procesan únicamente lo datos que se extrajeron.

Capacidad de Almacenamiento de Datos EólicosPara determinar dicha capacidad, se han de hacer unos cálculos sencillos que

pasamos a enumerar:

Cada 10 minutos se almacena en memoria Dataflash un contenedor de datos[4B], por lo que cada día se registran:

4 BytesContenedor

⋅6 ContenedoresHora

⋅24 horasdia

=576 Bytesdia

Cada hora se guarda un contenedor de hora y de temperatura [2B]

88

//Funciones de ayuda a la escritura en el Paquetes DataFlash___________________ unsigned char DF_Write_Logs (uint16_t Data16_Mean, uint16_t Data16_Vari, uint16_t Data16_Peak);unsigned char DF_Write_Hour (void);unsigned char DF_Write_Date (void);unsigned char DF_Write_Wind (uint16_t Data16_Wind); //Paquete Especial

unsigned char DF_Read_Logs (uint16_t *Data16_Mean, uint16_t *Data16_Vari, uint16_t *Data16_Peak, uint8_t *vhora, uint8_t *vtemperat, uint8_t *DataType);

Capítulo 1 Motivaciones del Proyecto

2 BytesContenedor

⋅1ContenedoresHora

⋅24 horasdia

=24 Bytesdia

Cada día se almacena un contenedor registrando la fecha[2B]

2 BytesContenedor

⋅1Contenedordia

=2 Bytesdia

Luego cada día se almacenan:

∑ contenedoresdía

=576482=628 Bytesdía

Con lo que como la memoria Dataflash tiene 4Mbits de capacidad

4Mbits

8 bitsByte

= 512KBytes

puede almacenar

512KBytes

628 Bytesdia

= 815dias decapacidad=másde2años decapacidad

Además el intervalo de registro de los valores estadísticos de la media y la varianza puede ser con figurable:

3.5. La memoria EEpromSe trata de otro tipo de memoria no volátil, pero a diferencia de la DataFlash,

esta memoria es un dispositivo interno en el AtMega.

Para su utilización se ha estructurado en dos capas:

La capa 1 posee las funciones más básicas de manejo de la transmisión de la información a la EEprom, y son de bajo nivel.

La capa 2 utiliza las funciones de la capa 1 para realizar tareas más complejas, como la gestión da datos del número de página inicial, final y último utilizado de la DataFlash,

• DFSave_CtrlInfo ()

• DFSave_FP_Info ()

• DFLoad_CtrlInfo ()

y la gestión de varios arrays de información de longitud configurable destinados a guardar textos editables con el joystick del sistema como son el nombre del emplazamiento donde se situará al registrador de datos, un número de teléfono de asistencia técnica, o el nombre de la empresa instaladora.

• EE_Save_TableUint()

• EE_Load_TableUint()

89

Intervalo de Registro Bytes/dia Capacidad

Cada 10 minutos 576+48+2 628 Bytes/dia 815 dias = 2 años y 2 meses

Cada 5 minutos (2*576)+48+2 1205 Bytes/dia 424 días = 1 años y 2 meses

Cada 2 minutos (4*576)+48+2 2354 Bytes/dia 217 días = 7 meses

Tabla 6: Capacidades de Almacenamiento de Datos Eólicos según el período estadístico elegido.

Capítulo 1 Motivaciones del Proyecto

En la Tabla 7 se adjunta un Listado de funciones de manejo de la EEpromubicadas en el archivo eeprom.h

3.6. Conversión de Datos de 8 bits a 16 bitsEn distintas funciones del programa se hace necesaria la transferencia,

visualización o almacenamiento de datos de 16bits, mientras que la arquitectura del Avr es de 8bits, y por tanto las funciones estándar están adecuadas a ese ancho de datos. Por ello se hicieron necesarias estas dos funciones :

Conv16b_to_2x8b() convierte un dato de 16bits en dos datos de 8bits haciendo una copia del de 16bits, desplazando los bits de una copia 8 posiciones hacia el bit menos significativo, y haciendo un “cast” de ambas variables a 8bits. El diagrama conceptual del proceso se muestra en la Figura10.

Conv2x8b_to_16b() convierte dos datos de 8bits haciendo en un dato de 16bits tomando ambos datos, haciéndole un “cast” a ambos a “int”, desplazando el bit superior 8 posiciones hacia el bit más significativo, sumando de forma lógica ambas variables de 16bits. El diagrama conceptual del proceso se muestra en la Figura 11.

90

Figura 10: Conversión de un Dato de 16bits (2Bytes) a dos datos de 8bits (1Byte)

Data16

up down Data16

up down Aux16

up down

up up

igual

>>8 up

down

cast

cast

/// Function Prototypes:_(CAPA 2)__________________________________________unsigned char EEPROM_Read_Str(unsigned int EE_Start_adr, char *pBufferRam, char RAM_Max_num_bytes );void EEPROM_Write_Str (char *pBufferRam, unsigned int EE_Start_adr,

char EE_Max_num_bytes);

/// Funciones de Manejo de la informacion de control de la DataFlash mediante la EEPROM__(CAPA 2)__________________________________________________________void DFSave_CtrlInfo (unsigned int TopBufLP, unsigned int LastPage );

void DFSave_FP_Info (unsigned int FirstPage);void DFLoad_CtrlInfo (unsigned int *TopBufLP, unsigned int *LastPage,

unsigned int *FirstPage);

void EE_Save_TableUint(unsigned int *TablaUint, uint8_t iMax_Tabla);void EE_Load_TableUint(unsigned int *TablaUint, uint8_t iMax_Tabla);

/// Function Prototypes Special for atMega169:___(CAPA 1)__________________uint8_t EEPROM_Read8b (const uint16_t *addr);void EEPROM_Write8b (uint16_t *addr, uint8_t val);

Tabla 7: Listado de funciones de manejo de la EEprom ubicadas en el archivo eeprom.h

Capítulo 1 Motivaciones del Proyecto

Para probar el correcto funcionamiento de la librería creada, así como la librería de la DataFlash y la librería UART, se crearon múltiples versiones de un programa de ejemplo cuya funcionalidad era guardar en memoria Dataflash 1000 números de 16bits y ver el tamaño que ocupan en ésta, así como enviarlos vía uart para ver que se grabaron correctamente.

1000números x 2Bytes/num = 2000Bytes --> 7 páginas de 264 Bytes y1 página con 152Bytes (0-151)ocupados

En dichos programas se utilizaban intensivamente dichas funciones de conversión, ya que las transmisiones serie se hacían en modo carácter (8bits), y en la DataFlash se almacena la información en Bytes, por lo tanto en ambas se utilizaban conversiones de 16 a 8bits.

3.7. Comunicación por el Puerto Serie a través de la UART

Configuración y manejo de la UARTComo en anteriores periféricos, la estructura se organiza en varias capas, en

este caso en dos:

La capa 1 hace las funciones de más bajo nivel como son:

• la inicialización del periférico a la velocidad BaudRate deseada (esto es importante hacerlo bien, y configurar el sistema que esté al otro lado e la comunicación con el mismo BaudRate),

• La deshabilitación del periférico (esto es interesante para el ahorro de energía),

• y el envío y recepción de caracteres por el puerto serie, que es su principal cometido.

En la capa 2 se encuentran funciones más especializadas, como son:

• el envío de cadenas de caracteres leídas directamente de una zona de memoria Ram de datos, o bien en memoria Flash de programa,

91

Figura 11: Conversión de dos datos de 8bits (1Byte) a un Dato de 16bits (2Bytes) Data16

0000 down

0000 up up 0000 up up

Mask 0x00FF

<<8up8b

down8b

castcast

0000 down

up down

cast

OR

Mask 0xFF00

///___CAPA 1___________________________________________ void USART_Init(unsigned int baudrate);//Inicializa la UARTvoid USART_Close(void); //Deshabilita la UARTchar USART_Try2Rx(char *data); //Intenta recibir un carácter por Rs232void USART_putc(char data); //Envía un carácter por Rs232

Texto 1: Funciones de la Capa 1 de la USART

Capítulo 1 Motivaciones del Proyecto

• el envío de números enteros de 8bits, y de 16 bits

• el envío del valor de una velocidad del viento genérica ( con un formato de dos dígitos enteros y un dígito decimal 00.0m/s).

• el envío de datos correspondientes a la fecha (minuto, hora, día, mes, año).

• El envío del carácter nueva línea con el que el extremo receptor pasa a la línea siguiente si se encuentra en modo de “consola terminal”.

Volcado de datos y comunicación serie entre el analizador y el registrador

Como ya hemos indicado anteriormente, para que la comunicación sea efectiva, los sistemas que están a ambos extremos de ésta deben estar configurados con los mismos parámetros de velocidad y tipos de datos.

Para la comunicación entre el prototipo Rv1 y un Pc se los parámetro son:

En la Figura 12 se pueden ver los parámetros de configuración del sistema para configurar el programa Hyperterminal de Windows, pero para un mejor manejo de la comunicación se recomienda utilizar el programa Bray's Terminal, que es un programa gratuito, especialmente diseñado para hacer pruebas y probar la comunicación entre sistema, permitiendo el visionado de los datos tanto en hexadecimal, como en modo carácter, y que a lo largo del desarrollo del proyecto se pudo comprobar que es una buena herramienta de trabajo. En la Figura 13 se puede observar el aspecto de dicho programa , y las múltiples opciones que ofrece.

92

///___CAPA 2___________________________________________void USART_puts(char *pStr, uint16_t num_bytes);//envía una cadena desde RAMvoid USART_puts_f(const char *pFlashStr); //envía una cadena desde Flash

void USART_put_u8b(unsigned char Data_u8b); //envía enteros de 8bitsvoid USART_put_u16b(unsigned int Data_u16b); //envía enteros de 16bits

void USART_put_WSpeed(unsigned int Data_u16b); //envía datos d velocidad vientovoid USART_put_datetime(uint8_t Month,uint8_t Day,uint8_t Hour,uint8_t Minute);

void USART_NewLine(void); //envía el carácter nueva línea

Texto 2: Funciones de la Capa 2 de la USART

Figura 12: Pantalla de configuración del programa Hyperterminal de windows, con los valores empleados en la comunicación con el AvrButterfly

Capítulo 1 Motivaciones del Proyecto

Aunque para el desarrollo de funciones y visión de resultados las citadas herramientas de comunicación entre Pc y AvrButterfly son muy útiles, para la aplicación de volcado se buscaba una aplicación especialmente creada para ese fin. Por ello se desarrolló un programa creado con Visual C++ que al ejecutarse en el Ordenador Pc extrajese los datos del AvrButterfly y los almacenase en un fichero de texto.

En la Figura 14 se muestra el protocolo de comunicaciones que se diseñó para el programa consola de recepción de datos del Rv1 en el Pc.

Pero dicho programa se desarrolló para un entorno MsDos (porque minimizar el tiempo de desarrollo y acabar más rápido el proyecto), y la interacción con el usuario es muy pobre, por lo que dado que en sí dicho programa no es una especificación del proyecto, se decidió no adjuntarlo, y para la transferencia de la información se recomienda, para la versión prototipo, el Brays Terminal, ya que posee la opción de guardar los datos transmitidos en un fichero de texto, y como los datos que se envían desde el AvrButterfly vienen en el correcto orden, indentación con comas, y con saltos de línea, para el prototipo es más que suficiente.

93

Figura 13: Captura de Pantalla Bray's Terminal y fotografía de una sincronización usando dicho programa

Figura 14: Diagrama de comunicación entre Prototipo Rv1 y Programa de Volcado en PC

PC

Final de Txon

“#*#”= EOF

Ráfaga de 100 datos

Txon

Ráfaga de 100 datos

Empezar a TxirAVR

Capítulo 1 Motivaciones del Proyecto

3.8. Modos de Ahorro de EnergíaComo una de las especificaciones del proyecto es que tiene que tener una

autonomía mínima de 6 meses capturando datos y almacenándolos en memoria Flash, el ahorro de energía es un aspecto de importancia, y debe aplicarse siempre que se pueda.

Como puede verse en la Tabla 8,el AtMega169 tiene cinco modos seleccionables de ahorro de energía:

La elección del modo de ahorro de energía adecuado tiene bastante importancia, porque si hacemos una maa elección, por ejemlo, si estamos utilizando el timer0 para generar interrupciones con una cadencia determinada y al final del bucle infinito hacemos que entre en modo ahorro de energía “powersave”, dichas interrupciones cesarán hasta que se reactive el sistema a “active” con una interrupción de timer2 (RTC) ó con una del display o del joystick del aparato. Como lo que se desea es mantener la cadencia de interrupciones, la opción adecuada para ese ahorro de energía sería el modo “idle”, que no deshabilita el timer0, aunque según se puede ver en la Tabla 9, también el ahorro de energía es menor, pero es bastante mejor que no aplicar ningún modo de ahorro de energía.

94

Modo de Ahorro Mantiene Activo DeshabilitaIDLE - sRam

- Timer/Counters 0,1,2- Puerto SPI- Sistema de Interrupciones

Detiene a la CPU

ADC-NOISE REDUCTION Se usa para minimizar el ruido de conmutación durante als conversiones del CA/D.

- Timer2 Asíncrono(RTC) - Controlador LCD - ADC

Detiene a la CPU ytodos los módulos de Entrada/Salida

POWER-SAVESe usa para permitir al usuario mantener una base temporal a la vez de operar el DisplayLCD mientas que el resto del sisteam está dormido.

- Timer2 Asíncrono(RTC) - Controlador LCD

STANDBYPermite un encendido muy rápido combinado con un bajo consumo de energía

-Oscilador ce Cuarzo El resto del dispositivos están dormidos

POWERDOWN Salva al información de los registros, pero congela el oscilador, deshabilitando todas las dema´s funciones del chip hasta la siguiente inetrrupción o Reset Hardware.

Tabla 8: Características de los Modos de Ahorro de Energía del AtMega

Ahorro de Energía a 1Mhz, Vcc=3vMODE Icc (25ºC) %Ahorro

Active (pleno rendimiento) 0,700mA 0%

Modo “Idle” de Ahorro de Energía 0,370mA -47,2%

Modo “PowerSave” de Ahorro de Energía 0,006mA -99,1%

Tabla 9: Consumo Energético en los distintos modos de Ahorro de Energía

Capítulo 1 Motivaciones del Proyecto

Los valores de la tabla están extraídos de las gráficas de las figuras 15,16 y 17, en las que gráficamente se puede ver el consumo energético del AtMega169 dependiendo de la tensión de alimentación, para lso distintos modos de ahorro de energía.

95

Figura 15: Consumo Energético a pleno rendimiento del microcontrolador (ACTIVE)

Figura 16: Consumo Energético del AtMega169 en el modo IDLE de Ahorro de Energía

Figura 17: Consumo Energético del en el modo POWER-SAVE de ahorro de Energía

Capítulo 1 Motivaciones del Proyecto

3.9. Captura de la señal analógica procedente del sensor

El Convertidor Analógico Digital integrado en el ATmega169V

El CA/D es un periférico que debe ser comprendido bien para poder usarlo correctamente, y las diferentes opciones de configuración deben elegirse con cautela porque es difícil darse cuenta de dónde se ha cometido el error. Por ello es necesario antes de configurar el dispositivo hacer un estudio de la señal y determinar si es una señal flotante o a tierra, su amplitud máxima, y la rapidez de cambio de la señal. Por todo ello se ha creido necesario hacer un tutorial detallado que sirva de ayuda a a hora de determinar la configuración más adecuada para la captura de señales.

a) Modos de captura de señal del CA/D

Los Canales del Convertidor Analógico Digital (ADC) pueden configurarse de dos formas:

• Modo Diferencial

• Modo de terminación única

La elección de una configuración u otra debe depender de si la señal de entrada es flotante o está referida a tierra.

Una señal flotante es aquella que utiliza una referencia de tierra aislada y no estaría conectada al nivel de tierra de la placa. Como resultado, la señal de entrada y el dispositivo hardware no se conectan a la ninguna referencia común, lo cual puede provocar que la señal de entrada exceda el rango válido de tensiones del dispositivo hardware. Para evitar este problema, se debe conectar la señal a la tierra de la placa del dispositivo. Ejemplos de fuentes de señal flotantes son los termoacopladores sin tierra y baterías.

Una señal a tierra es aquella que se conecta a la tierra de la placa. Como resultado, la señal de entrada y el dispositivo hardware se conectan a una referencia común.

Ejemplos de señales a tierra son las salidas de instrumentación no aisladas y dispositivos conectados al sistema de alimentación de la placa del microcontrolador.

b) ADC configurado para Entradas Diferenciales Cuando se configura el ADC para entrada diferencial, hay dos cables de

señal asociados con cada canal de entrada (uno para el canal de entrada y otro para la referencia o retorno de señal). La medida es la diferencia en tensión entre las dos líneas, que ayuda a reducir el ruido y cualquier tensión no común a ambas líneas.

96

Capítulo 1 Motivaciones del Proyecto

• Según National Instruments, sería recomendable utilizar entradas diferenciales en los siguientes casos:

• Cuando la señal de entrada tiene un bajo nivel (menos de 1 voltio)

• Cuando los cables que llevan la señal tienen una longitud superior a 3 metros.

• Cuando la señal de entrada requiere un punto de referencia de tierra o un retorno de señal.

• Cuando los cables que transmiten la señal pasan a través de un entorno ruidoso.

c) ADC configurado para Entradas a Tierra Cuando se configura el hardware para entradas a tierra, cada señal de

entrada se conecta a la misma tierra. Por ello este tipo de ntradas son más vulnerables ante el ruido que las diferenciales (debido a las diferencias en los caminos de la señal).

d) Funcionamiento del ADC El ADC convierte una entrada analógica de tensión en un valor digital de 10

bits mediante aproximaciones sucesivas.

El valor mínimo adquirible viene dado por el valor de tensión que haya en la patilla GND, y el máximo por la tensión en la patilla AREF menos 1LBS(menos un bit menos significativo).

Opcionalmente, una tensión de referencia interna e 1.1V o la tensión de la patilla AVCC pueden conectarse al pin AREF escribiendo en los registros del ADMUX sobre los bits de REFSn.

En ese caso, la referencia interna de tensión debe desacoplarse mediante un condensador externo en el pin AREF para mejorar la inmunidad ante el ruido.

e) La Tensión de Referencia del ADC El voltaje de referencia del ADC (Vref) indica su rango de conversión.

Los canales “single ended” que exceden Vref dan como resultado valores de conversión cercanos a 0x3FF.

Vref puede ser selecciona de entre AVCC, referencia interna de 1.1V o el pin externo AREF.

AVCC se conecta al ADC a través de un interruptor pasivo.

La referencia interna se genera de una referencia de tensión “bandgap” Vgb

mediante un amplificador interno.

En ambos casos, el pin externo AREF se encuentra conectado directamente al ADC, y el voltaje de referencia puede hacerse más inmune al ruido conectando un condensador entre los pines AREF y tierra.

Vref puede también ser medido en el pin AREF con un voltímetro de alta impedancia. Es de observar que Vref es una fuente de alta impedancia, y sólo una carga capacitiva debe ser conectado e un sistema así.

Si se conectase una fuente de tensión constante al pin AREF, no se deberían usar las otras referencias de tensión en la aplicación, ya que serán cortadas por la tensión externa.

97

Capítulo 1 Motivaciones del Proyecto

Si so se aplicase una tensión externa al pin AREF, entonces se debe elegir entre AVCC o los 1.1V como tensiones de referencia. Después de conmutar la tensión de referencia, la primera medición de ADC será imprecisa, por lo que el usuario debe descartar dicho resultado.

f) El Preescalado y el Tiempo de conversión Por defecto, el circuito de aproximaciones sucesivas requiere la entrada de

una señal de reloj de entre 50kHz a 200kHz para obtener la máxima resolución. En caso de que se necesite una resolución mayor a 10bits, dicha señal de reloj deberá ser mayor de 200kHz para alcanzar una mayor tasa de muestreo.

El módulo de conversión Analógico-Digital contiene un preescalador que genera una frecuencia de reloj aceptable de cualquier frecuencia de CPU por encima de 100kHz.

Dicho preescalador puede configurarse con los bits ADPS en el registro ADCSRA. El preescalador empieza a contar desde el momento en el que el ADC es encendido mediante el bit ADEN del registro ADCSRA, y se mantiene en funcionamiento mientras éste se encuentre a 1, reseteándose cuando ADEN se ponga a 0.

Cuando se inicia una conversión “single ended” poniendo ADSC=1 en el ADCSRA, la conversión comienza en el siguiente flanco de subida de la señal de reloj del ADC.

La Captura de la TemperaturaPese a que finalmente la captura de la señal del anemómetro se ha hace con el Convertidor Analógico/Digital porque se cambió el sensor y se usó finalmente uno digital, la captura de la temperatura si se hace usando el mencionado CA/D.

Los parámetros del CA/D para la captura de la señal del Sensor de Temperatura con una configuración en Modo de terminación única y una resolución de 10 bits, y con el muestreo de señal realizado a la mínima frecuencia de muestreo posible en modo ráfaga.

La captura se realiza haciendo una ráfaga d conversiones A/D de 8 muestras, y promediando las (sumándolas y dividiéndolas entre 8), ya que como la temperatura es una magnitud con una inercia muy grande, al promediarla se está eliminando el ruido detectado en las conversiones.

98

Figura 18: Fotografía del sensor de temperatura del AvrButterfly (Resistencia Negativa de Tensión)

Capítulo 1 Motivaciones del Proyecto

99

Escuela Superior de Ingenieros de Sevilla www.esi.us.es

Avda.de los Descubrimientos,s/n 41092, Sevilla, España

Universidad de Sevillawww.us.esPaseo del Rectorado, s/nSevilla, España

Departamento deAutomática y Robótica

www.us.esAvda.de los Descubrimientos,s/nSevilla, España

José Juan López Ruiz www.josejuanlopez.xs3.com Sevilla, España

Agradecimientos Martin Thomas ,

Ingeniero de por la Universität Kaiserslautern Vertiefungsrichtungen, y programador de la portabilidad del código de demostración del AvrButterfly,escrito para IAR, al lenguaje C compatible con el compilador Gnu-Gcc.

Jörg Wunsch , experto en programación de microcontroladores Atmel, desarrollador del proyecto WinAvr con Gnu-Gcc, e incansable colaborador en el foro de avrfreaks, por su ayuda y orientación en la resolución de dudas relativas a la programación del AtMega169.

Alberto Prieto Löfkrantz, desarrollador en el pto. I+D de Indra Espacio,por su ayuda y orientación a la programación en el lenguaje C++ utilizado para la consola terminal del Pc utilizada para a transferencia de datos desde el Prototipo Rv1 al Pc.

Bibliografía del CapítuloReferencia Descripción Fecha

ATmega169V Reference Manual Ref. Doc: 2514I–AVR–10/03 (Documento Imprescindible)http://www.atmel.com

[CAD-01] Ayuda de Matlab para comprobación de funciones estadísticashttp://www.mathworks.com/access/helpdesk/help/toolbox/daq/c1_int13.html

[CAD-02] Ayuda sobre captura de señales y sobre entradas con resistencia Pull-Uphttp://www.iotech.com/sensors9712.html

[HLPC-01] [HLPC-02]

Ayudas para programar en Lenguaje C:http://www.drpaulcarter.com/cs/common-c-errors.php#2.3.2http://www.plethora.net/~seebs/faqs/c-iaq.html

AVR Butterfly Application code port to avr-gcc by Martin Thomas (Documento Imprescindible)http://www.siwawi.arubi.uni-kl.de/avr_projects/

Página de Ayuda al desarrollo de sistemas basados en microcontroladores Avr, y principal ayuda en la obtención de documentación para este proyecto (Documento Imprescindible)http://www.avrfreaks.com/

Comunidad y Foro de Dudas técnicas sobre programación de microcontroladores en GCC y dudas sobre diseño hardware.http://www.avrfreaks.com/forum Topics: Avr Butterfly Real Available Pins Timer0_callback funtion in AVR Butterfly Port with GCC ? “José Juan López” tiene en el foro el pseudónido de “sequan”

Página de Ayuda del compilador C para Avr utilizadoGNU GCC Compilerhttp://www.gnu.org/home.es.html

Otros Compiladores de C para microcontroladores Atmel Avr:IAR Embedded Workbenchhttp://www.iar.com/CodeVision C Compilerhttp://www.hpinfotech.ro/html/download.htmImageCraft C Embedded Compilerhttp://www.imagecraft.com/software/

WebRing (Enlaces relacionados) de AVRhttp://r.webring.com/hub?ring=avr