• Domingo 22 de Diciembre de 2024, 06:31

Autor Tema:  Uso De Interrupciones Con Pic 16f877  (Leído 18187 veces)

karen81

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Uso De Interrupciones Con Pic 16f877
« en: Viernes 23 de Abril de 2004, 20:04 »
0
:huh: Hola no se si alguien tiene un problema cualquiera en pic 16f877 que utilice interrupciones aun tengo dudas del esquema a utilizar o si pueden decirme como debe ser la estructura de un programa que utilice interrupciones

Gracias de antemano :hola:
No basta tener buen ingenio; lo principal es aplicarlo bien.

lmarte

  • Miembro activo
  • **
  • Mensajes: 73
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #1 en: Viernes 23 de Abril de 2004, 21:16 »
0
Hola Karen,  no creo que haya un esquema especifico para usar las interrupciones, la función de ellas es la de darle prioridad a un evento, de manera tal que tu no tengas que estar revisando esa condición en todo momento, simplemente se generó la interrupción y el programa se "interrumpe" (suena redundante   :P ) y va a realizarte lo que tu quieres que suceda cuando llegue el evento. Es algo como si estuvieras ordenando toda la casa y el momento q suena el tel (la interrupción), dejas lo que estas haciendo atiendes la llamada, luego cuelgas (se acabo la funcion generada por la interrupcion) y luego sigues donde habias quedado cuando escuchaste el ring, y asi todas las veces q sea necesario.

Espero ser claro.
lmarte
Si no se intenta, ... no se hace

karen81

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #2 en: Lunes 26 de Abril de 2004, 04:01 »
0
Se lo que es una interrupcion, lo que necesito saber es por ejemplo el convertidor analogico digital dispara una interrupcion cuando completa una conversion al hacerlo se debe mandar un una al puerto pero lo que no se es como el programa sabe que tiene que hacer cuando se da la interrupcion por que como tengo entendido cuando se da la interrupcion el cpu va a un vector en la direccion 0004h especificamente.
lo que no se es como decirle por ejemplo que lo que tiene que hacer esta en la direccion xxxxx
¿se debe de guardar en esa direccion (0004h) la direccion xxxx. para que cuando se de la interrupcion se vaya para allá?

 :unsure:
gracias de antemano.

atte Karen Giraldo.
No basta tener buen ingenio; lo principal es aplicarlo bien.

lmarte

  • Miembro activo
  • **
  • Mensajes: 73
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #3 en: Lunes 26 de Abril de 2004, 15:47 »
0
Hola,

Citar
es como el programa sabe que tiene que hacer cuando se da la interrupcion por que como tengo entendido cuando se da la interrupcion el cpu va a un vector en la direccion 0004h especificamente.

mira si entiendo ahora, lo que quieres es saber que sucede cuando ocurre una interrupción. Según lo que he aprendido hay dos tipos de interrupciones, las primeras las voy a llamar sencillas, como por ejemplo la de los timer, la del ADC, etc. estas lo que te hacen es activarte una bandera cuando ocurre una situación en especial, me explico, se lleno el timer en el momento de pasar de ff a 00 te coloca la respectiva bandera en uno. Igual el ADC, termino la conversión, entonces activa bandera.

El segundo tipo, las generales, que son las que tienen que ver con el puerto B, RB0 (recibe un flanco), RB7 a RB4 cambian de estado, no se si se me pasa alguna  :P
Estas al suceder se van al vector interrupción

Código: Text
  1.                     ORG 00
  2.           goto INICIO
  3.  
  4.           ORG 04
  5.           goto interrupcion
  6.             
  7.                                 ORG 05
  8.  
  9.               INICIO        NOP      &#59;aqui va el prog
  10.                                 NOP        ;principal
  11.                                 GOTO INICIO
  12.  
  13.              interrupcion  NOP      &#59;aqui lo que debe hacer si  
  14.                                 NOP      &#59;ocurre interrupción
  15.                                 retfie  
  16.  
  17.                                 end
  18.  
  19.  

Si utilizas una de las primeras, lo que tienes que hacer es cada tanto estar revisando la bandera que te interesa...pq son interrupciones <_< , digamos que te dan la ventaja de seguir realizando otras operaciones mientras la función está corriendo y te avisan que sucedió (pero no te interrumpen el ciclo normal, eso lo haces tu).

Ahhh... se me olvidaba, OJO con INTCON.

Espero esta vez si haber sido de ayuda, me cuentas
lmarte
Si no se intenta, ... no se hace

javierv

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #4 en: Lunes 26 de Abril de 2004, 17:44 »
0
Tambien las interrupciones de timers envia al vector de interrupcion.

[CODE]
;***************************************************************
   org     0x00
   goto   inicio
;***************************************************************
; programacion de interrupcion
   org   0x04                  ; vector de interrupcion
   btfss   INTCON, T0IF     ;checar si es interrupcion de timer0
   retfie                                 ; si no lo es regresar
; aqui va el codigo de la interrupcion
;...
;...
   retfie                                  ; fin de la interrupcion

inicio
; ACTIVACION DEL TIMER0 COMO INTERRUPCION
   bsf            STATUS, RP0
   movlw   0xD6
   movwf   OPTION_REG
   bcf   STATUS, RP0
   bsf   INTCON, T0IE
   bsf   INTCON,GIE
; aqui va el codigo del programa
;...
;...
                end

lmarte

  • Miembro activo
  • **
  • Mensajes: 73
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #5 en: Lunes 26 de Abril de 2004, 18:26 »
0
javierv está en lo correcto.

Citar
A global interrupt enable bit, GIE (INTCON<7>)
enables (if set) all unmasked interrupts, or disables (if
cleared) all interrupts. When bit GIE is enabled, and an
interrupt’s flag bit and mask bit are set, the interrupt will
vector immediately


Citar
The “return from interrupt” instruction, RETFIE, exits
the interrupt routine, as well as sets the GIE bit, which
re-enables interrupts.

No me habia dado cuenta de eso pq al ingresar a una interrución es desabilitado el GIE. Hoy aprendí otra cosa  :rolleyes:  Gracias
Si no se intenta, ... no se hace

karen81

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #6 en: Lunes 26 de Abril de 2004, 19:28 »
0
:) gracias creo que he comprendido una ultima duda es para el motorola hc12 ocurre igual se da una interrupcion y el se va a un vector especifico ya que cada uno tiene uno propio el timer tiene el suyo que esta en la ffxx (no recuerdo bien) como seria en ese caso?
¿igual que con el pic o como?



gracias de antemano
No basta tener buen ingenio; lo principal es aplicarlo bien.

lmarte

  • Miembro activo
  • **
  • Mensajes: 73
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #7 en: Martes 27 de Abril de 2004, 00:13 »
0
Karen, yo no he usado motorola, que te dice el datasheet?
Seguro ahi encuentras la respuesta

Un saludo
Si no se intenta, ... no se hace

Hakets

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #8 en: Martes 18 de Mayo de 2004, 21:37 »
0
Hola, soy nuevo en el foro, Karen81 no se si ya todas tus dudas esten claras... yo he usado el 16F877A y sus conversores, no he tenido necesidad de usar interrupciones ;) .
Te envio 2 porcioncitas de codigo

1.Habilitacion del ADC
Código: Text
  1.  
  2. Port_ADC
  3.   bsf  STATUS,RP0  
  4.   movlw   b'00011111'  
  5.   movwf   PORTA  
  6.   movlw   b'00000000'&#59;Lo seteas de esta manera para trabajar
  7.   movwf   ADCON0   &#59;con un reloj de FOSC/2 y con el canal RA0/AN0
  8.   bcf  STATUS,RP0
  9.  
  10.  

2.Rutina de medicion
Código: Text
  1.  
  2. MEDICION
  3.   bsf  ADCON0,0&#59;Modulo ON
  4.   call  espera20u  
  5.   bsf  ADCON0,2&#59;Conversion en progreso
  6.  
  7. espera
  8.   btfsc  ADCON0,2&#59;Esperas a terminar la conversion, este bit se
  9.   goto  espera&#59;clarea solito cuando termine
  10.   movf  ADRESH,0  
  11.   movwf  RESULTADO  
  12.   bcf  ADCON0,0&#59;Modulo OFF
  13.   return  
  14.  
  15. espera20u  
  16.   movlw  0x05  
  17.   movwf  CONTA3  
  18. retardo1  
  19.   decfsz  CONTA3,1  
  20.   goto  retardo1  
  21.   return  
  22.  
  23.  
Recuerda definir las variables necesarias, espero te sirva... ahhh el ADC en el bit 2(GO/DONE) y en bit 0(On bit) te avisa el estado de del ADC :hola:
HaKeTs®

microprocesadores

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #9 en: Viernes 4 de Junio de 2004, 14:00 »
0
hola me gustaria que me contestarais a varias dudas que tengo
la 1 que son las interrupciones irq y la nmi de un microprocesador?
la 2 que diferencia hay entre las enmascarables y las NOenmascarables?
la 3que es el vector de interrupcion
que papel juega la pila sp gracias y mil gracias de antemano

karen81

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #10 en: Sábado 5 de Junio de 2004, 23:04 »
0
Las interrupciones son un conjunto de excepciones asincrónicas que permite el microprocesador para alterar la ejecución secuencial normal de instrucciones; estas se manejan a través de vectores que contienen la dirección física de la memoria donde se encuentra la rutina de servicio a la excepción solicitada.

es decir hacemos un programa que acepta interrupciones por lo que cada vez que se da una interrupcion el programa se interrumpe el micro guarda la direccion donde se interrumpio el programa y otras cosas en la pila (depende de que microcontrolador estemos usando) luego se va al vector de interrupcion donde esta la direccion de la rutina de servicio (que es la rutina que queremos que haga cuando se da la interrupcion) luego de realizarla saca lo que guardo en la pila y retorna a la direccion donde se dio la interrupcion y continua.
La diferencia entre las interrupciones enmascarables y las noenmascarables es que las enmascarables se pueden evitar, es decir si no queremos que se den las enmascaramos poniendo a uno o a cero una bandera (depende del micro) y aunque se de la condicion no se da la interrupcion. En cambio las noenmascarables no se puede evitar que se den ejemplo los RESET no se pueden evitar.
En cuanto a la interrupcion NMI e IRQ tendrias que especificar a que micro te refieres.

Espero que esto te ayude, si algo no te queda claro avisame ya que es un tema que recien acabo de pasar por lo que lo recuerdo muy bien

adios :comp:
No basta tener buen ingenio; lo principal es aplicarlo bien.

SinChip

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #11 en: Jueves 14 de Octubre de 2004, 12:15 »
0
Hola , yo también soy nuevo en el foro. He leído y releído vuestras respuestas ya que las necesito para solucionar un problema, pero aún no lo he conseguido. Se trata de hacer saltar al pic 16f877 a cualquier interrupción (estoy mosca porque esto se supone que es algo básico  :whistling: ).

Es la primera vez que trabajo con estos pics, y me parecen bastante potentes y sencillos de manejar, pero aquí hay algo que se me escapa.

Estoy usando las directivas de código relocalizable (CODE, IDATA, UDATA), aunque he usado las mismas estructuras de programa Imarte o Javierv para el uso de interrupciones viendo que no hay ninguna diferencia entre poner un ORG o un CODE  0x... cuando quieres que un bloque empiece desde una direccion concreta. Es decir, estas directivas no creo que me estén planteando problemas, ya que estoy depurando con ICD2 otros programas que he hecho (sin interrupciones) y van bien.

La interrupción que quiero activar es la de RB0 (es decir, INTE dentro de INTCON). Por cierto Imarte, ¿Qué quieres decir con?:

Citar
Ahhh... se me olvidaba, OJO con INTCON.

precisamente a mí me está dando problemas, ya que intento poner a 0 el bit INTF para que vuelva a interrumpir, pero siempre está a 1, y en el 877 no hace falta seleccionar el banco de memoria que contiene a INTCON ya que está reflejado en los 4 bancos.

Os dejo el codiguito que me trae de cabeza, ya estoy empezando a desconfiar en la placa que he hecho, incluso en el icd2 :blink:


