Autor Tema: Problema con rutina q alterna interrupcion Ext y cambio de nibble  (Leído 4405 veces)

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

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
bueno resulta que tengo unos problema con una rutinita:

Código: [Seleccionar]
;Programa que saque por PORTA la siguiente secuencia cuando se produzca interrupción externa
;por flanco de bajada:
;10101
;espera medio segundo
;01010
;espera mediosegundo

;y la siguiente secuencia cuando se produzca interrupción por cambio de nibble pero solo en RB6,
;si se produce en RB7, RB5 ó RB4 debe volver a donde ocurrió la interrupción.
;11011
;espera medio segundo
;00100
;espera medio segundo

;cada secuencia se debe quedar ejecutando hasta que se produzca la otra interrupción, o sea que si se está
;ejecutando la primera secuencia (por interrupción externa), esta no parará hasta que se produzca la otra
;interrupción por cambio de nibble en RB6 y así sucesivamente.


LIST P=16F84A
#INCLUDE "P16F84A.INC"

TMR0_OPT EQU 1H ;EN EL BANCO1 TMR0, EN EL BANCO0 REGISTRO OPTION
;###########################DEFINICION DE REGISTRO ###########################
CBLOCK 0X0C
CONTAR
ENDC
;##############################################################################

ORG 0
GOTO INICIO
;################################### INTERRUPCION ##############################
ORG 0X04

BTFSS INTCON,INTF
GOTO NIBBLE
GOTO REPONER

REPONER BCF INTCON,INTF
BSF INTCON,GIE
RUTINA1 MOVLW B'00010101'
MOVWF PORTA
CALL MEDIO
MOVLW B'00001010'
CALL MEDIO
GOTO RUTINA1

NIBBLE BTFSS PORTB,6
GOTO FIN
GOTO REPONER2


REPONER2         BCF INTCON,RBIF
BSF INTCON,GIE
RUTINA2 MOVLW B'00011011'
MOVWF PORTA
CALL MEDIO
MOVLW B'00000100'
MOVWF PORTA
CALL MEDIO
GOTO RUTINA2



FIN BCF INTCON,RBIF
MOVF PORTB
RETFIE


;################################################################################

INICIO BSF STATUS,5
CLRF PORTA
MOVLW 0XFF
MOVWF PORTB
        MOVLW B'00000010'
        MOVWF TMR0_OPT
BCF STATUS,5

CLRF PORTA
CLRF PORTB

MOVLW B'10011000'
MOVWF INTCON

LOOP GOTO LOOP



;###################### MEDIO SEGUNDO CON TMR0 ###########################

MEDIO      MOVLW .250
MOVWF CONTAR
NON CALL DOSMI
DECFSZ CONTAR,1
GOTO NON
RETURN

DOSMI      MOVLW .6
MOVWF TMR0_OPT
NO BTFSS INTCON,2
GOTO NO
BCF INTCON,2
RETURN

;#########################################################################

END

La rutina debuggea muy bien en MPLAB, cumple con las demoras, si se hace una interrupcion cambia de rutina, pero funciona bien hasta cierto punto, ¿por qué hasta cierto punto? por que cuando el pic entra en la rutina de demora y si ocurre una interrupcion, ahí se queda enganchado todo el tiempo q le da la gana, como puedo solucionar eso? o solo será en simulacion el problema?

Ahora, en proteus funciona correctamente la interrupcion por cambio de nibble, funcionan bien los tiempos y el encendido de los leds, pero la interrupcion externa da problemas el PIC se queda estático mostrando en PORTA la primera secuencia(10101), no cambia a la segunda secuencia, si ocurre interrrupcion en cambio de nibble en RB6 pss cambia a las secuencia de cambio de nibble...y por ultimo RA4  del pic 16F84A funciona bien proteus?


dejo adjunto el asm y DSN ...

