Vous êtes sur la page 1sur 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 movlw 10
movwf TMR0 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 Posibles fuentes de
tomada del circuito de reloj y reloj para el TMR0
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.

Jos Oliden Martnez


Manejo del TMR0

Jos Oliden Martnez


Ejemplo de funcionamiento:
Prescaler

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

Jos Oliden Martnez


Clculo de tiempo con TMR0

Tiempo = 4 x Tosc x (255-Valor en TMR0) x (Rango Divisor)

10x10-3 = 4 x 0.1x10-6 x (255-TMR0) x 256

Jos Oliden Martnez


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
1 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 3

;Bloque del programa principal.


PRINCIPAL:

rutina_int:
;Bloque de la rutina interrupcin. 6

Jos Oliden Martnez


Interrupcin con el TMR0
(Generar IntTMR0 de 10ms)
Tiempo = 4 x Tosc x (255-Valor en TMR0) x (Rango Divisor)

10x10-3 = 4 x 0.1x10-6 x (255-TMR0) x 256

TMR0 = 158
PASOS:
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

Archivo: IntTimer0.asm: Jos Oliden Martnez


RB0 Ton=100ms
RD0
Toff=100ms

uC Ton=10ms
RD1
Toff=10ms

RD2
Interrupciones: IntTimer0.asm

Jos Oliden Martnez