Supuestamente el Timer de 8 bit son de 1/256 de prescaler del 16F84A, el 16F88 tiene un Timer de 16 Bits. Un ejemplo del libro www.16f84a.org
EJEMPLO: ¿Qué valor hay que cargar en el TMR0 para lograr un tiempo de 500us si se utiliza un Prescaler de 2?
Solución: Sustituyendo em ña ecuación anterior queda:
Temporización = Tcm * Prescaler * (256 - Carga TMR0)
500 = 1 x 2 (256 - Carga TMR0)
de donde se deduce que el valor a cargar tiene que ser:
Carga TMR0 = 6
Como pueden ver el ejemplo de abajo, el parpadeo es de 500us.
Tanta explicación para una sola pregunta que es:
¿Cómo puedo usar 20 minutos de duración con el TIMER0 de 8 bit?
Si es imposible, al menos para los 16 Bits del PIC-16F88.
A parte de esto, como segunda idea, quiero crear con Visual C# 2010 Express un generador de códigos en asm para los timer de 8 Bits y 16 Bits si es posible, al menos para los PIC16F84A y 16F88, más adelante con más PIC.
20m = 20 minutos.
20m = 20000s = 20000000us
20000000 / 256 = 78125 Parece que no se puede hacer, hay que hacer algo.
Siguiendo con el ejemplo.
Temporización = Tcm * Prescaler * (256 - Carga TMR0)
20000000 = 1 x 256 (256 - Carga TMR0)
Carga TMR0 = 78125 ; Es mucho, cómo máximo tiene que ser 256, no 78125. ¿Hay algún truco para ello?
Un cordial saludo.
Donde:Temporización = Tcm * Prescaler * (256 - Carga TMR0)
- Temporización, es el tiempo deseado.
- Tcm, es el período de un ciclo máquina e igual a Tcm = 4 Tosc. Para los 4 MHz ya se ha calculado en anteriores ocaciones Tcm = 4 * 1/f = 4 * 1/4 = 1 us.
- Prescaler, es el rango de divisor de frecuencia elegido.
- (256-Carga TMR0), es el número total de impulsos a contar por el TMR0 antes de desbordarse en la cuenta ascendente.
EJEMPLO: ¿Qué valor hay que cargar en el TMR0 para lograr un tiempo de 500us si se utiliza un Prescaler de 2?
Solución: Sustituyendo em ña ecuación anterior queda:
Temporización = Tcm * Prescaler * (256 - Carga TMR0)
500 = 1 x 2 (256 - Carga TMR0)
de donde se deduce que el valor a cargar tiene que ser:
Carga TMR0 = 6
Como pueden ver el ejemplo de abajo, el parpadeo es de 500us.
Código:
;************************************** Timer0_02.asm ***********************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.org
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Por la línea 3 del puerto B se genera una onda cuadrada de 1 kHz, por tanto, cada
; semiperiodo dura 500 µs. Los tiempos de temporización se consiguen mediante la
; utilización del Timer 0 del PIC.
;
; A la línea de salida se puede conectar un altavoz, tal como se indica en el esquema
; correspondiente, con lo que se escuchará un pitido.
; El cálculo de la carga del TMR0 se hará de forma simple despreciando el tiempo que
; tardan en ejecutarse las instrucciones.
;
; ZONA DE DATOS **********************************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
ENDC
#DEFINE Salida PORTB,3
; ZONA DE CÓDIGOS ********************************************************************
ORG 0
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
bcf Salida ; Esta línea se configura como salida.
movlw b'00000000'
movwf OPTION_REG ; Prescaler de 2 asignado al TMR0
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
bsf Salida ; La salida pasa a nivel alto
call Timer0_500us ; durante este tiempo.
bcf Salida ; La salida pasa a nivel bajo
call Timer0_500us ; durante este tiempo.
goto Principal
; Subrutina "Timer0_500us" -------------------------------------------------------
;
; Como el PIC trabaja a una frecuencia de 4 MHz, el TMR0 evoluciona cada microsegundo.
; Para conseguir un retardo de 500 µs con un prescaler de 2 el TMR0 debe contar 250
; impulsos. Efectivamente: 1 µs x 250 x 2 = 500 µs.
;
TMR0_Carga500us EQU d'256'-d'250'
Timer0_500us
movlw TMR0_Carga500us ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_Rebosamiento
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_Rebosamiento ; Todavía no. Repite.
return
; Comprobando con la ventana Stopwatch del simulador se obtienen unos tiempos para la onda
; cuadrada de 511 µs para el nivel alto y 513 µs para el bajo.
END
¿Cómo puedo usar 20 minutos de duración con el TIMER0 de 8 bit?
Si es imposible, al menos para los 16 Bits del PIC-16F88.
A parte de esto, como segunda idea, quiero crear con Visual C# 2010 Express un generador de códigos en asm para los timer de 8 Bits y 16 Bits si es posible, al menos para los PIC16F84A y 16F88, más adelante con más PIC.
20m = 20 minutos.
20m = 20000s = 20000000us
20000000 / 256 = 78125 Parece que no se puede hacer, hay que hacer algo.
Siguiendo con el ejemplo.
Temporización = Tcm * Prescaler * (256 - Carga TMR0)
20000000 = 1 x 256 (256 - Carga TMR0)
Carga TMR0 = 78125 ; Es mucho, cómo máximo tiene que ser 256, no 78125. ¿Hay algún truco para ello?
Un cordial saludo.
Última edición: