Autor Tema: Entrar a interrupcion en ASM, en entorno C  (Leído 14660 veces)

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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Re: Entrar a interrupcion en ASM, en entorno C
« Respuesta #30 en: 10 de Noviembre de 2008, 04:27:10 »
 :?
Mi alegria no podia ser total y absoluta...
Segun estuve mirando, si se usa #int_global, no se pueden usar las demas #int_xxx. Esto implica que el int_global se tiene que encargar de TODO. Ademas de salvar el contexto y comprobar que interrupcion salto, tambien debemos incluir el codigo que queramos ejecutar para cada int, dentro del mismo int_global. Queda todo demasiado condensado para mi gusto... pero aun asi, es un gran descubrimiento poder encargarme del ISR  :mrgreen:

Bruno, una consulta. En los codigos que optimizaste utilizas la siguiente estructura para comprobar si salto la interrupcion:
Código: ASM
  1. BTFSC INDF, TMR1IE
  2. BTFSS PIR1, TMR1IF
  3. GOTO 0x50    ;TIMER1 ISR

y segun entiendo, si esta deshabilitada TMR1IE salta una instruccion, con lo cual llega al GOTO y entra a la interrupcion, pero no deberia
en el otro caso, si TMR1IE esta habilitada, sigue con la siguiente instruccion, que si esta habilitado el flag TMR1IF salta una instruccion, por lo que no entra, aunque deberia.

La verdad me son un poco complicados de seguir los BTF, y tal vez los este interpretando mal  :?
Que opinas?
Salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Entrar a interrupcion en ASM, en entorno C
« Respuesta #31 en: 10 de Noviembre de 2008, 11:07:39 »
 :shock: :shock: :shock:

Tenés razón. Cuando yo cometo un error así,es para ver si la persona estaba atenta a mi explicación  :mrgreen:  :lol: :D

Nah, mentira. Me equivoqué. No se por que se me chispoteó y las hice al revés, negadas.

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.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Re: Entrar a interrupcion en ASM, en entorno C
« Respuesta #32 en: 10 de Noviembre de 2008, 13:05:00 »
Me parece genial que me pongas "equivocaciones" trampa para ver si estoy atento  :mrgreen:
Gracias a ti y los compañeros que me ayudaron en este hilo ya "se" lo minimo de ASM!!  :-/

Lo que comentas del codigo, aunque esten al reves, negadas, puede ser que le falte un GOTO entre los BTF? sino no veo la manera de que funcione.
Yo lo resolvi asi:

Código: C
  1. TIMER1: //--------------------
  2.         BTFSS    INDF, TMR1IE   //si esta habilitada la int, salta...
  3.         GOTO     CCP1           //...sino continua hacia la siguiente int a comprobar
  4.         BTFSC    PIR1, TMR1IF   //si esta desactivado el flag, salta...
  5.         GOTO     TMR1_INT       //...sino ejecuta la interrupcion

Ese codigo funciona. De hecho, todo el #int_global funciona!  :-/
Si alguien quiere aprovecharlo me quedo asi:

Código: C
  1. //reserva posiciones de memoria para salvar contexto
  2. #reserve 0x70, 0x71, 0x72, 0x73
  3.  
  4. //Constantes ASM
  5. #define W               0
  6. #define F               1
  7.  
  8. #define INDF    0x00
  9. #define STATUS  0x03
  10. #define PCLATH  0x0A
  11. #define FSR             0x04
  12. #define PIR1    0x0C
  13. #define PIE1    0x8C
  14.  
  15. #define TMR1IF  0
  16. #define CCP1IF  5
  17.  
  18. #define TMR1IE  0
  19. #define CCP1IE  5
  20.  
  21. #define W_AUX   0x70    //W
  22. #define S_AUX   0x71    //STATUS
  23. #define P_AUX   0x72    //PCLATH
  24. #define F_AUX   0x73    //FSR
  25.  
  26. #int_GLOBAL
  27. void ISR(void){
  28.         #asm
  29.         //Guardar contexto
  30.         MOVWF   W_AUX           //guardo el contenido de W
  31.         SWAPF   W_AUX, F        //swap a W
  32.  
  33.         SWAPF   STATUS, W       //cargo W con STATUS
  34.         MOVWF   S_AUX           //guardo STATUS en 0x71
  35.  
  36.         MOVF    PCLATH, W       //cargo W con PCLATH
  37.         MOVWF   P_AUX           //guardo PCLATH en 0x72
  38.         CLRF    PCLATH          //borro PCLATH
  39.  
  40.         MOVF    FSR, W          //cargo W con FSR
  41.         MOVWF   F_AUX           //guardo FSR en 0x73
  42.        
  43.         MOVLW   PIE1            //puntero de PIE1...
  44.         MOVWF   FSR                     //...en FSR
  45.        
  46. TIMER1: //--------------------
  47.         BTFSS   INDF, TMR1IE    //si esta habilitada la int, salta...
  48.         GOTO    CCP1                    //...sino continua hacia la siguiente int a comprobar
  49.         BTFSC   PIR1, TMR1IF    //si esta desactivado el flag, salta...
  50.         GOTO    TMR1_INT                //...sino ejecuta la interrupcion
  51.        
  52. CCP1:   //--------------------
  53.         BTFSS   INDF, CCP1IE    //si esta habilitada la int, salta...
  54.         GOTO    RESTAURAR               //...sino va a restaurar contexto y sale del ISR
  55.         BTFSC   PIR1, CCP1IF    //si esta desactivado el flag, salta...
  56.         GOTO    CCP1_INT                //...sino ejecuta la interrupcion
  57.         GOTO    RESTAURAR               //sale del ISR
  58.        
  59. TMR1_INT:
  60.         //codigo de INT_TIMER1
  61.         //......
  62.  
  63.         BCF             PIR1, TMR1IF//resetea el flag
  64.         BCF             PCLATH, 3       //
  65.         GOTO    RESTAURAR       //restaura el contexto
  66.  
  67. CCP1_INT:
  68.         //codigo de INT_CCP1
  69.         //......
  70.  
  71.         BCF     PIR1, CCP1IF    //resetea el flag
  72.         BCF     PCLATH, 3
  73.         GOTO RESTAURAR          //restaura el contexto
  74.  
  75. RESTAURAR:      //Restaurar contexto
  76.         MOVF    F_AUX, W        //cargo W con F_AUX
  77.         MOVWF   FSR                     //restauro valor de FSR
  78.  
  79.         MOVF    P_AUX, W        //cargo W con P_AUX
  80.         MOVWF   PCLATH          //restauro valor de PCLATH
  81.  
  82.         SWAPF   S_AUX, W        //cargo W con S_AUX
  83.         MOVWF   STATUS          //restauro valor de STATUS
  84.  
  85.         SWAPF   W_AUX, W        //restauro valor de W
  86.         #endasm
  87. }

Modificandolo un poquito se puede adaptar a otras interrupciones.
las instrucciones "BCF PCLATH, 3" que estan en la linea 39 y 47 no se para que sirven, vienen por defecto cuando sales de una INT en CCS. Probablemente se puedan omitir.

Ahora mis servos no se adelantan ni se retrasan ni 1uS!!  :-)
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

jacrmr

  • Visitante
Re: Entrar a interrupcion en ASM, en entorno C
« Respuesta #33 en: 11 de Noviembre de 2008, 19:46:36 »
Seguramente te benficiará el nuevo cambio de arquitectura de Microchip en toda su línea Mid-Range PIC12 y PIC16 que saldrá empezando el 2009. En estos dispositivos (que serán compatibles con los actuales) el contexto de la interrupción se guardará por hardware y no con software como se ha estado haciendo.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Re: Entrar a interrupcion en ASM, en entorno C
« Respuesta #34 en: 11 de Noviembre de 2008, 22:15:09 »
Seguramente te benficiará el nuevo cambio de arquitectura de Microchip en toda su línea Mid-Range PIC12 y PIC16 que saldrá empezando el 2009. En estos dispositivos (que serán compatibles con los actuales) el contexto de la interrupción se guardará por hardware y no con software como se ha estado haciendo.

Estuve mirando un poco y la verdad tienen muy buena pinta! Ademas de salvar el contexto automaticamente tambien cuenta con 2 registros INDF, aumentan a 49 el numero de intrucciones, stack de 16 niveles...
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2692&redirects=enhanced

Espero que levanten la restriccion de los samples para probar estos micros nuevos  :mrgreen:
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Entrar a interrupcion en ASM, en entorno C
« Respuesta #35 en: 20 de Febrero de 2009, 19:54:16 »
Espero que levanten la restriccion de los samples para probar estos micros nuevos  :mrgreen:


Pues yo tuve que pagar los 7.50 para que me llegarán unos 24H y 24F que se pidieron en Diciembre  del 2008, no creo que lo levanten.
« Última modificación: 20 de Febrero de 2009, 20:31:21 por Mario »
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee


 

anything