Vous êtes sur la page 1sur 7

PRACTICA 4 INTERRUPCIONES Y TEMPORIZADORES OBJETIVOS: Comprender el uso de interrupciones Trabajar con el Timer 0 INDICACIONES: a) Realizar los ejercicios de la prctica

ca b) Opcional: Leer el anexo sobre el Timer 0 y trabajar en el MPLAB con el ejercicio indicado en el anexo.
;********************************************************** ; USO DEL TIMER0 COMO TEMPORIZADOR Y ; EMPLEO DE INTERRUPCIONES ;********************************************************** ; NOMBRE: p4a_ra.asm ; FECHA: 14/06/2010 ; VERSION: 1.00 ; PROGRAMADOR: Mikroelectrnica ;**********************************************************

DESCRIPCION:

Luego de realizar la prctica anterior habr notado una desventaja de los retardos mediante lazos anidados y es que mientras ocurren los retardos el microcontrolador no hace nada ms que esperar. Esta prdida de tiempo es inaceptable y otro mtodo debe aplicarse. Este ejercicio enlaza al TMR0 y las interrupciones. Las conexiones se mantienen iguales pero esta vez los retardos para notar los cambios en el PORTB se los conseguir mediante la temporizacin del TMR0 haciendo uso de su preescalador (1:256). Cada vez que el TMR0 se desborda (con la interrupcin por TMR0 habilitada) ocurre una interrupcin. La rutina de interrupcin incrementa en uno el valor mostrado en PORTB; este procedimiento se realiza detrs del escenario del proceso completo, permitiendo al microcontrolador hacer otras cosas.

;********************** Header *************************************** ;******************************************************************** LIST p=16F887 INCLUDE P16F887.INC __CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC errorlevel -302 ;************************ START OF PROGRAM *********************** ; forma de iniciar programa que usa interrupciones

;******************************************************************** org goto org goto org 0x00 main 0x04 inter 0x05 ; vector de reset ; salto a label "main" ; vector de interrupcin ; salto a interrupcin ; continuacin de programa

;************************ MAIN PROGRAM *************************** ; inicio de programa principal ;********************************************************************


;SETEO DE PUERTOS Y REGISTROS

main banksel clrf banksel clrf clrf banksel movlw

movwf movlw

movwf bsf bsf banksel clrf loop nop goto

TRISB ;Selects bank containing register TRISB TRISB ;All port B pins are configured as outputs ANSEL ;Bank containing register ANSEL ANSEL ;Clears registers ANSEL and ANSELH ANSELH ;All pins are digital OPTION_REG ; Bank containing register OPTION_REG b'00000111' ;carga divisor con 255, se lo aplica aTMR0 ;PSA =0 (BIT 3); se aplica el divisor al TMR0 ;TOCS=0 (BIT 5); TMR0 origen de pulsos Fosc/4 OPTION_REG b'10100000' ;habilita interrupcin por Timer 0 y Global ;GIE=0 (BIT 7); habilita interrupciones globales ;TMR0IE=0 (BIT 5); habilita interrupciones por TMR0 INTCON INTCON,TMR0IE ; TMR0 interrupt overflow enabled INTCON,GIE ; Global interrupt enabled PORTB PORTB ; Bank containing register PORTB ; Clears Port B

loop

; Permanece en el lazo

;************************ INTERRUPT ROUTINE ********************** ; Inicio de rutina de interrupcin llamado desde org 0x04 ;******************************************************************* inter incf bcf retfie

PORTB INTCON,TMR0IF

; Increments register PORTB by 1 ; Clears interrupt flag TMR0IF ; Return from interrupt routine

;******************************************************************* ; IMPORTANTE: rutina de interrupcin termina en retfie

;******************************************************************* end ; Fin de programa

RESPONDER: 1) Qu valor de temporizacin obtiene trabajando a 4MHz.? 2) Qu valor de temporizacin obtiene trabajando a 10MHz.?
;********************************************************** ; USO DE SUBRUTINAS Y PULSADORES ;********************************************************** ; NOMBRE: p4b_ra.asm ; FECHA: 14/06/2010 ; VERSION: 1.00 ; PROGRAMADOR: Mikroelectrnica ;**********************************************************

DESCRIPCION:

En los ejercicios anteriores el microcontrolador ejecuta el programa sin influencia externa. En esta prctica se har uso de un pulsador para modificar la ejecucin del programa.
;****************************************************************************

; Header ;**************************************************************************** ;************* DEFINING VARIABLES ******************************************* cblock counter1 counter2 endc 0x20 ; ; ; ; Block of Variable Variable Block of variables starts at address 20h "counter1" at address 20h "counter2" at address 21h variables ends

;************************ MAIN PROGRAM ************************************** org banksel clrf clrf banksel clrf movlw movwf banksel movlw movwf loop rlr call loop3 btfss goto goto PORTA,1 loop3 loop ; Tests the firs port A bit ; "0" is applied to pin.Go to label "loop3" ; "1" is applied to pin.Go to label "loop" PORTB DELAY ; Port B bits rotates by one place left ; Calls subroutine "DELAY" 0x0000 ANSEL ANSEL ANSELH TRISB TRISB B'00000010' TRISA PORTB B'00000001' PORTB ; ; ; ; Address of the first program instruction Selects bank containing register ANSEL Clears registers ANSEL and ANSELH to configure all inputs as digital

; Selects bank containing register TRISB ; All port B pins are configured as outputs ; Pin RA1 is input ; Selects bank containing register TRISB ; Writes 1 to register W ; Number is moved to PORTB

