Autor Tema: PC y pila  (Leído 3221 veces)

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

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
PC y pila
« en: 26 de Marzo de 2008, 19:32:47 »
Buenas,

Estoy programando un 16F876 y tengo la siguiente cuestión:
accedo a una interrupción, por lo tanto el contador de programa se guarda en la pila, accedo a la rutina de interrupción y posteriormente con retfie salgo de la rutina volcando el valor de la pila en el contador de programa para volver donde estaba. ok, hasta ahí todo correcto, no?
Pues bien, ahora quiero que en la rutina de servicio a la interrupción antes del retfie modificar el valor de la pila, para que al hacer el retfie, no vuelva a la posición donde estaba, si no a una posición que yo desee (mediante el valor de la etiqueta)

PD: La programación es en ensamblador

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: PC y pila
« Respuesta #1 en: 26 de Marzo de 2008, 20:45:32 »
El problema es que no se dispone de instrucciones para el manejo de la pila como push y pop, así que la cosa esta difícil.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: PC y pila
« Respuesta #2 en: 26 de Marzo de 2008, 21:11:54 »
Puedes usar algún flag asi ya no vuelves a la posición donde estabas antes, mejor dicho vuelves pero ahi mismo sales a donde deseabas, por ejemplo:

     ORG    H'04'
RSI
     ----
     ----
     ----
     ----
     bsf      Flag,Cambiar_de_Etiqueta
     retfie

Nueva_Etiqueta
     ----
     ----
     ----
     ----

Rutina_Espera
     btfss     Flag,Cambiar_de_Etiqueta
     goto      Rutina_Espera
     goto      Nueva_Etiqueta

Javicho.

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: PC y pila
« Respuesta #3 en: 27 de Marzo de 2008, 05:33:47 »
No entiendo muy bien lo que me propones, eso del flag y cambiar la etiqueta.... no lo veo claro, me lo puedes explicar de nuevo? creo que lo que me propones es que tenga una rutina esperando a que me interrumpan, pero en la rutina de espera si me interrumpen ya se donde estoy y por lo tanto no abría problema, lo que sucede es que no se en que trozo de mi código principal me van a interrumpir, y al volver quiero volver directamente a otra rutina que yo quiera, sin pasar por retfie porque entonces me volverá al punto donde me interrumpió, pero a la vez tengo que activar el bit GIE porque si no no me volverá a interrumpir, ¿hay algun problema en que no retorne con el retfie y active yo el bit GIE manualmente? lo único que puede pasar es que se me vaya llenando la pila, pero en realidad, el dato de retorno no me interesa, ¿si la pila se llena y llega un nuevo valor de PC borra el valor de la pila mas antiguo? ¿hay algun modo de borrar la pila?

Otra cosa que me sucede es que si entro a la interrupción y salgo sin el retfie, luego se me mete en un call, y cuando me hace un return me vuelve a la posición que apuntaba cuando entre a la interrupción, ¿no hay ninguna forma de borrar la pila?

gracias, un saludo

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: PC y pila
« Respuesta #4 en: 27 de Marzo de 2008, 08:49:58 »
Lo que te propone Javicho es que implementes una máquina de estados, donde el estado se cambiaría en la interrupción y la acción se ejecutaría en el main. Eso es la forma normal de hacer lo que tu quieres y no tocar la pila.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: PC y pila
« Respuesta #5 en: 27 de Marzo de 2008, 10:39:26 »
Otra cosa que me sucede es que si entro a la interrupción y salgo sin el retfie, luego se me mete en un call, y cuando me hace un return me vuelve a la posición que apuntaba cuando entre a la interrupción, ¿no hay ninguna forma de borrar la pila?

En el pic que mencionas no es posible modificar el stack de hardware del micro, tampoco hay forma de 'borrar la pila' salvo que hagas un reset.

A mi modo de verlo lo que sucede es que estás planteando mal la lógica de como resolver tu problema.  El stack no es la solución, sino implementar una lógica adecuada en tus bucles de código.  Un código bien estructurado (no importa si está hecho en assembly o en C o en Basic o en el lenguaje que te guste) debe poder cambiar el flujo de ejecución del mismo por la propia lógica y no forzándola.

Lo de los flags es una manera bastante interesante de resolverlo, tienes que entender que 'inmediato' no hay nada, alguna latencia de microsegundos hasta leer el flag vas a tener.

