TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: jachy en 19 de Mayo de 2003, 12:04:00
-
Despues de buscar y buscar aun no he encontrado la solucion al secuenciador ,no encuentro la matera de que se pare el programa y no corra hasta que PORTA sea 0x01
Caracteristicas secuenciador manual, que pase de RB0 a RB7 de uno en uno cuando a la entradade PORTA sea = a 0x01
pero tengo un error en el ASM por k al montarlo en el entrenador no se mantiene quieto en la ultima posicion de RBx donde anteriormente estaba,
list p=16f84
include "p16f84.inc"
org 0x00
INICIO bsf STATUS,RP0
clrf TRISB
movlw b"00001111"
movwf TRISA
bcf STATUS,RP0
caso1 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso1
caso12 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On1
GOTO caso12
On1 BSF PORTB,0
BCF PORTB,7
;En caso1 si en la entrada tenemos0x01 pasa a caso12 y si caso12 ya no esta porta en 0x01 entonces pone a onRB0 y off RB7 (asi hasta k no suelte el pulsador no enciende RB0 Y APAGA RB7) Pero lo k no se hacer es que haga este ciclo hasta k se cumpla y cuando lo cumpla pase al siguiente y haga lo mismo k el caso anterior pero con la siguiente salida RB.
caso2 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso2
caso22 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On2
GOTO caso22
On2 BSF PORTB,1
BCF PORTB,0
;aqui necesito k pare hasta tener PORTA=0x01
caso3 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso3
caso32 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On3
GOTO caso32
On3 BSF PORTB,2
BCF PORTB,1
;aqui necesito k pare hasta tener PORTA=0x01
caso4 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso4
caso42 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On4
GOTO caso42
On4 BSF PORTB,3
BCF PORTB,2
;aqui necesito k pare hasta tener PORTA=0x01
caso5 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso5
caso52 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On5
GOTO caso52
On5 BSF PORTB,4
BCF PORTB,3
;aqui necesito k pare hasta tener PORTA=0x01
caso6 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso6
caso62 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On6
GOTO caso62
On6 BSF PORTB,5
BCF PORTB,4
;aqui necesito k pare hasta tener PORTA=0x01
caso7 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso7
caso72 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On7
GOTO caso72
On7 BSF PORTB,6
BCF PORTB,5
;aqui necesito k pare hasta tener PORTA=0x01
caso8 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso8
caso82 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On8
GOTO caso82
On8 BSF PORTB,7
BCF PORTB,6
;aqui necesito k pare hasta tener PORTA=0x01
goto caso1
end
¿Que instruccion hay para hacer eso?
Saludos Jachy
-
Hola jachy.
Por lo que veo estas haciendo actuar a RA0 por flanco de bajada.
Siempre que se emplean flancos es fundamental dotar después de cada cambio de 0 a 1, o de 1 a 0 de una subrutina antirebotes (con un delay de 20ms bastaría, a no ser que el pulsador esté viejo y desgastado) que espere a que se estabilice el pulsador, a no ser que los pulsadores-interruptores vengan provistos de antirebotes hardware.
Puse un ejemplo de encendido-apagado de una bombilla con un pulsador empleando flancos de subida, en el apartado de Todo en microcontroladores.
Un saludo
-
Hola pocher .
Ya lo vi pero no me sirve ,lo que intento hacer es un secuenciador que salte de un led a otro apagandose el anterior

