Autor Tema: secuenciador manual  (Leído 6111 veces)

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

Desconectado jachy

  • PIC10
  • *
  • Mensajes: 26
secuenciador manual
« 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

Desconectado pocher

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: secuenciador manual
« Respuesta #1 en: 19 de Mayo de 2003, 13:01:00 »
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


Desconectado jachy

  • PIC10
  • *
  • Mensajes: 26
RE: secuenciador manual
« Respuesta #2 en: 19 de Mayo de 2003, 15:50:00 »
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

Desconectado ENCARPA

  • PIC16
  • ***
  • Mensajes: 172
RE: secuenciador manual
« Respuesta #3 en: 19 de Mayo de 2003, 16:43:00 »
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.


Desconectado jachy

  • PIC10
  • *
  • Mensajes: 26
RE: secuenciador manual
« Respuesta #4 en: 19 de Mayo de 2003, 17:09:00 »
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

Desconectado pocher

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: secuenciador manual
« Respuesta #5 en: 20 de Mayo de 2003, 00:23:00 »
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



Desconectado ENCARPA

  • PIC16
  • ***
  • Mensajes: 172
RE: secuenciador manual
« Respuesta #6 en: 20 de Mayo de 2003, 18:30:00 »
Jachi aber si esto funciona, esta modificado desde word.
Salu2.

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: secuenciador manual
« Respuesta #7 en: 20 de Mayo de 2003, 19:15:00 »
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.
Saludos desde Huelva (ESPAÑA)

Desconectado jachy

  • PIC10
  • *
  • Mensajes: 26
RE: secuenciador manual
« Respuesta #8 en: 21 de Mayo de 2003, 02:37:00 »
ok gracias lo probare, ya contare el resultado.

Salu2 jachy

Desconectado ENCARPA

  • PIC16
  • ***
  • Mensajes: 172
RE: secuenciador manual
« Respuesta #9 en: 21 de Mayo de 2003, 16:44:00 »
Prueba de esta manera

Desconectado pocher

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: secuenciador manual
« Respuesta #10 en: 21 de Mayo de 2003, 23:45:00 »
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.

Desconectado pocher

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: secuenciador manual
« Respuesta #11 en: 22 de Mayo de 2003, 00:35:00 »
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

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
RE: secuenciador manual
« Respuesta #12 en: 31 de Mayo de 2003, 22:06:00 »
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"



Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
RE: secuenciador manual
« Respuesta #13 en: 31 de Mayo de 2003, 22:09:00 »
 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
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
RE: secuenciador manual
« Respuesta #14 en: 01 de Junio de 2003, 08:45:00 »
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
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...


 

anything