Código: Text
  1. ;***** DEFINICIÓN DE VARIABLES ****************************************
  2.  
  3. variables  UDATA 0x110
  4. w_temp    RES 1&#59; Variables para la salvaguarda del contexto
  5. pclath_temp  RES 1
  6. status_temp  RES 1
  7. reg_temp    RES  1
  8.  
  9.  
  10. ;******** VECTORES DE INTERRUPCIÓN *************************************
  11.  
  12. RESET_VECT  CODE    0x000   &#59; Vector de reset del procesador
  13.            nop            &#59; &#34;nop&#34;      
  14.                                 pagesel     inicio  &#59;
  15.       goto      inicio  &#59; Salto al inicio del programa
  16.  
  17. ;*******************************************************************
  18.  
  19. INT_VECTOR  CODE       0x004  &#59; Zona del vector de interrupción
  20.     goto  ServInt  &#59;
  21.  
  22. ISR    CODE  0x005
  23. ServInt:
  24.     banksel   w_temp
  25.                   movwf     w_temp  
  26.     movf  STATUS,w
  27.     movwf  status_temp     &#59;hasta aquí guarda de registros
  28.  
  29.     btfsc  INTCON,INTF  &#59;¿ocurrió flanco en rb0?
  30.     goto  noint
  31.                                 movlw  b'00110100'   &#59; indicar interrupción
  32.     banksel   PORTB
  33.     movwf  PORTB
  34.     bcf   INTCON,INTF                    
  35.    &#59; Limpia las interrupciones pendientes
  36.      
  37. noint  
  38.     banksel   status_temp    &#59; recupera lo guardado
  39.     movf      status_temp,w
  40.     movwf  STATUS
  41.     swapf     w_temp,f
  42.     swapf     w_temp,w
  43.      
  44.       retfie                   &#59;
  45.  
  46.  
  47.  
  48. ;***** PROGRAMA PRINCIPAL *********************************************
  49.  
  50. MAIN    CODE               &#59; Zona de Programa
  51.  
  52. inicio:
  53.  
  54.     bcf  INTCON,GIE  &#59;Deshabilito por si acaso
  55.     movlw  b'00001001'   &#59;
  56.     banksel   TRISB        &#59; configurando el puerto B
  57.     movwf   TRISB
  58.     movlw  b'00000000'   &#59;
  59.     banksel   PORTB
  60.     movwf  PORTB
  61.  
  62.     bsf  INTCON,INTE  &#59;
  63.     banksel   OPTION_REG  &#59;
  64.     bsf  OPTION_REG,INTEDG&#59;
  65.     bsf   INTCON,GIE  &#59;
  66.  
  67.     bcf  INTCON,1&#59; Limpia las interrupciones pendientes
  68.  
  69.     goto  &#036;             &#59; espera interrupciones
  70. fin
  71.     END
  72.  

Bueno, espero que os sirva de algo el codigo, y si hay errores me lo decís. Ojalá sepais que me puede pasar, no estoy muy ducho con los PIC.

Gracias por adelantado.

oldkami

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #12 en: Domingo 17 de Octubre de 2004, 07:23 »
0
1- Desde que yo programo pics (hace ya casi unos 4 años) es la primera vez que escucho que el GIE en INTCON se desactiva con solo ejecutarse una interrupción. Esto definitivamente !no es verdad¡ es necesario desactivar el INTCON,GIE si se quiere atender la interrupción, de lo contrario se corre el riesgo que el programa se interrumpa continuamente,  y esto puede causar multiples consecuencias, desde desbordar el stack del micro y ocasionar reset del mismo, hasta alterar los datos en las variables de contexto y volver de la interrupcion con datos totalmente erroneos (W,STATUS,OPTION, PCLATH, etc). solo cuando se realiza algo complejo como interrupciones priorizadas se tendria en cuenta no apagar el GIE. lo que si es cierto es que al ejecutar RETFIE el bit GIE es activado automaticamente para permitir atender la siguiente interrupcion.

2- En el codigo de sinchip existen dos errores, uno fatal y el otro no muy obvio.

