Autor Tema: Ayuda por favor  (Leído 1504 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado yorchbh

  • PIC10
  • *
  • Mensajes: 1
Ayuda por favor
« 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

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: Ayuda por favor
« Respuesta #1 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
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube