Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INSTITUTO TECNOLÓGICO DE
LÁZARO CÁRDENAS
NOMBRE DE LA PRACTICA:
1.2 VARIACION DE SECUENCIAS Y VELOCIDAD POR
INTERRUPCIONES
NÚMERO DE CONTROL:
19560199
CARRERA:
INGENIERÍA ELECTRÓNICA
INSTRUCTOR:
M.C. JULIO CESAR GALLO SANCHEZ
Av. Melchor Ocampo # 2555, Col. Cuarto Sector, C.P. 60950, Cd. Lázaro Cárdenas, Michoacán,
Teléfono (753) 53 7 19 77, 53 2 10 40, 53 7 53 91, Ext. 121 e-mail: electronica01@itlac.mx
www.tecnm.mx | www.itlac.mx.
INTRODUCCION
Cabe aclarar que este pequeño instructivo se ha creado con la finalidad de explicar lo más
detallado posible para que la persona que este leyendo este documento para que se pueda
replicar de una manera exitosa.
DESARROLLO
Lista de materiales
Cantidad Material
1 Microcontrolador PIC18F45K50
2 Resistencia de 39 KΩ
2 Push button
1 Protoboard
Lo que se realizara en esta práctica es hacer uso de las interrupciones externas del
microcontrolador. Las interrupciones son eventos que hacen que el microcontrolador deje de
realizar la tarea actual y pase a efectuar otra actividad. Al finalizar la segunda actividad
retorna a la primera y continúa a partir del punto donde se produjo la interrupción, cabe
aclarar que las interrupciones deben ser instrucciones cortas ya que si el programa no regresa
lo más pronto posible al programa principal deja de ser una interrupción, en la siguiente
imagen se representa un descripción grafica que básicamente son dos push button, uno para
cambiar de secuencia de leds que estarán conectadas a l puerto ya que es el único de los
puertos que está completo y el otro botón para incrementar la velocidad
39 KΩ
39 KΩ
En la siguiente imagen se muestra los pines del microcontrolador PIC18F45K50 en donde
están las interrupciones externas del microcontrolador las cuales son: IN0, INT1 e INT2. Se
usarán las INT0 e INT1 que son los pines RB0 que se usará para incrementar la velocidad de
la secuencia y RB1 para cambiar la secuencia respectivamente.
En la siguiente imagen se muestra los pines RB0 y RB1 de la tarjeta donde está integrado el
PIC18F45K50.
Después de la explicación sigue la elaboración del código en el software MPLAB IDE,
comenzando en las siguientes líneas de código se configura como se trabajara el
microcontrolador, los parámetros que se configuran son la velocidad del microcontrolador
que este caso se está usando la mayor velocidad a la que puede trabajar que son 48 MHz, se
agrega la librería del microcontrolador, además se aparta un proporción de la memoria de
trabajo del microntrolador para la programación a través del puerto USB (Bootloader) esto
para no tener que usar el Programador físico.
Después se declaran 3 variable auxiliares, sec y vel serán para cambiar la secuencia y otra
para incrementar la velocidad respectivamente, y s para ir desplegando los valores de los
vectores que se desplegarán en el módulo de leds que está conectado al puerto A.
int sec,vel;
int s=0;
dentro de la función principal main, en estas líneas de código se habilitan las interrupciones
que se usaran, en este caso INT0 y INT1y a su vez si se activaran con flanco de posición
positivo o negativos.
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_EXT);
ext_int_edge(1,L_TO_H);
ext_int_edge(0,L_TO_H);
tomando de ejemplo la INT con la primera línea de código se activa la interrupción, con la
segunda línea se da de alta la interrupción y finalmente con la tercera línea de código se
estable si se activara con un flanco de posición negativo o positivo en este caso se declaró de
L_TO_H que quiere decir de LOW_TO_HIGH que es de bajo a alto.
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
ext_int_edge(0,L_TO_H);
Después dentro de la función principal main, y a su vez dentro de un for infinito se pregunta
primeramente usando switch case se pregunta por el estado de la variable sec para desplegar
la secuencia en el módulo de leds conectados al puerto A.
switch(sec)
{
case 1: if(s== 7)
{
s=0;
}
output_A(sec1[s]);
s++;break;
case 2: if(s==16)
{
s=0;
}
output_A(sec2[s]);
s++;break;
case 3: if(s==21)
{
s=0;
}
output_A(sec3[s]);
s++;break;
case 4: if(s==32)
{
s=0;
}
output_A(sec4[s]);
s++;break;
case 5: if(s==8)
{
s=0;
}
output_A(sec5[s]);
s++;break;
}
Tomado por el ejemplo para cuando sec = 1, entra al caso 1, sec 1 es la secuencia 1 que es
un vector de 7 posiciones, se pregunta si s es igual al número de posiciones del vector se
iguala 0 para que se vuelva a ejecutar la secuencia, por el contrario se manda el dato de la
posición del vector del valor que tenga s en ese momento y se incrementa, de igual forma se
hace lo mismo con los demás casos.
case 1: if(s== 7)
{
s=0;
}
output_A(sec1[s]);
s++;break;
de igual forma con switch case se hacen diferentes casos para el cambio de la velocidad,
dependiendo del valor que tenga la variable vel se ejecutara la secuencia a la velocidad del
caso.
switch(vel){
case 1:delay_ms(1000);break;
case 2:delay_ms(500);break;
case 3:delay_ms(250);break;
case 4:delay_ms(100);break;
case 5:delay_ms(80);break;
}
En la interrupción 0 primero se estable fuera de la función principal main con #int_ext, se le
pone un nombre cualquiera y dentro de ella se pregunta por el estado de la variable vel que
recordando este programa solo tiene 6 diferentes velocidades si es igual a 6 se reinicia a 1 de
lo contario se incrementa se espera 2 ms por el rebote del botón y finalmente regresa a la
función principal.
#int_ext
void Velocidad__()
{
if(vel == 6)
vel = 1;
else
vel++;
delay_ms(2);
}
#int_ext1
void secuencia__()
{
if(sec == 6)
sec = 1;
else
sec++;
delay_ms(2);
}
Código del programa
#include "18f45k50.h"
#use delay(internal=48MHz)
#build(reset=0x02000,interrupt=0x02008)
#org 0x0000, 0x1FFF { }
void main(void){
//Set_tris_a(0xff);
//output_a(0xff);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_EXT);
ext_int_edge(1,L_TO_H);
ext_int_edge(0,L_TO_H);
for (;;)
{
switch(sec)
{
case 1: if(s== 7)
{
s=0;
}
output_A(sec1[s]);
s++;break;
case 2: if(s==16)
{
s=0;
}
output_A(sec2[s]);
s++;break;
case 3: if(s==21)
{
s=0;
}
output_A(sec3[s]);
s++;break;
case 4: if(s==32)
{
s=0;
}
output_A(sec4[s]);
s++;break;
case 5: if(s==8)
{
s=0;
}
output_A(sec5[s]);
s++;break;
}
switch(vel){
case 1:delay_ms(1000);break;
case 2:delay_ms(500);break;
case 3:delay_ms(250);break;
case 4:delay_ms(100);break;
case 5:delay_ms(80);break;
}
#int_ext
void Velocidad__()
{
if(vel == 6)
vel = 1;
else
vel++;
delay_ms(2);
}
#int_ext1
void secuencia__()
{
if(sec == 6)
sec = 1;
else
sec++;
delay_ms(2);
}}
Fotos de la practica en físico
CONCLUSION
Con esto último se concluye esta práctica de la secuencia de luces con velocidad variable por
interrupciones externas.
Este pequeño proyecto en MPLAB IDE, aunque puede muy insignificante las secuencias de
luces están por todas partes en los vehículos hogareños, vehículos grandes, camiones de
cargar, en el entrenamiento, como indicaciones las secuencias de luces nos indican cierta
instrucción, o ya sea que se utilice como una forma de entrenamiento como en los juegos de
ferias en los, en los vehículos de transporte de material peligroso y agregando un extra de
que si puede variar la velocidad de estas se puede tener una alta área de aplicación.