Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SUBPRIORIDADES
UNIVERSIDAD POLITÉCNICA SALESIANA
MICROPROCESADORES Y SISTEMAS EMBEBIDOS, INGENIERÍA MECATRÓNICA
DARIO JAVIER CASAMIN CINILIN
dcasamin@est.ups.edu.ec
OBJETIVOS ESPECÍFICOS:
• Comprender el funcionamiento en FIG 1. CUBE MX STM32
programación de una prioridad y sub
prioridad.
• Ver la utilidad de una prioridad en KIEL MDK
programación para STM32f4xx. Keil MDK es el entorno de desarrollo de
software completo para una amplia gama de
dispositivos microcontroladores basados en
II. MARCO TEÓRICO Arm Cortex-M. MDK incluye el IDE μVision y
depurador , compilador Brazo C / C ++ , y
CUBE MX STM32
esenciales de middleware componentes. Es
• Configuración de generación de compatible con todos los proveedores de
código C para la multiplexación de silicio con más de 8.000 dispositivos y es
pin, la señal de reloj, los periféricos y fácil de aprender y usar.[2]
la configuración de middleware con
asistentes gráficos
• Generación de proyectos de entorno
completo de desarrollo integrado
(IDE) listos para cadenas de
herramientas entorno completo de
desarrollo integrado
• Cálculo del consumo de energía para
una secuencia de aplicación definida
por el usuario
• Importación directa de bibliotecas de FIG 2. SOFTWARE KEIL
FIG 4. LCD
siguiente posición del lcd, podemos
emplear funciones como \f para limpiar el
display, \n cambio a la segunda línea, \b
mueve una posición atrás.
lcd_getc(x,y): devuelve caracteres a la
posición x,y.
Otras funciones: lcd_send_nibble(BYTE
n), lcd_send_byte(BYTE address, BYTE
n). [4]
PULSADORES
Pulsadores o interruptores, hay toneladas de
ellos en su casa. Un interruptor es un
FIG 5. CONEXIONADO DE PINES dispositivo simple con dos posiciones, EN y
AP (ENcendido y APagado). Una clase de
interruptor que usted usa cada día es el
LA LIBRERÍA DEL LCD:
interruptor de la luz. Cuando conecta, dentro
del interruptor, dos cables son unidos, lo que
Para poder visualizar los caracteres
o símbolos en el LCD es necesario que en permite fluir a la corriente que enciende la luz
el programa de código fuente a emplear, o la tostadora se caliente. Cuando lo
incluyamos la librería de este. desconecta, los dos cables son desunidos y
En este caso empleamos la librería "lcd.c", corta el flujo de la corriente. Esto esta muy
la cual hemos modificado. Siempre que bien pero creo que esto no es lo que interesa
utilicemos una librería de este tipo aquí.
tendremos que analizarla para saber cuales En definitiva, se trata de un mecanismo
son los pines de control y los pines para el
simple (los hay muy sofisticados),
Bus de datos, en este caso podemos
observar que están definidos al comienzo constituido por un par de contactos
de la misma. eléctricos que se unen o separan por medios
mecánicos. En electricidad, los falsos
contactos que se producen el ser utilizados
#define LCD_ENABLE_PIN PIN_D0 normalmente, en algunos casos produce
#define LCD_RS_PIN PIN_D1 una chispa debido a la corriente que
#define LCD_RW_PIN PIN_D2 atraviesa los contactos, provocando que
#define LCD_DATA4 PIN_D4 quemen en parte y ennegreciendo los
#define LCD_DATA5 PIN_D5 contactos eléctricos, lo que a la larga acaba
#define LCD_DATA6 PIN_D6 deteriorando dichos contactos. La chispa se
#define LCD_DATA7 PIN_D7 produce siempre al separar los contactos
(desconectar), en ocasiones parece que
En el resto de la librería se puede encontrar
también salta al conectarlos, eso es debido
todas las estructuras necesarias así como
las funciones que nos permiten utilizar a los rebotes mecánicos que se producen al
nuestro LCD. cambiar de estado.
Podemos encontrar funciones como : Esto que en electricidad se considera
normal, en electrónica es un verdadero nido
lcd_init: inicializa el lcd. de problemas, debido a dichos falsos
lcd_gotoxy: establece la posicion de contactos. Por su propia naturaleza, al
escritura en el lcd.
cambiar de posición un interruptor, los
lcd_putc: nos muestra un dato en la
contactos chocan entre sí y esto significa
una serie de falsos contactos que se de 0x00 a 0x0F. Digamos que tenemos que
reproducen de un modo sin control, por lo usar USART recibe la interrupción y la
que se generan los temidos rebotes conversión ADC finaliza la interrupción.
(debounce en inglés), estos rebotes, se USART es más importante que ADC, por lo
producen incluso cuando unimos dos cables que USART tendrá un número menor que
desnudos, simulando un interruptor o ADC.
pulsador.[5]
NVIC_IRQChannelSubPriority
Con este parámetro configuras la
interrupción prioridad, número de 0x00 a
0x0F. Digamos que tienes 2
USARTs habilitado, pero USART1 es más
importante que USART2. Así que USART1
tendrá número más bajo que USART2.[6]
FIG 6. PULSADOR
➢ PUERTOS PULSADORES:
• PB1: GPIO_EXTI1-PULL-UP
• PB2: GPIO_EXTI2-PULL-UP
• PB3: GPIO_EXTI10-PULL-UP
Vamos al NVIC para configurar las
prioridades y sub prioridades para nuestro
programa
FIG 10. SOFTWARE KEIL
CÓDIGO EN KEIL:
LLAMAR A LAS LIBRERIAS:
/* Includes --------------------------------------------
----------------------*/
FIG 8. CONFIGURACIÓN PRIORIDADES #include "main.h"
También nos ubicamos en GPIO para #include "stdio.h"
configurar los puertos de los pulsadores en
PULL-UP y en modo RISING para las INICIALIZACIÓN DE LAS VARIABLES:
prioridades y sub prioridades. int p=00;
int q=00;
int r=00;
int s=00;
int t=00;
int u=00;
FIG 9. CONFIGURACIÓN DE PUERTOS PARA
PULSADORES int v=00;
Damos en generar código para luego poder int contador=0;
programar en el software KEIL y también
char T1[2];
debemos adicionar unas librerías para
poder ejecutar el LCD lo que programemos char T2[2];
char T3[2];
CONFIGURACION DE PUERTOS PARA
LCD:
/* USER CODE BEGIN 2 */
LCD1602_Begin4BIT(GPIOC,GPIO_PIN_1
0,GPIOC,GPIO_PIN_12,GPIOA,GPIO_PIN
if(t<=9){
_1,GPIOA,GPIO_PIN_4,GPIOB,GPIO_PIN
_0,GPIOC,GPIO_PIN_1); LCD1602_setCursor(1,6);
PROGRAMACIÓN DEL RELOJ: LCD1602_PrintInt(t);
/* USER CODE BEGIN 3 */ }
if(t>9 && t<=24){
LCD1602_setCursor(1,5); LCD1602_setCursor(1,5);
LCD1602_print(" : : "); LCD1602_PrintInt(t);
}
LCD1602_noCursor(); if(t<10){
LCD1602_noBlink(); LCD1602_setCursor(1,5);
LCD1602_PrintInt(u);
LCD1602_setCursor(2,4); }
LCD1602_print("04/01/2021");
p=p+1;
if(p>=60){ if(r<=9){
r=r+1; LCD1602_setCursor(1,9);
p=0; LCD1602_PrintInt(r);
} }
if(r>=60){ if(r>9 && r<60){
t=t+1; LCD1602_setCursor(1,8);
r=0; LCD1602_PrintInt(r);
} }
if(t>=24){ if(r<10){
p=00; LCD1602_setCursor(1,8);
r=00; LCD1602_PrintInt(s);
t=00; }
}
if(p<=9){ /* USER CODE BEGIN 4 */
LCD1602_setCursor(1,12); void HAL_GPIO_EXTI_Callback(uint16_t
GPIO_PIN){
LCD1602_PrintInt(p);
if (GPIO_PIN == GPIO_PIN_1){
}
for(int a=1;a<=17;a++)
if(p>9 && p<60){
{
LCD1602_setCursor(1,11);
LCD1602_clear();
LCD1602_PrintInt(p);
LCD1602_setCursor(2,a);
}
if(p<10){
LCD1602_setCursor(1,11);
LCD1602_print("mecatronica");
LCD1602_PrintInt(q);
HAL_Delay(600);
}
LCD1602_clear();
HAL_Delay(1000);
}
}
}
if(GPIO_PIN == GPIO_PIN_2){
/* USER CODE END 3 */
LCD1602_clear();
}
LCD1602_setCursor(2,1);
PARA VER LAS INTERRUPCIONES:
LCD1602_print("DARIO
/* EXTI interrupt init*/
CASAMIN");
HAL_NVIC_SetPriority(EXTI1_IRQn, 1, 1);
HAL_Delay(5000);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
LCD1602_clear();
}
HAL_NVIC_SetPriority(EXTI2_IRQn, 1, 2);
if(GPIO_PIN == GPIO_PIN_10){
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
LCD1602_clear();
LCD1602_setCursor(2,1);
HAL_NVIC_SetPriority(EXTI15_10_IRQn,
contador=contador+1;
1, 3);
LCD1602_PrintInt(contador);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); HAL_Delay(3000);
PROGRAMACIÓN DE PULSADORES LCD1602_clear();
CON INTERRUPCIONES:
}
}
/* USER CODE END 4 */
IMPLEMENTACIÓN DE LA
PROGRAMACIÓN
INICIO
RELOJ
PULS1 NO
SI
MECATRONICA
NO
PULS2
SI
DARIO
CASAMIN
PULS3 NO
SI
CONT+1
RELOJ NO
FIN
g/pulsadores-sin-rebotes. [Último acceso:
03 01 2021].
V. BIBLIOGRAFÍA