Hola a todos 
Aqui dejo un ejemplo de la utilización dle TMR0 para crear retrasos.
Se utiliza el 16F84A (el código se puede adaptar fácilmente a cualquier otro dispositivo). junto con el diagrama.
Cada botón genera un delay mayor al anterior, disulparán que no les diga exactamente de cuánto es cada delay, pero sólo es un ejemplo y no lo hice con los cálculos de cada uno.
No se si sea la mejor o la manera correcta de hacerlo, cualquier comentario será bien recibido
Saluds al foro
Aqui dejo un ejemplo de la utilización dle TMR0 para crear retrasos.
Se utiliza el 16F84A (el código se puede adaptar fácilmente a cualquier otro dispositivo). junto con el diagrama.
Cada botón genera un delay mayor al anterior, disulparán que no les diga exactamente de cuánto es cada delay, pero sólo es un ejemplo y no lo hice con los cálculos de cada uno.
No se si sea la mejor o la manera correcta de hacerlo, cualquier comentario será bien recibido
Saluds al foro
Código:
;
;*****************************************
;*EJEMPLO 6: Timero con TMR0 y 3 botones *
;*************************************** *
;* El siguiente programa genera un delay *
;* para tres botones en PORTB el cuál es *
;* visible en un led conectado a PORTA *
;*****************************************
;******** Configuracion del PIC
LIST P=16F84A ;procesador
INCLUDE "p16f84A.inc" ;Definir los registros
__CONFIG _CP_OFF &_PWRTE_ON & _XT_OSC & _WDT_OFF ; Bit de config.
;********* Declarar variables
cblock 0x0C
tdelay
endc
;******** Declarar constantes en RAM
#define entrada PORTB ; PORTB = entrada
#define salida PORTA ; PORTA = salida
#define led PORTA, 0 ; Led en RA0
#define bot01 PORTB, 0 ; Boton 1 en RB0
#define bot02 PORTB, 1 ; Boton 2 en RB1
#define bot03 PORTB, 2 ; Boton 2 en RB2
;******* Vector de Reset e interrupción
org 0x00 ; aquí inicia el PIC despues de un RESET
goto inicializar
org 0x04 ; aquí inicia el PIC cuando TMR0 interrumpe
btfss INTCON,1 ; da skip si el bit 1 de INTCON es 1
retfie ; regresa de la interrupción si no es hecha por TMR0
bcf INTCON,2 ; borra el flag de TMR0
retfie ; regresa de la interrupción
;******** Inicilizar PIC
inicializar
clrf INTCON
bsf STATUS, RP0 ; Cambio a Bank 1
movlw 0xFF
movwf TRISB ; Inicializa PORTB como entadas
clrf TRISA ; Inicializa PORTA como salidas
movlw b'10000111'
movwf OPTION_REG ; iniciliza el registro OPTION
bcf STATUS,RP0 ; Cambio a Bank 0
clrf salida ; limpia el PORTA
goto main
;******** Programa principal
main
btfss bot01 ; boton 1 no activado = skip
call delay1 ; llama a la rutina del 1er botón
btfss bot02 ; boton 2 no activado = skip
call delay2 ; llama a la rutina del 2do botón
btfss bot03 ; boton 3 no activado = skip
call delay3 ; llama a la rutina del 3er botón
goto main
;******** Rutina botón1
delay1
bsf led ; enciende el led
movlw 0x0A ; carga en W el valor para la rutina "delay"
call delay
return
;******** Rutina botón2
delay2
bsf led ; enciende el led
movlw 0x14 ; carga en W el valor para la rutina "delay"
call delay
return
;******** Rutina botón3
delay3
bsf led ; enciende el led
movlw 0x1E ; carga en W el valor para la rutina "delay"
call delay
return
;******** Rutina de retraso
delay
movwf tdelay ; toma el valor de W, ajustado anteriormente
insert
movlw 0x01
movwf TMR0 ; coloca el TMR0 en 0x01
bcf INTCON,2 ; borra el flag de interrupció de TMR0
espera
btfss INTCON,2 ; checa si el bit de interrupcion de TMR0
goto espera ; si todavía no es 1
decfsz tdelay,F ; si ya es 1
goto insert ; da otra vuelta para restar a "tdelay"
bcf led ; apaga el led
clrw ; borra W
return
end