Banner publicitario de PCBWay

Ejemplo de temporización por TMR0

Hola a todos :D

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 :D

Saluds al foro :D


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
 

Adjuntos

  • delay_191.jpg
    delay_191.jpg
    53.7 KB · Visitas: 101
Atrás
Arriba