Autor Tema: Como hacer un salto de bucle a otro.  (Leído 1916 veces)

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

Desconectado pipazzzz

  • PIC10
  • *
  • Mensajes: 2
Como hacer un salto de bucle a otro.
« en: 25 de Abril de 2018, 10:46:35 »
disculpen, estoy realizando un circuito con el PIC16F8777A, la cual se debe prender dos led con dos pulsadores, mi problema es que enciende pero no logro hacerlo apagar:

LIST P=16f877A
#include "p16f877a.inc"
; CONFIG
; __config 0x3F39
 __CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
 ORG 0x00
 INICIO
 BSF STATUS,RP0
MOVLW 0x06
MOVWF ADCON1
MOVLW 0xCF
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
BCF STATUS,RP0
 
ENCENDIDO
        BTFSC PORTA,0   
        CALL  luce1ON     
        BTFSC PORTA,1   
        CALL  luce2ON     
       GOTO  ENCENDIDO     ;repite secuencia
APAGADO
        BTFSC PORTA,0    ; bit 0 del puerto B esta en nivel bajo, salta 1 linea
        CALL  luce1OFF      ;salta a encender LED1
        BTFSC PORTA,1    ; bit 1 del puerto B esta en nivel bajo, salta 1 linea
        CALL  luce2OFF      ;salta a encender LED2
        GOTO  APAGADO ;Repite secuencia

luce1ON
   MOVLW   D'1'   ; pone a 1
        MOVWF   PORTB   ;para encender LED1
         CLRF    PORTB
        RETURN
luce2ON 
        MOVLW   D'1'   ;pone a 1
        MOVWF   PORTB ;para encender LED2
          CLRF    PORTB
        RETURN
luce1OFF
        MOVLW   D'0'   ; pone a 1
        MOVWF   PORTB   ;para apagar LED1
         CLRF    PORTB
        RETURN
luce2OFF 
        MOVLW   D'0'   ;pone a 1
        MOVWF   PORTB ;para apagar LED2
          CLRF    PORTB
        RETURN   
END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Como hacer un salto de bucle a otro.
« Respuesta #1 en: 25 de Abril de 2018, 12:11:28 »
Si osbervas tu programa... Partiendo desde la etiqueta "ENCENDIDO", preguntas por un boton, preguntas por el otro y luego saltas a encendido. Entonces NUNCA va a llegar a apagado.

Una forma de solucionarlo es hacer que la rutina invierta el bit en ves de ponerlo a 1 o a 0. Me explico con el código:

Código: ASM
  1. PRINCIPAL
  2.         CALL  INVLED1       ;Rutina de LED1
  3.         CALL  INVLED2       ;Rutina de LED2
  4.         GOTO  PRINCIPAL     ;repite secuencia
  5.  
  6.         ; Subrutina de LED 1
  7. INVLED1
  8.         BTFSS PORTA,0           ; Boton presionado? (presionado = 1)
  9.         RETURN                  ; No esta presioando, entonces vuelve
  10. AUXLED1
  11.         BTFSC   PORTA,0         ; Se solto el boton? Es decir espero hasta que el boton se suelte
  12.         GOTO    AUXLED1         ; Mientras esta presionado vuelve a preguntar por el boton
  13.         MOVLW   B'00000001'     ; Se solto, asi que ahora a cambiar led 1, en este caso RB0
  14.         XORWF   PORTB           ; Hacemos una XOR de W con PORTB, al estar en W el unico 1 en el bit0 va a invertir unicamente el bit0 de PORTB
  15.         RETURN                  ; Vuelvo
  16.  
  17.         ; Subrutina de LED 2
  18. INVLED2  
  19.         BTFSS PORTA,1           ; Boton presionado? (presionado = 1)
  20.         RETURN                  ; No esta presioando, entonces vuelve
  21. AUXLED2
  22.         BTFSC   PORTA,1         ; Se solto el boton? Es decir espero hasta que el boton se suelte
  23.         GOTO    AUXLED2         ; Mientras esta presionado vuelve a preguntar por el boton
  24.         MOVLW   B'00000010'     ; Se solto, asi que ahora a cambiar led 1, en este caso RB1
  25.         XORWF   PORTB           ; Hacemos una XOR de W con PORTB, al estar en W el unico 1 en el bit1 va a invertir unicamente el bit1 de PORTB
  26.         RETURN                  ; Vuelvo

Reemplace ENCENDIDO por PRINCIPAL, y transforme las subrutinas...
Observa que ahora se espera que la persona presione y suelte el boton para poder cambiar el estado de la salida. Si no hubiera realizado esto, y tenias presionado el boton, el led iba a apagar y encender rapidamente.
La misma subrutina se encarga de encender Y apagar el led.

Otra forma de hacerlo, luego de haber preguntado si el boton estaba activado, es haber preguntado por PORTB,0 y si era 1 llevar a un codigo de apagarlo, y si era 0 un codigo para encenderlo. Pero con la XOR se vuelve mucho mas simple, y ese codigo sirve para ambos.
« Última modificación: 25 de Abril de 2018, 12:14:23 por KILLERJC »

Desconectado pipazzzz

  • PIC10
  • *
  • Mensajes: 2
Re:Como hacer un salto de bucle a otro.
« Respuesta #2 en: 25 de Abril de 2018, 17:11:12 »
Gracias, me sirvio de mucha ayuda, no sabia que se ha podido utilizar compuerta.