Autor Tema: Retorno de un bucle  (Leído 2134 veces)

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

Desconectado Andres Piedra

  • PIC10
  • *
  • Mensajes: 2
Retorno de un bucle
« en: 26 de Abril de 2018, 21:14:34 »
Disculpen, estoy realizando un circuito con el PIC16F8777A, la cual se debe prender dos led con dos pulsadores,cuando se pulsa el primer pulador se debe prender el primer y parpadear y asi con el segundo pulsador, mi problema es que cuando presiono el primera parpadea el primer led, pero presionar el segundo y no hace nada, vuelvo a simular y sucede lo mimo ahoro presiono el segundo pulsador, parpadea el segundo, pero presionar el primero y no hace nada.
Como puedo encender los led con su respectivo pulsador, Ese se mi codigo, cual puede ser el error:

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
    REG1 EQU 0X20
    REG2 EQU 0X21
    REG3 EQU 0X22
ORG 00h
GOTO INICIO
ORG 05h
INICIO
BSF STATUS,RP0
MOVLW 0x06
MOVWF ADCON1
MOVLW 0xCF
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
BCF STATUS,RP0
CLRF PORTB
 PRINCIPAL
 CALL ENCENDIDO1
 GOTO PRINCIPAL
 ENCENDIDO1
        BTFSC PORTA,0 
        CALL  luce1ON
        BTFSC PORTA,1 
   CALL  luce2ON     
   RETURN   
luce1ON
   BSF PORTB,0
   CALL RETARDO
   BCF PORTB,0
   CALL RETARDO
        GOTO luce1ON
   RETURN
luce2ON
        BSF   PORTB,2
        CALL RETARDO
   BCF PORTB,2
   CALL RETARDO
        GOTO luce2ON
   RETURN
RETARDO
    MOVLW 0X20
    MOVWF REG3
EXTERNO
    MOVLW 0X30
    MOVWF REG2
MITAD
    MOVLW 0X50
    MOVWF REG1
INTERNO
    DECFSZ REG1,1
    GOTO INTERNO
    DECFSZ REG2,1
    GOTO MITAD
    DECFSZ REG3,1
    GOTO EXTERNO   
RETURN
END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Retorno de un bucle
« Respuesta #1 en: 26 de Abril de 2018, 21:38:33 »
Te voy a dar una guia, luego vos haces el programa. Vamos a hacer 3 subrutinas (+ 1 de delay). El loop principal va a ser de esta forma:

Código: ASM
  1. PRINCIPAL
  2.     CALL BOTON1TEST
  3.     CALL BOTON2TEST
  4.     CALL PARPADEAR
  5.     CALL DELAY
  6.     GOTO PRINCIPAL


BOTON1TEST y BOTON2TEST son iguales, lo que vas a hacer aca es revisar si se presiono el boton, si lo hizo entonces procedes a invertir el bit de un registro que vamos a llamar REGBITS supongamos... Algo asi:

Código: [Seleccionar]
BOTON1TEST:
     Esta presionado el boton del LED1 ?
     No esta presionado entonces salgo
     Si esta presionado -> Invierto el bit 0 de REGBITS
     Vuelvo

Para BOTON2TEST vas a invertir el bit1 de REGBITS, y vas a preguntar por el boton del LED2.

Finalmente PARPADEAR. Este es donde vamos a hacer parpadear o no nuestro led.

Código: ASM
  1. PARPADEAR:
  2.     MOVF    REGBITS, W
  3.     XORWF  PORTB
  4.     RETURN

------------------------------------------------------------------

En fin es simple, las primeras subrutinas solo observan los pulsadores y cambian los bits que luego van a invertir o no la salida de los leds.
Parpadear hace una XOR del registro que modificaron los botones con el puerto B, si los bits estan en 0 no van a invertir y van a quedar como estaban. SI tiene un 1 van a empezar a parpadear.

Problemas que podes tener:

