TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: JoseLuis2801 en 13 de Octubre de 2011, 06:03:37
-
Hola a todos, creo que es esta seccion donde debo situar el post, sino disculpenme.
Tengo un pequeño problemilla, simular me simula bien con el MPLAB, pero luego programo el PIC 16F886 con el PIcKit 3 (verificado programa bien), y al comprobar el funcionamiento del pic por si solo, osea desconectandolo del PICKIT3, y suministrandole 5V auxiliares, y hacieno un pequeño curcuito: pin RB6 - pulsador NA - GND, y, pin RB7 - pulsador NA - GND , al pulsar , no acaba de funcionar correctamente.
Para empezar, estan bien activadas las R de polarizacion para bits 6 y 7 ?, o me falta algo de poner que desconozco.
w EQU 0h
f EQU 1h
LIST P=16F886
INCLUDE <P16F886.INC>
RP0 EQU 05H
RP1 EQU 06h
RBPU EQU 07H
ORG 00H
GOTO INI
ORG 05H
INI BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
CLRF ANSELH ;DIGITALES PUERTO B
BCF STATUS,RP1
BSF STATUS,RP0 ; BANCO 1
BCF OPTION_REG,RBPU ;RESSITENCIAS
MOVLW 0XC0 ; DE POLARIZACION
MOVWF WPUB ;ACTIVADAS, BITS 6 Y 7
MOVLW 0XF0
MOVWF TRISB
BCF STATUS,RP0 ; BANCO 0
CLRF PORTB ; APAGA LEDS
SWITCH1 BTFSS PORTB, 6h
GOTO ENC.2LEDSA
SWITCH2 BTFSS PORTB, 7H
GOTO ENC.2LEDSB
GOTO SWITCH1
ENC.2LEDSA BSF PORTB,0H
BSF PORTB,3H
GOTO FIN
ENC.2LEDSB BSF PORTB,1h
BSF PORTB,2h
FIN NOP
END
Gracias ,
Un saludo
-
Mira aqui si los tienes bien conectados, porque creo que no los estas poniendo bien.
http://picmania.garcia-cuervo.net/trucos.php#CONECTANDOCONTACTOS
Despues dices que son NA, normalmente abiertos no?, en el programa haces esto:
SWITCH1 BTFSS PORTB, 6h
GOTO ENC.2LEDSA
SWITCH2 BTFSS PORTB, 7H
GOTO ENC.2LEDSB
GOTO SWITCH1
Si SWITCH1 esta pulsado es 1 salta a SWITCH2 y si tambien esta pulsado salta a GOTO SWITCH1, es decir cuando los pulsas no hace nada, es esto lo que quieres?.
-
Otro enlace más. 8)
Si NA, Normalmente abietos, si activo las resistencias de polarización internas del propio PIC, me queda como el esquema de tú enlace, el de abajo, mientras no pulse, están ambas entradas a 1, gracias a la R internas, y el PIC no sale del bucle, en el momento que pulse uno de los 2 switch, se pone a 0V una entrada, por lo que se deja de cumplir una condición, y sale del bucle, y bien o se encienden los 2 leds de los extremos, o los 2 centrales, y acaba el programa.
Lo entiendes así tb, o hay algo que se me escapa ?
Entinedo, esta es la configuracion adecuada segun datasheet del PIC, para activar las R:
BCF STATUS,RP1
BSF STATUS,RP0 ; BANCO 1
BCF OPTION_REG,RBPU ;RESSITENCIAS
MOVLW 0XC0 ; DE POLARIZACION
MOVWF WPUB ;ACTIVADAS, BITS 6 Y 7
Luego os pongo una fotito.
Gracias
Un saludo
-
YA ESTÁ :-/ :-/ :-/ :-/ :-/ :-/
XQ me había olvidado del registro de configuracion de bits, me habia olvidado de inhabilitar el WTDE y el LVP.
Funciona perfecto, excepto que funciona siempre, nunca termina de ejecutarse. :shock:
LUego os pongo la fotito.
Un saludo
-
pin RB6 - pulsador NA - GND, y, pin RB7 - pulsador NA - GND , al pulsar , no acaba de funcionar correctamente.
Bien tal y como lo ponias aqui deducia, parece que mal, que no estabas conectando a +5V.
Las R parece que estan bien configuradas, que problema te da, falla siempre o solo a veces?. No haces antirrebotes por eso pregunto.
Prueba a hacer un antirrebotes por software, chequeas el pulsador llamas a un retardo de 20ms y en el segundo chequeo tomas la decision.
btfss SWITCH1
goto $-1 ; es 0 sigue aqui
call DELAY ; delay de 20ms
btfss SWITCH1 ; es 1 o rebotes?
goto ESCERO ; si viene aqui fueron rebotes
goto ESUNO ; si viene aqui fue pulsacion
-
Si, disculpame, debí haber piuesto mas info, esas R, que ya te digo que son internas , osea, están dentro del PIC, están conectadas directas por un lado a 5V, y por el otro a la entrada, lo mismo que el esquemita. Y si , si funciona perfectamente.
Si había pensado lo de los rebotes, pero como soy novatillo,......................... :oops:
Luego entonces,como ántes tenía el cableado un poco deficiente, y seguro que habia rebotes, me ha venido fenomeno cableado de los equipos R/C, el de conexion Receptor -servos, y ya tengo todo conectado, excepto la limentación, cierto es que pueden habrán rebotes en el switch tb.
Gracias , me quedo con el circuito antirebotes. Luego veo la logica que me has descrito.
Lo de que el circuito siempre funciona, no lo entiendo, si ha encendido 2 leds, es que ha salido del bucle, y no ejecuta end, sino que es como si el PIC se resetease otra vez, osea ocurre lo siguiente:
Conecto 5V, todo apagado, pulso un switch, se encienden sus 2 leds, perfecto, mientras esta pulsado, estan encendidos, suelto, y se apagan, pero el programa sigue corriendo, vuelvo a pulsar el que sea, y se vuelven a encender. :shock:No tenía que haber se parado ya el programa despues de encender los 2 leds ? No lo entiendo. :5]
Un saludo
Las fotos ya están adjuntas a este post. :shock:
-
No lo mandes a hacer el END. Ahi no lo debes de mandar nunca (puede haber algun caso muy especial en que se haga), pero por regla general nunca se manda al END.
ENC.2LEDSA BSF PORTB,0H
BSF PORTB,3H
GOTO FIN
ENC.2LEDSB BSF PORTB,1h
BSF PORTB,2h
FIN NOP
END
Puedes por ejemplo encender los LEDs y que vuelva a chequear los pulsadores, si quieres que al pulsar otra vez los apague.
Quieres que haga algo en especial?
Lo de que el circuito siempre funciona, no lo entiendo,
Te lo preguntaba porque cuando es por rebotes suele fallar algunas veces pero no siempre, pero si ya lo has hecho por hardware, no es necesario que tambien lo hagas en el programa. Normalmente se hace por software para no poner componentes extra.
En lo de la resistencias internas tienes tu razon, como nunca las uso estaba equivocado yo.
-
Hola, una cosilla que tenía que haberte puesto, añadi en las instrucciones de poner a 1 los bits, el borrar los otros 2, por si acaso.
SWITCH1 BTFSS PORTB, 6h
GOTO ENC.2LEDSA
SWITCH2 BTFSS PORTB, 7H
GOTO ENC.2LEDSB
GOTO SWITCH1
ENC.2LEDSA BSF PORTB,0h
BSF PORTB,3h
BCF PORTB,1H
BCF PORTB,2H
GOTO FIN
ENC.2LEDSB BSF PORTB,1h
BSF PORTB,2h
BCF PORTB,0H
BCF PORTB,3H
FIN NOP
END
Bajo mi humilde opinión, creo que en este caso los rebotes no es que importen mucho, porque como es poner a masa y encender, al final queda a masa, quizas haya unos cuantos encendidos - apagados , cuando pulso el switch, pero bueno, un led es un señalizador, y no me importa mucho que hayan rebotes. por lo menos ahora y con mis conocimientos. ESta claro que en otras ocasiones si será necesario el tenerlos en consideración.
NO importa, si no es cuestión de quien tiene o no razón, lo importante es ir conociendo cosas nuevas, tan pequeños y las enormes posibilidades que tienen. A mí las R internas si me van a venir bien para mis pequeños proyectos que tengo en mente para el aeromodelismo. para los parámetros de programación, nada mejor que los pulsadores.
Si te entiendo Tapi8 lo que me dices, pero mi programita funciona como si en lugar de el NOP de la penúltima linea, hubiese un Goto switch1, mientras esta pulsado algun switch, estan encendidos sus 2 leds, suelto, se apagan, vuelvo a pulsar se encienden, suelto , se apagan,.............................no termina, salvo desconecte la alimentación claro está. Simulando con el MPLAB, por soft, sí se ejecutaba el NOP.
Bueno, de todas formas ya ha sido un buen alegrón el ver que, el codigo del simulador, pasa al PIC, y no hay errores ni "historias".
Gracias
Un saludo
-
Hola, una cosilla que tenía que haberte puesto, añadi en las instrucciones de poner a 1 los bits, el borrar los otros 2, por si acaso.
Bien hecho.
Bajo mi humilde opinión, creo que en este caso los rebotes no es que importen mucho, porque como es poner a masa y encender, al final queda a masa, quizas haya unos cuantos encendidos - apagados , cuando pulso el switch, pero bueno, un led es un señalizador, y no me importa mucho que hayan rebotes. por lo menos ahora y con mis conocimientos. ESta claro que en otras ocasiones si será necesario el tenerlos en consideración.
Siempre que se usen elementos con contactos mecanicos, caso de pulsadores e interruptores, al hacer contacto las placas metalicas producen unos picos de tension que "engañan" al PIC haciendo que a veces lean 1 en vez de 0 y viceversa, como se producen en el momento de la pulsacion o la despulsacion si se espera un pequeño tiempo habran pasado y ya se puede leer sin "engaños" si es 0 o 1
Si te entiendo Tapi8 lo que me dices, pero mi programita funciona como si en lugar de el NOP de la penúltima linea, hubiese un Goto switch1, mientras esta pulsado algun switch, estan encendidos sus 2 leds, suelto, se apagan, vuelvo a pulsar se encienden, suelto , se apagan,.............................no termina, salvo desconecte la alimentación claro está. Simulando con el MPLAB, por soft, sí se ejecutaba el NOP.
Si te fijas cuando va al END la flecha verde del MPLAB desaparece, por lo menos en el mio, esto es porque el programa se pierde, porque despues de END no hay nada.
El END se pone para que el MPLAB sepa donde se acaba el programa, no para que se ejecute en ningun momento, es preferible que lo mandes a la mierda o a tomar por el c.... que al END :lol: :lol:
-
:shock: :shock: :D :D :D :D :D
Bueno................... :D, mi realidad es que como en mis futuras aplicaciones , o funcona siempre el programa o esta sin alimentacion el circuito, se acabo el END, si acaso se quedara el sleep, que para eso está, sino goto rutina principal, y punto pelota. :-/
un saludo
Acabo de cambiar la linea NOP por el GOTO switch1, y ahora solo tengo que pulsar y ya se quedan encendidos permanentemente, aunque suelte, que pulso el otro switch, como es logico me conmuta a los otros 2 leds, bueno, como tengo un cable libre, voy a añadir otro switch para pagar los leds, sino, una vez se pula un switch, siempre hay 2 encendidos.
-
PERFECTO, a la 1ª:
:-/ :-/ :-/ :-/
w EQU 0h
f EQU 1h
LIST P=16F886
INCLUDE <P16F886.INC>
RP0 EQU 05H
RP1 EQU 06h
RBPU EQU 07H
ORG 00H
GOTO INI
ORG 05H
INI BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
CLRF ANSELH ;DIGITALES PUERTO B
BCF STATUS,RP1
BSF STATUS,RP0 ; BANCO 1
BCF OPTION_REG,RBPU ;RESSITENCIAS
MOVLW 0XE0 ; DE POLARIZACION
MOVWF WPUB ;ACTIVADAS, BITS 5, 6, 7
MOVLW 0XF0
MOVWF TRISB
BCF STATUS,RP0 ; BANCO 0
CLRF PORTB ; APAGA LEDS
SWITCH BTFSS PORTB, 6h
GOTO ENC.2LEDSA
BTFSS PORTB, 7H
GOTO ENC.2LEDSB
BTFSS PORTB, 5H
GOTO APAGATODOS
GOTO SWITCH
ENC.2LEDSA BSF PORTB,0h
BSF PORTB,3h
BCF PORTB,1H
BCF PORTB,2H
GOTO FIN
ENC.2LEDSB BSF PORTB,1h
BSF PORTB,2h
BCF PORTB,0H
BCF PORTB,3H
GOTO FIN
APAGATODOS BCF PORTB,0H
BCF PORTB,3H
BCF PORTB,1H
BCF PORTB,2H
FIN goto SWITCH
END
No se si el ensamblador necesita del END, pero ya me da igual, ah, he quitado la etiqueta switch2, no había salto a la misma.
Un saludo
-
Me alegra que te funcione. :-/ :-/
Bueno................... , mi realidad es que como en mis futuras aplicaciones , o funcona siempre el programa o esta sin alimentacion el circuito, se acabo el END, si acaso se quedara el sleep, que para eso está, sino goto rutina principal, y punto pelota.
Exactamente.
Acabo de cambiar la linea NOP por el GOTO switch1, y ahora solo tengo que pulsar y ya se quedan encendidos permanentemente, aunque suelte, que pulso el otro switch, como es logico me conmuta a los otros 2 leds, bueno, como tengo un cable libre, voy a añadir otro switch para pagar los leds, sino, una vez se pula un switch, siempre hay 2 encendidos.
Mira este es un programa que hice a medias con un motero para ponerle bombillas LED a los intermitentes, es mas o menos lo que tu tienes solo que los LED son de 3W. lleva un pulsador en la manilla derecha y otro en la izquierda, si se pulsa uno se encienden los dos intermitentes de ese lado, si se pulsa el contrario los otros y si se pulsan los dos pulsadores a la vez encienden los cuatro. Para que te hagas una idea de como va. primero lo hicimos con un 16f84 con bucles de tiempo, despues se hizo con TMR0 para dejar mas libre el procesador y poder controlar mejor todo y por ultimo lo pasamos a un 12f629, para ahorrar espacio y dinero.
http://www.todopic.com.ar/foros/index.php?topic=32966.0
No se si el ensamblador necesita del END, pero ya me da igual, ah, he quitado la etiqueta switch2, no había salto a la misma.
Si, si no lo pones el MPLAB tira error y no ensambla, porque no sabe donde acaba el programa. Haz la prueba poniendole un ; delante y asi lo ve como un comenterio y no lo compila.
Lo que no necesita es esto:
w EQU 0h
f EQU 1h
Cuando pones un bit de un puerto, por ejemplo:
BSF PORTB,0h
La "h" sobra con PORTB,0 ya esta.
-
;-)
Si los destinos los puse porque como estoy aprendiendo, no tengo una aplicacion especifica y por lo tanto su programa en mente. Igual luego voy a utilizar instrucciones en las que, y para no tener que definir el destino en la misma instruccion, requiera tener definido el destino.
Ok la h. :lol:
Echaré un vistazo a tu programa :shock: