TODOPIC

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.

;CLAVE

CLAVE      movf   PUERTOB,W
         xorlw   b'10000000'
         btfss   ESTADO,Z
         goto   CLAVENO
         goto   CLAVESI

CLAVESI      clrf   PUERTOB
         goto   VOLVERC

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
  1. CLAVE      movf   PUERTOB,W
  2.          andlw B'11110000'       ;enmascaramos para poner los bits RB0 a RB4 leidos en cero
  3.          xorlw   b'10000000'
  4.          btfss   ESTADO,Z
  5.          goto   CLAVENO
  6.          goto   CLAVESI

Saludos