¿Alguien sabe como se utiliza el Timer0 en el PIC16F877A? Quiero hacer oscilar un led a una frecuencia de 1 Hz.
Respuestas a la pregunta
Contestado por
1
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!
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!
Adjuntos:
Otras preguntas