a-  ¿btfsc    INTCON,INTF?  ; yo creo que es mejor btfss        :)
       goto    noint               ; de lo contrario siempre va a noint

b- cuando se seleccionan las variables para hacer el cambio de contexto, lo mejor es definirlas en la seccion UDATA_SHR, con el fin de no cambiar el registro STATUS con la operacion "banksel"  ya que si se regresa de la interrupcion se puede llegar al programa principal con un banco no deseado. ademas, repito hace falta apagar el GIE en el servicio de interrupciones.  algo asi como:

Código: Text
  1.  
  2.  
  3.   UDATA_SHR
  4. irq_w        res d'1'
  5. irq_status  res d'1'
  6.  
  7. RESET_VEC  CODE  0x0000
  8.        pagesel  INICIO
  9.        goto       INICIO
  10.  
  11.  
  12. INT_VEC   code 0x0004
  13.        pagesel  ISR
  14.        goto       ISR
  15.  
  16.  
  17. ISR:
  18.       bcf         INTCON,GIE
  19.       btfsc      INTCON,GIE  &#59;paranoia
  20.  
  21.       movwf    irq_w
  22.       swapf      irq_w,F
  23.       movfw    STATUS
  24.       movwf    irq_status    &#59;cambio de contexto
  25.  
  26.       btfss      INTCON, (mi interrupcion);[PIR1,(mi interrupcion)]probar aqui
  27.                                                        &#59;el tipo de interrupcion
  28.       goto       ATENDER
  29.  
  30.  
  31. ATENDER
  32.     &#59;el codigo necesario
  33.  
  34.  
  35. END_ISR
  36.      movfw    irq_status    &#59;vuelve al contexto anterior
  37.      movwf    STATUS
  38.      swapf     irq_w,W
  39.      retfie                         &#59;esta instruccion coloca el GIE en ON
  40.  
  41.  
  42. INICIO
  43.                                  &#59;mi codigo
  44. END
  45.  
  46.  
  47.  




Saludos

Oldkami

oldkami

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #13 en: Domingo 17 de Octubre de 2004, 07:31 »
0
erratas:
Código: Text
  1.  
  2.   btfsc      INTCON, (mi interrupcion);[PIR1,(mi interrupcion)]probar aqui
  3.                                                     &#59;el tipo de interrupcion
  4.   goto       ATENDER                       &#59;si el bit esta en set atiende
  5.   goto       END_ISR                        &#59;si es clear sale de la rutina (aunque si es asi
  6.                                                     &#59;alguna interrupcion no prevista se ejecuto)
  7.  
  8.  
  9.  

Creo que asi es mas claro :)

Saludos

Oldkami

oldkami

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #14 en: Domingo 17 de Octubre de 2004, 07:37 »
0
Errata 2:

uicchhh..

ISR:
     bcf         INTCON,GIE
     btfsc      INTCON,GIE  ;paranoia
     goto       ISR


tal vez ya esta muy tarde.. que duerman  -_-


Saludos

Oldkami

SinChip

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #15 en: Miércoles 20 de Octubre de 2004, 17:18 »
0
Gracias Oldkami por tu rápida respuesta. No obstante, cambiando el origen de la interrupcion a la direccion 100 hex, funciona, no sé por qué no me deja empezar desde la direccion 5 que se supone que es la posicion libre inmediatamente despues del vector de interrupción.

además , he intentado añadir "pagesel" en el vector de interrupcion para saltar a la ISR y me dice que no cabe. No será pq sólo hay una palabra de espacio para el mapeo del vector de int. en la 04?

Bueno, más cositas. Tengo un programa que hace una cuenta binaria de 3 bits (Típico contador Johnson, o como se diga) y la saco por tres líneas del puerto B y ok, pero la saco en RA2,3 y 4 y no lo consigo. El hecho es que siempre que activo un bit del puerto A se desactiva el que hubiere anteriormente, ¿inquietante eh? (con RA4 no pasa esto, es la única que fluctua debidamente sin que la afecten las demás)

He tenido en cuenta el drenador abierto de RA4, pero se ve que la inversión del dato se resuelve de forma transparente al usuario, ya que tengo un pull-up a la salida y el dato sale tal y como lo escribo en el puerto, no invertido como esperaba que lo hiciese.

Por cierto RA2,3 y 4 van colgadas a la entrada de un MUX 8 a 1, y éste funciona aparentemente bien.

Aquí os dejo un pequeño ejemplo que ilustra el fallo mediante una barrido de tres lineas del puerto, parece simple, pero ocurre lo que os he mencionado.

Citar
MAIN  CODE               ; Zona de Programa

inicio:
;-------Configuración de puertos-------
     movlw b'00000011'    ; como salida, y ent RA0, RA1 y RA3 b'00001011'
     banksel TRISA        ; configurando el puerto B
     movwf TRISA

     movlw b'00001001'    ; como salida, y ent RB0 y RB3 -> b'00001001'
     banksel TRISB        ; configurando el puerto B
     movwf TRISB
     movlw b'00001010'    ;
     banksel PORTB
     movwf PORTB

     movlw b'00000000'    ; como salida
     banksel TRISC        ; configurando el puerto B
     movwf TRISC

     movlw b'00000000'    ; como salida
     banksel TRISD        ; configurando el puerto B
     movwf TRISD

     movlw b'00000000'    ; como salida
     banksel TRISE        ; configurando el puerto B
     movwf TRISE

     banksel PORTA
     ;movwf   PORTA
     bcf   PORTA,BIT2
     bcf   PORTA,BIT3
     bcf   PORTA,BIT4 ; limpiamos puerto

salta
     call delay_1s
     bsf   PORTA,BIT3
     call delay_1s
     bsf   PORTA,BIT2
     call delay_1s
     bsf   PORTA,BIT4
     call delay_1s
     goto  salta

No sé si es un fallo software, porque he cambiado por varios micros, incluso usé un 648A programado (sin usar el modo depuración) y pasa lo mismo. Tengo un header que me he hecho yo que convierte 40 a 18 pines, pero esto tampoco falla, ya que la placa destino tiene como os digo 18 pines, y allí es donde usé el 648.

Los pines restantes de los puertos del 877, como veis los configuro como salida, recomendacion que te da Microchip cuando no los vas a usar.

Bueno, o bien encomiendo a San Silicio, aunque me gustaría que me comentarais sobre esto en breve.

Saludito para todos, y gracias de nuevo
 :alien:

oldkami

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #16 en: Jueves 21 de Octubre de 2004, 23:07 »
0
Citar
no sé por qué no me deja empezar desde la direccion 5 que se supone que es la posicion libre inmediatamente despues del vector de interrupción.

además , he intentado añadir "pagesel" en el vector de interrupcion para saltar a la ISR y me dice que no cabe. No será pq sólo hay una palabra de espacio para el mapeo del vector de int. en la 04?


Ese sintoma... sip, tienes razon, no compila. Disculpas a todos  :hola: .  pero olvide mencionarlo, se debe precisamente a las restricciones que impone el script *.lkr que utiliza el linker . en la definicion del espacio de inicio (vectors), una de las posibles la soluciones la coloco a continuación:
Código: Text
  1.  
  2.     title &#34;Ejemplo ISR&#34;
  3.     list P=16F877
  4.     #include &#34;P16F877.inc&#34;
  5.  
  6.   UDATA_SHR
  7. irq_w        res d'1'
  8. irq_status  res d'1'
  9.  
  10. RESET_VEC  CODE  0x0000
  11.       pagesel  INICIO
  12.       goto       INICIO                     &#59;hasta aqui 3 instrucciones
  13.       nop
  14. INT_VEC    bcf      INTCON,GIE     &#59;vector de interrupcion 0x0004 y fin de
  15.                                                    &#59;seccion (vectors)
  16. ISR  code 0x0005                         &#59;colocar el ISR inmediatamente despues
  17. ISR:
  18.      btfsc      INTCON,GIE &#59;paranoia
  19.      goto    INT_VEC      &#59;o goto &#036;-2
  20.  
  21.      movwf    irq_w
  22.      swapf      irq_w,F
  23.      movfw    STATUS
  24.      movwf    irq_status   &#59;cambio de contexto
  25.  
  26.      btfsc      INTCON,(mi interrupcion);[PIR1,(mi interrupcion)]probar aqui
  27.                                                   &#59;el tipo de interrupcion
  28.      goto     ATENDER                    &#59;atiende la interrupcion
  29.      goto     END_ISR                     &#59;sale del ISR
  30.  
  31. ATENDER
  32.   &#59;el codigo necesario
  33.  
  34.  
  35. END_ISR
  36.     movfw    irq_status   &#59;vuelve al contexto anterior
  37.     movwf    STATUS
  38.     swapf     irq_w,W
  39.     retfie                        &#59;esta instruccion coloca el GIE en ON
  40.  
  41.  
  42. INICIO
  43.   goto  &#036;      &#59;mi codigo
  44. END
  45.  
  46.  
  47.  
  48.  

es lo mejor, ya que se atiende la interrupcion de la manera mas rapida posible (con pagesel + goto ISR se toma 4 instrucciones mas) y te permite compilar :).

 otra alternativa es modificar el archivo *.lkr para extender la seccion Vectors con el fin de colocar el codigo apropiado:

Código: Text
  1.  
  2.  
  3. ;ejemplo con 16F877.lkr
  4. ; codigo original
  5. CODEPAGE   NAME=vectors   START=0x0      END=0x4      PROTECTED
  6. CODEPAGE   NAME=page0     START=0x5      END=0x7FF
  7.  
  8. ; codigo modificado
  9. CODEPAGE   NAME=vectors   START=0x0      END=0x6      PROTECTED
  10. CODEPAGE   NAME=page0     START=0x7      END=0x7FF
  11.  
  12.  

con esto obtienes 2 palabras adicionales en la seccion STARTUP para ubicar
pagesel ISR  y goto ISR.

Código: Text
  1.  
  2.  
  3. RESET_VEC  CODE 0x0000
  4.         pagesel  MAIN
  5.         goto       MAIN   &#59;hasta aqui 3 instrucciones
  6.         nop
  7.  
  8. INT_VEC   code 0x0004
  9.         pagesel  ISR               &#59;aqui 0x0004 (vect Interrupt) y 0x0005
  10.         goto       ISR               &#59;0x0006 final de Vectors
  11.  
  12. ISR  CODE                &#59;donde sea... o asignado por el linker
  13.  
  14. ISR:
  15.      
  16.     &#59; Aqui mi ISR
  17.  
  18.  
  19.  



Aunque esta alternativa le quita portabilidad al codigo (tendrias que modificar cada *.lkr que necesites), aunque yo la utilice en el codigo que envie anteriormente :) extendiendo mucho la seccion vectors.

Con estos ejemplos creo que ya se pueden defender en la construccion de la seccion de interrupciones.


En cuanto a la segunda pregunta, deberias iniciar una nueva discusion y anexar el codigo para ser evaluado, ya que se sale un poco del tema de esta discusion que es el uso de interrupciones en pic 16f877, sin embargo te adelanto que no veo mayor problema en ese codigo, a menos que la subrutina "delay_1s" o alguna otra rutina sobreescriba el puerto. Dificil saberlo con la información que enviaste.


Saludos

Oldkami

SinChip

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #17 en: Viernes 22 de Octubre de 2004, 10:54 »
0
Gracias de nuevo Oldkami, desde luego que estás ducho en este tema. Respecto al codigo nuevo sobre el fallo del puerto, en realidad no es mucho más que eso, es realmente simple. Voy a colgar otra discusión con lo dicho sobre esto y ademas la rutina de delay_1s, para que veas que no influye en los puertos.

Un saludo, sigo en el tajo :comp:

gelito

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Uso De Interrupciones Con Pic 16f877
« Respuesta #18 en: Jueves 10 de Julio de 2008, 21:37 »
0
Hola!!
Estoy programando un PIC16F877, en su rutina principal trabaja con el ADC interno del PIC pero no he logrado q una interrupcion por Recepción funcione correctamente. Por fa ayudenme!!