Microcontroladores y sistemas embebidos
Unidad 3: Programación C (ATmega)
Ing. Oscar Alonso Rosete Beas
Semana 6 Abril Rev:4 ciclo 2026-1

oscarrosete.com
Agenda
Unidad 3. Programación de los Microcontroladores
3.1. Introducción a los lenguajes de programación en microcontroladores.
3.2. Arquitectura y lenguaje de programación Ensamblador.
3.3. Lenguaje C.
3.4. Repertorio de instrucciones.
3.4.1. Instrucciones Aritméticas y Lógicas.
3.4.2. Instrucciones para el Control de Flujo.
3.4.3. Instrucciones de Transferencia de Datos.
3.4.4. Instrucciones para el Manejo de Bits.
oscarrosete.com
ATmega328P en C
oscarrosete.com
+Información
AVR c source (AVRGCC)
Comments
Los comentarios puede tener las siguientes formas:
// [Texto]
/*
Texto
Texto continua
*/
Continuación de líneas
Como en lenguaje C, las lineas del codigo fuente pueden continuarse al dejar como el ultimo caracter en la linea como una diagonal (\).

oscarrosete.com
| Decimal (default) | 10 |
|---|---|
| Hexadecimal | 0x0a |
| Binario | 0b00001000 |
| Octal | 077 |
Constates Enteras en C
Puedes forzar a una constante a ser Long o unsigned integer agregando una secuencia de uno o mas caracteres al finalizar la constante.
U o u para unsigned integer
l o L para Long
Por ejemplo 45U es de tipo unsigned int.
45UL es de tipo unsigned long int
45ull es de tipo unsigned long long int
oscarrosete.com
Tipos de dato enteros
Extraído de https://gcc.gnu.org/wiki/avr-gcc
| AVR GCC | Bits | Rango | c99 alternate |
|---|---|---|---|
| signed char | 8 | -128 a127 | int8_t |
| unsigned char | 8 | 0 a 255 | uint8_t |
| short int/short/signed short int/signed short | 16 | -32768 a 32767 | |
| unsigned short int | 16 | 0 a 65535 | |
| unsigned int | 16 | uint16_t | |
| unsigned long | 32 | uint32_t |
También existen: signed int, long int, unsigned long int, long long int, unsigned long long int. Así como tipos de datos alternos presentados en el estandar c99 y disponibles en GCC. u para definir si tiene signo, #_t numero de bits, int para diferenciar entero de decimal.
Ejemplo de declaración y definición de variable.
unsigned int bar=42;
oscarrosete.com
Operadores

oscarrosete.com
Operadores bitwise
El operador & (bitwise AND) in C toma 2 números como operandos y realiza la operación AND con cada bit de los 2 números. El resultado de una operación And es 1 si ambos bits son 1.
El operador | (bitwise OR) en C toma 2 números como operandos y realiza la operación OR con cada bit de los 2 números. El resultado de la operación es 1 si cualquiera de los bits es 1.
El operador ^ (bitwise XOR) en C realiza la operación XOR con cada bit. El resultado es 1 si los 2 bits son diferentes.
El operador ~ (bitwise NOT) en C toma un número y realiza la inversión de todos los bits en el.
oscarrosete.com
Operadores de desplazamiento
El operador << (left shift) en C hace un desplazamiento a la izquierda de los bits del primer operando, el segundo operando decide la cantidad de espacios a desplazar.
El operador >> (right shift) en C hace un desplazamiento a la derecha de los bits del primer operando, el segundo operando decide la cantidad de espacios a desplazar.
Ejemplo
(1<<4)= 0001 0000
oscarrosete.com
Palabras clave
De manera similar al lenguaje ensamblador se puede hacer referencia a los registros de los puertos de entradas y salidas haciendo utilizacion de las palabras claves DDR,PIN,PORT.
Ejemplos para el ATmega328p:
DDRB,DDRC,DDRD.
PORTB,PORTC,PORTD.
PINB,PINC,PIND
PORTB=2;
PORTC=0b00010000
AVR C

oscarrosete.com
Palabras clave
De manera similar al lenguaje ensamblador se puede hacer referencia a los registros de los puertos de entradas y salidas haciendo utilizacion de las palabras claves DDR,PIN,PORT.
Referencia a la posición de los bits específicos del microcontrolador:
PORTB4=5 ; PINC3, DDRD2;
Ejemplo:
(1<<PORTB4)=(1<<4)= 0001 0000
DDR2=1 es una operación incorrecta ya que DDR2 es un número, equivalente a escribir 2=1
AVR C