0...1...2...3...4...5...6...7
se enciende 0 cuando PORTA=0x01
PORTA=0 EN ESPERA HASTA PORTA=0x01
se enciende 1 cuando PORTA=0x01
PORTA=0 EN ESPERA HASTA PORTA=0x01
se enciende 2 cuando PORTA=0x01
PORTA=0 EN ESPERA HASTA PORTA=0x01
se enciende 3 cuando PORTA=0x01
PORTA=0 EN ESPERA HASTA PORTA=0x01
se enciende 4 cuando PORTA=0x01
PORTA=0 EN ESPERA HASTA PORTA=0x01
se enciende 5 cuando PORTA=0x01
PORTA=0 EN ESPERA HASTA PORTA=0x01
se enciende 6 cuando PORTA=0x01
PORTA=0 EN ESPERA HASTA PORTA=0x01
se enciende 7 cuando PORTA=0x01
PORTA=0 EN ESPERA HASTA PORTA=0x01
Lo unico que necesito es como hacer un bucle en cada caso1
caso2
caso3
caso4
etc.
Para que se quede constantemente haciendo bucle en caso1 hasta que porta=0x01 y pasa a caso2 donde se quedaria haciendo otro bucle hasta que cumpla porta=0x01
Salu2 Jachy
-
jachy, y si comparas el porta solo con el estado que te interesa en bez de aplicar la operacion logica XOR que tiene dos estados que no te interesan y puedes estar pasando por alto
asi:
movf porta,w ; mober puertoa a w
sublw 0x01 ; restarle el estado que te interesa
btfss Status,Z ; si da cero entoces puertoa = 0x01
y bit Z del registro estado es igual a 1
y continuas con la rutina que mas te
te combenga.
goto ...
goto ...
yo tambien soy principiante y tu be que hacer algo parecido con un motor de cc y un freno tambien de cc.
Espero que te sirba de algo nos vemos en el foro.
-
si tambien estaria bien pero eso no es lo que pregunto eso lo tengo resuelto, yo quiero saver como hacer que se quede condinuamente en un caso asta que cumpla la condicion y pase al siguiente, que no cumple el caso pues que siga en ese caso.
Me entiendes a lo que me refiero
Lo he hecho con goto pero cuando lo monto no funciona es como si el programa siguiera corriendo.
Salu2
Jachy
-
Vamos a ver si nos entendemos. Quieres que:
1.- Si activas (pulsas) RA0 (RA0=1) se te active RB0 (RB0=1)
2.- Al desactivar (soltar) RA0 (RA0=0) se quede RB0=1
3.- Si activas (pulsas) RA0 (RA0=1) se te active RB1 (RB1=1) y se te desactive RB0 (RB0=0)
4.- Al desactivar (soltar) RA0 (RA0=0) se quede RB1=1
5.-... y así sucesivamente
De esta forma estas haciendo actuar a RA0 por flanco de subida.
Conforme tú lo tienes:
caso1 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso1
caso12 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On1
GOTO caso12
On1 BSF PORTB,0
BCF PORTB,7
estas haciendo actuar a RA0 por flanco de bajada (Se te activa RB0 cuando RA0 pasa a 0).
Prueba esto (RA0 va por flanco de subida):
caso1 movfw PORTA
XORLW 0x01
BTFSC STATUS,Z ; ¿RA0=0?
goto caso1
CALL delay_20ms ; Antirebotes
caso12 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z ; ¿RA0=1?
GOTO caso12
CALL delay_20ms ; Antirebotes
On1 BSF PORTB,0
BCF PORTB,7
Otra cosa, por lo que se vé solo necesitas activar-desactivar RA0 (RA1..RA4 siempre estan a 0). Si es así sería más fácil hacer esto:
caso1 BTFSC PORTA,0
goto caso1 ; ¿RA0=0?
CALL Delay_20ms ; Antirebotes
caso12 BTFSS PORTA,0 ; ¿RA0=1?
GOTO caso12
CALL Delay_20ms ; Antirebotes
On1 BSF PORTB,0
BCF PORTB,7
.
.
.
Este es el problema de la bombilla ON-OFF con un pulsador. Copiate de allí la subrutina de tiempo (no te olvides de definir las etiquetas Contador1 y Contador2)
Un saludo
-
Jachi aber si esto funciona, esta modificado desde word.
Salu2.
-
Sólo he mirado por encima lo que aquí hay escrito, ya que ahora ando un poco liado. Te diré que algo parecido me ocurrió a mi con un programa. Lo solucioné poniendo como dicen un retardo al pulsar, pero también puse otro al soltar.
Veras, si por ejemplo lo que estas haciendo es un polling continuamente del RA0 para ver si se pulsa, cuando esto ocurra saltas a la rutina de atención de esto, es entonces cuando haces un retardo (de 20ms por ejemplo). Entonces realizas lo que debas... y entonces lo que hacía yo antes de salir de esta rutina era comprobar si estaba pulsado continuamente hasta que pase a cero, entonces otro retardo y sale de la rutina:
.
.
.
SALIR1
BTFSS PORTB,RB2 ;Espera mientras tecla pulsada
GOTO SALIR1
CALL RETARDO ;Retardo para anti-rebote al soltar
RETURN
Entiendes, hay un rebote tanto al pulsar como al soltar.
Por cierto, creo que te sería más fácil si usaras la instrucción de rotar byte. Con unas pocas líneas tienes tu programa.
Un saludo.
-
ok gracias lo probare, ya contare el resultado.
Salu2 jachy
-

