Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: yorchbh en 14 de Junio de 2009, 18:23:27
Título: Ayuda por favor
Publicado por: yorchbh en 14 de Junio de 2009, 18:23:27
Hola que tal a todos, soy nuevo en este foro y tengo este semestre aprendiendo sobre micros, en especial del 16f84.
Tengo un proyecto que entregar acerca de una alarma con 2 sensores, un zumbador, leds de salida y con un dipswitch de 4 tengo que ingresar una clave de 4 bits para detener todo, sino, despues de 30 segundos, un led se enciende, simulando el aviso a la policía.
Lo unico que no he logrado es que reconozca la clave y prende al LED de policia. Quisiera saber si alguien puede ayudarme, aqui envio mi código.
;Jorge ;Ingenieria Electrica ;Mayo de 2009 ;Este es mi proyecto final de la materia de Microcontroladores ; ;Se trata de una alarma domestica conformada por dos sensores y una clave de entrada ;y una alarma sonora y dos leds de salida ;
;CONFIGURACIONES INICIALES
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC LIST P=16F84 RADIX HEX INCLUDE <P16F84A.INC>
;CODIGO W EQU 0x00 ;Registro W F EQU 0x01 ;Registro F Z EQU 0x02 ;Es el bit2 del registro ESTADO ESTADO EQU 0x03 ;Para facilitar comprension PUERTOA EQU 0x05 ;Igual PUERTOB EQU 0x06 ;Igual CBLOCK 0x20 R_ContA ; Contadores para los retardos. R_ContB R_ContC ENDC
;Programa principal
ORG 0 ;Arrancamos en direccion 0 goto INICIO ;Saltamos a la direccion 5 ORG 5 ;Para evitar el vector de interrupcion
INICIO bsf ESTADO,5 ;Vamos al banco 1 movlw 0xFF ;PuertoA como entrada movwf PUERTOA movlw 0xF0 ;PuertoB como entrada/salida movwf PUERTOB bcf ESTADO,5 ;Regresamos al banco 0 clrf PUERTOA clrf PUERTOB
CHECATE btfss PUERTOA,0 ;Se checa el interruptor que activa o no ;la alarma goto APAGADO
call SENS1 ;Rutinas que comprueban el estado call SENS2 ;de los sensores call ZUMBA ;Si pita, pita, si no, ps no call RETARDO ;Para introducir la clave call CLAVE
APAGADO clrf PUERTOB goto CHECATE
;Sensor1 Switch
SENS1 btfss PUERTOA,1 ;Si esta a 1, activa el LED1 goto APAGA1 ;si no, lo apaga goto ACT1
APAGA1 bcf PUERTOB,1 goto VOLVER1
ACT1 bsf PUERTOB,1 goto VOLVER1
VOLVER1 return
;Sensor2 Optosensor
SENS2 btfss PUERTOA,3 ;Si esta a 1, activa el LED2 goto APAGA2 ;si no, lo apaga goto ACT2
APAGA2 bcf PUERTOB,2 goto VOLVER2
ACT2 bsf PUERTOB,2 goto VOLVER2
VOLVER2 return
;Zumbador
ZUMBA movf PUERTOA,W andlw b'00001010' ;Asi se consigue que en W solo quede el valor de ;los sensores btfss ESTADO,Z ;Si esta a 1, desactiva, si no, activa goto ACTZ goto DESACTZ
DESACTZ bcf PUERTOB,0 goto VOLVERZ
ACTZ bsf PUERTOB,0 goto VOLVERZ
VOLVERZ return
;RETARDO
RETARDO movlw d'255' ; Aporta 1 ciclo máquina. Este es el valor de "N" goto Retardo_1Decima ; Aporta 2 ciclos máquina.
;RETARDO Retardo_1Decima movwf R_ContC ; Aporta 1 ciclo máquina. R1Decima_BucleExterno2 movlw d'100' ; Aporta Nx1 ciclos máquina. Este es el valor de "M". movwf R_ContB ; Aporta Nx1 ciclos máquina. R1Decima_BucleExterno movlw d'249' ; Aporta MxNx1 ciclos máquina. Este es el valor de "K". movwf R_ContA ; Aporta MxNx1 ciclos máquina. R1Decima_BucleInterno nop ; Aporta KxMxNx1 ciclos máquina. decfsz R_ContA,F ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar). goto R1Decima_BucleInterno ; Aporta (K-1)xMxNx2 ciclos máquina. decfsz R_ContB,F ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar). goto R1Decima_BucleExterno ; Aporta (M-1)xNx2 ciclos máquina. decfsz R_ContC,F ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar). goto R1Decima_BucleExterno2 ; Aporta (N-1)x2 ciclos máquina. return ; El salto del retorno aporta 2 ciclos máquina.
CLAVENO bsf PUERTOB,3 ;LED DE AVISO A POLICIA goto VOLVERC
VOLVERC return
END
Saludos a todos
Título: Re: Ayuda por favor
Publicado por: sander en 15 de Junio de 2009, 01:57:23
Bienvenido al foro yorchbh, yo creo que tu problema podria ser que como utilizas el PORTB para introducir la clave y tambien como salida , al momento de hacer la comparacion el PORTB podria no tener los Bits RB0 a RB4 en cero , entonces tu comparacion no es valida , eso lo puedes solucionar enmascarando el valor que leas del PORTB haciendo :
Código: ASM
CLAVE movf PUERTOB,W
andlw B'11110000';enmascaramos para poner los bits RB0 a RB4 leidos en cero