;************************ SUBROUTINES *************************************** DELAY clrf counter2 ; Clears variable "counter2" loop1 clrf counter1 ; Clears variable "counter1" loop2 decfsz counter1 ; Decrements variable "counter1" by 1 goto loop2 ; Result is not 0. Go to label loop2 decfsz counter2 ; Decrements variable "counter2" by 1 goto loop1 ; Result is not 0. Go to lab loop1 return ; Return from subroutine "DELAY" end ; End of program

RESPONDER: 1) Indique lo que hace el programa? 2) Modifique el programa Colocando un interruptor en RA1 en lugar del pulsador, de tal forma que con el interruptor se pueda cambiar la direccin de giro de los leds.

ANEXO TIMER 0 http://www.circuitoselectronicos.org/2011/04/el-temporizador-timer-0-en-los.html Junio 13, 2011

El Timer 0 es un modulo temporizador/contador de 8 bits que cuenta con un preescalador programable tambin de 8 bits. Puede funcionar como temporizador o como contador. En modo temporizador el valor del registro TMR0 se incrementa con cada ciclo de instruccin (o cada X ciclos dependiendo del preescalador). En modo contador el valor del registro TMR0 se incrementa en cada flanco (ascendente o descendente) del pin RA4/T0CKI. En ambos casos al desbordarse (pasar de 0xFF a 0x0) el registro TMR0 la bandera de interrupcin del timer 0 (bit T0IF del registro INTCON) se pone a 1. El modo temporizador se selecciona poniendo a cero el bit T0CS del registro OPTION. Poniendo a uno ese bit el modulo trabaja en modo contador, en este modo de operacin adems se debe seleccionar si el incremento se producir en cada filo ascendente o descendente, al poner a cero el bit T0SE del registro OPTION se selecciona el filo ascendente. El preescalador es compartido por el Timer 0 y por el Watchdog. Se asigna a un mdulo o a otro mediante el bit PSA del registro OPTION. Poniendo el bit a 1 el preescalador se asigna al Watchdog y poniendolo a 0 el preescalador se asigna al Timer 0. El valor del preescalador se selecciona con los bits PS2:PS0 de la siguiente manera:
PS2:P20 000 001 010 011 100 101 110 111 TMR0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256 WDT 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

Carga y temporizacin En modo temporizador el Timer 0 incrementa su cuenta en cada ciclo de instruccin. Este modo sirve para generar temporizaciones y bases de tiempo de la misma forma que los retardos por software, sin embargo las temporizaciones con el Timer 0 pueden ser ms exactas y adems se cuenta con la ventaja de que el mdulo puede trabajar mediante interrupciones as que el programa puede ejecutar otras isntrucciones mientras se realiza la temporizacin. La temporizacin que se puede obtener con este mdulo se obtiene de la siguiente relacin: Temporizacin = [(256 - precarga)*PS+2]*Tinstruccion Donde: precarga = Valor que se le asigna al registro TMR0 al comenzar la temporizacin PS = Preescalador. Si esta asignado al watchdog tomar el valor de 1 Tinstruccin = 4/frecuencia de oscilacin y la temporizacin est dada en segundos. La temporizacin mxima utilizando el oscilador interno del pic 16f628 es:

Temp.max. = [(256 - 0)*256+2]*1uS = 65528uS De modo que la temporizacion mxima que se puede tener con el es solamente de 65.538mS. Si se desea obtener una temporizacion distinta solo se debe escribir en el registro TMR0 el valor de la precarga necesaria. precarga = -[([Temporizacion/(4/fosc)]-2)/PS]+256 Donde, de nuevo, la temporizacin est dada en segundos. Veamos un ejemplo de aplicacin: Se desea complementar el valor del puerto B cada 50mS. Se estar revisando que se haya cumplido el tiempo de la temporizacin checando la bandera T0IF. Utilizando la expresin de la precarga y utilizando el preescalador ms grande (256) obtenemos el valor que necesitamos cargar al registro TMR0 para obtener una temporizacin de 50mS. precarga = -[([50mS/(4/4Mhz)]-2)/256]+256 = 60.69 60 Ya que no podemos cargar numeros fraccionarios el valor de precarga necesario es 60. Teniendo entonces el valor de la precarga el cdigo del programa sera el siguiente:
INICIO bsf clrf movlw movwf bcf clrf bcf PRECARGA movlw movwf ESPERA btfss goto bcf comf goto STATUS,RP0 TRISB b'00000111' OPTION_REG STATUS,RP0 PORTB INTCON,T0IF .60 TMR0 INTCON,T0IF ESPERA INTCON,T0IF PORTB,f PRECARGA

La configuracin del Timer 0 se realiza mediante las lneas "movlw b'00000111'" y "movwf OPTION_REG". Mediante estas lineas se configura el timer en modo temporizador (T0CS = 0), el preescalador se asigna al timer 0 (PSA = 0) y se selecciona el preescalador mximo (PS2:PS0 = 111). Una vez configurado el timer 0 se limpia el puerto B y la bandera T0IF. Posteriormente se realiza la precarga cargando un 60 al registro TMR0 y en ese momento la temporizacin comienza. Para saber si la temporizacin termin se est revisando la bandera T0IF. Mientras esta sea 0 la temporizacin an no habr terminado, cuando la bandera es 1 entonces la temporizacin finaliz, se borra la bandera, se complementa el puerto B y se vuelve a realizar la precarga. De este modo el programa est complementado el puerto B cada 50mS.

Vous aimerez peut-être aussi