LabMIyL - MieV4 - 6,8 - E2 - P5

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 14

UNIVERSIDAD AUTÓNOMA DE NUEVO LEÓN

FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA


Laboratorio Microcontroladores
Práctica N.º05 - Eliminadores de rebotes por código

N.° de equipo: 2 Brigada: 315

Nombre Matricula Numero de lista


Marcos Ezequiel
1953168 6
Cervantes Castro
Javier Osmar
Covarrubias 1958896 8
Bautista

Nombre del profesor: Jesús Daniel Garza Camarena

Semestre en curso: 7to

Días de la clase y Hora: Miercoles V4

San Nicolas de los Garza, N.L Fecha: 20/10/2023


Objetivo (obligatorio)

Crear un contador ascendente – descendente manual, mostrado mediante un solo


display de 7 segmentos ya sea cátodo o ánodo común mostrando números del 0 al 9.

• Añadir dos botones para que uno incremente el número en el display +1 y el otro
lo decremente en -1.
• Es necesario agregar un tope para que el número no pueda disminuir de 0 o
aumentar de 9.

Introducción a la práctica (¿Cómo se eliminan los rebotes de los


switches mediante código?) (obligatorio)

Disponemos de dos formas de aplicar el debounce. Añadiendo dispositivos electrónicos


que filtren la señal (debounce por hardware) o modificando nuestro código para eliminar
el rebote (debounce por software).

En esta práctica solo hablaremos del debounce por software, sin embargo el debounce
por hardware es comunmente usando en la indutria, pues existen modulos ya listos para
eso, siendo una opcion eficiente y potente para evitar el rebote

El debounce por software tiene la ventaja de no requerir componentes adicionales.


Resolvemos el rebote únicamente modificando el código de nuestro programa. Esta
estrategia es particularmente útil cuando se desea minimizar costos y simplificar el
diseño de hardware, ya que no implica la incorporación de componentes electrónicos
adicionales.

Sin embargo, como desventaja, el debounce por software puede incrementar levemente
el tiempo de ejecución y la complejidad del código. Esto se debe a la necesidad de
introducir mecanismos de temporización y control para gestionar los cambios de estado
del switch de manera confiable. Además, si no aplicamos el código correctamente, existe
el riesgo de ignorar interrupciones "verdaderas" o cambios de estado legítimos del
switch, lo que podría afectar la funcionalidad del sistema.
La forma más sencilla de aplicar un debounce por software es comprobar el tiempo entre
disparos de la interrupción. Si el tiempo transcurrido entre dos cambios de estado es
inferior a un determinado umbral de tiempo (threshold), simplemente ignoramos la
interrupción. Esto establece una especie de "zona muerta" en la que se desestiman las
interrupciones generadas por el switch durante ese período, lo que contribuye a la
estabilidad y confiabilidad de la detección de cambios de estado.

Imagen del diagrama de bloques (10 puntos)


Lista de materiales utilizados (nombres de los dispositivos) (5 puntos)

Precio Precio
Cantidad Descripción
unitario total
1 Tarjeta de Desarrollo arduino 600 600
1 Fuente de voltaje CD +5V 300 300
1 Protoboard 70 70
9 Resistencias 3 27
1 Display 7 Segmentos 20 20
2 Push bottom 5 10

Marco teórico (detalles de los elementos utilizados dentro de la


práctica) (5 puntos)

En primer lugar, el ATmega328P es un conocido microcontrolador fabricado por


Microchip Technology, que forma parte de la familia de microcontroladores AVR. El
componente está diseñado para ser una solución altamente versátil y energéticamente
eficiente para aplicaciones que van desde proyectos de electrónica de aficionados hasta
sistemas integrados más complejos. Sus principales características son:

