Autor Tema: Stop De emergencia  (Leído 2599 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

1_k

  • Visitante
Stop De emergencia
« en: 15 de Julio de 2007, 16:14:40 »
hola, me acabo de encontrar con este foro y me parece muy interesante, mucha info y una gran comunidad.

Tengo un programa hecho en assembler y necesitaria hacer que cuando corra normalmente y ocurra una interrupcion (por rb0) el micro se quede en ella ,
como si fuese una parada de emergencia,y que cuando se vuelva a activar y desactivar rb0 termine la interrupcion y se dirija a un lugar especifico en el programa;
a continuacion les muestro lo que pensé:

              ORG       04H
              BTFSC    INTCON,1
              GOTO     INTER
TERMIN   BCF        INTCON,1
              BSF        INTCON,7
              BANCO0
              RETFIE

INTER     BANCO0
              BCF        INTCON,7
              MOVWF   ACUM
              MOVF      STATUS,0
              MOVWF    STAT
LOOP3     BTFSC    PORTB,0
              GOTO     CONTIN
              CALL      DELAYCITO
              GOTO     LOOP3
CONTIN
              MOVF     STAT,W
              MOVWF   STATUS
              SWAPF   ACUM,F
              SWAPF   ACUM,W
              GOTO    TERMIN

Esto supuestamente me sirve para que cuando ocurra la interrrupcion se quede en ella esperando hasta que active y desactive de vuelta el bit rb0
pero el micro se queda parado cuando aprieto una vez el boton que esta conectado a rb0 y luego lo aprieto otra vez y el micro sigue trabado, sin mportar cuantas veces lo apriete.

Ademas tambien queda pendiente lo de que cuando termina la interrupcon se diriga a un lugar preciso en el programa, como podria hacerlo?,
se puede poner un goto que salga dentro de donde esta especificada la interrupcion?, o sea antes del retfie?

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Stop De emergencia
« Respuesta #1 en: 15 de Julio de 2007, 16:51:48 »
Hola, yo creo que tendrias que colocar un contador, entonces cuando pulsas por primera vez, se pone en uno, y  al salir de la interrupcion, verificas el estado del contador y saltas al programa de parada de emergencia, que tendra que quedar en un loop
al generarse una nueva interrupcion, la atiendes, incrementas nuevamente en contador dentro de la interrupcion, y al salir, (regresara a la parada de menrgencia), pero al verificar el estado de contador, saltara a la otra parte del programa, (donde ademas, colocaras en cero al contador)

espero se entienda!  :D :mrgreen:

Norberto

Firmat - Santa Fe - Argentina

www.TodoPic.net

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

1_k

  • Visitante
Re: Stop De emergencia
« Respuesta #2 en: 15 de Julio de 2007, 20:02:28 »
Gracias por la respuesta, y la entiendo perfectamente,  el unico detalle seria como hacer para que al finalizar la interrupcion se dirija automaticamente a el lugar donde se fija el valor del contador, ya que la interrupcion puede ocurrir en cualquier lugar del programa y al retornar  vuelve a el lugar donde ocurrió. espero que ahora se me haya entendido a mi  :lol:

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Stop De emergencia
« Respuesta #3 en: 15 de Julio de 2007, 21:15:32 »
ORG       00H
              goto INI             

ORG       04H
              BTFSC    INTCON,1
              CALL      INTER

              BCF        INTCON,1
              ;BSF        INTCON,7 no hace falta si usas el retfie
              BANCO0
              RETFIE

INTER     BANCO0
              ;BCF        INTCON,7 no hace falta xq al ingresar a la rutina de interr. se desactiva automaticamente INTCON,GIE(7)
              MOVWF   ACUM
              MOVF      STATUS,0
              MOVWF    STAT
              incf          EMERGENCIA,F

              ;CALL      DELAYCITO ???
CONTIN
              MOVF     STAT,W
              MOVWF   STATUS
              SWAPF   ACUM,F
              SWAPF   ACUM,W
              return

INI         
             clrf        EMERGENCIA
MainLoop
             btfsc     EMERGENCIA,0
             goto     $-1                   ;actualmente en emergencia. No hacer nada. Pausa.
             
FuncNormal
          ....
          goto           MainLoop

No se si lo que queres es algo asi...esto seria fuera de la interr.

Lo de desviar el codigo inmediatamente una vez producida la interr, no es posible en las familias 12F y 16F ya que no permiten acceder al STACK(pila) para modificarla a gusto. Si haces el algoritmo de FuncNormal corto, el refresco con el cual se verificara el estado de la emergencia sera mas breve(mejor).




ORG       04H
              BTFSC    INTCON,1
              CALL      INTER

              ;BSF        INTCON,7 no hace falta si usas el retfie
              RETFIE

INTER     BCF      INTCON,1
              MOVWF   ACUM
              MOVF      STATUS,0
              MOVWF    STAT
              BTFSS   INTCON,1
              goto       $-1             ;esperar hasta que se vuelva a producir la interr.

              BCF        INTCON,1             
CONTIN
              MOVF     STAT,W
              MOVWF   STATUS
              SWAPF   ACUM,F
              SWAPF   ACUM,W
              return

Y eso seria dentro de la misma rutina de interrupcion. ese programa detiene inmediatamente el procesamiento en cuanto cambia el estado de RB0 y lo mantiene asi, pausado hasta que RB0 vuelve a cambiar de estado.

Esto es todo a ojo. Por ahi no este perfecto, pero bue! lo miramos si hay algo que falla.
Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

1_k

  • Visitante
Re: Stop De emergencia
« Respuesta #4 en: 15 de Julio de 2007, 21:55:04 »
Muchas gracias por las correcciones BrunoF, ahora el unico problema como vos dijiste es que la secuencia es bastante larga (tiene delays en el medio de hasta 11 segundos :( ) asi que a menos que cada tres instrucciones haga un call y los incluya dentro de los delays recalculando los tiempos,(que por cierto los queria ir variando para ajustar la secuencia) que podria hacer?

Una duda que tambien tengo es que si se puede desde una interrupcion ir automaticamente a algun punto del programa especifico sin un retfie pero saliendo de la interrupcion como por ejemplo cambiando el pc (program counter) ç

Desde ya muchas gracias.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Stop De emergencia
« Respuesta #5 en: 15 de Julio de 2007, 22:21:08 »
¿Y no te sirve el ejemplo que no sale de la interrupcion hasta que vuelve a ocurrir la interrupcion por RB0?
Ese no tiene demora practicamente.

Una duda que tambien tengo es que si se puede desde una interrupcion ir automaticamente a algun punto del programa especifico sin un retfie pero saliendo de la interrupcion como por ejemplo cambiando el pc (program counter) ç

Justamente me estaba refiriendo a que las familias 12F y 16F no permiten poder modificar el STACK(pila) que es el que administra las posiciones a las cuales debe retornar el codigo al producirse un RETFIE o RETURN.

Cuando se produce una interrupcion, en algun momento el programa va a tener que volver a la linea siguiente a la que se estaba ejecutando cuando se produjo la interrupcion. O sea que liberar el STACK es casi INMINENTE.

Por ahi con algun artilugio podes "simular" y desviar el codigo.
¿Por que no posteas el codigo entero asi podemos analizar todo en conjunto?

Saludos
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything