Documentos de Académico
Documentos de Profesional
Documentos de Cultura
El Software
Indice
1. Compiladores de C para microcontroladores Avr _______________________Pg. 69
1.1. Comparativa de Compiladores y Razones de Eleccin
Captulo 1
De estos 4 destacados el nico que no es un producto comercial el es GCCAVR, que se trata de un programa bajo licencia de Software Libre y de Libre Distribucin y uso. El resto son programas cuya licencia pueden llegar a costar en su configuracin bsica 1.200, como es el caso del compilador IAR. Pasemos a enumerar las caracterstica de cada uno de ellos:
CodeVision AVR
El entorno IDE (Integrated Development Environment) es amigable y muy fcil de usar.
69
Captulo 1
Est basado en proyectos, e incluye un generador de cdigo automtico llamado Codewizard AVR que genera todo el cdigo necesario para la inicializacin de los perifricos internos de los microcontroladores AVR, as como de algunos perifricos externos (usando libreras que tambin incluye). Dichas libreras dan soporte a un gran nmero de aparatos frecuentemente usados como son pantallas LCD, Relojes de Tiempo Real RTC, sensores de temperatura, la UART, el SPI, etc... Codevision dispone tambin de un programa terminal que puede enviar y recibir archivos y tambin visualizar los datos recibidos o enviarlos en hexadecimal o ASCII.
GCC-AVR
El compilador GNU para AVR es una versin 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 acompaan a los otros compiladores. ES tan slo un compilador C. Sin embargo, la Distribucin WinAvr dispone de herramientas de este tipo, aunque no del IDE, ya que si bien el programa Programmers Notepad es un potente editor de cdigo, no tiene la integracin y especializacin 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 cdigo fuente est disponible en sourceforge.com bajo licencia de software libre. GCC-AVR, como todos los compiladores GNU se suministra con el programa estndar 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 lnea de cdigo, y dicho AVR Studio incluso dispone de resaltado de cdigo. Esto soluciona el problema prcticamente, aunque sigue habiendo la necesidad de gestionar los archivos makefile, aunque la mayora de los usuarios pueden hacerlo sin problemas. Es de resaltar que las actuales versiones de AvrStudio v4 en adelante no permiten la utilizacin de GCC, por tanto slo se recomienda la versin v3.28. No obstante, aunque AvrStudio puede utilizarse para la edicin del cdigo, el citado Programmers Notepad tiene unas opciones de resalado de cdigo ms potentes.
70
Captulo 1
ImageCraft C Compiler
Es 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 fcil de usar. Est orientado a proyectos, e incluye un generador de cdigo automtico llamado Application Wizard que genera el cdigo de inicializacin para los perifricos internos de los microcontroladores AVR. As pose libreras que dan soporte a perifricos como UART, SPI, EEPROM y tambin a funciones de comprobacin de la pila.
71
Captulo 1
Instalacin de mProg.exe
La distribucin WinAvr incorpora todo lo necesario para la programacin 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
Captulo 1
trae la distribucin es en modo comando, se prefiri la utilizacin del original de Atmel. Para cuya instalacin hubo que instalar la suite de desarrollo de Atmel AvStudio, que lo incluye.
a) Configurar los estilos de texto para una fcil programacin A la hora de programar el cdigo que se desea desarrollar, Programmers Notepad 2 presenta una caracterstica que hace el cdigo mucho ms legible que el editor Notepad de Windows, y aunque se necesitan unos minutos para configurar el entorno grfico con este aspecto, merece la pena completamente.
Para configurarlo es necesario ir a la Barra de Mens 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 distribucin, y equiespaciada) ----------> Hacer Click en Styles/Schemes/
Style
Default Default WhiteSpace Comment Comment Line Number KeyWord String Character Operator Identifier EndOfLineString Doc Comments UUID Preprocessor Verbatim Coment Line Doc DarkRed Green Lavender (fill to end of line) Black BrightGreen BrightGreen (fill to end of line) Bold Bold Bold /// /** */ // #define
Text Colour
Black Black Green Green DarkGreen Indigo Dark Green Sea Green Blue DarkGreen
BackGround
White(default) White (default)
FontStyle
-----------------> Seleccionar el esquema (Scheme): C/C++ e insertar posteriormente los siguientes valores:
Captulo 1
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:
Teclas
Ctrl+F2
Accin
Crea una marca de referencia para poder desplazar la pantalla a ese punto rpidamente (estas marcas de referencia no se guardan en ningn archivo, por lo que al salir del programa se desaparecen) Salta a la siguiente marca de referencia creada (hay que definirlo) Borra los archivos de salida de la compilacin anterior (hay que definirlo) Guarda los archivos del proyecto definidos en el makefile y realiza la compilacin de stos, de acuerdo con los parmetros de makefile.
F2 F4 F5
make filename.s = Just compile filename.c into the assembler code only To rebuild project do "make clean" then "make all".
# MCU name MCU = atmega169 # Output format. (can be srec, ihex, binary) FORMAT = ihex
74
Captulo 1
# Target file name (without extension). TARGET = main # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c SRC += 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 extensions CSTANDARD = -std=gnu99 [...]
b) Resaltado de cdigo 75
Captulo 1
Con el fin de hacer ms cmoda la programacin, Programmers Notepad posee un sistema de resaltado de cdigo que es configurable por el usuario. En la pgina 5 se muestra la tabla 1, con los valores con los que hay que configurar el programa para que el cdigo tenga el aspecto deseado. As los comentarios tendrn diferente color segn su contenido. Para ver los usos que se le da a cada color se recomienda ver el captulo 6, Listado de Cdigo del Proyecto.
c) Consejos para facilitar la programacin Se pueden crear dentro de Programers Notepad unas teclas rpidas muy tiles, como son F4=make clean y F5=make all.
Tambin a la hora de probar partes del cdigo, en lugar de borrarlo o comentar cada lna, se puede hacer lo siguiente: Crear una lnea que empiece por //* y despus del cdigo que funciona (COD1) pero que queremos sustituir poner otra lnea con /*/ Escribir el nuevo cdigo(COD2) a partir de la lnea siguiente y tras l crear una nueva lnea con la cadena //*/. De esta forma, tal y como est escrito, COD1 ser compilado, y COD2 est comentado. Y cuando queramos lo contrario, slo tendremos que quitar el la primera barra inclinada de la primera lnea para que COD2 se compile y COD1 se comente, como se puede ver en a figura 2.
Figura 2: Ejemplo de comentarios de cdigo que sirve para activar partes de cdigo que se quieren probar sin borrarlas
76
Captulo 1
const
La definicin const sirve para definir una cadena de caracteres utilizando slo memoria ROM del microcontrolador, en el caso del AtMega169, no memoria Rom, sin la memoria flash destinada al cdigo de programa, que a todos los efectos cuando el programa est en funcionamiento es como si fuese memoria ROM. Esta definicin 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 ms obvia de hacer esta declaracin (aunque esta forma es incorrecta) sera:
#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 cdigo no es el que se buscaba. De esta forma (incorrecta) obtendramos una tabla de cadenas de caracteres almacenada en ROM, y una cadena individual almacenada en RAM (en la seccin .data de la memoria). Para obtener el resultado realmente buscado, se necesita un cdigo 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 definicin macro (macro definition) usada en lugar del siguiente cdigo:
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
Captulo 1
volatile
La definicin de volatile se utiliza como prefijo para que el programa reconozca que esa variable ser actualizada mediante una rutina de interrupcin. As, cuando se utiliza un optimizador, en un bucle como el siguiente:
uint8_t flag; ... while (flag == 0) { ... }
el compilador tradicionalmente optimizara el cdigo de manera que ignorara la condicin dada por la bandera como siempre cierta, ya que dara igual, ya que analizando del cdigo 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 anlisis de la ruta de cdigo (por ejemplo mediante una rutina de interrupcin), la variable debe ser declarada tal que as:
volatile uint8_t flag;
static
Las variables definidas como locales a una funcin desaparecen al final de la ejecucin de dicha funcin. E manera que cuando se llama a esa funcin 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 funcin a lo largo de un programa, se puede definir esa variable local como static. La inicializacin de las variables static se hace slo en la primera llamada a la funcin 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 slo pueden ser accedidas dentro del mbito de la funcin que las llama, y por tanto otras funciones pueden tener el mismo nombre de variable, sin que se interfieran unas con otras. Adems esta particularidad ayuda para la bsqueda de errores, ya que la variable no puede ser modificada fuera de esa funcin, y por lo tanto all es donde debe buscarse dicho error.
static char letra;
78
Captulo 1
En este punto, en el directorio del proyecto se han generados dos archivos que son los que habran 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 botn de Reset (si la placa ya estaba alimentada, si la acabamos de alimentar no es necesario) Al mismo tiempo pulsar el botn 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, slo hay que pulsar el botn aceptar, para iniciar el borrado, la programacin y la verificacin de la correcta programacin 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
Captulo 1
80
Captulo 1
perifrico interno del AtMega como el Comparador Analgico y no se puede porque los pines de entrada de dicho perifrico estn siendo utilizados con otra funcionalidad.
Por estos motivos se crey de importancia el poder plasmar en el mismo cdigo del programa, aunque sea como comentario, la situacin 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
Con las funciones que tenan implementados los controladores de la pantalla LCD nicamente se podan activar los seis dgitos alfanumricos que aparecen en la figura anterior, dado que los dgitos que estn en blanco no estn conectados fsicamente al perifrico DriverLCD. Sin embargo, pese a que la hilera de nmeros y sus respectivos subrayados s estn conectados fsicamente con dicho perifrico, su activacin no viene
81
Captulo 1
implementada en el programa controlador, por lo que se procedi a la elaboracin de funciones que habilitasen dicha funcionalidad:
Figura 5: Intefaz entre Bits del Registro LCD y segmentos del LCD
Ello se consigui manipulando los registros de los segmentos LCD y dndole valores a los bits que no se usaban siguiendo un mtodo de prueba y error. Para ello se tuvo que hacer un estudio intensivo y algo de ingeniera inversa para conocer la funcionalidad de cada bit de dicho registro, que a continuacin pasamos a describir:
Dicho registro lo interpretaremos como una tabla cuyas filas las denominaremos por LCDDRxx, y cuyas columnas las llamaremos por un nmero de bit (de 0 a 7). Ahora se establecer una correspondencia entre los bits de este registro y los segmentos de cada dgito del LCD (ver Figura 6): as pues las columnas 0, 1, 2 y 3 se corresponden con segmentos de los dgitos 0, 2 y 4, y las columnas 4, 5, 6 y 7 se corresponden con segmentos de los dgitos 1, 3 y 5.
82
Captulo 1
Por poner un ejemplo de correspondencia, podemos decir que los segmentos que se corresponden con el dgito 0 son:
Fila fila LCDDR1 fila LCDDR6 fila LCDDR11 fila LCDDR16 bit 3 SEG311(K) SEG211(L) SEG111(L) SEG011(M) bit 2 SEG310(X) SEG210(F) SEG110(E) SEG010(P) bit 1 SEG309(Y) SEG209(H) SEG109(G) SEG009(N) bit 0 SEG308(A) SEG208(B) SEG108(C) SEG008(D)
Tabla 3: Ejemplo de correspondencia entre los segmentos del LCD del dgito 0 y los bits del registro de segmentos del LCD que le corresponden
La informacin relativa a las mscaras y las funciones para la utilizacin de tales segmentos se puede encontrar en la seccin deDisplay LCD del captulo 6 Listado de Cdigo. De esta forma de pueden activar o desactivar individualmente los siguientes segmentos:
los nmeros 1,2 4, 5, 9 y 10, los subrayados 1,2,3,4,9,10, y el nmero 3 conjuntamente con el subrayado 5.
83
Captulo 1
Simbolo
Mscara
0xEAA8
{MPND}
1110
{LEGC}
1010
{JFHB}
1010
{KXYA}
1000
* / \ m s _
JPM GNK HPL GJM HKN JLP KGM NLH
0x4008
0100
0000
0000
1000
0x8020
1000
0000
0010
0000
0x2F00
0010
1111
0000
0000
0x9800
1001
1000
0000
0000
0x1000
0001
0000
0000
0000
0xC080
1100
0000
1000
0000
0x2208
0010
0010
0000
1000
0x4820
0100
1000
0010
0000
0x8280
1000
0010
1000
0000
0x2028
0010
0000
0010
1000
0x4880
0100
1000
1000
0000
0x8208
1000
0010
0000
1000
0x2820
0010
1000
0010
000
84
Captulo 1
Por ltimo en lo relativo al LCD se describen las funciones que se tienen en sendos archivos de programacin del LCD: Funciones deLCDDriver.h Manejador del Display especfico que incorpora el AvrButterfly
LCD_Init(); Inicializa la pantalla LCD y prepara para su uso LCD_WriteDigit(2); Escribe un carcter en uno de los seis dgitos del LCD //SIGNAL(SIG_LCD)--> LCD Interrupt Routine LCD_Num1_On(); LCD_Num1_Off(); LCD_Led1_On(); LCD_Led1_Off() // ENCIENDE el Numero_1 del LCD // ENCIENDE el Led_1 del LCD
Funciones de LCDFunctions.h Funciones genricas para cualquier Display con caracteres alfanumricos.
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, slo cambiarn los bytes especificados para que se sobreescriban, no vindose afectados los restantes bytes por dicha accin. void void void void char LCD_UpdateRequired(char update, char scrollmode); LCD_Clear(void); LCD_Colon(char show); LCD_FlashReset(void); SetContrast(char input);
Se evita hacer una descripcin pormenorizada de las unciones debido a que en el listado de cdigo del programa, en el captulo 6, se comenta exhaustivamente el cdigo diciendo en el encabezado de cada funcin cual es su funcionalidad.
85
Captulo 1
Buffer #2
Pgina 2047
Buffer #1
Buffer_to_Page
Pgina 0
263 263
8bits 8bits
2 buffers sRAM
Cada buffer tiene una longitud de 264Bytes (la misma longitud que las pginas en que est dividida la memoria). Estos buffers son memoria static RAM (voltil) y confieren una especie de memoria cach durante una operacin de programacin o borrado. Por lo tanto a la hora de almacenar o recuperar datos de la memoria Dataflash no-voltil, dicha informacin 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 informacin en paquetes de 8 bits con ndices totalmente transparente al usuario, que se limita nicamente a enviar o recibir datos, y la gestin de pginas es completamente automtica.
86
SPI
Captulo 1
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 parmetros necesarios para la utilizacin de cada una.
///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);
87
Captulo 1
Los que fijan una referencia temporal horaria y registran la temperatura ambiente Hora_Temp(se escriben 24 al da 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
crc
Hora(0h,23h) [5b]
Temperatura(-25,+60) [8b]
Los que fijan una referencia temporal implcita y registran los datos estadsticos elicos correspondientes a un perodo de 10 minutos (la media, varianza y valor mximo d la velocidad del viento en ese perodo), recibe el nombre de Datos (se escriben 144 al da y tienen una longitud de 4Bytes)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Datos [4B]
Varian..
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 0 1 0 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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
//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);
Las cuatro primeras funciones son de escritura de paquetes en la Dataflash, y las tres es una funcin de lectura que extrae los datos del los paquetes interpretndolos, devolviendo como salida el tipo de datos ledo, y actualizando los parmetros de salida con los datos extrados, de manera que segn fuese el tipo de contenedor de datos se actualizan unos parmetros u otros, y despus con una condicin if se procesan nicamente lo datos que se extrajeron.
88
Captulo 1
Bytes Contenedores horas Bytes 1 24 =24 Contenedor Hora dia dia Bytes Contenedor Bytes 1 =2 Contenedor dia dia
512 KBytes = 815 dias de capacidad =ms de 2 aos de capacidad Bytes 628 dia
Adems el intervalo de registro de los valores estadsticos de la media y la varianza puede ser con figurable:
Intervalo de Registro
Cada 10 minutos 576+48+2 Cada 5 minutos Cada 2 minutos
Bytes/dia
628 Bytes/dia
Capacidad
815 dias = 2 aos y 2 meses 424 das = 1 aos y 2 meses 217 das = 7 meses
y la gestin de varios arrays de informacin 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 nmero de telfono de asistencia tcnica, o el nombre de la empresa instaladora.
EE_Save_TableUint() EE_Load_TableUint()
89
Captulo 1
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
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 Figura 10.
up
Data16 Aux16
down down
igual >>8
up up
down up
Data16
up
Figura 10: Conversin de un Dato de 16bits (2Bytes) a dos datos de 8bits (1Byte)
Conv2x8b_to_16b() convierte dos datos de 8bits haciendo en un dato de 16bits tomando ambos datos, hacindole un cast a ambos a int, desplazando el bit superior 8 posiciones hacia el bit ms significativo, sumando de forma lgica ambas variables de 16bits. El diagrama conceptual del proceso se muestra en la Figura 11.
90
Captulo 1
down
Mask 0x00FF
0000
down
OR
up
<<8
up
up
0000
up
Figura 11: Conversin de dos datos de 8bits (1Byte) a un Dato de 16bits (2Bytes)
down
Data16
Para probar el correcto funcionamiento de la librera creada, as como la librera de la DataFlash y la librera UART, se crearon mltiples versiones de un programa de ejemplo cuya funcionalidad era guardar en memoria Dataflash 1000 nmeros de 16bits y ver el tamao que ocupan en sta, as como enviarlos va uart para ver que se grabaron correctamente. 1000nmeros x 2Bytes/num = 2000Bytes --> 7 pginas de 264 Bytes y 1 pgina con 152Bytes (0-151)ocupados En dichos programas se utilizaban intensivamente dichas funciones de conversin, ya que las transmisiones serie se hacan en modo carcter (8bits), y en la DataFlash se almacena la informacin en Bytes, por lo tanto en ambas se utilizaban conversiones de 16 a 8bits.
3.7. Comunicacin por el Puerto Serie a travs de la UART Configuracin y manejo de la UART
Como en anteriores perifricos, la estructura se organiza en varias capas, en este caso en dos: La capa 1 hace las funciones de ms bajo nivel como son:
la inicializacin del perifrico a la velocidad BaudRate deseada (esto es importante hacerlo bien, y configurar el sistema que est al otro lado e la comunicacin con el mismo BaudRate), La deshabilitacin del perifrico (esto es interesante para el ahorro de energa), y el envo y recepcin de caracteres por el puerto serie, que es su principal cometido.
///___CAPA 1___________________________________________ void USART_Init(unsigned int baudrate);//Inicializa la UART void USART_Close(void); //Deshabilita la UART char USART_Try2Rx(char *data); //Intenta recibir un carcter por Rs232 void USART_putc(char data); //Enva un carcter por Rs232
el envo de cadenas de caracteres ledas directamente de una zona de memoria Ram de datos, o bien en memoria Flash de programa,
91
Captulo 1
el envo de nmeros enteros de 8bits, y de 16 bits el envo del valor de una velocidad del viento genrica ( con un formato de dos dgitos enteros y un dgito decimal 00.0m/s). el envo de datos correspondientes a la fecha (minuto, hora, da, mes, ao). El envo del carcter nueva lnea con el que el extremo receptor pasa a la lnea siguiente si se encuentra en modo de consola terminal.
una cadena desde RAM una cadena desde Flash
///___CAPA 2___________________________________________ void USART_puts(char *pStr, uint16_t num_bytes);//enva void USART_puts_f(const char *pFlashStr); //enva void USART_put_u8b(unsigned char Data_u8b); void USART_put_u16b(unsigned int Data_u16b);
void USART_put_WSpeed(unsigned int Data_u16b); //enva datos d velocidad viento void USART_put_datetime(uint8_t Month,uint8_t Day,uint8_t Hour,uint8_t Minute); void USART_NewLine(void); //enva el carcter nueva lnea
Figura 12: Pantalla de configuracin del programa Hyperterminal de windows, con los valores empleados en la comunicacin con el AvrButterfly
En la Figura 12 se pueden ver los parmetros de configuracin del sistema para configurar el programa Hyperterminal de Windows, pero para un mejor manejo de la comunicacin se recomienda utilizar el programa Bray's Terminal, que es un programa gratuito, especialmente diseado para hacer pruebas y probar la comunicacin entre sistema, permitiendo el visionado de los datos tanto en hexadecimal, como en modo carcter, 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 mltiples opciones que ofrece.
92
Captulo 1
Figura 13: Captura de Pantalla Bray's Terminal y fotografa de una sincronizacin usando dicho programa
Aunque para el desarrollo de funciones y visin de resultados las citadas herramientas de comunicacin entre Pc y AvrButterfly son muy tiles, para la aplicacin de volcado se buscaba una aplicacin 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.
AVR
r a Txir Empeza
PC
Rfaga d e 1 00 datos
Txon
#*#=
En la Figura 14 se muestra el protocolo de comunicaciones que se dise para el programa consola de recepcin de datos del Rv1 en el Pc. Pero dicho programa se desarroll para un entorno MsDos (porque minimizar el tiempo de desarrollo y acabar ms rpido el proyecto), y la interaccin con el usuario es muy pobre, por lo que dado que en s dicho programa no es una especificacin del proyecto, se decidi no adjuntarlo, y para la transferencia de la informacin se recomienda, para la versin prototipo, el Brays Terminal, ya que posee la opcin de guardar los datos transmitidos en un fichero de texto, y como los datos que se envan desde el AvrButterfly vienen en el correcto orden, indentacin con comas, y con saltos de lnea, para el prototipo es ms que suficiente.
93
Captulo 1
Mantiene Activo
- sRam - Timer/Counters 0,1,2 - Puerto SPI - Sistema de Interrupciones - Timer2 Asncrono(RTC) - Controlador LCD - ADC
Deshabilita
Detiene a la CPU
ADC-NOISE REDUCTION Se usa para minimizar el ruido de conmutacin durante als conversiones del CA/D.
POWER-SAVE - Timer2 Asncrono(RTC) Se usa para permitir al usuario - Controlador LCD mantener una base temporal a la vez de operar el DisplayLCD mientas que el resto del sisteam est dormido. STANDBY Permite un encendido muy rpido combinado con un bajo consumo de energa POWERDOWN -Oscilador ce Cuarzo El resto del dispositivos estn dormidos
Salva al informacin de los registros, pero congela el oscilador, deshabilitando todas las demas funciones del chip hasta la siguiente inetrrupcin o Reset Hardware.
La eleccin del modo de ahorro de energa adecuado tiene bastante importancia, porque si hacemos una maa eleccin, 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 energa powersave, dichas interrupciones cesarn hasta que se reactive el sistema a active con una interrupcin de timer2 (RTC) con una del display o del joystick del aparato. Como lo que se desea es mantener la cadencia de interrupciones, la opcin adecuada para ese ahorro de energa sera el modo idle, que no deshabilita el timer0, aunque segn se puede ver en la Tabla 9, tambin el ahorro de energa es menor, pero es bastante mejor que no aplicar ningn modo de ahorro de energa.
Ahorro de Energa a 1Mhz, Vcc=3v MODE
Active (pleno rendimiento) Modo Idle de Ahorro de Energa Modo PowerSave de Ahorro de Energa
Icc (25C)
0,700mA 0,370mA 0,006mA
%Ahorro
0% -47,2% -99,1%
94
Captulo 1
Los valores de la tabla estn extrados de las grficas de las figuras 15,16 y 17, en las que grficamente se puede ver el consumo energtico del AtMega169 dependiendo de la tensin de alimentacin, para lso distintos modos de ahorro de energa.
Figura 16: Consumo Energtico del AtMega169 en el modo IDLE de Ahorro de Energa
95
Captulo 1
3.9. Captura de la seal analgica procedente del sensor El Convertidor Analgico Digital integrado en el ATmega169V
El CA/D es un perifrico que debe ser comprendido bien para poder usarlo correctamente, y las diferentes opciones de configuracin deben elegirse con cautela porque es difcil darse cuenta de dnde se ha cometido el error. Por ello es necesario antes de configurar el dispositivo hacer un estudio de la seal y determinar si es una seal flotante o a tierra, su amplitud mxima, y la rapidez de cambio de la seal. Por todo ello se ha creido necesario hacer un tutorial detallado que sirva de ayuda a a hora de determinar la configuracin ms adecuada para la captura de seales.
La eleccin de una configuracin u otra debe depender de si la seal de entrada es flotante o est referida a tierra. Una seal flotante es aquella que utiliza una referencia de tierra aislada y no estara conectada al nivel de tierra de la placa. Como resultado, la seal de entrada y el dispositivo hardware no se conectan a la ninguna referencia comn, lo cual puede provocar que la seal de entrada exceda el rango vlido de tensiones del dispositivo hardware. Para evitar este problema, se debe conectar la seal a la tierra de la placa del dispositivo. Ejemplos de fuentes de seal flotantes son los termoacopladores sin tierra y bateras. Una seal a tierra es aquella que se conecta a la tierra de la placa. Como resultado, la seal de entrada y el dispositivo hardware se conectan a una referencia comn. Ejemplos de seales a tierra son las salidas de instrumentacin no aisladas y dispositivos conectados al sistema de alimentacin de la placa del microcontrolador.
b) ADC configurado para Entradas Diferenciales Cuando se configura el ADC para entrada diferencial, hay dos cables de seal asociados con cada canal de entrada (uno para el canal de entrada y otro para la referencia o retorno de seal). La medida es la diferencia en tensin entre las dos lneas, que ayuda a reducir el ruido y cualquier tensin no comn a ambas lneas.
96
Captulo 1
Segn National Instruments, sera recomendable utilizar entradas diferenciales en los siguientes casos: Cuando la seal de entrada tiene un bajo nivel (menos de 1 voltio) Cuando los cables que llevan la seal tienen una longitud superior a 3 metros. Cuando la seal de entrada requiere un punto de referencia de tierra o un retorno de seal. Cuando los cables que transmiten la seal pasan a travs de un entorno ruidoso.
c) ADC configurado para Entradas a Tierra Cuando se configura el hardware para entradas a tierra, cada seal de entrada se conecta a la misma tierra. Por ello este tipo de ntradas son ms vulnerables ante el ruido que las diferenciales (debido a las diferencias en los caminos de la seal). d) Funcionamiento del ADC El ADC convierte una entrada analgica de tensin en un valor digital de 10 bits mediante aproximaciones sucesivas.
El valor mnimo adquirible viene dado por el valor de tensin que haya en la patilla GND, y el mximo por la tensin en la patilla AREF menos 1LBS(menos un bit menos significativo). Opcionalmente, una tensin de referencia interna e 1.1V o la tensin 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 tensin debe desacoplarse mediante un condensador externo en el pin AREF para mejorar la inmunidad ante el ruido.
e) La Tensin de Referencia del ADC El voltaje de referencia del ADC (Vref) indica su rango de conversin.
Los canales single ended que exceden Vref dan como resultado valores de conversin 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 travs de un interruptor pasivo. La referencia interna se genera de una referencia de tensin 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 ms inmune al ruido conectando un condensador entre los pines AREF y tierra. Vref puede tambin ser medido en el pin AREF con un voltmetro de alta impedancia. Es de observar que Vref es una fuente de alta impedancia, y slo una carga capacitiva debe ser conectado e un sistema as. Si se conectase una fuente de tensin constante al pin AREF, no se deberan usar las otras referencias de tensin en la aplicacin, ya que sern cortadas por la tensin externa.
97
Captulo 1
Si so se aplicase una tensin externa al pin AREF, entonces se debe elegir entre AVCC o los 1.1V como tensiones de referencia. Despus de conmutar la tensin de referencia, la primera medicin de ADC ser imprecisa, por lo que el usuario debe descartar dicho resultado.
f) El Preescalado y el Tiempo de conversin Por defecto, el circuito de aproximaciones sucesivas requiere la entrada de una seal de reloj de entre 50kHz a 200kHz para obtener la mxima resolucin. En caso de que se necesite una resolucin mayor a 10bits, dicha seal de reloj deber ser mayor de 200kHz para alcanzar una mayor tasa de muestreo.
El mdulo de conversin Analgico-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, resetendose cuando ADEN se ponga a 0. Cuando se inicia una conversin single ended poniendo ADSC=1 en el ADCSRA, la conversin comienza en el siguiente flanco de subida de la seal de reloj del ADC.
La Captura de la Temperatura
Pese a que finalmente la captura de la seal del anemmetro se ha hace con el Convertidor Analgico/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 parmetros del CA/D para la captura de la seal del Sensor de Temperatura con una configuracin en Modo de terminacin nica y una resolucin de 10 bits, y con el muestreo de seal realizado a la mnima frecuencia de muestreo posible en modo rfaga.
Figura 18: Fotografa del sensor de temperatura del AvrButterfly (Resistencia Negativa de Tensin)
La captura se realiza haciendo una rfaga d conversiones A/D de 8 muestras, y promediando las (sumndolas y dividindolas 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
Captulo 1
Fecha
Ayuda sobre captura de seales y sobre entradas con resistencia Pull-Up http://www.iotech.com/sensors9712.html Ayudas para programar en Lenguaje C: http://www.drpaulcarter.com/cs/common-c-errors.php#2.3.2 http://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/ Pgina de Ayuda al desarrollo de sistemas basados en microcontroladores Avr, y principal ayuda en la obtencin de documentacin para este proyecto (Documento Imprescindible) http://www.avrfreaks.com/ Comunidad y Foro de Dudas tcnicas sobre programacin de microcontroladores en GCC y dudas sobre diseo hardware. http://www.avrfreaks.com/forum Topics: Avr Butterfly Real Available Pins Timer0_callback funtion in AVR Butterfly Port with GCC ? Jos Juan Lpez tiene en el foro el pseudnido de sequan Pgina de Ayuda del compilador C para Avr utilizado GNU GCC Compiler http://www.gnu.org/home.es.html Otros Compiladores de C para microcontroladores Atmel Avr: IAR Embedded Workbench http://www.iar.com/ CodeVision C Compiler http://www.hpinfotech.ro/html/download.htm ImageCraft C Embedded Compiler http://www.imagecraft.com/software/ WebRing (Enlaces relacionados) de AVR http://r.webring.com/hub?ring=avr
[HLPC-01] [HLPC-02]
Agradecimientos
Martin Thomas , Ingeniero de por la Universitt Kaiserslautern Vertiefungsrichtungen, y programador de la portabilidad del cdigo de demostracin del AvrButterfly,escrito para IAR, al lenguaje C compatible con el compilador Gnu-Gcc. Jrg Wunsch , experto en programacin de microcontroladores Atmel, desarrollador del proyecto WinAvr con Gnu-Gcc, e incansable colaborador en el foro de avrfreaks, por su ayuda y orientacin en la resolucin de dudas relativas a la programacin del AtMega169. Alberto Prieto Lfkrantz, desarrollador en el pto. I+D de Indra Espacio, por su ayuda y orientacin a la programacin en el lenguaje C++ utilizado para la consola terminal del Pc utilizada para a transferencia de datos desde el Prototipo Rv1 al Pc.
Escuela Superior de Ingenieros de Sevilla www.esi.us.es Avda.de los Descubrimientos,s/n 41092, Sevilla, Espaa
99