Arquitectura AVR: El ATmega328P se basa en la arquitectura AVR (Advanced Virtual


RISC) de Atmel, que tiene un conjunto de instrucciones compacto y eficiente. Esto
permite que las instrucciones se ejecuten en un solo ciclo de reloj, lo que ayuda a lograr
un rendimiento rápido y eficiente desde el punto de vista energético. Velocidad de reloj:
puede funcionar a una frecuencia de reloj de hasta 20 MHz, lo que proporciona una
potencia de procesamiento relativamente alta para una variedad de aplicaciones.
Memoria: Hay una memoria flash de 32 KB para almacenamiento de programas, una
memoria RAM de 2 KB para almacenamiento temporal de datos y una memoria
EEPROM de 1 KB para almacenamiento de datos no volátiles. Estas memorias son
esenciales para almacenar códigos de programa, variables y configuraciones. Periféricos
integrados: el ATmega328P incluye varios periféricos integrados para simplificar la
interacción con el entorno externo. Esto incluye temporizadores, USART serial, SPI
(interfaz periférica serial) e interfaces I2C, pines de E/S programables, convertidores
analógicos a digitales (ADC) y más. Puertos de E/S: El chip tiene 23 pines de E/S
programables que brindan una gran flexibilidad para conectar y controlar componentes
externos como sensores, actuadores, pantallas, etc. Modos de ahorro de energía: uno
de los aspectos más destacados de los microcontroladores AVR es la capacidad de
operar en varios modos de ahorro de energía. Esto es fundamental para aplicaciones
alimentadas por batería en las que desea minimizar el consumo de energía cuando el
dispositivo está inactivo. En cuanto a los LED (diodos emisores de luz), estos dispositivos
permiten que la corriente fluya en una dirección y emiten luz cuando están polarizados.
Estos componentes suelen funcionar a alrededor de 2 V. Su funcionamiento es sencillo:
cuando se aplica corriente al semiconductor superior de un LED, una corriente fluye a
través de él provocando la emisión de luz. Algunas características notables de los LED
incluyen:

Variaciones de color: Debido al pequeño tamaño de los LED, se pueden combinar en


tiras para crear LED RGB, proporcionando múltiples colores controlando la corriente y la
luz emitida. Brillo y eficiencia: pueden conseguir importantes niveles de iluminación sin
elevar demasiado la temperatura. Respetuoso con el medio ambiente: los LED no
contienen elementos tóxicos y alcanzan su máximo rendimiento casi inmediatamente
después de su encendido. Además, son reutilizables, lo que permite repararlos y
reemplazarlos fácilmente en caso de daño. Finalmente, hablando de resistencias, son
una medida de resistencia a la corriente en un circuito. Todos los materiales tienen cierta
resistencia al paso de la corriente eléctrica y se pueden dividir en dos grandes categorías:

Conductores: Estos materiales tienen una resistencia eléctrica muy baja, lo que permite
que los electrones se muevan fácilmente a través de ellos. Ejemplos de conductores son
la plata, el cobre, el oro y el aluminio. Aislante: Por el contrario, los materiales aislantes
tienen una alta resistencia eléctrica y restringen el flujo de electrones. Ejemplos de
aislantes son el caucho, el papel, el vidrio, la madera y el plástico.

Imagen del Diagrama Esquemático hecho en un software EDA con los


nombres de sus integrantes (15 puntos)
Imagen del diagrama de flujo del programa (10 puntos)

Código en lenguaje C con los nombres de sus integrantes (copia y


pega el código directamente del IDE) (15 puntos)

/*
* Práctica 5.c
*
* Created: 12/10/2023 02:06:18 p. m.
* Author : Javie
* Docente: Jesús Daniel Garza Camarena
*
* Equipo 2
*
* Marcos Ezequiel Cervantes Castro #1953168 N.L: 6
* Javier Osmar Covarrubias Bautista #1958896 N.L: 8
* Brigada: 315
* Dia y hora: Miercoles, V4
*
* Fecha: 20/10/2023
*/

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>

//--Constantes
#define DELAY 5

//--Inputs
#define SWITCH_DDRX DDRC
#define SWITCH_PORTX PORTC
#define SWITCH_PINX PINC
#define SW_0 PINC1
#define SW_1 PINC2

//--Outputs
//---Puertos para segmentos A a G
#define DISPLAY_DDRX DDRD
#define DISPLAY_PORTX PORTD
#define DISPLAY_DDRX2 DDRB
#define DISPLAY_PORTX2 PORTB

//----Segmento A
#define SEG_A PORTD2
#define SEG_A_ON DISPLAY_PORTX |= _BV(SEG_A);
#define SEG_A_OFF DISPLAY_PORTX &= ~_BV(SEG_A);

//----Segmento B
#define SEG_B PORTD3
#define SEG_B_ON DISPLAY_PORTX |= _BV(SEG_B);
#define SEG_B_OFF DISPLAY_PORTX &= ~_BV(SEG_B);

//----Segmento C
#define SEG_C PORTD4
#define SEG_C_ON DISPLAY_PORTX |= _BV(SEG_C);
#define SEG_C_OFF DISPLAY_PORTX &= ~_BV(SEG_C);
//----Segmento D
#define SEG_D PORTD5
#define SEG_D_ON DISPLAY_PORTX |= _BV(SEG_D);
#define SEG_D_OFF DISPLAY_PORTX &= ~_BV(SEG_D);

//----Segmento E
#define SEG_E PORTD6
#define SEG_E_ON DISPLAY_PORTX |= _BV(SEG_E);
#define SEG_E_OFF DISPLAY_PORTX &= ~_BV(SEG_E);

//----Segmento F
#define SEG_F PORTD7
#define SEG_F_ON DISPLAY_PORTX |= _BV(SEG_F);
#define SEG_F_OFF DISPLAY_PORTX &= ~_BV(SEG_F);

//----Segmento G
#define SEG_G PORTB2
#define SEG_G_ON DISPLAY_PORTX2 |= _BV(SEG_G);
#define SEG_G_OFF DISPLAY_PORTX2 &= ~_BV(SEG_G);

//--Funciones
void init_ports(void);
void show_number(uint8_t x);
uint8_t RisingEdge(uint8_t pin);

//--Variables
uint8_t EstadoActual = 0;
uint8_t EstadoAnterior = 0;

int main(void)
{
init_ports();
uint8_t contador = 0;
while (1)
{
show_number(contador);
if (RisingEdge(SW_0) && contador < 9)
{
contador++;
_delay_ms(DELAY);
}
if (RisingEdge(SW_1) && contador > 0)
{
contador--;
_delay_ms(DELAY);
}
}
}

uint8_t RisingEdge(uint8_t pin)


{
EstadoAnterior = EstadoActual;
EstadoActual = bit_is_clear(SWITCH_PINX, pin);

if (EstadoAnterior == 0 && EstadoActual == 1)


{
while(bit_is_clear(SWITCH_PINX, pin));
return 1;
}
else
{
return 0;
}
}

void init_ports(void)
{
//--Inputs
SWITCH_DDRX &= ~(_BV(SW_0) | _BV(SW_1));

//--Pull Up
SWITCH_PORTX |= _BV(SW_0) | _BV(SW_1);

//--Outputs
DISPLAY_DDRX |= _BV(SEG_A) | _BV(SEG_B) | _BV(SEG_C) | _BV(SEG_D)
| _BV(SEG_E) | _BV(SEG_F);
DISPLAY_DDRX2 |= _BV(SEG_G);
}

void show_number(uint8_t numero)