- Al presionar deja de parpadear, pero esto no significa que se apague, esto lo vas a ver en la simulacion, esto puede solucionarse obviamente en la subrutina de PARPADEAR.

- Debido al delay "grande" dentro del loop principal, te vas a encontrar que si presionas el boton poco tiempo o que lo presiones mientras el micro esta haciendo el delay, es como si no lo hubieras presionado. Esto se puede solucionar reduciendo el delay y preguntando en PARPADEAR cuando entro X veces, suponete que tenes un parpadeo cada 1s originalmente, entonces en ves de un delay de 1s, haces uno de 100ms, para que no parpadee cada 100ms, contas hasta 10 dentro de PARPADEAR, y cuando llegue a 10 ejecutas el codigo y reiniciar tu contador a 0. El efecto visual es el mismo, cada 1s se apagaria y se encenderia pero se accede a las subrutinas mucho mas rapido.

- De acceder mucho mas rapido, implica que si tu presion del boton es demasiado largo ( que ocupe al menos 1 delay de tiempo) puede entrar 2 o mas veces a la subrutina del boton, entonces hay que aplicarle una "proteccion" para que no entre varias veces. Aca no se puede poner un loop esperando que suelte el boton, ya que de hacer eso, significa que no va a ejecutar PARPADEAR ni el DELAY, mientras tengas presionado el boton y es un problema.

Desconectado Andres Piedra

  • PIC10
  • *
  • Mensajes: 2
Re:Retorno de un bucle
« Respuesta #2 en: 26 de Abril de 2018, 21:55:03 »
Bueno gracias, pero disculpe que lo moleste, pero pasa que recien estoy iniciando en la programacion de los pics en MPLA, y mi profesor me solicito esta tarea, la cual me ha llevado mas de dos dias, y por eso le suplicara que si me podria ayudar con su resolucion en este ejercicio... espero me entienda y muchas gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Retorno de un bucle
« Respuesta #3 en: 26 de Abril de 2018, 23:26:27 »
Entiendo que estes iniciando y te lleve mas tiempo realizar algunas cosas, mucho mas dentro de los que me incluyo pasamos por eso, pero justamente tu profesor te pidio esta tarea por un motivo, y es para que pienses alguna forma de hacer el codigo.

Yo te di una guia, se podria llamar "guia", pero te di el codigo y un pseudocodigo que casi se asemeja al codigo de las subrutinas. Y lo unico que tenes que hacer es traducir ese pseudocodigo a instrucciones en lenguaje ASM. Y ya tendrias tu ejemplo funcionando.

Citar
y por eso le suplicara que si me podria ayudar con su resolucion en este ejercicio

Si te doy el ejercicio ya realizado, ¿que es lo que ganas?. Es tener el codigo de forma apenas mas directa de lo que te di. Puede que seas una persona honesta y no copies, pegues el código que te doy e intentes hacer el tuyo, o puede que simplementes tomes el código, lo pegues y listo. O que realmente te pongas a ver como es que funciona el codigo o tal ves no lo hagas. Y se termino tu aprendizaje, en ningun momento tuviste que ingeniartelas para tratar de hacer algo, y eso es lo que se esta buscando. Imaginate que tu profesor te de la consigna y luego te de el programa completo. Luego cuando te pida hacer algo distinto, lo vas a poder hacer?

Por eso pido que me entiendas el porque no te doy el codigo directo.
Si queres dedico media hora escribiendo sobre cualquier duda que tengas, pero por como te dije antes voy a intentar no darte el codigo, a pesar que si no me equivoco ya otra persona (compañero tuyo o vos - el anonimato de internet no me permite ser especifico) presento un codigo MUY parecido al tuyo. Y que curiosamente posee el mismo PIC, la misma configuracion, el mismo nombre de subrutinas, etc.

Lo repito nuevamente... Todas las dudas que tengas voy a intentar contestarlas, sea cual sea la preguntas que tengas de PIC.