martes, 5 de noviembre de 2024

Lección 2: Tipos de datos en lenguaje C para microcontroladores Atmel (AVR)

 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:

 

 Figura5. Código en lenguaje C para enviar valores alternados de bits 200 veces al puerto B del microcontrolador atmega 16.


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:

  


 Figura7. Código en lenguaje C para enviar valores alternados de bits 50000 veces al puerto B del microcontrolador atmega 16.


 

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