saludos
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema con rutina q alterna interrupcion Ext y cambio de nibble
« Respuesta #1 en: 18 de Abril de 2009, 18:43:00 »
Hola. Por lo poco que miré tu programa, el error seguramente esté en que no estás guardando los registros críticos cuando entrás a la interrupción(y restaurandolos antes de salir).
Tenés que salvar ciertos registros(como el W,STATUS) y tal vez otros(FSR,PCLATH) para que la iterr no te sobreescriba estos registros y al salir de la interr estén modificados provocando el mal funcionamiento.

En el datasheet del PIC tenés una parte en la que se comenta cómo salvar estos registros o acá en el foro vas a ver que este tema es tratado infinidad de veces.

Suerte.
"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 Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problema con rutina q alterna interrupcion Ext y cambio de nibble
« Respuesta #2 en: 18 de Abril de 2009, 18:55:31 »
Hola jhozarate.

Hay varias cosas que estás haciendo mal.

1- Estás habilitando las interrupciones dentro de una interrupción y no haces por software una prioridad de interrupciones. (nunca tuve que hacer uno, por lo que por el momento, desconozco como hacerlo).

2- Si la interrupción entra en la rutina REPONER, no sale mas de ahí y queda cargado un nivel de la pila que jamás se vacía y con las interrupciones habilitadas.

2b- La instrucción GOTO REPONER está demás porque continúa. Un goto debe usarse para saltear instrucciones, si bien, esto no produce un error, pero lleva a consumir memoria de programa más ciclo de máquina inecesariamente.

3- De la forma que estás utlizando el TMR0 podrías hacerlo con solo el CP, o sea, con una demora o delay estandar, consumiendo ciclos de máquina antes de seguir con otra tarea.

La solución del problema, es que hagas un diagrama de flujo de que trabajo tiene que hace el CP, porque en la interrupción está mal, recuerda que una interrupción es para atender un evento, hacer una tarea requerida y luego salir y continuar con el programa principal, que en tu caso, sería quedar en el bucle infinito LOOP

Como concejo, acostúmbrate a poner comentarios, a corto plazo te lo vas a agradecer vos mismo. Y algo importante, utiiliza en la medida que puedas los nombre de los bit y no el número, por ejemplo, es mejor poner STATUS,RP0 y no STATUS,5 porque si sin querer pones un 6, el programa hace otra cosa.

Cuando configures los puertos como salida o entrada, utiliza los nombres apropiados TRISx y no el nombre del puerto PORTx, si bien, de la manera que lo hiciste no genera problemas y el MPLAB lo toma como el TRISx, estarás evitando un confusión propia y de un amigo que te quiera ayudar con tu problema.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Problema con rutina q alterna interrupcion Ext y cambio de nibble
« Respuesta #3 en: 18 de Abril de 2009, 19:48:46 »
bueno...gracias por los comentarios....en verdad es q soy un neofito en esto..pero he aprendido mucho en el foro...
el problema q tenia con la secuencia q debia haber en porta era tan tonto q me da pena nombrarlo :oops:  , sin embargo si se mira bien es muy obvio... creo q ya hice todas las correciones,ya funciona bien la rutina,  pero creo q es inevitable, al menos en simulacion q el pic se quede enganchado cuando entra en una rutina de tiempo y dentro de la rutina de tiempo ocurre una interrupcion, ahora cuando ocurre por primera vez una interrupcion ( y se salvan registros) y el pic entra en rutina de tiempo ya sea que utilicemos TMR0 o ciclos de maquina y dentro de esa rutina de tiempo se vio afectado el registro W y en ese momento  ocurre una interrupcion los datos que salvamos al inicio del vector de interrupcion serian erroneos? al menos el q tiene q ver con w...?

Código: [Seleccionar]
LIST P=16F84A
#INCLUDE "P16F84A.INC"

TMR0_OPT EQU 1H ;EN EL BANCO1 TMR0, EN EL BANCO0 REGISTRO OPTION
;###########################DEFINICION DE REGISTRO ###########################
CBLOCK 0X0C
PDel1
PDel0
CONTAR
STATUS_TEMP
W_TEMP
ENDC
;##############################################################################

