Beruflich Dokumente
Kultur Dokumente
Actividad 5: Encendido de un
despliegue de LED controlado por
un botón
Introducción
Es importante mencionar que los display de 7 segmentos, dado que están construidos con
diodos LED, requieren una corriente máxima. En otras palabras, se requiere colocar una
resistencia para limitar la corriente. Dicha resistencia depende de la corriente que se quiera
suministrar al LED, así como de la caída de voltaje. Para calcular la resistencia usamos la Ley
de Ohm. Pueden ver este tutorial para calcular la resistencia de un led. También te puede
interesar el código de colores para resistencias.
o Filtrado: Hace uso de filtros digitales para cambiar la frecuencia de la señal a procesar,
estos filtros tienen la capacidad de aplicar nuevos filtros no existentes de forma
analógica como los llamados “de fase lineal”.
o Análisis de espectro: Cuando se quieren saber las frecuencias encontradas en una
señal, se utiliza esta herramienta, que es la aplicación de transformaciones para la
descripción de las señales en términos de valores en el dominio del tiempo o también
en el dominio de la frecuencia.
o Síntesis: Los PDS’s tienen la capacidad de generar funciones trigonométricas,
osciladores digitales, números aleatorios, etc.
o Correlación: Se puede ver esta herramienta como un filtro particular ya que deja pasar
cierto tipo de señal, se utiliza para detectar las periodicidades de una señal, esto a través
de contrastar intervalos anteriores con otros más actuales y así, en general, señalar las
similitudes entre señales.
Métodos
Material utilizado
o Cable USB tipo A a Mini-B.
o Tablero de prototipado (protoboard).
o Despliegue LED de 7 segmentos de anodo común.
o 1 resistencia de 220 Ohms.
o Cables Jump Wire.
Equipo utilizado
1. Tarjeta de procesamiento.
2. Computadora
Software utilizado
o Embitz: Es un IDE de alto rendimiento open source escrito en C++.
o STM32 ST-LINK utility: Interfaz de software para programación de microcontroladores
STM32 proporcionando un entorno de uso fácil y eficiente para la lectura, escritura y
verificación de un dispositivo de memoria. Esta herramienta proporciona una gama muy
amplia de funciones para la programación de memorias internas de STM32, memorias
externas, verificación de contenido de la programación y automatización de la
programación de STM32.
Procedimiento seguido
Actividad autónoma 1: Modifique el programa para modificar la
frecuencia con la que se realiza la secuencia a partir de un comando
enviado por el botón de usuario.
El programa consiste en 5 principales partes, las cuales son:
2. Definir las variables para activar el display de siete segmentos de anodo común. En esta parte
se definen los números del cero al F (en typedef enum) y consecuentemente se guardan las
variables en un vector (const unsigned short int segmentos) .
3. Se definen los registros y los espacios de memoria necesarios para poder utilizar el código
de manera eficaz en la tarjeta Nucleo-f401re (configuración máquina) y se inicializan las
variables que se requieran (en este caso DISPLAY=CERO, para que de esta manera el primer
número que se muestre en pantalla sea en cero).
4. Se define la lógica con la cual haremos el programa (void loop(void)) en la cual declaramos
variables de tipo estático (“static”) y se define la lógica con la cual desplegaremos los números
deseados en una secuencia lógica en el display de 7 segmentos de la manera correcta.
5. El código principal (int main(void)) se encuentra en esta parte, el cual no tendrá más
relevancia en este código que repetir el loop() en un ciclo while indefinidas veces.
Una vez identificadas las partes del código relevantes, podemos proceder a realizar los cambios
necesarios para poder cambiar la frecuencia con la que el display muestra la secuencia de
números hexadecimales, el procedimiento es el siguiente:
1. Se definieron 2 variables globales para cambiar la frecuencia, las cuales son DELAY con una
frecuencia de 500000 milisegundos y la otra es DELAYS con una frecuencia de 250000
milisegundos (es dos veces más rápida).
4. Se define la lógica con la cual haremos el programa (void loop(void)) en la cual declaramos
variables de tipo estático (“static”) y se define la lógica con la cual desplegaremos los números
deseados en una secuencia lógica en el display de 7 segmentos de la manera correcta.
5. El código principal (int main(void)) se encuentra en esta parte, el cual no tendrá más
relevancia en este código que repetir el loop() en un ciclo while indefinidas veces.
Una vez identificadas las partes del código relevantes, podemos proceder a realizar los cambios
necesarios para poder cambiar la secuencia de números hexadecimales por la secuencia de
letras que tienen el mensaje HOLA en el DISPLAY cada vez que se acciona el botón, para esto
el procedimiento que se realizó fue el siguiente:
1. Se definieron 2 variables globales, las cuales son DELAY con una frecuencia de 500000
milisegundos.
2. Se definieron 3 letras más en los valores para activar el Display de 7 segmentos (typedef
enum) las cuales fueron H, O y L, para formar la palabra HOLA (la letra A no era necesario
definirla nuevamente, ya estaba previamente en el programa).
3. Además del vector segmentos , se agregó otro vector llamado seg el cual contiene las
palabras ordenadas para formar la palabra HOLA.
Resultados
PB2 C yellow
# Interface #
PB3 D green
## Physical connections ##
PB4 E orange
Port Segment Color
PB5 F violet #define DELAY 500000UL //Frecuencia
original
PB6 G gray
#define DELAYS 250000UL //Frecuencia
modificada
typedef enum {
F B
CERO = 0xc0,
F B
UNO = 0xf9,
F B
DOS = 0xa4,
GGG
TRES = 0xb0,
E C
CUATRO = 0x99,
E C
CINCO = 0x92,
E C
SEIS = 0x82,
DDD
SIETE = 0xf8,
*/
OCHO = 0x80,
#include "stm32f4xx_conf.h"
NUEVE = 0x90,
#define DISPLAY GPIOB->ODR
CA = 0x88,
#define BUTTON (GPIOC->IDR &
GPIO_IDR_IDR_13)
CB = 0x83,
CC = 0xc6, |
GPIO_MODER_MODER4 | GPIO_MODER_MODER5
| GPIO_MODER_MODER6);
CD = 0xa1,
GPIOB->MODER |=
(GPIO_MODER_MODER0_0 |
CE = 0x86, GPIO_MODER_MODER1_0 |
GPIO_MODER_MODER2_0 |
GPIO_MODER_MODER3_0
CF = 0x8e
|
GPIO_MODER_MODER4_0 |
} digits;
GPIO_MODER_MODER5_0 |
GPIO_MODER_MODER6_0);
GPIOC->MODER &=
void setup() ~GPIO_MODER_MODER13;
{ GPIOC->PUPDR &=
~GPIO_PUPDR_PUPDR13;
// Configuraci de m痃uina
// Inicializaci de variables
RCC->AHB1ENR |=
DISPLAY = CERO;
RCC_AHB1ENR_GPIOBEN;
}
RCC->AHB1ENR |=
RCC_AHB1ENR_GPIOCEN;
void loop(void)
GPIOB->MODER &=
~(GPIO_MODER_MODER0 |
GPIO_MODER_MODER1 | GPIO_MODER_MODER2 {
| GPIO_MODER_MODER3
static short unsigned int display_count++;
display_count = 0;
DISPLAY =
segmentos[display_count];
static short unsigned int m = 0;
// inicialización (variable de
control)
delay_count = DELAYS;
if (BUTTON)
static long unsigned int del_count
= DELAYS; // inicialización
(frecuencia modificada)
{
del_count--;
{
//m = m+1;
display_count++;
m = m; // variable m igual a m
display_count &= 0x0f;
}
DISPLAY =
segmentos[display_count];
{
}
m = m+1;
if (m==1 && !delay_count) //rutina
con la frecuencia modificada
}
{
if (m>1) //caso if variable m @author Gastón SALAZAR || equipo
mayor a 1 12
{ # Interface #
m = 0; ## Physical connections ##
{ PB1 B red
{ PB4 E orange
} PB6 G gray
F B
/** @file main.c
F B
GGG TRES = 0xb0,
E C CUATRO = 0x99,
E C CINCO = 0x92,
E C SEIS = 0x82,
*/ OCHO = 0x80,
CC = 0xc6,
#define DELAY 500000UL
CD = 0xa1,
#define ms 1UL
CE = 0x86,
// Values for activating LEDs on a 7-
segments display with common anode
CF = 0x8e,
typedef enum {
CH = 0x89,
CERO = 0xc0,
CO = 0xc0,
UNO = 0xf9,
CL = 0xc7
DOS = 0xa4,
} digits;
const unsigned short int segmentos[] |
= {CERO, UNO, DOS, TRES, CUATRO, GPIO_MODER_MODER4_0 |
CINCO, GPIO_MODER_MODER5_0 |
GPIO_MODER_MODER6_0);
|
GPIO_PUPDR_PUPDR4 | GPIO_PUPDR_PUPDR5
const unsigned short int seg[] = {CH, | GPIO_PUPDR_PUPDR6);
CO, CL, CA}; // designación de los
nuevos caracteres
GPIOC->MODER &=
~GPIO_MODER_MODER13;
void setup()
GPIOC->PUPDR &=
{ ~GPIO_PUPDR_PUPDR13;
}
RCC->AHB1ENR |=
RCC_AHB1ENR_GPIOCEN;
void loop(void)
GPIOB->MODER &=
~(GPIO_MODER_MODER0 |
GPIO_MODER_MODER1 | GPIO_MODER_MODER2 {
| GPIO_MODER_MODER3
delay_count--;
if (m==0 && !delay_count) //
contador de 0 a f
//m = m+1;
m = m; // m igual a m
resignación de estado
display_count++;
}
display_count &= 0x0f;
else
DISPLAY =
segmentos[display_count];
delay_count = DELAY;
m = m+1; // variable m
= m+1 (cambio de estados)
}
}
if (m==1 && !delay_count)
//contador caracter H-O-L-A
if (m>1) //condiciones de
estado m mayor a 1
{
{
dis_count++;
m = 0;
dis_count &= 0x03;
}
DISPLAY = seg[dis_count];
}
delay_count = DELAY;
int main(void)
}
{
if (BUTTON)
setup(); loop();
while(1) }
{ }
Dificultades encontradas
Durante la realización de los dos programas la única dificultad que se encontró fue la función y
los estados del botón de usuario, ya que al inicio de la programación teníamos de escaso a
nulo conocimiento de este.
Conclusiones
Referencias
Salazar, Gaston., “dsp03”. github.com. N.p. , 23 Feb. 2019. Web. 13 Feb 2019.
Yiu, Joseph., “ARM Cortex-M for Beginners”. community.arm.com. N.p., Mar. 2017. Web. 22
Feb 2019.