Sería importante saber un poco más de cómo está organizado tu código para poder seguir echandote una mano

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: PC y pila
« Respuesta #6 en: 27 de Marzo de 2008, 11:00:51 »
Hola super. Lo que te dice Javicho y explicandolo un poco diferente a lo que te explicó jfh, es que incorpores dentr del programa por dónde va a estar pasando el CP cuando habilites la interrupción el chequeo de un bit bandera (o flag en ingles) Tomas una pocición de la RAM cualquiera, suponemos 0X20 y la llamas (en el ejemplo de Javicho) FLAG,  y utilizas el bit 0 de esta pocición de la RAM, entonces cuando se halla producido la interrupción, antes de salir de la misma, ajusta a 1 (o SET) el bit 0 de la pocición de la RAM 0X20 llamada FLAG. (Acuerdate que cada pocición de la RAM tiene 8 bit). A lo largo del programa principal el CP pasará por esta instrucción:

       btfsc       FLAG,0                         ;¿volví de la interrupción? ¿es 1 el bit 0 de la pocicion 0X20?
       goto       cambiar_de_etiqueta      ;Si, voy a cambiar de etiqueta
       ......                                           ;No, continuo normalmente
       ......
       ......


cambiar_de_etiqueta                        ;Aca vengo cuando salí de la interrupción
      bcf         FLAG,0                         ;pongo a 0 el bit 0 de 0X20 (FLAG)
      .......                                         ;Continuo con lo que tengo que hacer
      .......



Esto va en la parte de la interrupción

              ORG          h'04'
;
              ........                                  ;Atiendo a la interrupción
              ..........
              .........
              .........
              BSF         FLAG,0                 ;Pongo a 1 el bit 0 para cuando vuelvo, voy a donde tengo que seguir
              RETFIE
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: PC y pila
« Respuesta #7 en: 27 de Marzo de 2008, 11:10:21 »
Lo que sucede en mi código es que en el bucle principal estoy leyendo sensores y moviendo motores, he implementado una comunición de forma que cada vez que leo un dato me interrumpe, y en dicha comunicación quiero parar los motores y que no se vuelvan a encender hasta nueva orden (otro comando en la comunicación), y vale, los paro, pero cuando vuelve al programa principal despues del retfie, si el programa estaba justo en la parte de codigo donde ya había leido los sensores y iba a actuar sobre los motores, pues vuelve a arrancar los motores y no me sirve de nada haberlos parado, la solución mas facil que veo es no interrumpir por la comunicación, si no hacerla por polling, para así al regresar de la rutina de la comunicación, lo hago justo despues del polling de comunicación y ahí ya puedo meter al programa en otra rutina diferente que es lo que me interesa

Espero que hayais entendido que es lo que quiero hacer, si no vuelvo a explicarlo si hace falta, muchas gracias por las sugerencias, todas son bien recibidas y tenidas en cuenta

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: PC y pila
« Respuesta #8 en: 27 de Marzo de 2008, 11:28:40 »
Como siempre, Maunix tiene razón y deberás plantear mejor la lógica del programa. Como consejo te doy, que te hagas un mapa con los pasos que deba realizar el PC, para luego escribir el programa, con el mapa me refiero es que traces en una hoja y con lapiz, un diagrama de programa.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: PC y pila
« Respuesta #9 en: 27 de Marzo de 2008, 18:18:43 »
En otras palabras, tienes que hacer un diagrama de flujo y no estaria mal tambien hacer el algoritmo de lo que pretendes programar  :mrgreen:

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
Re: PC y pila
« Respuesta #10 en: 28 de Marzo de 2008, 05:30:10 »
Como dice maunix lo correcto es usar otros metodos que no sean la pila  .

Por ejemplo usar un pin para parar todo el hardware  que no te interese que funcione (un paro de emergencia).

Tambien simplemente poner el tris como entrada , asi si continuas dando ordenes una vez regrese de la int y mientras no puedas verificar el FLAG de lo que ocurrio para decidir lo que hacer , los motores no funcionaran .


Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: PC y pila
« Respuesta #11 en: 28 de Marzo de 2008, 06:05:44 »
Ya lo he solucionado, lo que sucedía es que yo paraba motores dentro de la interrupción y al salir, como no se a que parte del programa principal me salía pues se me volvian a activar los motores(ya que en el principal los muevo hacia delante), la solución es el flag en la interrupción, rutina de testeo del flag en la que cuando llega paro los motores, así no se me vuelven a activar porque ya tengo el programa en la rutina que me interesa, gracias por las opiniones



 

anything