ORG 0
GOTO INICIO
;################################### INTERRUPCION ##############################

ORG 0X04

PUSH MOVWF W_TEMP ;SALVO REGISTROS
SWAPF STATUS, W ;
MOVWF STATUS_TEMP       ;

BTFSS INTCON,INTF         ; JERARQUIA DE INTER, INTERRUPCION EXTERNA?
GOTO NIBBLE ; NO, FUE POR CAMBIO NIBBLE


REPONER BCF INTCON,INTF                      ; REPONGO FLAG DE INTER EXT
BSF INTCON,GIE                        ;HABILITO INTERRUPCIONES, PARA QUE PUEDA
;ACTUAR INTER POR CAMBIO NIBBLE
RUTINA1 MOVLW B'00010101'
MOVWF PORTA
CALL MEDIO
MOVLW B'00001010'
MOVWF PORTA
CALL MEDIO
GOTO RUTINA1

NIBBLE BTFSS PORTB,6 ;CAMBIÓ EL RB6?
GOTO POP ;NO,
;


REPONER2 BCF INTCON,RBIF ;REPONGO FLAG DE INTER POR CAMBIO NIBBLE
BSF INTCON,GIE         ;;HABILITO INTERRUPCIONES, PARA QUE PUEDA
;ACTUAR INTER EXTER

RUTINA2 MOVLW B'00011011'
MOVWF PORTA
CALL MEDIO
MOVLW B'00000100'
MOVWF PORTA
CALL MEDIO
GOTO RUTINA2


POP SWAPF STATUS_TEMP,W    ;REPONGO LOS REGISTROS
MOVWF STATUS
SWAPF W_TEMP, F
SWAPF W_TEMP, W

FIN BCF INTCON,RBIF ;REPONGO FLAG DE CAMBIO DE NIBBLE
MOVF PORTB ;LECTURA DE PUERTO, NECESARIA PARA SALIR
;DE LA INTERRUPCION
RETFIE


;################################################################################

INICIO BSF STATUS,RP0
CLRF PORTA
MOVLW 0XFF
MOVWF TRISB
    BCF STATUS,RP0

CLRF PORTA
CLRF PORTB

MOVLW B'10011000'
MOVWF INTCON

LOOP GOTO LOOP



;###################### MEDIO SEGUNDO CON TMR0 ###########################

MEDIO  movlw     .239      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .232      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL4  goto PDelL5         ; 2 ciclos delay
PDelL5  goto PDelL6         ; 2 ciclos delay
PDelL6  goto PDelL7         ; 2 ciclos delay
PDelL7  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

;#########################################################################

END


« Última modificación: 18 de Abril de 2009, 19:51:33 por jhozate »
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: Problema con rutina q alterna interrupcion Ext y cambio de nibble
« Respuesta #4 en: 18 de Abril de 2009, 21:13:06 »
Hola jhozate, ¿Porque habilitas las interrupciones en el vector de interrupciones?, eso es muy complicado, por lo menos  a mi no se me ocurre una forma segura de controlar el salto entre interrupciones, es mas te cuento que hace tiempo estube dos dias buscando un cuelgue misterioso que se producia en un programa y ese cuelgue se debia a que algun gracioso (mi jefe) habilito irresponsablemente las interrupciones dentro de otra interrupcion. Como experimento interesante , talvez, talveeeez   con dos interrupciones  se pueda controlar, pero cuando las interrupciones pueden suceder en cualquier o tienes mas de dos (como en mi caso) , no me parece conveniente aunque sea pensar en hacerlo. y es mejor solucionar el problema de otra forma.

Pasando a tu problema  , lo que se me ocurre es que  te crees dos pilas para guardar el W, el STATUS y las demas variables que estes usando en tu rutina de retardo, una para cada interrupcion, ademas deberias  definir dos banderas, una indicaria cuando vienes de la interrupcion de cambio y la otra cuando vienes de la interrupcion externa,  al finalizar la interrupcion tendrias que ir a un POP para  la interrupcion respectiva. Pero esto NO solucionaria el otro problema que tienes que te lo explica Leon Pic en  su punto 2 , estas cargando el STACK y a la larga se produciria un Stack overflow.


Saludos.


« Última modificación: 18 de Abril de 2009, 21:15:20 por sander »
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Problema con rutina q alterna interrupcion Ext y cambio de nibble
« Respuesta #5 en: 19 de Abril de 2009, 01:39:31 »
pero por qué es complicado manejar interrupciones dentro de una interrupcion?.....bueno a lo mejor en este ejercicio no resulta muy complicado pero para eso mismo al entrar en la interrupcion se pregunta por los flags correspondientes y de esta manera podemos hacer una jerarquia de las interrupciones.

pero ahora viendo la rutina, cuando el programa esta haciendo la secuencia que corresponde a la interrupcion externa si ocurre la otra interrupcion no salvo registros, no es necesario en este ejercicio, pero dado el caso que cuando se produzca una inter externa y estoy haciendo alguna operacion con registros y se produzca otra interr ...ahi habria estaria el problema...lo mejor seria solo atender una sola cosa cuando entro al vector de interrupcion.
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problema con rutina q alterna interrupcion Ext y cambio de nibble
« Respuesta #6 en: 19 de Abril de 2009, 09:35:53 »
En las familias de gama media y baja, no están preparados para atender dos interrupciones simultáneas, y por ende, no tiene prioridad de las interrupciones. Justamente, es ese el motivo por que cuando se produce una interrupción, inmediatamente, se desabilitan las interrupciones generales. La única opción de trabajar con interrupciones simultaneas con estos micro, es hacer por software las prioridades (en la gama alta, si tienen prioridades)

Ten en cuenta que, cuando se produce una interrupción, se carga en la pila la posición que tenía el CP al momento de atender la interrupción. En tu programa, jamás vacías esta pila, tampoco haz echo por software las prioridades de interrupción. ¿Qué es esto? básicamente, cada interrupción vale mas que otra, o sea, no hay dos interrupciones con la misma prioridad. Cuando ocurre una interrupción y se está ejecutando otra, el software tiene que dejar de atender una interrupción, atiende la nueva interrupción (si es más importante que la que se está trabajando) y volver a completar la interrupción que se estaba haciendo antes.

En tu programa, por lo que entiendo, no lo haces. Por eso, te dije que hagas un diagrama de flujo para que veas el panorama de la situación y después de eso, poder escribir el programa. Si subes un diagrama de flujo, te podremos ayudar mejor.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Problema con rutina q alterna interrupcion Ext y cambio de nibble
« Respuesta #7 en: 19 de Abril de 2009, 14:21:25 »
bueno...la verdad cuando tuve clases de micro nunca me hicieron hacer diagramas de flujo (Ahora veo lo necesidad)...pero trate de hacerlo lo mas entendible...haciendolo comprendi lo de las prioridades en las interrupciones..pero tambien me doy cuenta que en esta rutina no existe tal prioridad porque lo que debe hacer el programa es ejecutar una secuencia correspondiente a la interrupcion que la provocó, de primera mano no esperamos una determinada interrupcion sino que cuando ocurra una debe pasar algo, sin embargo en este caso siempre iniciamos preguntando por la interr ext.

adjunto el diagrama

saludos
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema con rutina q alterna interrupcion Ext y cambio de nibble
« Respuesta #8 en: 19 de Abril de 2009, 15:32:55 »
Hola.

Mirá, ese diagrama de flujo no creo que sea correcto. No intentes activar las interrupciones ya estando dentro de una, porque es sumamente complejo y creo que vas a entrar en un tema bastante áspero sin sentido por lo que veo.

Te planteo acá una alternativa(no estricta a tu diagrama de flujo) que he hecho modificando tu codigo.