oscarrosete.com
Preprocessor Directives
AVRGCC considera todas las lineas que comienzan con # como su primer caracter una directiva de preprocesamiento.
Para profundizar dar click en la imagen inferior.
AVR C
oscarrosete.com
Setting and clearing bits
Establecer un bit (asignar un 1 lógico):
DDRD = DDRD | (1 << 4);
Vaciar un bit (asignar un 0 lógico):
DDRD &= ~(1<<mySwitch);
Alternar el valor de un bit:
DDRD ^= (1<<mySwitch);
Establecer un conjunto de bits (asignar un 1 lógico):
DDRD = DDRD | (1 << 4)| (1<<3);

oscarrosete.com
-
En los pines digitales 2, 3 y 4, activar el pin 2 (LED rojo) por 5 segundos.
-
Hacer un parpadeo (off-on) de 0.5 segundos en el pin 2, después desactivarlo.
-
Activar el pin 3 (LED amarillo) por 2 segundos.
-
Hacer un parpadeo (off-on) de 0.5 segundos en el pin 3, después desactivarlo.
-
Activar el pin 4 (LED verde) por 5 segundos.
-
Hacer un parpadeo (off-on) de 0.5 segundos en el pin 4, después desactivarlo y repetir la secuencia completa.

Ejercicio Atmega C 1

oscarrosete.com
Realizar un programa que simule el funcionamiento de un semáforo (Microchip Studio y Tinkercad):
Lectura de bits
Lectura de bit individual
status=(PIND & (1<<mySwitch) != 0)
Lectura de múltiples bits
if(!(PIND & (1 << PORTD4)) || !(PIND & (1 << PORTD5)) || !(PIND & (1 << PORTD6)) || !(PIND & (1 << PORTD7)))



oscarrosete.com
Debouncing

oscarrosete.com
Debouncing
Consideraremos 10 ms de transitorio para eliminar el rebote

oscarrosete.com
Debouncing
Propuesta 1
Detect first edge from high to low→ do nothing for 10 ms(delay) → read the switch again and if it's low → continue on.
same on button release as long as you see high edge→ 10 ms delay→ read switch, it is high? → Continue on

oscarrosete.com
Anatomía del código

oscarrosete.com
oscarrosete.com
+Información
Código de referencia
ATMEL STUDIO DEBUGGING
oscarrosete.com

oscarrosete.com
+Información
ATMEL STUDIO DEBUGGING
ATmega328P Simulación Proteus


oscarrosete.com

ATmega328P Simulación Proteus
oscarrosete.com

oscarrosete.com
ATmega328P Simulación Proteus

oscarrosete.com
ATmega328P Simulación Proteus

ATmega328P Simulación Proteus
oscarrosete.com

oscarrosete.com
ATmega328P Simulación Proteus

Terminals mode

Components mode
oscarrosete.com
ATmega328P Simulación Proteus
Proteus


oscarrosete.com
Simulación de encendido de LED utilizando ATmega328p programado en lenguaje ensamblador.
ATmega328P Simulación Emulare


oscarrosete.com
+Información
Simulación del mismo código en software libre Emulare
Arduino Uno
oscarrosete.com
Relación de pines Arduino Uno/Atmega 328p

oscarrosete.com
Generalidades
Los pins/terminales son cables conectados al microcontrolador.
Son la interfaz del microcontrolador
Los voltajes de los pines son controlados a partir de un "sketch"

oscarrosete.com
Arduino Uno
oscarrosete.com
Los pins/terminales de salida son controlados por el Arduion.
El voltaje es determinado a partir del "sketch"
Otros componentes pueden ser controlados a través de sus salidas.


Arduino Uno
oscarrosete.com

Los pins/terminales de entrada son controlados por otros componentes.
Arduino lee el voltaje en esas terminales
Le permite responder a eventos e información.

Arduino Uno
Digital vs Analógico
Algunos pins son únicamente digitales.
- Lectura digital, salida digital
- 0 o 5 volts.
Algunos pines pueden ser entradas analógicas
- se pueden leer voltajes analógicos en la terminal
- Utilizados en sensores analógicos.
- Estas terminales están etiquetadas.
- Ningún pin puede generar una salida analógica. No cuenta con convertidor Digital-analógico, sin embargo, con PWM se pueden realizar funciones similares.


oscarrosete.com
+Información
ATmega328P (Inside of Arduino Uno) Tinkercad Simulation
oscarrosete.com
+Información
Atmega328p c 2026
By Oscar Rosete
Atmega328p c 2026
- 11



