UNIVERSIDAD NACIONAL DEL CALLAO-FIEE-2015 Prof-MSc. Ing. Jacob Astocondor Villar
Introducción • • •
• •
• •
•
Los AVR tienen una gama amplia de recursos internos. En este este capítulo capítulo revisaremos revisaremos los temporizadores. temporizadores. y interrpciones interrpciones Una labor habitual de los controladores suele ser la determinación de intervalos de tiempo concretos. Esto se hace a través través de un un elemento elemento denominado denominado Temporizador Temporizador (Timer). (Timer). Un tempo temporizad rizador or básica básicament mentee es un registr registro o de n-bits n-bits que que se increment incrementa a de manera automática automáti ca en cada ciclo de instrucción instruc ción o cuando ocurre un evento externo. temporiza ción es externa, ext erna, se le conoce como com o contador de eventos. Si la fuente de temporización El registro registro puede puede ser pre-cargado pre-cargado para iniciar su conteo a partir partir de un valor valor determinado. Cuando ocurre un desbordamiento en el registro (una transición de 1’s a 0’s) se genera alguna señalización.
El ATMega8 y el ATMega16 tienen tres temporizadore temporizadoress y manejan tres tipos de eventos. Los eventos quedan registrados registrados en TIFR (Timer Interupt Flag Register).
TIMER 0.
FUNCIONAMIENTO GENERAL Un tem tempori poriza zado dorr (Tim (Timer er)) es un peri perifé féri rico co que que se enca encarg rgaa gener enerar ar un even evento to (interrupción) cada vez que ha pasado cierto intervalo de tiempo. La interrupción de un temporizador se genera cuando el circuito contador del mismo, sufre un sobre flujo, es decir, cuando se desborda. La velocidad a la que un temporizador genera interrupciones depende del origen de la señal de reloj que alimente alimente al mismo. En la familia familia de microco microcontr ntrola oladore doress AVR, AVR, dicha dicha señal señal de reloj puede provenir provenir del exterior o ser generada internamente. Cua Cuando ndo la seña señall es inte nterna, la velocidad del temporizador depende de la frecuencia del cristal colocado al microcontrolador. Cuando es externa, dependerá de la velocidad de los pulsos que se introduzcan por alguna terminal específica del dispositivo. Un temporizador temporizador cuya señal de reloj es externa, se dice que está configurado en modo
contador (Counter). APLICACIONES
Medición de intervalos de tiempo.
UNIVERSIDAD NACIONAL DEL CALLAO-FIEE-2015 Prof-MSc. Ing. Jacob Astocondor Villar
Generación de bases de Tiempo. Tacómetro digital.
REGISTROS I VOLUCRADOS. OMBRE DEL BIT7 REGISTRO. TCCR0 TCNT0 TIMSK TIFR
BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 CS02 CS01
MSB
CS00 LSB TOIE0 TOV0
Tabla TC0-1. Registros involucrados con el Timer/Counter 0. El significado de cada bit y su función se puede observar en la Tabla TC0-2.
FUNCI N BIT significado CS02 a CS00 Clock Select0 bits 2,1 y 0 Selecciona el origen y el pre escalamiento de la señal de RELOJ para el Timer/Counter0. .
MSB a LSB TOIE0
Bit más significativo a bit menos significativo del contador del Timer/Counter0. Timer/Counter0 Overflow TOIE0=“1” Habilita interrupción del Timer/Counter0. Interrupt Enable TOIE0=“0” Deshabilita Interrupción del Timer/Counter0.
TOV0
TOV0 se pone en “1” cuando el Timer/Counter0 produce la interrupción de sobreflujo.
Tabla TC0-2. Bits y función de los registros especiales para el Timer/Counter 0.
El Timer/Counter 0 tiene un registro especial de 8 bits llamado TCNT0, que tiene la función de contar de manera ascendente. Por ser un registro de 8 bits, cuando llega a su máximo valor 255 ($ff) e intenta incrementarse se desborda, y esto puede producir una interrupción, si esta última se encuentra habilitada. Los bits CS02, CS01 y CS00 determinan la velocidad a la que el registro TCNT0 incrementa su valor. Estos bits se encuentran localizados en el registro TCCR0. Los posibles valores de estos bits, y el efecto que producen en la velocidad de conteo de TCNT0, se muestran en la Tabla .
CS02
CS0 CS0 ORIGEN Y 1 0 PREESCALAMIENTO
0
0
0
DETENID, NO CUENTA.
0
0
1
0
1
0
1/f osc 8/ osc
0
1
1
1
0
64/ osc 0 256/f osc
1
0
1 1024/f osc (más lento)
(más rápido)
DE LA
UNIVERSIDAD NACIONAL DEL CALLAO-FIEE-2015 Prof-MSc. Ing. Jacob Astocondor Villar
1 1
1 1
0
Terminal T0, flanco descendente. (modo contador).
1
Terminal T0, flanco ascendente. (modo contador).
TABLA Origen de la señal de reloj y pre escalamiento. Cuando este periférico se configura en modo contador, se le introducen pulsos por el pin T0, localizado en cada dispositivo como se muestra en la Tabla .
SECUENCIA DE CONFIGURACIÓN
1. Ponga SREG=0. (Bit 7 del registro SREG). Deshabilita interrupciones. 2. Haga TCNT0=0. Inicie contador en $00 o en un valor que necesite. 3. Haga TIMSK=”1” Habilita interrupción del TIMER/COUNTER 0, requiere interrupciones. En caso contrario ponga ese bit en ”0”. 4. Haga TIFR=”1". Limpia posible interrupción falsa. 5. Ponga SREG=1. (Bit 7 del registro SREG). Habilita interrupciones. 6. Seleccione el origen de la señal de RELOJ para el TIMER/COUNTER0. Ver Tabla
Si
TCCR0 =0 hace que este periférico se pare, es decir, TCNT0 no cuenta y por lo tanto el TIMER/COUNTER0 no genera interrupciones. TCCR0=1 hace que el TCNT0 se incremente con cada pulso de reloj, es la forma más rápida en la que este periférico genera interrupciones. TCCR0=5 hace que el TCNT0 se incremente cada 1024 pulsos de reloj, es la forma más lenta en la que este periférico genera interrupciones (con RELOJ interno). TCCR0=6 hace que el TCNT0 se incremente con cada flanco negativo (cuando la señal pasa de “1” a “0”) aplicado en la terminal T0 del microcontrolador.
I.S.R. El CPU salta a la dirección vector de interrupción de este periférico cada vez que el registro TCNT0 tiene el valor $FF (255 en decimal) e intenta incrementar su valor (se desborda). Si programa en ensamblador, deberá colocar una instrucción de salto (rjmp) en la dirección del vector de interrupción para re direccionar a la posición de memoria donde se encuentra realmente la ISR del TIMER/COUNTER0 .
En la ISR puede (y quizá hasta deba) reiniciar el registro TCNT0 con un valor apropiado, generalmente se pone en 0, aunque puede ser otro valor. Observe entre mayor sea el valor de TCNT0 la interrupción siguiente se producirá en un tiempo menor. No es necesario que ponga el bit 7 del archivo TIFR en “0” cada vez que se produzca una interrupción, al atenderse la ISR el hardware lo realiza.
IMPLANTACIÓN. La secuencia de configuración, de los registros especiales, se muestra programada en lenguaje ensamblador. Si usted utiliza otro lenguaje de programación, solo tome los ejemplos de implantación como referencia.
UNIVERSIDAD NACIONAL DEL CALLAO-FIEE-2015 Prof-MSc. Ing. Jacob Astocondor Villar
TIMER/COUNTER 0 MODO TEMPORIZADOR. El siguiente programa en ensamblador configura al TIMER/COUNTER 0 del microcontrolador para que incremente el registro TCNT0 en cada pulso de reloj. Si el dispositivo tiene colocado un cristal de 4 MHz, las interrupciones se generarán cada 65 micro segundos aproximadamente. ;Timer/Counter0 Modo Temporizador ;***************************************************************** .include "m8def.inc" ;***************************************************************** .org $0 ;vector de inicio. rjmp RESET ;redireccionado a la dirección donde se ;encuentra RESET .org $009 ;vector de TIMER/COUNTER0 rjmp TIMER0_ISR ;redireccionado a TIMER_ISR ;***************************************************************** ;Esta ISR se produce cada vez que TCNT0 se desborda. : | ISR del TIMER/COUNTER0 inc r18 ;incrementa registro r18 out PORTB,r18 ;y saca el valor por el PORTB ldi r17,0 ; out TCNT0,R17 ;pone valor de TCNT0 en 0. reti ;regresa de interrupción. ;************************************************************************ ;inicio de programa. ldi r17,$ff ;configura PORTB out DDRB,r17 ;como salida ;***************************************************************** ldi r16, ;Descomente para dispositivos ;con RAM mayor 256 Bytes out SPH,r16 ldi r16, out SPL,r16 ;***************************************************************** cli
;SREG=0.int. deshabilitadas.
ldi out
r17,0 TCNT0,R17
;Inicia TCNT0 con valor 0
; ori out
in r17,TIMSK r17,(1<
;Habilita interrupción ;del TIMER/COUNTER0 ;TIMSK=1
in ori out
r17,TIFR r17,(1<
;Limpia posible ;interrupción anterior ;TIFR=0
sei ldi
r17,1
;SREG<7>=1. int. habilitadas ;Selecciona el origen de la ;señal de reloj
UNIVERSIDAD NACIONAL DEL CALLAO-FIEE-2015 Prof-MSc. Ing. Jacob Astocondor Villar
out TCCR0,r17 ;TCCR0=1. ;TCCR0=5, nop nop rjmp
;Se incrementará TCNT0 en cada pulso de RELOJ. (Si se quiere visualizar por el PORTB ;hacer ;LO MAS LENTO POSIBLE) ;Espera hasta que ;se generen interrupciones. nop ;loop infinito
OTAS DE CON FIGURACIÓN .
N
Para este periférico los cambios más importantes en el programa son en el paso 6 , es aquí donde se le indica al periférico el origen de la señal de RELOJ. Consulte TABLA y sustituya el valor que requiera en la línea de código ldi r17,1 del paso 6 . EJERCICIO Realizar un programa para encender y apagar 8 leds ubicado en el puerto B .include "m8def.inc" .def temp = r16 .def leds = r17 .org 0x0000 rjmp main ; Reset Handler .org 0X009 rjmp timer0_overflow ; Timer Overflow Handler main: ldi temp, HIGH(RAMEND) out SPH, temp ldi temp, LOW(RAMEND) out SPL, temp ;**************************************************** ldi temp, 0xFF ; Port B auf Ausgang out DDRB, temp :********************************************************** ldi leds, 0xFF ;********************************************************* ldi temp, (1<
UNIVERSIDAD NACIONAL DEL CALLAO-FIEE-2015 Prof-MSc. Ing. Jacob Astocondor Villar ;************************************************************