¿Alguien sabe como se utiliza el Timer0 en el PIC16F877A? Quiero hacer oscilar un led a una frecuencia de 1 Hz.

Respuesta :

Hola, el TMR0 no es más que un contador de 8 bits, que puede utilizarse como contador de impulsos por RA4 o temporizador.

En este caso lo utilizaremos como un temporizador. Para calcular los tiempos de temporizacion, se tiene la siguiente formula:

t = tcm*prescaler*(256-Vinicial)

*OBS:
tcm es el valor de un ciclo máquina. Si utilizas un cristal de 4MHZ , tendremos que:

tcm = 4(1/4MHZ) = 1us

para otro valor "X" MHZ → tcm = 4(1/XMHZ)

Sin embargo el máximo tiempo que se puede alcanzar (con un cristal de 4MHZ) es de 65.536ms por lo que debemos hacer uso de una variable ( registro de proposito general) para extender el tiempo a 500ms (Generaremos una onda cuadrada, de 500ms en estado alto y 500ms en estado alto, con esto logramos que el led oscile a una frecuencia de 1HZ)

Los datos que utilizaremos serán los siguientes:

Prescaler = 256
Valor inicial de TMR0  aproximadamente igual a 61

( eso quiere decir que produciremos una interrupcion  aproximadamente cada  50ms)
Variable "contador" :  Inicia en 0 y cada vez que llega a 10 (cuenta el nº de interrupciones generadas por desbordamiento del TMR0), encendemos o apagamos el led y reiniciamos su valor nuevamente a 0.

Adicional a esto, se utilizaran algunos bits de los registros OPTION_REG y INTCON

* de OPTION_REG:

bit 4:  si es 0 → el divisor se asigna al TMR0 (claro que haremos esto)
         si es 1 → el divisor se asigna al watchdog

bit2,bit1 y bit0:    Con esto se asigna el valor del prescaler
Para prescaler=256 → bit2=1 , bit1=1 , bit0=1

El resto de bits, no vienen al caso, y conviene dejarlos en 0 para esta aplicacion.

* de  INTCON:

bit7:  Se pone a 1 para activar las interrupciones.
bit2: Se pone a 1 para activar la interrupcion por desbordamiento del TMR0

El resto de bits, los dejamos en cero, pues asi conviene para esta aplicacion


Y por ultimo, adjunto el programa hecho en ensamblador!

Saludos!
Ver imagen Jeizon1L