Programando Embedded System Microcontroller con Metologia interactiva.
GILBERTO PASCUAL, 2024
gpascualt@gmail.com
Lenguaje C y el Microcontrolador AVR
Lección 2:
Tipos de datos en lenguaje
C para microcontroladores Atmel (AVR)
Passive Avr Programmer
Figura1
Figura2
“Ahora usted puede
aprender a Programar Microcontroladores de forma muy fácil”.
1. Introducción:
Uno de los objetivos de programar
microcontroladores AVR es crear archivos “.hex” de tamaño pequeño, para lograr
esto debemos de examinar de manera correcta los tipos de datos usados en el
lenguaje C para programar el microcontrolador.
Es decir para la optimización con
tipos de datos debemos conocer y utilizar correctamente los tipos de datos en C
no solo para permitir aprovechar al máximo el espacio de memoria en
microcontroladores AVR, sino que también optimiza el tamaño del archivo “.hex”
generado.
Esta lección se explica los tipos
de datos más adecuados para microcontroladores AVR y sus ventajas en la
programación. Para lograr ello dentro de esta lección nos enfocamos en
especificar los tipos de datos en lenguaje C mayormente usados para compilar en
AVR Studio.
2. Tipos de datos común usados por Compiladores en leguaje C:
En la siguiente tabla se muestra
los tipos de datos y sus tamaños de consumo de memoria que ocupan cuando se usa
el compilador AVR Studio, estos valores pueden variar de un compilador a otro.
Tipo de dato |
Tamaño en Bits |
Rango de uso |
unsigned
char |
8
bit |
0
a 255 |
char |
8 bit |
-128 a +127 |
unsigned
int |
16
bit |
0
a 65535 |
int |
16 bit |
-32768 a +32767 |
unsigned
long |
32
bit |
0
a 4294967295 |
long |
32 bit |
-2147483648 a
+2147483648 |
float |
32
bit |
±1.175e-38
a ±3.402e38 |
double |
32 bit |
±1.175e-38 a
±3.402e38 |
3. Unsigned char
En su mayoría los
microcontroladores AVR son microcontroladores de 8-bit, por eso este tipo de
dato “unsigned char”, es el más usado para la mayoría de aplicaciones. El tipo
de dato “unsigned char”, es un dato de 8-bits que tiene un rango de valor de 0
– 255 (00 – FFH), es uno de los tipos de datos más usados para
microcontroladores AVR. En algunas situaciones comunes como, valores de
contadores donde no se necesita datos con signos, nosotros podríamos usar este
tipo de dato.
Nosotros debemos tener cuidado
cuando declaramos el tipo de dato de las variables a usar, pues recuerde que
tienen un tamaño especifico, por ejemplo, usar una variable de tipo “unsigned
char” y otra variable de tipo “int”. Esto podía limitar las operaciones dentro
de los microcontroladores AVR, pues tienen un número limitado de registros
ubicación de datos en la memoria RAM. El uso de variables de tipo “int” y “char
podrían hacer mayor uso de espacio en memoria, que no es notorio cuando se
compila el programa, pues los procesadores de computadoras tienen suficiente
memoria de ejecución y no les afecta a ellos.
En los compiladores C no es
necesario colocar signed char para saber que es una variable con signo, pero si
debemos indicarles con “unsigned” que es una variable sin signo. Por ejemplo,
si queremos indicar que no se considere el signo en los caracteres en ASCII
debemos declarar la variable como “unsigned char”.
Ejemplo 1: “Escribir un
programa en lenguaje C para microcontrolador AVR que envié valores de 00 – FF
hacia el puerto”.
Solución:
Figura3. Código en lenguaje C para enviar valores de 0 – FF al puerto B del microncontrolador atmega 16.
En este ejemplo hemos mostrado
como se declara los pines del microcontrolador como salida (DDR = 0xFF), y
también como asignamos un dato de 8bits a todos los puertos del
microcontrolador (PORTB = z), tener presente que la variable “z”, es un dato de
tipo “unsigned char”, eso significa que solo puede tomar valores enteros de 00
– FF (valores hexadecimales), que, en valor decimal, el rango seria de 0 – 255.
Ejemplo 2: “Escribir un
programa en lenguaje C para microcontrolador AVR que envié los siguientes
valores ASCII 0, 1, 2, 3, 4, 5, A, B, C y D por el puerto B”.
Solución:
Figura4. Código en lenguaje C para enviar
valores ASCII al puerto B del microcontrolador
atmega 16.
En este ejemplo como en el anterior, primero configuramos los pines del PUERTOB como salida, para luego hacer un desplazamiento o barrido en los caracteres de la variable “myList” y asignarlos al PUERTOB por cada valor de “z”. Finalizamos con un loop para finalizar y dejar el microcontrolador sin ninguna actividad.
Ejemplo 3: “Escribir un
programa en lenguaje C para microcontrolador AVR que alterne los valores de los
bits del Puerto B 200 veces”.
Solución:
En este tercer ejemplo después de
declarar los pines del puerto B como salida, también lo hemos inicializado con
el comando “PORTB=0xAA”, para luego hacer un bucle con “for” para que ejecute
la inversión de pines (~PORTB) 200 veces.
Con los ejemplos que hemos
planteado anteriormente hemos hecho uso no solo del manejo del tipo de dato
“unsigned char”, sino también el uso “for” que es una función del lenguaje C
para crear estructuras de repetición.
4. signed char
La variable de tipo “signed char”
es un dato de 8-bit que usa el bit más significativo (D7 de D7-D0) para
representar el valor de “-“ y “+”. Como resultado tenemos solo 7 bits para la
magnitud de numero con signo, dándonos un valor de -128 a +128. En esta situación
donde se necesita usar valores + y – nos sirve por ejemplo para representar
valores de temperatura, podríamos usar un dato de tipo “signed char”
Como aclaración si no declaramos
una variable como “unsigned”, por defecto se entiende que es una variable
“signed”, por esta razón nosotros siempre deberíamos declarar variables enteras
positivas como “unsigned”, sino estaríamos haciendo uso de un bit de signo y su
valor máximo cambia si solo trabajamos con números enteros positivos.
Ejemplo 4: “Escribir un
programa en lenguaje C para microcontrolador AVR que envié valores de -4 a +4
hacia el Puerto B”.
Solución:
Figura6. Código en lenguaje C para enviar
valores positivos y negativos al
puerto B del microcontrolador atmega 16.
Cuando se ejecuta este programa
dentro del microcontrolador en el PORTB se mostrará los valores de FCH, FDH,
FFH, 00H, 01H, 02H, 03H y 04H (son valores hexadecimales de -4, -3, -2, -1, 0,
+1, +2, +3, +4).
5. unsigned int
La variable de tipo “unsigned int”
es un tipo de dato de 16-bit, su valor de rango de 0 a 65535 (0000-FFFFH). En los
microcontroladores AVR una variable de tipo “unsigned int” es usado para
definir variables de 16-bit como direcciones de memoria. Esto es usado para definir
valores de contadores que son mayores que 256.
Como los microcontroladores AVR
son de registros de 8-bit y el tipo de dato “int” es de 16-bit ocuparía dos
bytes de memoria RAM, por eso nosotros debemos tener cuidado con el uso de
variables de tipo “int”, porque ocaciona ocupar dos registros y direcciones
memoria, dando como resultado tener archivos “.hex” mas grandes, ejecución mas
lenta y mayor uso de memoria.
Para los microcontroladores AVR
no es frecuente usar variables de tipo “int”, la mejor opción es usar variables
de tipo “char”, para no ocaciones los problemas mencionados anteriormente. Aunque
en excepciones como en los contadores va ha ser necesarios el uso de variables
de tipo “int”, dependiendo del caso podremos usar una variable de tipo “unsigned”
o “signed”, como se menciono con la variable “char”, sino indicamos que es “unsigned”,
el compilador por defecto entiende que es una variable “signed int”.
6. signed int
La variable de tipo “signed int” es
un tipo de dato de 16-bit, se usa el bit más significativo (D15 de D15-D0) para
representar el signo “-“ ó “+” de valor con signo. Como resultado solo tenemos
15 bits para el valor de la magnitud, es decir nuestra variable pues tomar un
valor en el rango de -32768 a 32767.
7. Otro tipo de datos
La variable de tipo “unsigned int”
es limitado tomando valores de 0-65535 (0000-FFFFH). Los compiladores pueden
soportar datos de mayor longitud como “long”, que es un tipo de dato mayor que
16-bit, también están los datos decimales, bueno la mayoría de compiladores de
lenguaje C para microcontroladores AVR también soportan datos de tipo “float” y
“double”.
Ejemplo 5: “Escribir un
programa en lenguaje C para microcontrolador AVR que alterne todos los bits del
Puerto B 50000 veces”.
Solución:
Dentro de este ejemplo hemos
declarado la variable “z” como “unsigned int” que puede tomar un valor de 0 a 65535
que es mayor que 50000. Es por ello que el contenido dentro de la sentencia de
repetición “for” (asignación de valores al PORTB) se realizara 50000 veces tal
como como se está solicitando.
Para tener mayor claridad el
valor hexadecimal equivale en binario: 0x55 = 01010101 y 0xAA=10101010, veamos
que valores que se complementa en cada pin del Puerto B.
Ejemplo 6: “Escribir un
programa en lenguaje C para microcontrolador AVR que alterne todos los bits del
Puerto B 100000 veces”.
Solución:
Figura8. Código en lenguaje C para enviar
valores alternados de bits 100000
veces al puerto B del microcontrolador atmega 16.
Similar al ejemplo anterior,
ahora declaramos una variable de tipo “unigned long”, para poder crear un bucle
que se repita 100000 veces, por cada ciclo se está invirtiendo los bits de los
pines del Puerto B, tal cual como en el caso anterior (0x55 = 01010101 y 0xAA=10101010).
8. Resumen:
Resumen de la Lección 2: En esta lección, exploramos los tipos de datos más comunes en programación de microcontroladores AVR. Mediante los ejemplos, se demostró cómo afectan el rendimiento y la gestión de memoria en el entorno de compilación.
También se introdujo
pequeñas líneas de configuración y sentencias usadas en leguaje C para microcontroladores,
así como la representación en decimal y hexadecimal de datos. Espero haber
podido ser lo mas claro posible en la descripción y uso de los tipos de datos presentados
en esta lección.
9.
Descargar
el paper de la lección 2: Tipos de datos en lenguaje C para microcontroladores
Atmel (AVR).
Descarga la Lección Completa: puedes
descargar el paper de la Lección 2 sobre la programación en lenguaje C de
microcontroladores AVR directamente desde Google Drive aquí.
10. Preguntas frecuentes:
¿Por qué es útil usar “unsigned char” en
microcontroladores AVR?
Dado que estos microcontroladores son de 8 bits, “unsigned
char” permite trabajar eficientemente dentro de su rango sin utilizar bits
adicionales para el signo.
¿Qué impacto tiene “unsigned int” en la memoria?
Este tipo de dato ocupa más memoria, lo que puede ralentizar
el rendimiento si se usa en exceso.
11. Enlaces:
“Comparte este conocimiento”
“Si te ha sido útil este artículo, compártelo en tus redes sociales y
ayuda a otros a mejorar sus habilidades de programación de microcontroladores.
¡Tus comentarios también son bienvenidos!
¡Gracias!
Atte.
Gilberto Pascual
No hay comentarios:
Publicar un comentario