TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: En en 19 de Septiembre de 2008, 13:35:21
-
que tal gente del foro
les comento el problema que estoy teniendo que la verdad supongo que debe ser una pavada pero que yo no veo
mi objetivo es que el pic este esperando una entrada y que en el momento de que esta ocurra de una salida, pero la entrada no es continua, es dada por un pulsador por lo que la entrada dura solo unos milisegundos que tardo en pulsar el pulsador y la salida se activa y continua estable
para eso este codigo
List p=16f84
#INCLUDE P16F84.INC
__CONFIG _WDT_OFF & _PWRTE_ON & _XT_OSC
STATUS equ 0x03
PORTB equ 0x06
PORTA equ 0x05
org 0x00
goto INICIO
org 0x05
INICIO
bsf STATUS,5 ;cambia al banco1
movlw b'11111111'
movwf PORTA ;PORTA entradas
movlw b'11111000'
movwf PORTB ;PORTB salidas
bcf STATUS,5 ;cambia al banco0
ESPERA
btfss PORTA,0 ;espera
goto ESPERA
FACE1
bsf PORTB,0 ;prende RB0
end
mi problema es que RB0 se prende solo cuando la entrada esta siendo dada y no cuando se corta
no se la verdad me desconcertó cosa que en este tema no es muy dificil que me pase y viendo esto se me viene a la cabeza otra pregunta
si yo doy salidas, cuando termina el programa, es decir, cuando llega a end ¿las salidas se mantienen no?
bueno si me pueden dar una mano sera muy bienvenida yo seguire probando. gracias
-
Hola amigo:
Me parece que cuando lees el estado del pulsador, lo que realizas es poner a 1 el RB0 y ya no lo vuelves a desactivar , en ningun momento del progroma. Te faltaria la rutina de apagado cunado el pulsador n este activo.
Lo haria asi:
NICIO
bsf STATUS,5 ;cambia al banco1
movlw b'11111111'
movwf PORTA ;PORTA entradas
movlw b'11111000'
movwf PORTB ;PORTB salidas
bcf STATUS,5 ;cambia al banco0
ESPERA
btfss PORTA,0 ;espera
goto ESPERA
FACE1
bsf PORTB,0 ;prende RB0
end
-
Se me envio el mensaje antes de terminar de escribir, bueno aqui va la respuesta completa. :x :x :x :x :x :x
Hola amigo:
Me parece que cuando lees el estado del pulsador, lo que realizas es poner a 1 el RB0 y ya no lo vuelves a desactivar , en ningun momento del programa. Te faltaria la rutina de apagado cunado el pulsador no este activo.
Lo haria asi:
INICIO
bsf STATUS,5 ;cambia al banco1
movlw b'11111111'
movwf PORTA ;PORTA entradas
movlw b'11111000'
movwf PORTB ;PORTB salidas
bcf STATUS,5 ;cambia al banco0
ESPERA
btfss PORTA,0 ;espera
goto FACE2
FACE1
bsf PORTB,0 ;prende RB0
goto ESPERA
FACE2
bcf PORTB,0 ;apaga RB0
goto ESPERA
end
Esto es para explicarte un poco tu error. Todavia se podria depurar más el programa para evitar los gotos, pero de esta forma creo que lo entenderas mejor.
Ademas habria que añadir unos retardos para eliminar los rebotes que se producen al actuar los contactos del pulsador, asi como el añadir un tiempo de espera desde que se produce un cambio de la salida hasta la siguiente, dado que si el cristal es digamos e 4MHz el programa ira tan rapido que siempre veras el led iluminado.
Otra opcion seria realizarlo con interrupciones, pero si estas empezando eso mejor para mas adelante. :mrgreen: :mrgreen:
Fermin
-
mmm bueno, gracias por el aporte Fer_TACA
creo que te entendi, pero vos lo que me decis es que modifique el programa para que cuando pulso este prendida la led y cuando suelto apagada y yo lo que quiero no es eso, sino que este apagada y cuando lo pulso la led quede prendida sin importar si después lo suelto, funcionaria como el boton de inicio del programa (el programa queda a la espera hasta que se presiona este boton y una vez echo el programa sigue su curso y ya no importa lo que pase con esa entrada)
-
INICIO
bsf STATUS,5 ;cambia al banco1
movlw b'11111111'
movwf TRISA ;PORTA entradas>>>>>>>>>>>>Fijate en estas líneas que cambié, también debes cambiar de banco creo, pero eso te lo dejo a tí.
movlw b'11111000'
movwf TRISB ;PORTB salidas >>>>>>>>>>>
bcf STATUS,5 ;cambia al banco0
ESPERA
btfss PORTA,0 ;espera
goto FACE2
FACE1
bsf PORTB,0 ;prende RB0
goto ESPERA
FACE2
bcf PORTB,0 ;apaga RB0
goto ESPERA
end
Saludos!!!
-
La verdad es que lo que te pasa no tiene mucho sentido si todo tu código es el que nos has enviado.
De todas formas yo intentaría poner antes del end un bucle infinito de la forma :
fin goto fin
para probar si el problema se reproduce o no
Porque el PIC cuando llega al END no se para sino que sigue ejecutando el resto de posiciones hasta el final y vuelve a comenzar si no lo paras antes por medio de un bucle infinito. Lo que sospecho es, que por el motivo que sea, tienes grabada en alguna posición posterior una instrucción ( que no debería estar) que apaga la salida.
No tiene mucho sentido porque yo siempre había creido que los programadores borraban toda la memoria , pero es la única explicación que le veo. Haz la prueba que te digo para confirmar si es cierto o no.
Otro tema.
La solución que te daba flacoclau en el mensaje anterior es correcta y hace mas facil leer el código ya que le da el nombre correcto a los registros, pero no es la solución del problema porque ambos registros PORTA y TRISA tienen la misma posición aunque en bancos distintos por lo que el código funcionaría igual aunque es un poco mas dificil de entender y es mejor ponerlo como dice él.
-
Hola domingo, perdona que te corrija, tris a y port a no son lo mismo, no ocupan la misma posición y cumplen funciones distintas, no es un problema de legibilidad.
Están en diferentes bancos, uno es el puerto y el otro controla cada bit que sea entrada o salida.
saludos!!!
y el banco seleccionado está bien, no hace falta cambiarlo!!!
-
Tienes razón en lo que dices, quizás no me he sabido explicar bien. Voy a intentanlo de nuevo.
Es cierto que tienen posiciones distintas:
TRISA ocupa la posición 85H y PORTA la posición 05H. y está claro que ambas tienen funciones diferentes tal como tu dices.
Sin embargo debido a la manera en que se forma el código máquina de los PICS ambas se codifican dentro de la instrucción como 05H y por eso estamos obligados a seleccionar antes de la instrucción el banco al que nos referimos, porque si no lo hacemos el PIC puede interpretar que estamos asignando el valor a la posición equivocada ya que para él ambas son 05H dentro del código de la instrucción y la única manera que tiene de diferenciar una de otra es mediante la selección del banco realizada previamente.
Lo que quise decir es que aunque es mas correcto escribirlo como dices tú y es lo que hacemos siempre, el efecto práctico de modificarlo no resolvería el problema original que nos comunicaba.
Espero haber aclarado lo que quería decir.
-
Eso es cierto!!
-
si, gracias por la ayuda = creo que no logro expresar bien que es lo que busco aunque = ay respuestas que me pueden ser utiles
yo lo que quiero no es que al presionar el botón(darle el pulso) se prenda y al soltarlo(dejar de darle el pulso) se apague, sino que aprieto, prenda, suelto y siga prendida
pero bueno, voy a tener en cuenta eso de que el programa cuando llega al END sigue y vuelve a empezar, la verdad que es un dato muy importante y que la verdad no savia, gracias :-)
-
Hola.
La respuesta que te di se basa precisamente en que te había entendido.
Voy ha intentar explicartelo de nuevo. Tu código me parece correcto y no se verle ningún problema por esto te decía lo que probaras a ponerle el bucle infinito.
Lo que creo es que tienes algo parecido a esto :
TU CODIGO
END
CODIGO VIEJO DE ALGUNA PRUEBA ANTIGUA QUE APAGA EL LED
Por eso te digo que pongas esto:
TU CODIGO
fin goto fin
END
CODIGO VIEJO DE ALGUNA PRUEBA ANTIGUA QUE APAGA EL LED
De esta manera el codigo viejo no se ejecutará nunca y el led debería quedarse encendido.
De todas formas no tengo la seguridad de que este sea el problema, por eso te decía que lo probaras para ver si el problema seguia igual. Porque si sigue igual es que algo se nos está escapando en tu código y yo ya no podría ayudarte mas.
-
bueno lo prove dejando el codigo asi:
List p=16f84
#INCLUDE P16F84.INC
__CONFIG _WDT_OFF & _PWRTE_ON & _XT_OSC
STATUS equ 0x03
PORTB equ 0x06
PORTA equ 0x05
CONT equ 0x0C
CONT2 equ 0x0D
CONT3 equ 0x0E
org 0x00
goto INICIO
org 0x05
INICIO
bsf STATUS,5 ;cambia al banco1
movlw b'11111111'
movwf PORTA ;PORTA entradas
movlw b'11111000'
movwf PORTB ;PORTB salidas
bcf STATUS,5 ;cambia al banco0
clrf PORTB
ESPERA
bsf PORTB,1 ;abre barrera
btfss PORTA,0 ;espera boton de inicio
goto ESPERA
FACE1
bsf PORTB,0 ;le da energia a la via
FIN
goto FIN
end
y me funciono aunque parcialmente, y porque digo eso, porque me dejo de hacer el error que me hacia que era que prendia el RB0 y al dejar de darle la entrada se apagaba, bueno, ahora queda prendido como debe ser y doy gracias por el consejo
pero ahora lo que me pasa es que cuando le doy una entrada por la pata RA1,2 o 3 (son las que prove, las otras nose) la salida se corta, es decir, el RB0 se pone en 0 cosa que tampoco le encuentro la lógica, no se si se reinicia o que pero me corta el pulso de RB0 y si le vuelvo a dar un pulso por el RA0 vuelve a prender (pareceria que se reinicia, pero no se porque :shock:)
-
Tienes unos problemas muy raros je,je.
Empiezo a pensar que el problema es de ruido. Le has puesto un buen condensador a la alimentación de tu circuito, independientemente del que ya tiene la fuente. Lo digo porque una vez a mi también me hacía cosas raras un PIC y al final descubrí que no había filtrado lo suficiente la alimentación y le metía ruido que hacía imprevisible el funcionamiento. Se solucionó poniendo un buen condensador electrolítico adicional. Si no es eso no se que puede ser .
-
si, tenes razon ami hace poco ese tema me volvio loco y puede que sea lo mismo pero pasa que ahora lo estoy alimentando con pilas :?
-
buen muchachos les comento mi problema con las ultimas pruvas que estuve haciendo porque la verdad que ya como que me estoy desesperando un poco con todo este tema...
el problema crucial esta en el el programa esta echo para mantener una salida estable al recibir una entrada y no lo hace, sino que corta la salida ni vien se le deje de dar la entrada
en realidad es simplemente eso pero no ay caso, no le puedo encontrar la buelta, al tener un programa tan corto y simple y una electronica = no me logro dar cuenta de donde fallo
List p=16f84
#INCLUDE P16F84.INC
__CONFIG _WDT_OFF & _PWRTE_ON & _XT_OSC
STATUS equ 0x03
PORTB equ 0x06
PORTA equ 0x05
org 0x00
goto INICIO
org 0x05
INICIO
bsf STATUS,5 ;cambia al banco1
movlw b'11111111'
movwf PORTA ;PORTA entradas
movlw b'11111000'
movwf PORTB ;PORTB salidas
bcf STATUS,5 ;cambia al banco0
clrf PORTB
ESPERA
bsf PORTB,1 ;(salida pin 7)
btfss PORTA,0 ;espera boton de inicio(pin 17)
goto ESPERA
FACE1
bsf PORTB,0 ;(salida pin 6)
FACE2
btfss PORTA,1 ;espera Interruptor 2(pin 18)
goto FACE2
bcf PORTB,1 ;(apaga pin 7)
FIN
goto FIN
end
-
Prueba desabilitando al PWRTE y nos cuentas.
-
Mirando el código creo que hace falta una rutina antirrebotes, cuando se trabaja con pulsadores es indispensable, de lo contrario corremos el riesgo que sean inciertos los estados, aunque el código no tenga errores.-