Sie sind auf Seite 1von 18

Sistemas Embebidos

 Registro TMR0
 Interrupciones

José Oliden Martínez


El Registro TMR0

El PIC16F877/A contiene un contador de 8 bits (TMR0) ubicado en la dirección


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 señal interna proveniente del
reloj de instrucciones del uC (Fosc/4). La razón 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 interrupción.

José Oliden Martínez


Como temporizador TMR0

El contenido del TMR0 es incrementado con una cadencia regular y


programable directamente por el hardware del PIC.

movlw .60 movlw .60


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 automáticamente
reemprendiendo entonces el conteo no desde el valor originariamente cargado sino
desde cero.

José Oliden Martínez


El Registro TMR0
(Bloques Internos)
Fosc/4 es una señal 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 señal generada


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

José Oliden Martínez


Manejo del TMR0

José Oliden Martínez


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 Martínez


Cálculo 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 Martínez


Interrupciones

Una interrupción consiste en una detención del programa en curso para


realizar una determinada rutina que atienda la causa que ha provocado la
interrupción.

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


abandonó.

Por qué son útiles las interrupciones

José Oliden Martínez


Interrupciones: Causas (Fuentes)

• Interrupción externa (RB0/INT)

• Rebosamiento TMR0, TMR1 y TMR2

• Cambio de estado del puerto B (RB7-RB4)

• Convertidor A/D concluye la conversión

• La interfaz SCI síncrono transmite o recibe

• Puerto Serie asíncrono

• Puerto paralelo secundario. Se lee o se escribe

José Oliden Martínez


Interrupciones: Fases
1. Se activa una posible causa de interrupción. El señalizador de dicha causa, el bit de
permiso correspondiente y el global para todas las interrupciones (GIE) están a nivel alto.

2. Para evitar que se produzca otra interrupción 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 interrupción.

5. La rutina de interrupción comienza explorando el valor de los señalizadores, para


determinar la causa que la ha provocado.

6. Según la causa de la interrupción, la rutina se bifurca a la subrutina correspondiente.

7. Se borran los señalizadores por software, antes de realizar el retorno.

8. Cuando se llega a la última instrucción de la rutina de interrupción, 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 Martínez


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 definición de variables

org 0x00
1 clrf PCLATH
goto PP

org 0x04 ; dirección del vector interrupción


movwf w_temp ; guardar el registro W
movf STATUS,w ;
movwf status_temp ; guardar el registro STATUS
goto rutina_int

Salir_Interrupcion:
;Recupero W, STATUS, PCLATH. 3
retfie
4
;Bloque del programa principal.
PP:
;Configuración

7 PILA
;Configuración Interrupciones 6

;Bloque del programa principal.


2
rutina_int:
;Bloque de la rutina interrupción.

goto Salir_Interrupcion
José Oliden Martínez
Interrupciones: Secuencia
1. Al iniciar el programa se salta todo el bloque de inicio y fin de interrupción con la
instrucción GOTO PP (Ir al Programa Principal).

2. La interrupción ocurre en cualquier momento del programa. Cuando se activa el bit


ENABLE de la interrupción, esta puede ocurrir en cualquier momento.

3. Al ocurrir la interrupción el PC automáticamente va a la dirección 0x04 de la memoria de


programa. El valor del PC de donde ocurre la interrupción se guarda en la Pila.

4. La rutina de interrupción comienza guardando W, STATUS y PCLATH a valores


temporales y luego se va a rutina_int.

5. En la rutina_int se explora el valor de los señalizadores, para determinar la causa que la


ha provocado y una vez terminado esta rutina programada se va a Salir_interrupcion.

6. Se va a una parte del programa en donde se recuperan los valores de W, STATUS y


PCLATH y luego de usa la instrucción retfie para salir de la interrupción.

7. Al salir de la interrupción se recuperan los valores de PC guardados en la Pila y el


programa continua donde se quedó.
José Oliden Martínez
Interrupción 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
; Habilitación 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 Martínez


Interrupción con el TMR0
(Generar IntTMR0 de 10ms 20Mhz)
Tiempo = 4 x Tosc x (255-Valor en TMR0) x (Rango Divisor)

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

TMR0 = 60
PASOS:
Banco1
movlw B'10000111‘ ; pull-up=off,preescalador a TMR0=1:256
movwf OPTION_REG
Banco0
; Habilitación 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 Martínez


Programar

Una señal oscilante por el pin RD0 con 100ms en alto y 100ms en bajo. Esta
programación debe estar en el programa principal.
Adicionalmente debe salir una señal oscilante por RD1 con 10ms en alto y 10ms
en bajo que debe ser programada usando la interrupción del TMR0.

Ton=100ms
RB0
Toff=100ms
RD0
Ton=10ms

uC RD1 Toff=10ms

RD2
Diagrama de Flujo

PP

Configuración
PORTD OUT
TIMER0

Activar
Interrupciones
GIE, TMR0IE

Iniciar Valores
TMR0=60

PORTD,0=0

Delay_100ms

PORTD,0=1

Delay_100ms
Interrupciones: IntTimer0.asm

José Oliden Martínez

Das könnte Ihnen auch gefallen