miércoles, 2 de abril de 2025

Lección 3: Entradas y salidas en lenguaje C para microcontroladores Atmel (AVR)

 Programando Embedded System Microcontroller con Metologia interactiva.

          

GILBERTO PASCUAL, 2025 

gpascualt@gmail.com

 

Lenguaje C y el Microcontrolador AVR

 

Lección 3:

Entradas y salidas 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: 

 

Empezaremos con esta lección indicando que todos los puertos de los registros del microcontrolador AVR puede accederse considerándose como byte o se puede acceder como un bit. En esta lección nosotros programaremos los puertos del microcontrolador como entrada o salida y se pondrá ejemplos para manejarlo como un byte o como un bit.

 

Es decir, podremos controlar todo el puerto como byte o los pines podremos manejarlos como un bit.

 

Esta lección se explica cómo se configura y se hace uso de un puerto del microcontrolador configurado como salida o entrada de datos, todo ello lo programaremos en lenguaje C y compilar el programa en AVR Studio.

 

2. Entrada y salida de datos en byte: 

 

Se accede al registro PORT como byte, nosotros usaremos la nomenclatura PORTx, donde “x”, nos indicara el nombre del puerto que se usara, por ejemplo, PORTB, hace referencia al registro PORT del puerto B.

 

De manera similar podremos acceder a la dirección de datos del registro usando DDRx que indica la dirección de datos del puerto “x”. Para acceder al registro PIN como byte, usaremos PINx, donde “x”, indica el nombre del puerto que se usara. En la siguiente tabla se menciona los puerto y registros usando comúnmente.

 

Puerto

Registro

Dirección de datos

A

PORTA

DDRA

B

PORTB

DDRB

C

PORTC

DDRC

D

PORTD

DDRD

E

PORTE

DDRE

 

 

En resumen, la nomenclatura PORTx, DDRx y PINx, en donde “x” representara el nombre del puerto (ejemplo: PORTB, DDRB, PINB).


Ejemplo 1: “Los LEDs están conectados en los pines del PUERTO B del microcontrolador. Escribir un programa que muestre el conteo desde 0 hasta FFH (0000 0000 hasta 1111 1111 en binario) en los LEDs”.

 

Solución:

 



Figura3. Código en lenguaje C para configurar y enviar valores en byte por el puerto B del microcontrolador atmega 16.

 

 

Ejemplo 2: “Escribir un programa en lenguaje C para recibir datos en byte por el Puerto B y enviarlos por el Puerto C del microcontrolador”.

 

Solución:



Figura4. Código en lenguaje C para configurar entrada y salida de datos de tipo byte en el microcontrolador atmega 16.

 

Ejemplo 3: “Escribir un programa en lenguaje C para recibir datos en byte por el Puerto C y si es menor que 100, enviar este valor por el puerto B, en caso contrario enviarlo por el puerto D del microcontrolador”.

 

Solución: 

 

 


Figura5. Código en lenguaje C para configurar entrada y salida de datos de tipo byte y reenvió del dato con condicional en el microcontrolador atmega 16.

 

 

3. Entrada y salida de datos en bit

 

Las entradas y salidas de puertos en Atmega32 pueden accederse por medio de bit, pero en algunos compiladores en C para AVR no soportan esta funcionalidad y en otros compiladores no tienen el estándar aun diseñado. Por ejemplo, la siguiente línea de código puede ser usado en CodeVision para acceder a un pin del puerto B:

 

            PORTB.0 = 1;

 

Pero en otros compiladores como WinAVR no es posible esta codificación.

 

Para poder escribir un código que sea compatible para diferentes compiladores deberemos hacer uso de operadores de bit como AND y OR y poder acceder a un solo bit del registro. Esto lo veremos en nuestra siguiente lección, donde explicaremos como haremos para acceder a un bit del puerto y registro del microcontrolador.

 

4. Resumen:

Resumen de la Lección 3: En esta lección, Aprendimos a configurar los pines de un microcontrolador AVR como entradas o salidas a nivel de byte, usando registros adecuados. Se introdujeron ejemplos de uso con condiciones y tipos de datos.

Espero haber podido ser lo mas claro posible en la descripción, configuración y uso de entradas y salidas del presentados en esta lección.

 

5. Descargar el paper de la lección 3: Entradas y salidas de datos en lenguaje C para microcontroladores Atmel (AVR).

 

Descarga la Lección Completa: puedes descargar el paper de la Lección 3 sobre la programación en lenguaje C de microcontroladores AVR directamente desde Google Drive aquí.


 

6. Preguntas frecuentes:

 

¿Cuál es la diferencia entre PORTx, DDRx y PINx?

  • PORTx: Controla el estado de salida del puerto.
  • DDRx: Configura los pines como entrada o salida.
  • PINx: Lee el estado de los pines de entrada.

 

¿Por qué se usa “unsigned char” en el microcontrolador AVR?

  • Porque ocupa 8 bits, optimizando el uso de memoria y evitando el desperdicio de bits adicionales.

¿Qué ocurre si configuro como entrada sin activar pull-up?

  • Puede quedar en estado flotante y captar interferencias, generando lecturas incorrectas.

 

¿Es posible escribir directamente en un bit de un puerto en todos los compiladores?

  • No. Algunos compiladores como CodeVision lo permiten, pero otros como WinAVR requieren el uso de operaciones adicionales.

 

  7.     Enlaces:

 

            - “Tipos de datos en lenguaje C para microcontroladores Atmel”

 

            - "Tipos de Lenguajes de Programación"

 

            - “Parpadeo de Leds en un Atmega”

 

            - “Programando un Atmel: Mi primer programa”


 

“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

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