Interrupciones y Temporizadores

También podría gustarte

Está en la página 1de 15

C U R S O B S IC O -IN TER M ED IO

M IC R O C O N TR O LA D O R
ES
Dia:-16F877A
6y7
P IC 16F84A
18F4550
Expositor:
Lopez

Miguel Angel Ramirez

Interrupciones
Las interrupciones permiten a cualquier suceso interior o
exterior interrumpir la ejecucin del programa en
cualquier momento.
En el momento de producirse una interrupcin el PIC
ejecuta un salto a la rutina de atencin de interrupcin,
previamente definida por el programador, donde se
atender la demanda de la interrupcin.
Cuando se termina de ejecutar dicha rutina, el PIC
retorna a la ejecucin del programa principal en la
misma
posicin
de la memoria
de programa
se
El manejo
de interrupciones
permite
realizar donde
programas
ejecuto
la interrupcin.
que no tienen
que estar continuamente consultando
sobre sucesos internos o externos mediante tcnicas de
consulta las cuales provocan retardos o paradas en la
ejecucin del programa principal

Directivas de Interrupcin
Estas directivas especifican que la funcin que le sigue
es una funcin de interrupcin.
Las funciones de interrupcin no pueden tener ningn
parmetro, y como es natural no todas las directivas
pueden usarse con todos los dispositivos. Algunas de las
directivas
de INTERRUPCIN
este tipo son:
#INT_EXT
EXTERNA (RB0)
#INT_RTCC DESBORDAMIENTO DEL TIMER0(RTCC)
#INT_RB
CAMBIO EN UNO DE LOS PINES B4,B5,B6,B7
#INT_AD
CONVERSOR A/D
#INT_EEPROM ESCRITURA EN LA EEPROM COMPLETADA
#INT_TIMER1 DESBORDAMIENTO DEL TIMER1
#INT_TIMER2 DESBORDAMIENTO DEL TIMER2
#INT_CP1 MODO CAPTURA DE DATOS POR CCP1
#INT_CCP2 MODO CAPTURA DE DATOS POR CCP2
#INT_SSP
PUERTO DE SERIE INTELIGENTE(SPI, I2C)
#INT_PSP PUERTO PARALELO
#INT_TBE SCI DATO SERIE TRANSMITIDO
#INT_RDA SCI DATO SERIE RECIBIDO
#INT_COMP
COMPARADOR DE INTERRUPCIONES

#INT_ADOF
#INT_RC
#INT_I2C
#INT_LCD

DESBORDAMIENTO DEL A/DC DEL PIC 14000


CAMBIO EN UN PIN Cx
I2C DEL 14000
LCD 92x

El compilador salta a la funcin de interrupcin cuando


se detecta una interrupcin, es el propio compilador el
encargado de generar el cdigo para guardar y restaurar
el estado del procesador.
Tambin es el compilador quien borrar la interrupcin
(el flag). Sin embargo, nuestro programa es el encargado
de llamar a la funcin ENABLE_INTERRUPT() para
activar previamente la interrupcin junto con el
sealizador#int_EXT
(flag) global de interrupciones.
void EXT_isr()
//Nombre cualquiera de una funcin
Ejemplo de uso:
{
.codigo
.codigo
}

Funciones de Control del


ENABLE_INTERRUPTS(level)
Procesador
Esta funcin activa la interrupcin del nivel dado en
level.
Queda a cargo del programador definir un
procedimiento o rutina de atencin, para el caso que se
produzca la interrupcin indicada.
El nivel
GLOBAL
permite todas las
interrupciones que
*GLOBAL
*INT_AD
*INT_CCP2
estn
habilitadas de forma individual.
*INT_COMP
*INT_EXT *INT_EEPROM *INT_SSP
*INT_ADOF
*INT_RTCC *INT_TIMER1
*INT_PSP
*INT_RC
*INT_RB
*INT_TIMER2
*INT_TBE
enable_interrupts(INT_TIMER1);
// Quedan habilitada
la interrupcin por TIMER1 pero hasta
*INT_I2C//que no se habilite la GLOBAL, no se activara
enable_interrupts(GLOBAL);
// Ahora s se pueden producir la interrupcin anterior
*INT_AD
*INT_CP1
*INT_RDA
*INT_BUTTON

DISABLE_INTERRUPTS(level)

Esta funcin desactiva la interrupcin del nivel dado en


level.
El nivel GLOBAL prohbe todas las interrupciones,
aunque estn habilitadas o permitidas niveles
individuales
interrupcin.
*GLOBALde *INT_AD
*INT_CCP2
*INT_COMP
*INT_EXT *INT_EEPROM *INT_SSP
*INT_ADOF
*INT_RTCC *INT_TIMER1
*INT_PSP
*INT_RC
*INT_RB
*INT_TIMER2
*INT_TBE
*INT_I2C
enable_interrupts(INT_TIMER1); // Quedan habilitada la interrupcin por TIMER1 pero hasta
*INT_AD//que no*INT_CP1
se habilite la GLOBAL, no se*INT_RDA
activara
disable_interrupts(GLOBAL);
*INT_BUTTON // prohbe todas las interrupciones , aunque estn habilitadas
//individualmente

Interrupcin exterior
Es una interrupcin
bsica en la mayora de los PICs,
por RB0

permite generar una interrupcin tras el cambio Alto a


Bajo o Bajo a Alto del Pin RBO.
La directiva utilizada es la #INT_EXT, y se debe
acompaar de la funcin EXT_INT_EDGE(edge), la cual
se describe a continuacin
EXT_INT_EDGE(edge)

Esta funcin determina el flanco de activacin de la


interrupcin externa.
El flanco puede ser de subida (L_TO_H) o de bajada
(H_TO_L).
Ejemplo de uso:
Ext_int_edge( L_TO_H );

