Sei sulla pagina 1di 9

c

c
 

c c

 
   
    
    


ccccccc c
c
c

PROBLEMA

POR MEDIO DEL PIC 16F877A SE DEBE ENCENDER UN LED POR EL PUERTO
B A 10 HZ DE FRECUENCIA ACTIVANDO EL TMR0.

MARCO TEORICO

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 de 0xFF a 0×0) el
registro TMR0 la bandera de interrupción 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 operación además 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 módulo 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 TMR0 WDT

000 1:2 1:1

001 1:4 1:2

010 1:8 1:4

011 1:16 1:8

100 1:32 1:16


c
c

101 1:64 1:32

110 1:128 1:64

111 1:256 1:128

Carga y temporización

En modo temporizador el Timer 0 incrementa su cuenta en cada ciclo de


instrucción. 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 más exactas y además se
cuenta con la ventaja de que el módulo puede trabajar mediante
interrupciones así que el programa puede ejecutar otras isntrucciones
mientras se realiza la temporización.

La temporización que se puede obtener con este módulo se obtiene de la


siguiente relación:

Temporización = [(256 - precarga)*PS+2]*Tinstruccion

Donde:
precarga = Valor que se le asigna al registro TMR0 al comenzar la
temporización
PS = Preescalador. Si esta asignado al watchdog tomará el valor de 1
Tinstrucción = 4/frecuencia de oscilación
y la temporización está dada en segundos.

precarga = -[([Temporizacion/(4/fosc)]-2)/PS]+256

Donde, de nuevo, la temporización está dada en segundos.

Calculo del TMR0 PARA LOS 100ms:

Se desea el valor del puerto B cada 100ms(10Hz). Se estará revisando que


se haya cumplido el tiempo de la temporización checando la bandera T0IF.
Utilizando la expresión de la precarga y utilizando el preescalador más
grande (256) obtenemos el valor que necesitamos cargar al registro TMR0
para obtener una temporización de 100mS.

precarga = -[([100mS/(4/20Mhz)]-2)/256]+256 = 134.3 у 134


c
c

×a que no podemos cargar numeros fraccionarios el valor de precarga


necesario es 134.

_  
¸ cc cc
    c

 
c
 ccc ccc  cc c c

 _ 
c c ccc 
c  cc c c
c c c¸ c c c c c  c   c
c c ccc c c c  c c
c c c cc 
c c
c  c c c
c
c c!"c
!c  c c cc cc#c
\IAGRAMA \E FLUJO


¡¡ ¡¡c


 ¸¡#c


¸ 
 c

  ¡c$%c
$¡¸¸¡ $c



¸#¸ c



$%¸& c¸#c


 ¡ c
c
c



 
  

 

 








  

 



 




  !"" #

 $



 $

 

 


$


c
c




% 

c
c

c
c
c

æ 





c



c
c








c
c

æ

Pc s' cc(  c  cc c


Pc &cc c
Pc s' cc  ) c c c "*++ c


Potrebbero piacerti anche