Prueba de esta manera
-
Si lo estas probando con un pulsador o interruptor desprovisto de antirebotes hardware, como no le pongas una temporización antirebotes vas a seguir teniendo el mismo problema.
Cuando activas el interruptor y lo pasas a 1,este no cambia instantáneamente sino que hasta que se estabiliza hay muchos cambios de 0 a 1 y viceversa (rebotes). Como la velocidad de proceso del PIC es tan grande estos cambios indeseados los coge y hacen que tu programa "se deslice" a otra posición no deseada . Lo mismo ocurre si el interruptor lo lo pasas a cero.
Para evitar esto se debe esperar un tiempo (temporización antirebotes) hasta que el contacto se estabiliza y entonces testear el valor del pin de entrada.
-
En el apartado de simuladores tienes otra prueba de lo que llevo tiempo diciéndote. El tema es: un problema de simulación con el proteus con un circuito (papamarciano)
Un saludo
-
Hola Jachy, tu problema se soluciona con una tabla, y como dicen los amigos con un ANTIRREBOTE
por ejemplo, si el pulsador esta en port a
#define pulsador porta,0
pulsar BTFSC pulsador ; si pulsa , salta
goto pulsar ; se queda esperando que pulse
CALL DEMORA ; RETARDO DE 80 A 150 MILISEGUNDOS
BTFSC pulsador ; VERIFICO SI AUN ESTA PULSADO
GOTO pulsar ; REGRESA, FUE SOLO UN RUIDO
BTFSS pulsador ; ESPERO A QUE SUELTE EL PULSADOR
GOTO $-1 ;SE QUEDA EN UN LOOP HASTA QUE SUELTE
INCF CONTA ;INCREMENTO UN CONTADOR
MOVF CONTA,F
CALL TABLA ;VEO QUE VALOR ENCIENDO
MOVWF PORTB ;LO PASO A LA SALIDA DEL PUERTO
GOTO pulsar
TABLA ADDWF PCL,F
RETLW B"00000000"
RETLW B"00000001"
RETLW B"00000001"
RETLW B"00000010"
RETLW B"00000100"
RETLW B"00001000"
RETLW B"00010000"
RETLW B"00100000"
RETLW B"01000000"
RETLW B"10000000"
CONTA=0 ;SI PASA DE 8,LO COLOCO EN CERO
RETLW B"00000001"

-
Espero se entienda ok?, por supuesto, falta definir puertos, escribir la demora... pero esa es la idea, luego, en lugar de un pulsador, colocas un circuito pasabajos, y te funcionara con la musica....
suerte
Norberto
-
Hola Amigos, mirando la pagina de microladder, encontre esta info sobre rebotes en los contactos que esta bien documentada, y con imagenes del osciloscopio....
http://www.microladder.com/page.php?n=an2_rebound_effect_es
suerte!
Norberto