{
switch (numero)
{
//--Numero 0
case 0:
SEG_A_ON;
SEG_B_ON;
SEG_C_ON;
SEG_D_ON;
SEG_E_ON;
SEG_F_ON;
SEG_G_OFF;
break;
//--Numero 1
case 1:
SEG_A_OFF;
SEG_B_ON;
SEG_C_ON;
SEG_D_OFF;
SEG_E_OFF;
SEG_F_OFF;
SEG_G_OFF;
break;
//--Numero 2
case 2:
SEG_A_ON;
SEG_B_ON;
SEG_C_OFF;
SEG_D_ON;
SEG_E_ON;
SEG_F_OFF;
SEG_G_ON;
break;
//--Numero 3
case 3:
SEG_A_ON;
SEG_B_ON;
SEG_C_ON;
SEG_D_ON;
SEG_E_OFF;
SEG_F_OFF;
SEG_G_ON;
break;
//--Numero 4
case 4:
SEG_A_OFF;
SEG_B_ON;
SEG_C_ON;
SEG_D_OFF;
SEG_E_OFF;
SEG_F_ON;
SEG_G_ON;
break;
//--Numero 5
case 5:
SEG_A_ON;
SEG_B_OFF;
SEG_C_ON;
SEG_D_ON;
SEG_E_OFF;
SEG_F_ON;
SEG_G_ON;
break;
//--Numero 6
case 6:
SEG_A_ON;
SEG_B_OFF;
SEG_C_ON;
SEG_D_ON;
SEG_E_ON;
SEG_F_ON;
SEG_G_ON;
break;
//--Numero 7
case 7:
SEG_A_ON;
SEG_B_ON;
SEG_C_ON;
SEG_D_OFF;
SEG_E_OFF;
SEG_F_OFF;
SEG_G_OFF;
break;
//--Numero 8
case 8:
SEG_A_ON;
SEG_B_ON;
SEG_C_ON;
SEG_D_ON;
SEG_E_ON;
SEG_F_ON;
SEG_G_ON;
break;
//--Numero 9
case 9:
SEG_A_ON;
SEG_B_ON;
SEG_C_ON;
SEG_D_OFF;
SEG_E_OFF;
SEG_F_ON;
SEG_G_ON;
break;
}

Fotografía del prototipo armado solo el área útil (no se permite el uso
de jumpers) (10 puntos)

Conclusión personal por cada integrante (5 puntos)

Javier Osmar Covarrubias Bautista: A través de esta actividad reforcé mis


conocimientos acerca de cómo plantear circuitos que prevengan la aparición de rebotes
ocasionados por botones, solo que esta vez arreglamos ese problema por medio de una
solución vía software, aplicando delays y doble condicional if para que el programa
analizara mejor los casos y se diera su tiempo de presentar cada salida del sistema. Por
lo que puedo decir que esta práctica fue un éxito debido a que logramos el objetivo
propuesto por la actividad y además obtuvimos una retroalimentación de los
conocimientos vistos en clases.

Marcos Ezequiel Cervantes Castro: En esta práctica, logramos entender el porqué la


eliminación de los rebotes en los switches mediante código es esencial para garantizar
la confiabilidad y precisión en sistemas electrónicos y dispositivos interactivos,
entendimos que el debounce por software es una estrategia efectiva que no requiere
componentes adicionales, lo que puede simplificar el diseño de hardware y reducir
costos. Sin embargo, debemos entender de que esta técnica puede llegar a tener
contras, pues hace nuestro programa más pesado, y si nuestro sistema no lo soporta,
puede llegar a crashear.

Referencias Bibliográficas en formato APA (mencionar los datasheet


utilizados, libros, páginas web, etc.) (obligatorio)

• Llamas, L. (2016). Leer un pulsador con arduino con interrupciones y


debounce. Luis Llamas. https://www.luisllamas.es/debounce-interrupciones-
arduino/
• Codigo IoT. (2018, 26 octubre). Debounce - código IoT. Código
IoT. https://www.codigoiot.com/base-de-conocimiento/debounce/
• Martha. (2019, 15 enero). Debouncing via software - digilent
reference. https://digilent.com/reference/learn/microprocessor/tutorials/debouncin
g-via-software/start
• Jecrespom. (2018, 9 julio). Debounce – aprendiendo arduino. Aprendiendo
Arduino. https://aprendiendoarduino.wordpress.com/tag/debounce/

También podría gustarte