Código: ASM
  1. ;BY BRUNO FASCENDINI
  2.         LIST P=16F84A
  3.                         #INCLUDE "P16F84A.INC"
  4.        
  5.  
  6.         ERRORLEVEL -302
  7.                        
  8. TMR0_OPT EQU 1H                         ;EN EL BANCO1 TMR0, EN EL BANCO0 REGISTRO OPTION
  9. ;###########################DEFINICION DE REGISTRO ###########################
  10.                         CBLOCK 0X0C
  11.                         PDel1
  12.                         PDel0
  13.                         CONTAR
  14.                         STATUS_TEMP
  15.                         W_TEMP
  16.                         VALOR1
  17.                         VALOR2
  18.                         ENDC
  19. ;##############################################################################
  20.  
  21.                         ORG     0x000
  22.                         GOTO    INICIO
  23.  
  24. ;################################### INTERRUPCION ##############################
  25.                        
  26.                         ORG     0X004
  27.  
  28. PUSH            MOVWF   W_TEMP                  ;SALVO REGISTROS
  29.                         SWAPF   STATUS, W               ;
  30.                         MOVWF   STATUS_TEMP       ;
  31.                        
  32.                         BTFSC   INTCON,INTF                 ; JERARQUIA DE INTER, INTERRUPCION EXTERNA?
  33.                         CALL    INTERR_RB0
  34.  
  35.                         BTFSC   INTCON,RBIF
  36.                         CALL    INTERR_RB4B7
  37.  
  38. POP             SWAPF STATUS_TEMP,W    ;REPONGO LOS REGISTROS
  39.                         MOVWF STATUS           
  40.                         SWAPF W_TEMP, F
  41.                         SWAPF W_TEMP, W
  42.  
  43. FIN                     ;MOVF PORTB,F                   NO PODES HACERLO ACá PORQUE la INSTRUCCION MOVF afecta el flag STATUS,Z entonces "ensuciás el registro recuperado STATUS antes de salir
  44.                                                                         ;LECTURA DE PUERTO, NECESARIA PARA SALIR
  45.                                                                         ;DE LA INTERRUPCION
  46.                         RETFIE
  47.  
  48. ;################################################################################              
  49.  
  50. INTERR_RB0
  51.                         BCF     INTCON,INTF                      ; REPONGO FLAG DE INTER EXT
  52.                                                                         ;ACTUAR INTER POR CAMBIO NIBBLE
  53. RUTINA1         MOVLW   B'00010101'
  54.                         MOVWF   VALOR1
  55.                         MOVLW   B'00001010'
  56.                         MOVWF   VALOR2
  57.                         RETURN
  58.  
  59. ;################################################################################              
  60.  
  61. INTERR_RB4B7
  62.                         MOVF    PORTB,F
  63.                         BCF     INTCON,RBIF                     ;REPONGO FLAG DE INTER POR CAMBIO NIBBLE
  64.                         BTFSS   PORTB,6
  65.                         RETURN
  66.  
  67. RUTINA2         MOVLW   B'00011011'
  68.                         MOVWF   VALOR1
  69.                         MOVLW   B'00000100'
  70.                         MOVWF   VALOR2
  71.                         RETURN
  72.                                
  73. ;################################################################################              
  74.                
  75. INICIO          BSF     STATUS,RP0
  76.                         CLRF    TRISA   ;es el adecuado por mas que el otro tmb funciona
  77.                         MOVLW   0XFF
  78.                         MOVWF   TRISB
  79.                     BCF         STATUS,RP0
  80.  
  81.                         CLRF    PORTA
  82.                         CLRF    PORTB  
  83.  
  84.                         CLRF    VALOR1
  85.                         CLRF    VALOR2
  86.                        
  87.                         MOVLW   B'10011000'
  88.                         MOVWF   INTCON
  89.                        
  90. LOOP            MOVF    VALOR1,W
  91.                         MOVWF   PORTA
  92.                         CALL    MEDIO
  93.  
  94.                         MOVF    VALOR2,W
  95.                         MOVWF   PORTA
  96.                         CALL    MEDIO
  97.  
  98.                         GOTO    LOOP
  99.  
  100. ;###################### MEDIO SEGUNDO CON TMR0 ###########################
  101.  
  102. MEDIO  movlw     .239      ; 1 set numero de repeticion  (B)
  103.         movwf     PDel0     ; 1 |
  104. PLoop1  movlw     .232      ; 1 set numero de repeticion  (A)
  105.         movwf     PDel1     ; 1 |
  106. PLoop2  clrwdt              ; 1 clear watchdog
  107. PDelL1  goto PDelL2         ; 2 ciclos delay
  108. PDelL2  goto PDelL3         ; 2 ciclos delay
  109. PDelL3  clrwdt              ; 1 ciclo delay
  110.         decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
  111.         goto      PLoop2    ; 2 no, loop
  112.         decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
  113.         goto      PLoop1    ; 2 no, loop
  114. PDelL4  goto PDelL5         ; 2 ciclos delay
  115. PDelL5  goto PDelL6         ; 2 ciclos delay
  116. PDelL6  goto PDelL7         ; 2 ciclos delay
  117. PDelL7  clrwdt              ; 1 ciclo delay
  118.         return              ; 2+2 Fin.
  119.                
  120. ;#########################################################################             
  121.  
  122.         END


No entiendo si realmente lo que querés es que una vez ocurrida una interrupción el programa no haga nada mas que alternar mostrando esos valores en el PORTA, porque en ese caso tu diagrama tiene cosas innecesarias como guardar los registros y luego restaurarlos al igual que el retfie.  Sé que yo te dije que debías guardarlos, porque lo que estás haciendo es fuera de serie. No entiendo realmente qué fin tiene tu programa. Tal cual lo pusiste en el diagrama de flujo, tu diseño sólo entraría una sola vez al vector de interr, y no saldría nunca de el, por lo que sólo atendería a la primera interr.

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 jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Problema con rutina q alterna interrupcion Ext y cambio de nibble
« Respuesta #9 en: 19 de Abril de 2009, 15:58:58 »
mmmm...esta muy buena la solucion..solo se atiende una interrupcion y esta queda ejecutando la secuencia fuera del vector...ok..pero creo q te equivocaste preguntando por los flag de interrupcion porque estos se ponen a 1 y no 0..pero no importa se puede arreglar..algo q no me quedo claro fue aqui
Citar
INTERR_RB4B7
                         MOVF PORTB,F
                         BCF INTCON,RBIF       ;REPONGO FLAG DE INTER POR CAMBIO NIBBLE
                         BTFSS PORTB,6
                         RETURN

en la hoja de datos se dice que para poder salir de la interrupcion por cambio de nibble es necesario hacer una lectura del puerto, esa parte en el programa es esta
Citar
MOVF PORTB,F
????
« Última modificación: 19 de Abril de 2009, 16:02:15 por jhozate »
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema con rutina q alterna interrupcion Ext y cambio de nibble
« Respuesta #10 en: 19 de Abril de 2009, 16:30:17 »
Hola.

No necesariamente se atiende una interrupción. Si suceden simultáneamente se ejecutarán las dos dentro del vector interr.

Los BTFSC están bien. Lo que hice fue invertir la condición.

BTFSC = Bit Test Files Skip if Clear. Significa que saltea la siguiente instrucción si el bit cuestionado está en cero.
Entonces, si no ocurrió dicha interr, esquiva la subrutina(CALL ....). Si ocurrió, no esquiva el call e ingresa a la subrutina.

MOVF REG,F sobreescribe el valor del registro en si mísmo. Por omisión vos hiciste MOVF PORTB. El MPASM lo considera MOVF PORTB,F(y te larga un WARNING al ensamblar) porque no definiste el destino.
MOVF PORTB,F refresca el PORTB, cumpliendo con lo que el datasheet dice.

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 jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Problema con rutina q alterna interrupcion Ext y cambio de nibble
« Respuesta #11 en: 19 de Abril de 2009, 16:34:33 »
 :shock: upps  :D fue un lapsus...pero de todas maneras gracias..ya funciona la rutina...
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA