Sep 242012

 

Imagen de un PIC16F84

Pin Out del PIC16F84

 

 

 

 

 

 

Cuando necesitamos que transcurra un determinado tiempo de espera antes de que ocurra un evento como por ejemplo el encendido de una luz, LED, activación de una bobina de un relé o lectura de una determinada entrada, se suele recurrir a los retardos. Prácticamente casi todos los programas de microcontroladores PIC usan en algun momento una rutina de retardo.

El típico programa del parpadeo de un LED hace uso de estas rutinas para generar una demora entre los cambios de estado de un LED que se enciende y se apaga, el tiempo que tenemos entre el encendido y apagado viene determinado por la rutina de retardo..

Los retardos en los PIC los podemos generar de dos formas diferentes:

  • Por Software.
  • Por Hardware mediante el Timer TMR0.

Los retardos por Software consisten en que el pic se quede ejecutando unos bucles que van decrementado unos contadores cargados previamente con el tiempo de retardo, cuando los contadores llegan a 0 la rutina de retardo queda terminada y el microcontrolador sigue ejecutando otros procesos.

Los retardos por Hardware se realizan mediante el temporizador/contador TMR0 que es un registro de 8 bits, es decir, un particular tipo de registro cuyo contenido es incrementado con una cadencia regular y programable directamente por el hardware del PIC. Como es de 8 bits, el máximo de la cuenta está en 255.

El TMR0 tiene las siguientes modos de operación:

  • Temporizador/Contador de 8 bits.
  • Divisor de 8 bits programable por software.
  • Selección de reloj interno y externo.
  • Interrupción por desbordamiento.
  • Selección del flanco del reloj externo.

Este registro puede usarse para contar eventos externos por medio de un pin de entrada especial que hace que trabaje en modo contador o para contar pulsos internos de reloj de frecuencia constante en modo temporizador. Además, en cualquiera de los dos modos, se puede insertar un prescaler, es decir un divisor de frecuencia programable que puede dividir por 2, 4, 8, 16, 32, 64, 128 o 256. Este divisor puede ser utilizado alternativamente como prescaler o del TMR0 o como del Watch Dog Timer, según se lo programe.

Características de la subrutina Delay:

  • Utiliza 3 contadores anidados. (c1,c2 y c3)
  • No permite realizar ninguna acción hasta que acaba la rutina.

 

Si queremos conseguir 5 segundos de retardo tendremos que consumir 5000000 ciclos de reloj, esto sera valido solamente si el microcontrolador PIC trabaja con un Clock de 4 MHZ, ejecutándose un ciclo de instrucción en 1 uS. Tendremos que tener en cuenta que las instrucciones que realizan saltos consumen 2 ciclos de reloj cuando realizan un salto. Modificando los registros de la subrutina Delay podremos programar cualquier tiempo.

; Delay = 5 seconds
; Clock frequency = 4 MHz
	cblock
	c1
	c2
	c3
	endc

Delay

	movlw	0x2C
	movwf	c1
	movlw	0xE7
	movwf	c2
	movlw	0x0B
	movwf	c3
Delay_0
	decfsz	c1, f
	goto	$+2
	decfsz	c2, f
	goto	$+2
	decfsz	c3, f
	goto	Delay_0

	goto	$+1
	nop

	return

 

Programa de ejemplo de una rutina de retardo implementada en un PIC16F84 que hace parpadear un LED por el Pin RB0,

;---------------Encabezado-------------

	LIST	p=16f84
	radix	hex

;------------mapa de memoria---------

estado	equ	0x03	     ; Haciendo asignaciones
TRISB	equ	0x06
ptob	equ	0x06

reg1	equ	0x0C	     ; Estos 3 registros los utilizaré
reg2	equ	0x0D	     ; para hacer el retardo
reg3	equ	0x0E

;-------Configuración de puertos-------

reset	org	0x00 	     ; Origen del programa, aquí comenzará

	goto 	inicio	     ; salta a la etiqueta inicio.
inicio	bsf	estado,5     ; Pone rp0 a 1 y pasa al banco1
	movlw	b'00000000'  ; Carga W con 00000000
	movwf	TRISB	     ; y pasa el valor a TRISB.
	bcf	estado,5     ; pone rp0 a 0 y regresa al banco0

;----Aquí enciende y apaga el LED-----

ahora	bsf	ptob,0	     ; Pone un 1 en RB0 enciende el LED
	call	retardo	     ; Llamamos a la subrutina retardo.

	bcf	ptob,0	     ; Pone a 0 RB0 apaga el LED
	call	retardo	     ; Llamamos a la subrutina retardo.
	goto 	ahora	     ; Repite el bucle infinitamente.

;**************** Rutina de Retardo ***************************

retardo	movlw	10	     ; Cargamos los 3 registros con los valores de retardo.
	movwf	reg1

tres	movlw	20
	movwf	reg2

dos	movlw	30
	movwf	reg3

uno	decfsz	reg3,1	     ; Se van decrementando los registros anidados.
	goto	uno
	decfsz	reg2,1
	goto	dos
	decfsz	reg1,1
	goto	tres
	retlw	00

	end

Vídeo tutorial de como generar retardos por Software y por Hardware mediante el temporizador.



Contenido relacionado




 Deja un Comentario

(Requerido)

(Requerido)