You are on page 1of 14

Sistemas Embebidos

Registro TMR0
Interrupciones

Jos Oliden Martnez
El Registro TMR0
El PIC16F877/A contiene un contador de 8 bits (TMR0) ubicado en la direccin
0x1 de la memoria de datos. Este contador se incrementa con pulsos de reloj que
se aplican al pin RA4/TOCKI o de acuerdo a una seal interna proveniente del
reloj de instrucciones del uC (Fosc/4). La razn de incremento se puede
determinar por un pre-escalador (divisor de frecuencia) localizado en el registro
OPTION (0x81). Este contador activa un flag de desbordamiento (T0IF ubicado en
el INTCON) cuando la cuenta pasa de FFH a 00H, generando una interrupcin.
Jos Oliden Martnez
Como temporizador TMR0
El contenido del TMR0 es incrementado con una cadencia regular y
programable directamente por el hardware del PIC.
movlw 10
movwf TMR0
movlw 10
movwf TMR0
LAZO:
goto LAZO
el registro TMR0 es incrementado por el hardware interno del PIC al mismo
tiempo que se ejecuta el programa
Una vez alcanzado el valor 255, el registro TMR0 es puesto a cero automticamente
reemprendiendo entonces el conteo no desde el valor originariamente cargado sino
desde cero.

Jos Oliden Martnez
El Registro TMR0
(Bloques Internos)
Fosc/4 es una seal generada
internamente por el PIC
tomada del circuito de reloj y
que es igual a la frecuencia del
oscilador dividida por cuatro.

T0CKI es una seal generada
por un posible circuito externo
y aplicada al pin T0CKI
correspondiente al pin 6 en el
PIC16F877.

Posibles fuentes de
reloj para el TMR0
Jos Oliden Martnez
Manejo del TMR0
Jos Oliden Martnez
PS2

PS1

PS0

Divisor

Frecuencia de salida del prescaler (Hz)

0

0

0

2

500.000

0

0

1

4

250.000

0

1

0

8

125.000

Ejemplo de funcionamiento:
Prescaler
Jos Oliden Martnez
Tiempo = 4 x Tosc x (255-Valor en TMR0) x (Rango Divisor)
Clculo de tiempo con TMR0
Jos Oliden Martnez
10x10-3 = 4 x 0.1x10-6 x (255-TMR0) x 256
Interrupciones
Una interrupcin consiste en una detencin del programa en curso para
realizar una determinada rutina que atienda la causa que ha provocado la
interrupcin.

Cuando se termina, se retorna al programa principal en el punto en que se
abandon.

Por qu son tiles las interrupciones
Jos Oliden Martnez
Interrupciones: Causas (Fuentes)

Interrupcin externa (RB0/INT)

Rebosamiento TMR0, TMR1 y TMR2

Cambio de estado del puerto B (RB7-RB4)

Convertidor A/D concluye la conversin

La interfaz SCI asncrono transmite o recibe

Puerto Serie asncrono

Puerto paralelo secundario. Se lee o se escribe

Jos Oliden Martnez
Interrupciones: Fases

1. Se activa una posible causa de interrupcin. El sealizador de dicha causa, el bit de
permiso correspondiente y el global para todas las interrupciones (GIE) estn a nivel alto.

2. Para evitar que se produzca otra interrupcin mientras dura el tratamiento de la que se
ha aceptado, el bit GIE se pone a 0.

3. El valor actual del PC se guarda en la Pila.

4. El PC se carga con el valor 0004h, que es el del vector de interrupcin.

5. La rutina de interrupcin comienza explorando el valor de los sealizadores, para
determinar la causa que la ha provocado.

6. Segn la causa de la interrupcin, la rutina se bifurca a la subrutina correspondiente.

7. Se borran los sealizadores por software, antes de realizar el retorno.

8. Cuando se llega a la ultima instruccin de la rutina de interrupcin, que es la de RETFIE,
se carga en el PC el valor que inicialmente se guardo en la Pila y se pone el bit GIE = 1.

Jos Oliden Martnez







list p=16F877A

#include <p16F877A.inc>

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF

;Bloque de definicin de variables









org 0x00
clrf PCLATH
goto PRINCIPAL

org 0x04 ; direccin del vector interrupcin
movwf w_temp ; guardar el registro W
movf STATUS,w ;
movwf status_temp ; guardar el registro STATUS
goto rutina_int



;Bloque del programa principal.
PRINCIPAL:

rutina_int:

;Bloque de la rutina interrupcin.
1
2
3
4
5
6
Jos Oliden Martnez
Tiempo = 4 x Tosc x (255-Valor en TMR0) x (Rango Divisor)
Interrupcin con el TMR0
(Generar IntTMR0 de 10ms)
Jos Oliden Martnez
10x10-3 = 4 x 0.1x10-6 x (255-TMR0) x 256
Archivo: IntTimer0.asm:
TMR0 = 158
Banco1
movlw B'10000111 ; pull-up=off,preescalador a TMR0=1:256
movwf OPTION_REG
Banco0
; Habilitacin de Interrupciones
movlw b'11000000' ;GIE=1,PEIE=1 hab. int perif., noTMR0
movwf INTCON
; Programa Principal e Inicio
INICIO:
bsf INTCON,T0IE ; Se habilitan interrupciones del TMR0
PASOS:





uC





RD0
RD1
Ton=100ms
Toff=100ms
Ton=10ms
Toff=10ms
RD2
RB0
Programar















Jos Oliden Martnez
Interrupciones: IntTimer0.asm

You might also like