TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Andres Piedra 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
-
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:
PRINCIPAL
CALL BOTON1TEST
CALL BOTON2TEST
CALL PARPADEAR
CALL DELAY
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:
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.
PARPADEAR:
MOVF REGBITS, W
XORWF PORTB
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.
-
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
-
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.
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.