Académique Documents
Professionnel Documents
Culture Documents
temporizador http://aquihayapuntes.com/indice-practicas-pic-
en-c/uso-del-tmr0-como-temporizador.html
Detalles
En esta práctica vamos a ver cómo utilizar el
Timer0 con el compilador CCS.
Pero antes vamos a ver un poco de teoría:
El Timer0 es un temporizador/contador
ascendente de 8 bits, cuando trabaja con el Como podemos ver solo están marcados de un
reloj del PIC se le suele llama temporizador y color diferente los que están implicados en el
cundo los pulsos los recibe de una fuente funcionamiento del TMR0, vamos a ver la
externa a través de la patilla RA4/TOCKI se le función que tienen:
llama contador, pero digamos que es el mismo TMR0: es un registro del que podemos leer el
perro con dos collares diferentes. Para no valor del contador en tiempo real, pero
liarnos con las patillas y el nombre de los también podemos escribir en él y alterar el
registros voy a mostrar los registros y patillas valor de conteo.
implicadas solo en el TMR0 utilizando el OPTION: los bits que están en color verde son
PIC16f84, aunque podría ser otro cualquiera ya los que están implicados en la configuración
que este temporizador viene incorporado en del TIMER0
todos los PIC. PS0, PS1 y PS2: Configuración del
Patillaje: preescaler. El preescaler es un divisor de
pulsos que está a la entrada del Timer-
contador. El prescaler divide el número
de pulsos que le entran al timer-contador
o al Wachtdog. El factor de división es el
siguiente (según los valores de PS2, PS1
y PS0 respectivamente
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_25
6);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
set_TIMER0(0x83); //inicializa el
timer0
//el bucle infinito es necesario ya que si
el micro entra en sleep
Pues bien este es el esqueleto de nuestra //desactiva la interrupción del TMR0
aplicación y sin escribir una línea de código. while(true);
Ahora sobre esta plantilla tenemos que escribir }
nuestro código para hacer nuestra aplicación
funcional. Con la directiva #include lo que se hace es
En el archivo de cabecera incluiremos la línea incluir un archivo dentro de otro, si queremos
que esta en negrita: tener todo el código fuente en un mismo
archivo lo único que tenemos que hacer es
#include<16F84A.h> sustituir esta línea por el contenido del archivo
#usedelay(clock=4000000) de cabecera, pero es recomendable separar los
#bit RB7=0x6.7 //definimos RB7 como el archivos de cabecera del resto del programa. C
pin 7 de la puerta B es un lenguaje estructurado y así es como
trabaja, cuanto antes nos acostumbremos a
Con la directiva #bit le podemos asignar la ello mejor. ¡ojo¡ si utilizamos los dos archivos y
dirección de memoria del bit de un registro a copiamos el código fuente y lo pegamos en un
una variable que podremos utilizar después directorio diferente tendremos que modificar la
para referirnos a ese bit. ruta actual al archivo de cabecera si no al
compilar dará un error de archivo no
encontrado. El funcionamiento del programa es
muy simple, después de inicializar el puerto B
inicializamos el TMR0 por medio de la función
set_TIMER0, el valor que recibe como
parámetro esta función es el valor que se
escribirá en el TMR0 que es 0x86, valor que
habíamos obtenido de la fórmula
anteriormente, como está activada la
interrupción por desbordamiento del contador
este empieza a contar a partir de 0x86 ó 131
en decimal hasta 255 que equivale a 11111111
en binario como es un contador de 8 bits al
siguiente pulso de reloj se produce el
desbordamiento y el contador de programa va
Bueno yo creo que mas mascado no puede
a la dirección de memoria donde está el vector
estar, para aquellos que no conozcan el
de interrupción del TMRO y ejecuta las
lenguaje C y les suene a chino lo que es una
instrucciones que están dentro de su función.
función y lo de pasar parámetros a una
La función de interrupción lo único que hace es
función. “No problem” en el curso de teoría se
a través de una sentencia de control if–else
verá detenidamente.
encender o apagar el led, fijaros que en cada
caso se vuelve a cargar el valor del TMR0 para jueves, 5 de julio de 2012
que el contador vuelva a empezar a contar por El timer TMR0 en los PIC con ejemplo
131 y no por cero, de esta manera la El timer TMR0 en los PIC
interrupción se producirá cada 32 ms que es lo Es un modulo que sirve como contador o como
que queríamos. Bueno a hora toca construir temporizador de 8 bit's.
nuestro circuito virtual y simularlo con Proteus Funcionando como temporizador el TMR0 es un
para comprobar que efectivamente es así. registro donde yo puedo almacenar un valor y este se
va incrementando de 1 en 1 con los ciclos de
instruccion, es decir, con cada ciclo se incrementa
en 1 el TMR0, cuando la cuenta llega a 255 y pasa a
0 (cero) se porduce una interrupcion por desborde
del TMR0, recordemos que en un registro de 8 Bit's el
valor mas alto que se puede almacenar es 255 y que
si lo incrementamos estando en 255 pasa a cero, y es
a esto a lo que se le denomina desborde.
Hemos agregado una sonda de tensión y para El TMR0 tiene las siguientes caracteristicas:
poder ver los valores que toma en el tiempo -se puede leer y escribir
incluimos una grafica en simulación digital. Si -puede trabajar con relog externo o interno
ampliamos la gráfica veremos que cada -detecta el flanco de subida o bajada del relog
intervalo tiene una duración de 32 ms. Como externo
siempre el DSN y el código fuente os lo podéis -tiene un prescaler de 8 bit´s
-tiene una interrupcion por desborde de la cuenta de
bajar desde la sección Descargas –> Apuntes -
255 a 0
> Electrónica -> Microcontroladores ->
los registros asociados a el son el TMR0, INTCON y
Ejemplos prácticos programación PIC en C.
el OPTION_REG
donde
Configuramos el INTCON
Tocs = 1 / Fosc (frecuencia del oscilador)
Registro donde activamos las interrupciones globales
y la del TMR0
Entonces si necesitamos un determinado tiempo
MOVLW B'10100000'
podemos despejar TMR0 y hallar su valor:
MOVWF OPTION_REG
BIT 7 Activamos las interrupciones Globales
Tiempo
BIT 6 interrupciones de otros periféricos
TMR0 = ---------------------------- - 256
desactivadas
4 * Tosc * Prescaler
BIT 5 Habilitamos la interrupción por desborde en
el TMR0
Formula que nos dara un valor muy aproximado
BIT 4 deshabilitamos interrupción externa INT
del Tiempo
BIT 3 deshabilitamos interrupción por cambio en el
Empecemos la configuración PORTB
Configuramos el OPTION_REG
BIT 2 bandera interrupción en TMR0
BIT 1 bandera interrupción en INT
BANKSEL OPTION_REG
BIT 0 bandera interrupción por cambio en PORTB
MOVLW B'00000000'
ANALICEMOS
BIT 7 Pull up PORTB Disable
BTI 6 interrupcion por flaco de subida en el INT Pin
BIT 5 fuente del clock para el TMR0, internal 1 ciclo
ed intruccion (1/Fosc)
BIT 4 Flanco de bajada para el incremento del
TMR0
BIT 3 Prescaler asignado al TMR0
BIT 2-0 Division del prescaler
Ejemplo
Vamos a crear una señal de 1 KHz usando el TMR0.
END
El temporizador Timer 0 en los
microcontroladores PIC.
El Timer 0 es un modulo temporizador/contador de 8
bits que cuenta con un preescalador programable
también de 8 bits. Puede funcionar como
temporizador o como contador.
En modo temporizador el valor del registro TMR0 se
incrementa con cada ciclo de instrucción(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
Código fuente de 0xFF a 0x0) el registro TMR0 la bandera de
LIST P=16F886 interrupción del timer 0 (bit T0IF del registro INTCON)
INCLUDE P16F886.INC ERRORLEVEL -302 se pone a 1. El modo temporizador se selecciona
__CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & poniendo a cero el bit T0CS del
_PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF registro OPTION.Poniendo a uno ese bit el modulo
& _BOREN_ON & _IESO_OFF & _FCMEN_OFF & trabaja en modo
_LVP_OFF & _DEBUG_OFF contador, en este modo de operación además se
__CONFIG _CONFIG2, _BOR40V & _WRT_OFF debe seleccionar si el incremento se producirá en
cada filo ascendente o descendente, al poner a cero
CBLOCK 0X20 el bit T0SE del registro OPTION se selecciona el filo
ENDC ascendente. El preescalador es compartido por
el Timer 0 y por el Watchdog. Se asigna a un
ORG 0X00 módulo o a otro mediante el bit PSA del
GOTO CONFIGURA registro OPTION. Poniendo el bit a 1 el preescalador
se asigna al Watchdog y poniendolo a 0 el
ORG 0X04 preescalador se asigna al Timer 0. El valor del
GOTO INTERRUPCION preescalador se selecciona con los bits PS2:PS0 de
ORG 0X05 la siguiente manera:
PS2:P20 TMR0 WDT
INTERRUPCION COMF PORTB,F 000 1:2 1:1
MOVLW .7 001 1:4 1:2
MOVWF TMR0 010 1:8 1:4
BCF INTCON,T0IF 011 1:16 1:8
RETFIE 100 1:32 1:16
101 1:64 1:32
CONFIGURA CLRF PORTB
110 1:128 1:64
BANKSEL ANSEL
111 1:256 1:128
CLRF ANSEL
Carga y temporización
CLRF ANSELH
En modo temporizador el Timer 0 incrementa su
BANKSEL TRISB
cuenta en cada ciclo de instrucción. Este modo sirve
CLRF TRISB
para generar temporizaciones y bases de tiempo de
BANKSEL OPTION_REG
la misma forma que los retardos por software, sin
MOVLW B'00000000'
embargo las temporizaciones con el Timer 0 pueden
MOVWF OPTION_REG
ser más exactas y además se cuenta con la ventaja
MOVLW B'10100000'
de que el módulo puede trabajar
MOVWF INTCON
mediante interrupciones así que el programa puede
BANKSEL PORTB
ejecutar otras isntrucciones mientras se realiza
la temporización.
CLRF TMR0
La temporización que se puede obtener con este
CLRF PORTB módulo se obtiene de la siguiente relación:
De modo que la temporización máxima que se La configuración del Timer 1 se realiza mediante las
puede tener con este temporizador, utilizando el líneas “movlw b’01100000′” y “movwf T1CON“.
oscilador interno de 4Mhz del pic 16f628, Mediante estas lineas se configura el timer en modo
es de 524.288mS. Con la misma frecuencia de temporizador (TMR1CS = 0) y se selecciona el
oscilación el Timer 0 solamente podia lograr una preescalador máximo (T1CKPS1:T1CKPS0 = 11).
temporización de 65.538mS así que con el Una vez configurado el timer 1 se limpia el puerto B y
Timer 1 se logran temporizaciones de mayor la bandera TMR1IF del
duración. Si se desea obtener una temporización registro PIR1. Posteriormente se realiza la precarga
distinta solo se debe escribir en el par de registros cargando un 0xE7 al registro TMR1H y un 0x96 al
TMR1 el valor de la precarga necesaria para la registro TMR1L.Nótese que antes de realizar la
temporización deseada. carga se detuvo el timer poniendo a 0 el
bit TMR1ON,esto se hace para evitar errores al
precarga = -[([Temporizacion/(4/fosc)])/PS]+65536 momento de cargar el valor a los
registros TMR1,después de realizar la carga se
Veamos el mismo ejemplo que el del temporizador enciende el timer poniendo a 1 el bit TMR1ON y en
Timer 0 ahora aplicado al Timer 1: Se desea ese momento la temporización comienza. Para saber
complementar el valor del puerto B cada 50mS. Se si la temporización terminó se está revisando
estará revisando que se haya cumplido el tiempo de continuamente la bandera TMR1IF. Mientras esta sea
la temporización checando la bandera TMR1IF. 0 la temporización aún no habrá terminado, cuando la
Utilizando la expresión de la precarga y utilizando el bandera es 1 entonces la temporización finalizó,
preescalador más grande (8) obtenemos el valor que entonces se borra la bandera TMR1IF, se
necesitamos cargar al par de registros TMR1 para complementa el puerto B y se vuelve a realizar la
obtener una temporización de 50mS. precarga. De este modo el programa está
complementado el puerto B cada 50mS. Ejemplo del
precarga=-[([50mS/(4/fosc)])/8]+65536 = 59286 = temporizador Timer 1
0xE796
Espera interrupción
Se deshabilitan las columnas
Se escribe en el puerto B el valor de las filas
Se habilita la primer columna
Espera interrupción
Se deshabilitan las columnas
Se escribe en el puerto B el valor de las filas
Se habilita la siguiente columna
Espera interrupción