SE – uC: PIC16F84A – Proyecto Final

Requisitos del Programa

El proyecto final consiste en un sistema que controle el giro de una cámara de vigilancia, utilizando cuatro sensores infrarrojos para detectar movimiento, haciendo que la cámara gire recorriendo la menor distancia al sensor que se activó. El uC debe dormir cuando no exista actividad en algún sensor.

El sistema debe quedar de la siguiente manera:

Diseño Hardware

El primer sensor (S0) se utilizara para calibrar el sistema a su posición inicial cada vez que el sistema sea encendido, para asegurar un punto inicial de partida e ira conectado al pin RB3. El resto de los sensores (S1-S4) se utilizaran para detectar movimiento en los cuatro puntos establecidos en el diagrama general, estos estarán conectados en los pines RB4-RB7 correspondientemente.

Los lasers tendrán independencia total ya que cuentan con sus propias baterías. Los fototransistores nos darán “0” en su estado normal y “1” cuando sean interrumpidos.

El uC debe dormir al estar inactivo el sistema, utilizaremos un LED para indicar si se encuentra activo el cual ira conectado en el pin RA4. Para despertar el uC debemos generar una interrupción externa cuando algún sensor se active, debido a que las interrupciones del PORTB están bugeadas tendremos que generar la interrupción por el pin RB0/INT utilizando tres compuertas “OR” quedando la siguiente ecuación: RB0\INT = S1+S2+S3+S4, se utilizara el integrado 74LS32.

Utilizaremos un motor de pasos bipolar de dos bobinas, los cuales son cuatro cables de conexión. Para controlar este tipo de motor se utiliza un puente H por cada bobina, para facilitarnos esta tarea utilizaremos el driver LM293D el cual brinda una corriente de 600mA por canal y cuenta con cuatro canales. El voltaje en las bobinas será de Vs=3v y el voltaje lógico será de Vss=5v. Los cables de las bobinas (B0-B3) irán conectado a los pines RA0-RA3 correspondientemente.

Con todo lo comentado anteriormente procedemos a realizar el diagrama esquemático quedando de la siguiente manera:

Diseño Software

Lo primero a desarrollar son las rutinas para controlar el motor de pasos bipolar las cuales estarán en el archivo MOTOR_PAP.INC. Su diagrama de flujo es el siguiente:

Ahora procedemos a realizar el diagrama de bloque y flujo del programa principal:

Los registros y banderas que se utilizaran son los siguientes:

Todos los cálculos del sistema se realizaran en la rutina de interrupción, el diagrama de bloque es el siguiente:

Considerando todos los detalles el diagrama de flujo completo de la interrupción es el siguiente:

Código Fuente

;--------------------------------------------------------------
;	NOMBRE DEL PROGRAMA: PROYECTO FINAL DEL PIC16F84A
;		
;	DESCRIPCION: PROGRAMA QUE CONTROLA UN SISTEMA DE VIGILANCIA
;		
;	POR:		Omar Gurrola
;	
;	AÑO:		2006
;--------------------------------------------------------------
;	Configuracion para el GRABADOR
	__CONFIG	_CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
