Jaime Mutis P. Docente
Printf() con Mcu-AVR. Una que comenzamos a enviar mensajes de texto y/o caracteres por la puerta serial, nace la necesidad de e nviar ‘el valor de una variable’ fija o variable por este medio, o bien otro dispositivo como un display LCD. Si bien es posible, es necesario utilizar ‘librerías externas ´ las cuales poseen por ejemplo, funciones dedicas para el envió de variables.
Una de ella es la función printf(), que forma parte de la librería Estándar Input/Output ´stdio.h del lenguaje C. Tal como menciona su nombre, printf() ó fprintf() permite imprimir un mensaje por pantalla utilizando una ‘cadena de datos con formato’. Lenguajes como Java incluyen funciones similares, ver Método printf Método printf de de la clase PrintStream ).
Mediante la función printf() podemos escribir datos en los dispositivos de salida, además se puede escribir cualquier combinación de valores numéricos, caracteres sueltos y cadenas de caracteres. A continuación, se muestra un ejemplo para el envío de los datos que pueda contener la variable contador:
printf("cadena de control, lista de argumentos); printf("El valor es %d.\n", contador); fprintf("El valor es %d.\n", contador); En donde ´cadena de control´ hace referencia a una cadena de caracteres que contiene información sobre el formato de la salida y la lista de argumentos son argumentos que representan los datos de salida. La función printf no representan direcciones de memoria y por tanto no son precedidos por ‘&’. Además, dentro de los argumentos se pueden incluir referencias a otras funciones. En la cadena de control se incluyen grupos individuales de caracteres cada uno de los cuales deben comenzar por %. Normalmente, un grupo de caracteres estará formado por el signo de porcentaje seguido de un carácter de conversión que indica el tipo del dato correspondiente (debe haber igual número de caracteres de conversión como de argumentos). Pueden incluirse varios grupos de caracteres seguidos o separados por otros caracteres, caracteres éstos que serán enviados directamente a la pantalla, donde serán visualizados (es muy frecuente el uso de caracteres en blanco para separar grupos de caracteres). Además, los caracteres de conversión pueden incluir los siguientes modificadores:
Longitud del campo: Un número entero entre % y el carácter de conversión.
Número de dígitos decimales: Un número entero, un punto y un segundo número entre % y el carácter de conversión indica el número de dígitos decimales, y la long. máx. para enteros o cadenas.
Justificación a la izquierda: Signo - después del signo %. Recordar que delante de estos caracteres va siempre %
Programación en C de Microcontroladores AVR
1
Jaime Mutis P. Docente
printf () Formato especificadores Hay muchas especificadores de formato que deberá aprender a utilizar o bien manipular, con printf() usted puede especificar el número de dígitos de precisión, el número de ceros a la izquierda y todo tipo de truquillos, por mencionar algunos; %% Imprime un signo de %. %c imprime un carácter del código ASCII, ej: 66 imprime B, por ejemplo. %s una cadena %d un decimal %u un decimal negativo o positivo sin signo %o un integral en octal %x un integral en hexadecimal %e un número con punto flotante en notación científica %f un número con punto flotante en notación decimal %g puede ser %e ó %f, lo que decida fprintf que es lo mejor %X lo mismo que %x pero con mayúsculas %E como %e pero con 'E' mayúscula %G lo mismo que %E cuando se usa notaci ón científica %p un "pointer"; imprime la locación en memoria de una variable en hexadecimal %n imprime la cantidad de caracteres desplegados hasta el momento
Otras "expresiones" que existen por compatibilidad: %i lo mismo que %d %D lo mismo que %ld (decimal la rgo) %U lo mismo que %lu (decimal largo sin signo) %O lo mismo que %lo (octal largo) %F lo mismo que %f Por ejemplo, ¿qué pasa si usted tiene el valor 65 en una variable llamada mivalor y desea imprimir ese valor a la pantalla y/o enviar por la puerta serial? . No hay manera de lograr esto con usart0_puts () o usart0_putc () ya que el valor en mivalor será interpretado como ASCII y se mostrará como una A mayúscula. Con fprintf () puede imprimir el valor numérico almacenado en una variable a la pantalla. Simplemente dices fprintf
() la forma de interpretar la variable que está de paso, y luego lo pasa la variable que desea imprimir. He aquí un ejemplo:
printf ("El valor decimal en mivalor es:%d", mivalor); Ver el ‘%d’ en la cadena? printf () reemplazará ‘%d’ con el valor decimal se almacena en mivalor. ¿Por qué decimal? Debido a que usted escribió ‘%d’, que significa decimal a fprintf (). Usted podrá asignar otros formato, como por ejemplo hexadecimal para e llo es necesario reemplazar ‘%d’ por ‘%X’, quedando;
fprintf ("El valor hexadecimal en mivalor es:% X", mivalor); Cuando fprintf () ve el ‘%X’, lo reemplazará con el valor almacenado en mivalor y lo enviara como en notación hexadecimal.
Programación en C de Microcontroladores AVR
2
Jaime Mutis P. Docente
El problema con fprintf () fprintf () es una excelente función que añade un sin número de beneficios para sus programas. El gran problema con él es que es bastante grande. Al utilizar fprintf() el tamaño de su programa crece por encima de 1.444 bytes. Para utilizar fprintf() es necesario incluir la librería ‘stdio.h’, #include
. en la cabecera de su proyecto, librería que debe ser ‘linkeada’ .También es necesario definir una stream printf() para trabajar. Los streams son parte del ‘C’ y son una manera de mover caracteres entrono a un arreglo. Para definir un stream, debe crear una variable
GLOBAL, fuera de la función principal, de preferencia encima de la función principal, el stream quedara tal como se muestra a continuación:
FILE pc_putc = FDEV_SETUP_STREAM(USART0_putc, NULL, _FDEV_SETUP_WRITE);
Ejemplo:
Conversor Análogo/Digital Objetivo Con este programa, podrá medir y visualizar una tensión de 0 a 5vdc mediante la puerta serial conectada a la tarjeta Atmega2560. El conversor A/D trabajara con una resolución de 10-bits, o sea de 0-1023 posiciones.
Materiales 1.
Protoboards, alambres para el conexionado
2.
Un Potenciómetro
3.
Tarjeta Atmego2560 o similar
Programación en C de Microcontroladores AVR
3
Jaime Mutis P. Docente
Introducción El ADC convierte señales análogas continuas a números discretos. El conversor A/D es un dispositivo electrónico que pasa un nivel de voltaje de entrada a un valor digital proporcional a la magnitud de la entrada, la salida digital puede estar descrita por diferentes codificaciones, 8-bits o 10-bits. En este caso, el conversor A/D está configurado para realizar muestreos con una resolución de 10-bits con un tiempo de muestreo de 6uSeg. Para mayor información del conversor A/D del microcontrolador, sugiero verifique la hoja de datos suministrada por el fabricante. Como sabrá para establecer la configuración del conversor A/D, debe proceder de la misma manera como se hizo con el puerto serial USART0, para ello debe familiarizarse con los registros que controlan el proceso.
Registros involucrados en la conversión A/D ADCSRA = 0xC0;
Para el registro ADCSRA se asignó 0xC0 o 0b11000000, hexadecimal o binario respectivamente. El bit 7 ADEN habilita el uso del ADC, y el bit 6 ADSC al escribirle un uno inicia la conversión.
ADMUX = 0x22;
Se activan los bits 5 y 2 por lo que el registro nos queda como 0b00100010 (lo que es igual en hexadecimal a 0x22), al activar el bit 1 le indicamos al ADC que tome la entrada del pin del ADC2. Con el bit 5 (ADLAR) del registro ADMUX configuramos la manera en la que nos deposita el valor en los dos registros, para este caso se configuro de la siguiente manera, en la que como se puede ver se ignoraron
los
dos
bits
más
significativos.
ADCSRA|=_BV(ADSC); Al estar trabajando el ADC en este modo es necesario indicarle cada cuando tiene que realizar la conversión, con esta instrucción solo entra al bit ADSC del registro y lo habilita, no se modifica cualquier otro valor del registro ADCSRA.
Programación en C de Microcontroladores AVR
4
Jaime Mutis P. Docente
Ejemplo
// PRINTF - FLOAT // It's actually not hard to get this working in avrstudio. // 1. Go to Libraries in 'project' build config and add libprintf_flt.a // 2. Now add libm.a so it appears below libprintf_flt.a. // 3. Go to custom options and firstly check that -lprintf_flt is abowe -lm, if not sort em out. // 4. Now select linker options and add -uvfprintf (not with commas and such as others want you to.) // Compile and verify the printf response. */ #include #include #include #include #include
"USART0J.c" "ADC.c"
FILE pc_putc = FDEV_SETUP_STREAM(USART0_putc, NULL, _FDEV_SETUP_WRITE); int main(void){ int Valor; float voltage; USART0_init(MYUBRR); ADC_init(); ADC_set_channel(0); Actividad
while(1){ USART0_puts("Mi nombre es AVR, by JM."); Comprobar y comentar el funcionamiento del código anterior. USART0_putc('\r'); Valor=ADC_read(); voltage=(float)Valor*5.0/1023.0; fprintf(&pc_putc, "%i", Valor); "%1.3fV", voltage); Ejerciciosfprintf(&pc_putc, propuestos USART0_putc('\r'); _delay_ms(1); 1. } Realice los cambios necesarios para configurar tres canales de conversión A/D. } 2.
return(0);
Diseñe un programa que permita mostrar Tensiones de 0V a 400V, 0V a 25V y 0V a 1500V.
Programación en C de Microcontroladores AVR
5
Jaime Mutis P. Docente
Programación en C de Microcontroladores AVR
6