Ejemplo de uso de la interrupcin externa por RB0:


Void main()
//Funcion principal
{
..codigo
..codigo
Ext_int_edge( L_TO_H );
//Se configura la interrupcin externa con flanco de subida
Enable_interrupts(INT_EXT); //Habilitamos la interrupcin EXTerna
Enable_interrupts(GLOBAL); //Habilitamos la interrupcin GLOBAL
..codigo
..codigo
}
#int_EXT
void EXT_isr()
{
.codigo
.codigo
}

//Nombre cualquiera de una funcin

Temporizadores
Los TIMERS o Temporizadores son mdulos integrados
en el PIC que permiten realizar cuentas tanto de
eventos internos como externos.
Cuando la cuenta es interna se habla de
Temporizadores y cuando la cuenta es externa se habla
de Contadores.
Los
TIMERS TMR0
estn ntimamente ligados al uso de las
Temporizador
Interrupciones, pero no por ello se utilizan siempre de
manera
El
bloqueconjunta.
funcional TIMER O se basa en un contador
ascendente de 8 bits incrementado por hardware y
programable, la cuenta mxima es de 255, y el
incremento es constante e independiente de cualquier
Se
puede
evento
deutilizar
PIC. un PRESCALER o divisor de frecuencia
previo de 8 bits cuyo valor de divisin es configurable
por software.
Permite
solicitar interrupciones cuando se produce un
desbordamiento del TIMER O, es decir cuando pasa del

SETUP_TIMER_0(mode)

Esta funcin inicializa el timer0, Los valores de mode


deben ordenarse juntos El valor del timer0 puede
leerse y puede escribirse utilizando GET_TIMERO() y
SET_TIMERO() respectivamente.
Los valores de mode son:
*RTCC_INTERNAL *RTCC_EXT_L_TO_H *RTCC_EXT_H_TO_L
*RTCC_DIV_2 *RTCC_DIV_4 *RTCC_DIV_8 *RTCC_DIV_16
*RTCC_DIV_32 *RTCC_DIV_64 *RTCC_DIV_128 *RTCC_DIV_256
setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_8); //configuramos el timer0 como
//Temporizador con Prescaler de 8"

SET_TIMER0(value)

Esta funcione activan el TIMER al valor especificado.


set_timer0(120);

//se establece el Timer0 con un valor de Precarga de 120"

GET_TIMER0()

Esta funcione devuelve el valor de la cuenta de un


contador en tiempo real.
Int8 cont;
cont = get_timer0();
//Se toma el valor actual de la cuenta del TIMER0 y se la
//asigna a la variable de ocho bits cont

Clculo de la temporizacin en TMR0

Temporizador TMR1

Es otro Temporizador/Contador con las siguientes


caractersticas:
Trabaja
con
16 Bits
se puede contar
desde
hasta
Se puede
utilizar
un, PRESCALER
o divisor
deOfrecuencia
65535
cuyo valor de divisin es configurable por software.
Permite solicitar interrupciones cuando se produce un
desbordamiento del TIMER1, es decir cuando pasa del
valor 65535 a O
SETUP_TIMER_1(mode)

Esta funcin inicializa el timer0, Los valores de mode


deben ordenarse juntos, los valores de mode son:
*T1_DISABLED *T1_EXTERNAL_SYNC *T1_DIV_BY_2
*T1_INTERNAL *T1_CLK_OUT
*T1_DIV_BY_4
*T1_EXTERNAL *T1_DIV_BY_1
*T1_DIV_BY_8
setup_timer_1 (T1_INTERNAL | T1_DIV_8); //configuramos el timer1 como
//Temporizador con Prescaler de 8

SET_TIMER1(value)

Esta funcione activan el TIMER al valor especificado.


Value de 16 bits
set_timer1(30321);

//se establece el Timer1 con un valor de Precarga de 30321"

GET_TIMER1()

Esta funcione devuelve el valor de la cuenta de un


contador en tiempo real.
Int16 cont;
cont = get_timer1();
//Se toma el valor actual de la cuenta del TIMER1 y se la
//asigna a la variable de 16 bits cont

Clculo de la temporizacin en TMR1

Temporizador TMR2

Es un temporizador que trabaja con 8 bits, se puede


utilizar un PRESCALER o divisor de frecuencia, un
REGISTRO DE PERIODO que marca el valor mximo que
puede alcanzar la cuenta de TMR2 y un POSTSCALER.
Permite solicitar interrupciones cuando se produce un
desbordamiento del TIMER2.
SETUP_TIMER_2(mode, periodo, postscale)

Esta funcin inicializa el timer2; mode especifica el


divisor del reloj del oscilador, period0 es un nmero
comprendido entre 0-255, y determina el momento en
el que el valor del reloj se resetea a 0. postscale es un
nmero de 0 a 15, que determina cuntos reset del
timer
se han producido antes de una interrupcin. (los
*T2_DISABLED *T2_DIV_BY_1 *T2_DIV_BY_4 * T2_DIV_BY_16
valores de mode son:)

setup_timer_2(T2_DIV_BY_4,124,1); //configuramos el timer2 como Temporizador


//Con: Prescaler de 4",Periodo de "124" y
//Postcaler de "1",

SET_TIMER2(value)

Esta funcione activan el TIMER al valor especificado.


Value de 8 bits
set_timer1(21);

//se establece el Timer1 con un valor de Precarga de 21"

GET_TIMER2()

Esta funcione devuelve el valor de la cuenta de un


contador en tiempo real.
Int8 cont;
cont = get_timer1();
//Se toma el valor actual de la cuenta del TIMER1 y se la
//asigna a la variable de 8 bits cont

Clculo de la temporizacin en TMR2

Periodo

También podría gustarte