;_CP_ON / _OFF		Proteccion del Codigo
;_PWRTE_ON / _OFF	Reset mediante Power-Up Timer
;_WDT_ON / _OFF		WatchDog
;_LP_OSC			Oscilador de bajo Consumo (35Khz a 200Khz)
;_XT_OSC			Oscilador de Cristal (100khz a 4Mhz
;_HS_OSC			Oscilador de Alta velocidad (4Mhz a 20Mhz)
;_RC_OSC			Oscilador Resistencia-Capacitor ()
;--------------------------------------------------------------
;	Definiciones y Declaracion del Micro
	LIST	P=16F84A		;Procesador utilizado
	INCLUDE	<P16F84A.INC>	;Definicion de algunos operandos
;--------------------------------------------------------------
;	Declaracion de Constantes, Variables y Base
	RADIX	HEX		;Base Hexadecimal

	;CONSTANTES
	;Otros
	#DEFINE	BANK_0		BCF	STATUS,RP0	;Banco 0
	#DEFINE	BANK_1		BSF	STATUS,RP0	;Banco 1
	#DEFINE Dormido		PORTA,RA4		;Led de Dormido
	#DEFINE Iniciado	H'0'			;Ciclo Iniciado
	#DEFINE	Sentido		H'1'			;Sentido de Giro ESTADO.Sentido
	
	;Bobinas del Motor
	#DEFINE	Bobina_0	PORTA,RA0		;Bobina del Motor 0
	#DEFINE	Bobina_1	PORTA,RA1		;Bobina del Motor 1
	#DEFINE Bobina_2	PORTA,RA2		;Bobina del Motor 2
	#DEFINE Bobina_3	PORTA,RA3		;Bobina del Motor 3
		
	;Sensores
	#DEFINE Calibracion	PORTB,RB3		;Calibracion
	#DEFINE	Sensor_1	PORTB,RB4		;Sensor 1
	#DEFINE	Sensor_2	PORTB,RB5		;Sensor 2
	#DEFINE Sensor_3	PORTB,RB6		;Sensor 3
	#DEFINE	Sensor_4	PORTB,RB7		;Sensor 4

	;Posiciones
	#DEFINE	PS_1		D'12'			;Posicion del Sensor 1
	#DEFINE	PS_2		D'25'			;Posicion del Sensor 2
	#DEFINE PS_3		D'37'			;Posicion del Sensor 3
	#DEFINE	PS_4		D'50'			;Posicion del Sensor 4
	#DEFINE	POS_MAX		D'51'			;Posicion Maxima

	;VARIABLES
	CBLOCK 0x0C
		ESTADO		;Registro de Estado
		POS_ACT		;Registro de la Posicion Actual
		PASOS		;Registro de los Pasos que debe dar
		SEN_X		;Registro de la Posicion del Sensor Activo
	ENDC
;--------------------------------------------------------------
;	Inicio
	ORG	0			;Ir a Programa Principal
 	GOTO	PROGRAMA_PRINCIPAL
	ORG 4			;Ir a Rutina de Interrupcion
	GOTO	Rutina_Interrupcion
;--------------------------------------------------------------
;	Programa Principal
;--------------------------------------------------------------
PROGRAMA_PRINCIPAL
	;--------------------------------------------------------------
	;	Configurar Entradas y Salidas
	;--------------------------------------------------------------
	BANK_1
		BCF		OPTION_REG,RBPU		;Resistencias PULL-UP Activada
		CLRF	TRISA				;PORTA = Salidas
		MOVLW	0xFF				;
		MOVWF	TRISB				;PORTB = Entradas
	BANK_0
	;--------------------------------------------------------------
	;	Calibrar Camara
	;--------------------------------------------------------------
	BSF		Dormido					;El uC esta despierto
CALIBRAR
	CALL	MOTOR_GIRA_CW			;Da un Paso hacia CW
	BTFSS	Calibracion				;Esta en la posicion PS_4?
	GOTO	CALIBRAR				;NO, Calibra otra vez
	MOVLW	PS_4					;
	MOVWF	POS_ACT					;SI, POS_ACT = PS_S4
	;--------------------------------------------------------------
	;	Configurar Interrupciones
	;--------------------------------------------------------------
	BSF		INTCON,GIE
	BSF		INTCON,INTE
	BSF		OPTION_REG,INTEDG
	;--------------------------------------------------------------
	;	Activar Modo de Bajo Consumo de Potencia
	;--------------------------------------------------------------
DOR_UC
	BCF		Dormido					;El uC esta dormido
	SLEEP							
	GOTO	DOR_UC
;--------------------------------------------------------------
;	Rutina de Interrupcion
;--------------------------------------------------------------
Rutina_Interrupcion
	;--------------------------------------------------------------
	;	Algun sensor activado?
	;--------------------------------------------------------------
	BSF		Dormido
	BCF		ESTADO,Iniciado
CHECAR_SRS
	BTFSS	Sensor_1
	GOTO	CHECAR_S2
	MOVLW	PS_1
	GOTO	DET_MENOR_DIST
CHECAR_S2
	BTFSS	Sensor_2
	GOTO	CHECAR_S3
	MOVLW	PS_2
	GOTO	DET_MENOR_DIST
CHECAR_S3
	BTFSS	Sensor_3
	GOTO	CHECAR_S4
	MOVLW	PS_3
	GOTO	DET_MENOR_DIST
CHECAR_S4
	BTFSS	Sensor_4
	GOTO	CHECAR_ESTADO
	MOVLW	PS_4
	;--------------------------------------------------------------
	;	Determinar Menor Distancia
	;--------------------------------------------------------------
DET_MENOR_DIST
	MOVWF	SEN_X
	BSF		ESTADO,Iniciado
	MOVF	POS_ACT,W
	SUBWF	SEN_X,W
	BTFSS	STATUS,C
	GOTO	APLICAR_CMA2
	MOVWF	PASOS
	BSF		ESTADO,Sentido
	GOTO	D1_ES_MNR_DST
APLICAR_CMA2
	MOVWF	PASOS
	COMF	PASOS,F
	INCF	PASOS,F
	BCF		ESTADO,Sentido
D1_ES_MNR_DST
	MOVF	PASOS,W
	SUBLW	D'26'
	BTFSS	STATUS,C
	GOTO	DET_D2	
	GOTO	TRM_C
DET_D2
	COMF	PASOS
	MOVLW	PS_4
	ADDWF	PASOS,F
	INCF	PASOS,F
	BTFSS	ESTADO,Sentido
	GOTO	INV_CW
	BCF		ESTADO,Sentido
	GOTO	TRM_C
INV_CW
	BSF		ESTADO,Sentido
	;--------------------------------------------------------------
	;	Hay Pasos que recorrer?
	;--------------------------------------------------------------
TRM_C
	MOVF	PASOS,F
	BTFSS	STATUS,Z
	GOTO	CHECAR_SENTIDO
	GOTO	FIN_INT
	;--------------------------------------------------------------
	;	Determinar Sentido de Giro y Girar
	;--------------------------------------------------------------
CHECAR_SENTIDO
	BTFSS	ESTADO,Sentido
	GOTO	GIRA_CCW
	CALL	MOTOR_GIRA_CW
	INCF	POS_ACT,F	
	MOVLW	POS_MAX
	SUBWF	POS_ACT,W
	BTFSS	STATUS,Z
	GOTO	CHECAR_SRS
	MOVLW	D'1'
	MOVWF	POS_ACT
	GOTO	CHECAR_SRS
GIRA_CCW
	CALL	MOTOR_GIRA_CCW
	DECF	POS_ACT,F	
	MOVF	POS_ACT,F
	BTFSS	STATUS,Z
	GOTO	CHECAR_SRS
	MOVLW	PS_4
	MOVWF	POS_ACT
	GOTO	CHECAR_SRS
	;--------------------------------------------------------------
	;	Checar estado y/o decrementar Pasos
	;--------------------------------------------------------------
CHECAR_ESTADO
	BTFSS	ESTADO,Iniciado
	GOTO	FIN_INT
	DECF	PASOS
	GOTO	TRM_C
	;--------------------------------------------------------------
	;	Fin de la interrupcion
	;--------------------------------------------------------------
FIN_INT
	BCF		INTCON,INTF
	RETFIE
;--------------------------------------------------------------
	;Archivos Incluidos
	;INCLUDE <MOTOR_PAP.INC>		;Rutinas para el Motor PAP
	;INCLUDE <RETARDOS.INC>		;Rutinas de Tiempos

	END				;Fin del programa
	
	CBLOCK
		TEMP
	ENDC

;------------------------------------------------------
;	<MOTOR_PAP.INC>		;Rutinas para el Motor PAP
;	Libreria que controla un Motor Bipolar generando 
;	la secuencia necesaria para hacerlo dar un paso en 
;	el sentido requerido.
;------------------------------------------------------

; Esta Rutina hace girar un paso al Motor PAP en el 
; sentido de las manecillas del reloj (CW = Clock Wide).
MOTOR_GIRA_CCW
	MOVLW	B'00010110'
	CALL	ACTIVA_SALIDA
	MOVLW	B'00010101'
	CALL	ACTIVA_SALIDA
	MOVLW	B'00011001'
	CALL	ACTIVA_SALIDA
	MOVLW	B'00011010'
	CALL	ACTIVA_SALIDA
	RETURN

; Esta Rutina hace girar un paso al Motor PAP en el
; sentido contrario a las manecillas del reloj 
; (CCW = Counter Clock Wide).
MOTOR_GIRA_CW
	MOVLW	B'00011010'
	CALL	ACTIVA_SALIDA
	MOVLW	B'00011001'
	CALL	ACTIVA_SALIDA
	MOVLW	B'00010101'
	CALL	ACTIVA_SALIDA
	MOVLW	B'00010110'
	CALL	ACTIVA_SALIDA
	RETURN

; Esta Rutina manda el valor correspondiente al Puerto 
; de Salida, para activar las bobinas correspondiente y 
; se espera 5ms antes salirse.
ACTIVA_SALIDA
	MOVWF	PORTA
	CALL	Retardo_5ms
	CLRF	PORTA
	BSF		Dormido
	RETURN

Archivos del Proyecto

Archivos del proyecto – 2012-02_SE-uC_PIC16F84A-PROYECTO.rar

Galería

9 Responses to SE – uC: PIC16F84A – Proyecto Final

  1. ieepa22 says:

    Que puntazo de protecto, los sistemas de seguridad de las empresas, se quedan en nada!!!

  2. jhon says:

    man xvere tu poyecto, un favor este archivo de donde los saco y me aparecen como errores RETARDOS.INC y MOTOR_PAP.INC. soy nuevo en esto y de antemano gracias por tu respuesta

  3. Orlando says:

    Que tal, sinceramente que gran proyecto pero yo tengo un par de dudas no se si me las podrias resolver.

    En que hiciste todo tu proyecto? Que simulador usaste para el circuito y para el codigo?

    De ante mano gracias y muchas felicidades.

    • Omar Gurrola says:

      Hola orlando, aqui esta la informacion que me pediste:
      Para los diagramas de bloque, flujo y esquematico utilize: Microsoft Visio 2007.
      Para desarrollar el programa utilice: MPLAB IDE v7 y MPASM 5.05 (Las versiones son viejas, recuerda que se desarrollo en el 2006).
      Para simular el programa fue con: MPLABSIM que viene integrado en MPLAB IDE.

      Saludos =D

  4. waldo cal coil says:

    te chevere tu proyecto gracias por compartirlo

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: