Autor Tema: Duda con Retorno de interrupcion por cambio de estado RB7:RB4. ASM (solucionado)  (Leído 4733 veces)

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

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
 Hola a todos, resulta q quiero saber bien el funcionamiento de las interrupciones en el 16F84, ya me informe sobre q es lo q debo configurar para trabajar con las interruciones, me encamine a hacer una rutina sencilla para hacer el siguiente programa
si RA0=1 se realiza una suma de dos valores previamente cargados, en este caso NUM1=5 NUM2=4, y se muestra el resultado por el portb durante 5 segundos, el programa se queda en un bucle esperando a q RA0 sea 1.
Por el lado de la interrupcion tengo configurado por cambio de estado de RB7:RB4, si se detecta la interrupcion se realiza NUM1-NUM2 y  se debe mostrar por el puertoB el resultado, es decir "1" durante 5 segundos, y luego volver a preguntar por el estado de RA0.

el problema esta en q cuando se detecta la interrupcion  se queda siempre mostrando el resultado de la resta y no regresa al preguntar el estado de RA0,  yo creo q el problema lo genera la rutina de tiempo o tal vez estoy manejando mal la interrupcion, adjunto el codigo .
gracias por las aclaraciones q me puedan hacer
Código: [Seleccionar]
LIST P=16F84A

#INCLUDE "P16F84A.INC"

CBLOCK 0CH
NUM1
NUM2
PDel0
PDel1
PDel2
ENDC

ORG 0
GOTO INICIO



;##################interrupcion#######################
ORG 4



RESTA MOVF NUM2,W
SUBWF NUM1,W
MOVWF PORTB
CALL DEMORA
CLRF PORTB
BCF INTCON,RBIF
;BSF INTCON,GIE
retfie
;GOTO PREGUNTA
;##########################################################


;*****Principal***************************
INICIO BSF STATUS,5
BSF PORTA,0
MOVLW 0XF0
MOVWF PORTB
BCF STATUS,5
CLRF PORTB
CLRF PORTA

PRE MOVLW 88H
MOVWF INTCON

MOVLW 5H
MOVWF NUM1
MOVLW 4H
MOVWF NUM2

PREGUNTA BTFSS PORTA,0
GOTO PREGUNTA
GOTO SUMA


SUMA MOVF NUM2,W
ADDWF NUM1,W
MOVWF PORTB
CALL DEMORA
CLRF PORTB

GOTO PREGUNTA
;********************************************



DEMORA  movlw     .165      ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .41       ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .147      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
        return              ; 2+2 Fin.

END
« Última modificación: 11 de Marzo de 2009, 21:08:38 por jhozate »
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Duda con Retorno de interrupcion por cambio de estado RB7:RB4. ASM
« Respuesta #1 en: 08 de Marzo de 2009, 12:58:45 »
cual es la rutina de interrupción?

la rutina de demora, no tendría que estar encima del ORG 0 o quizá por debajo?

un saludo
.

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Duda con Retorno de interrupcion por cambio de estado RB7:RB4. ASM
« Respuesta #2 en: 08 de Marzo de 2009, 13:31:45 »
Saludos

No veo el retfie por ningun lado, si no tienes esta instrucción como pretendes retornar a PCL + 1, es decir, salir de la interrupción y volver donde estaba tu programa ejecutandose.

Un saludo desde Pereira - Colombia
Un saludo desde Pereira - Colombia

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Duda con Retorno de interrupcion por cambio de estado RB7:RB4. ASM
« Respuesta #3 en: 08 de Marzo de 2009, 14:02:48 »
tambien utilize el retfie, tengo entendido q el retfie actualiza el bit GIE y retorna a lugar donde se estaba ejecutando el programa, pero almenos en simulacion tampoco sale de la interrupcion, pero en cambio si quito la rutina de tiempo el programa funciona pero me vota muchos errores en el proteus

¿es totalmente indispensable utilizar el retfie?
¿puedo yo actualizar las banderas y dirigir al programa a otra ubicacion luego de tratada la interrucion?











« Última modificación: 08 de Marzo de 2009, 15:34:22 por jhozate »
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Duda con Retorno de interrupcion por cambio de estado RB7:RB4. ASM
« Respuesta #4 en: 08 de Marzo de 2009, 15:57:49 »
Saludos

La suma debe estar en el programa principal y la resta debe estar en la interrupcion pero si no sales de la interrupción como pretendes hacer la suma. además para salir del la interrupción obligatoriamente tienes que utilizar el retfie o si no tu programa se quedara en la interrupción. m i consejo es el siguiente haz la rutina de suma en el main del programa y la resta en el vector de interrupción. es decir cuando tu programa detecto interrupción inmediata mente va al vector de interrupcion ejecuta la rutina retorna y sigue preguntando por la suma. pero veo otro problema. es que en transcurso de la rutina de tiempo si hay interrupción ejecuta lo de la interrupción. entonces no hay suma.

Un saludo desde Pereira - Colombia
Un saludo desde Pereira - Colombia

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Duda con Retorno de interrupcion por cambio de estado RB7:RB4. ASM
« Respuesta #5 en: 08 de Marzo de 2009, 16:01:56 »
probe cambiando de posicion la rutina de tiempo y tampoco funciona, ahi acomode mejor el programa para q se vea donde esta la interrupcion, efectivamente la resta esta dentro de la interr y la suma en el programa principal

pero creo q el problema es la rutina de tiempo por que el programa funciona haciendo la suma y si cambio de estado muestra la resta pero se queda mostrandola

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

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: Duda con Retorno de interrupcion por cambio de estado RB7:RB4. ASM
« Respuesta #6 en: 10 de Marzo de 2009, 01:57:08 »
Despues de poner clrf   PORTB, pon movf    PORTB,W y despues pon a cero el RBIF

por cierto en que programa simulas?
Saludos
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: Duda con Retorno de interrupcion por cambio de estado RB7:RB4. ASM
« Respuesta #7 en: 10 de Marzo de 2009, 19:51:40 »
Cordial saludo sander, hice lo q me dijiste y si funciona, ahora mi pregunta es ¿por qué? si con la instruccion CLRF PORTB limpio el puerto e inmediatamente procedo a actualizar la bandera de la interrupcion y luego habilito el bit GIE

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

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Duda con Retorno de interrupcion por cambio de estado RB7:RB4. ASM
« Respuesta #8 en: 11 de Marzo de 2009, 21:05:30 »
 :D :D leyendo un post de CCS encontré la respuesta, resulta q mi ingles es muy basico por no decir nefasto, entonces para orientarme uso un ebook del 16F84 en español, y sospecho q en el datasheet del 16F84 se estipula q en la interrupcion por cambio de estado en RB4:RB7 se debe incluir la instruccion de "relleno" de lectura o escritura del puertob, en este caso mi programa funcionó con la instruccion movf portb,w
me parece raron q un libro q es dedicadoo exclusivamente al 16F84 no mencione esta rutina, ni siquiera la ponen en los ejemplos

Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA