Está en la página 1de 17

INTERRUPCIONES Y TEMPORIZADORES EN

LENGUAJE C CON CSS Y PROTEUS

Parte 1
Elaborado por:

Ivan Londoño
José Fernando Perez
Interrupciones

Las interrupciones son una herramienta Hardware que le permite a un microcontrolador


Monitorear diferentes eventos en forma simultanea, mientras el procesador se
encuentre ocupado ejecutando alguna rutina.

Ejemplo 1:

Supongamos que se requiere desarrollar una aplicación en la que el


microcntrolador debe realizar cuatro tareas diferentes:

a. Conversión análoga
b. Lectura de teclado
c. Temporización
d. Recepción serial

De estas cuatro tareas solo una se esta ejecutando continuamente, en


este caso se ejecutara la conversión análoga digital , mientras las
otras tres tareas se ejecutan solo cuando se genere el evento.

Es decir la lectura del teclado se ejecuta solo cuando se presione el


Teclado, al igual que la lectura del temporizador o la comunicación
serial.

Al finalizar la atención de la interrupción respectiva el sistema


regresa al programa principal.
Interrupción externa INT0

Ejemplo1: Se requiere Conmutar el led D1 cada que se presione el interruptor S1, para ello se debe utilizar la
interrupción externa INT0 del microcontroaldor PIC16F877 , simultaneo a esta tarea se debe poner a oscilar un
led D2 con una frecuencia de 1Hz. Esta oscilación se debe generar usando la herramienta DELAY.

Solución:
Interrupción externa INT0

#INCLUDE <16F877.H>
void Main ()
#USE DELAY(CLOCK=20M)
{
#Byte PORTB = 0x06
TRISC=0; //Configuración Puertos
#Byte PORTC = 0x07
TRISD=0;
#Byte PORTD = 0x08
#Byte TRISB = 0x86
enable_interrupts(INT_EXT); //Habilitación Interrupción Externa INT0
#Byte TRISC = 0x87
enable_interrupts(GLOBAL); //Permiso de Interrupciones
#Byte TRISD = 0x88
D2=0;
#BIT S1 =PORTB.0
WHILE(true)
#BIT D1 =PORTC.0
{
#BIT D2 =PORTD.0
D2=1; //D2 = ON
DELAY_MS(500);
#int_EXT
D2=0; //D2 = OFF
void Interrupcion_INT0(void) //Subrutina de Atención a la
DELAY_MS(500);
{ //interrupción de INT0
}
IF(D1==0)
{
}
D1=1;
}
ELSE
{
D1=0;
}
}
Interrupción externa RB7_RB4

Ejemplo2: Se requiere Conmutar 4 leds conectados en la parte baja del Portd, cada que se presione alguno de
los interruptores entre S1 y S4, para ello se debe utilizar la interrupción de la parte alta del Portb del
microcontroaldor PIC16F877, Esta interrupción detecta cualquier cambio en la parte alta del Portb, es decir
que cuando se presione uno o mas interruptores el sistema salta a la rutina reservada para atender este evento.
Solución:
Combinado dos interrupciones.
Interrupción externa RB7_RB4 y Interrupción externa RB0

#INCLUDE <16F877.H>
#USE DELAY(CLOCK=20M)

#Byte PORTB = 0x06 void Main () //Programa Principal


#Byte PORTD = 0x08 {
#Byte TRISB = 0x86 TRISD=0; //Configuración Puertos
#Byte TRISD = 0x88 Port_b_Pullups(True); //Se habilitan las resistencias
#BIT S1 =PORTB.4
Pullups
#BIT S2 =PORTB.5 //del PORTB
#BIT S3 =PORTB.6 //Esto permite conectar interruptores
#BIT S4 =PORTB.7 //en PORTB sin resistencia externa

#BIT D1 =PORTD.0
#BIT D2 =PORTD.1
#BIT D3 =PORTD.2
enable_interrupts(INT_RB);
#BIT D4 =PORTD.3 enable_interrupts(GLOBAL);

WHILE(True)
#int_RB {
void TECLAS(void) //Rutina de Atención Interrupción }
{ //de la parte alta del puerto B
IF(S1==0) //S1 se presiona S1
D1=~D1; //D1 Conmuta }
IF(S2==0) //Si se presiona S2
D2=~D2; //D2 Conmuta
IF(S3==0) //Si se presiona S3
D3=~D3; //D3 Conmuta
IF(S4==0) //Si se presiona S4
D4=~D4; //D4 Conmuta
}
Combinado dos interrupciones.
Interrupción externa RB7_RB4 y Interrupción externa RB0

Ejemplo3: En esta aplicación se combinan las dos interrupciones anteriores Se requiere Conmutar 4 leds conectados en la parte
baja del Portd, cada que se presione alguno de los interruptores entre S1 y S4, para ello se debe utilizar la interrupción de la
parte alta del Portb del microcontroaldor PIC16F877, además cada que se presiones el interruptor S0 se debe activar la
interrupción RB0(INT0), en donde se conmutara el estado del motor conectado en el pin RC2.

Solución:
#int_RB
#INCLUDE <16F877.H>
void TECLAS(void) //Rutina de Atención Interrupción
#USE DELAY(CLOCK=20M)
{ //de la parte alta del puerto B
IF(S1==0) //S1 se presiona S1
#Byte PORTB = 0x06
D1=~D1; //D1 Conmuta
#Byte PORTD = 0x08
IF(S2==0) //Si se presiona S2
#Byte PORTC = 0x07
D2=~D2; //D2 Conmuta
#Byte TRISB = 0x86
IF(S3==0) //Si se presiona S3
#Byte TRISD = 0x88
D3=~D3; //D3 Conmuta
#Byte TRISC = 0x87
IF(S4==0) //Si se presiona S4
D4=~D4; //D4 Conmuta
#BIT S1 =PORTB.4
}
#BIT S2 =PORTB.5
#BIT S3 =PORTB.6
#BIT S4 =PORTB.7

#BIT Motor =PORTC.2 void Main ()


#BIT D1 =PORTD.0 {
#BIT D2 =PORTD.1 TRISD=0; //Configuración Puertos
#BIT D3 =PORTD.2 TRISC=0;
#BIT D4 =PORTD.3 Port_b_Pullups(True); //Se habilitan las resistencias Pullups
//del PORTB
#int_EXT //Esto permite conectar interruptores
void Interrupcion_INT0(void) //Subrutina de Atención a la //en PORTB sin resistencia externa
{ //interrupción de INT0
IF(Motor==0) enable_interrupts(INT_EXT);
{ enable_interrupts(INT_RB);
Motor=1; enable_interrupts(GLOBAL);
}
ELSE WHILE(True)
{ {
Motor=0; }
}
} }
Temporizadores
El oscilador del microcontrolador utiliza cristal de cuarzo para su funcionamiento. Aunque no se trata de la solución más simple, hay
muchas razones para utilizarlo. La frecuencia del oscilador es definida con precisión y muy estable, así que siempre genera los pulsos del
mismo ancho, lo que los hace perfectos para medición de tiempo. Tales osciladores se utilizan en los relojes de cuarzo.

Si es necesario medir el tiempo transcurrido


entre dos eventos, basta con contar los pulsos
generados por este oscilador.

Un temporizador es un registro que incrementa su


Contenido cada que recibe una señal de reloj. Esta señal
de reloj puede provenir del oscilador interno del microcntrolador
o de un oscilador externo conectado a uno de los pines del microcontrolador

Grafica Tomada de la pagina: http://www.mikroe.com


Con fines educativos
Temporizadores: Pre-escalador

Un pre-escalador es un dispositivo electrónico


utilizado para dividir la frecuencia por un
factor predeterminado. Esto quiere decir que se
necesita llevar 1, 2, 4 o más pulsos a su entrada
para generar un pulso a la salida. La mayoría
de los microcontroladores disponen de uno o
más pre-escaladores incorporados y su tasa de
división puede ser cambiada dentro del
programa. El pre-escalador se utiliza cuando es
necesario medir los períodos de tiempo más
largos.

Grafica Tomada de la pagina: http://www.mikroe.com


Con fines educativos
Temporizadores: Interrupción
Si el registro del temporizador es de 8 bits, el mayor número que se puede escribir en él es 255 (en los
registros de 16 bits es el número 65.535). Si se excede este número, el temporizador se reinicia
automáticamente. Esto es denominado desbordamiento(overflow) y puede provocar una interrupción, lo
que abre completamente nuevas posibilidades.

Grafica Tomada de la pagina: http://www.mikroe.com


Con fines educativos
Temporizadores: Interrupción
Por ejemplo, el estado de registros utilizados para contar segundos, minutos o días puede ser
implementado en una rutina de interrupción. El proceso entero (excepto la rutina de interrupción) se
lleva a cabo internamente, lo que permite que los circuitos principales del microcontrolador funcionen
regularmente.

Grafica Tomada de la pagina: http://www.mikroe.com


Con fines educativos
Temporizadores/Contadores

Los TIMER o temporizadores son módulos integrados en el PIC que permiten realizar tanto de eventos
internos como externos. Cuando la cuenta es interna se habla de TEMPORIZACION y cuando la cuenta es
externa se habla de CONTADOR.
TIMER0

El bloque funcional TIMER0 es un registro de 8 bits, incrementado por


hardware y programable. La cuenta máxima es de 255 (el incremento
es constante e independiente)

•Contador: cuenta los eventos externos (pin RA4/TOCK1)

•Temporizador: cuenta los pulsos de reloj internos.


TIMER0
Configuración del TIMER0

Los distintos modos se pueden agrupar mediante el empleo de símbolo “ |”

Setup_timer_0 ( RTCC_DIV_2 | RTCC_EXT_L_TO_H );


Interrupciones

Las interrupciones permiten a cualquier suceso interior o exterior interrumpir la ejecución del programa principal
en cualquier momento.

En el momento en el que se produce la interrupción, el PIC ejecuta un salto a la rutina de interrupción y ejecuta el
codigo correspondiente a la interrupción. Una vez se termina de ejecutar dicha rutina el PIC retorna a la ejecución del
programa principal en la misma posición de memoria donde se produjo la interrupción.

•Interrupciones externas: detección en el cambio de estado de algún pin o pines de puerto.


•Interrupciones Internas: Desbordamiento de los TIMERS.
•Conversión A/D
•Comunicación Serial
•Comunicación USB

También podría gustarte