Autor Tema: Interrupción por periféricos en los puertos RB4 a RB7 (PIC16F876)  (Leído 5541 veces)

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

Desconectado intimdq

  • PIC10
  • *
  • Mensajes: 15
Interrupción por periféricos en los puertos RB4 a RB7 (PIC16F876)
« en: 24 de Noviembre de 2011, 08:07:52 »
Hola a todos, estoy haciendo una rutina en Mikrobasic, y tengo problemas con las interrupciones INTCON.RBIE. El problema es el siguiente, puedo entrar en la interrupción, pero no salir de ella, por mas que borre el flag (bandera) de la interrupción, a ver que se les ocurre que puede andar mal?? dejo el código comentado. Gracias de antemano...!!!

PD: Por ahí leí que hay que leer el estado del puerto b antes de borrar la bandera, (no se como hacerlo, no lo vi en ningún ejemplo), también leí por ahí que solo con leer el puerto b se borra el flag....Esto es así??
Para quedar bien, tendría que pasar en 5 display por 7 segmentos cada uno, de "00000" a "EEEEE" al precionar un boton en RB7 que se encuentra a 5v y al soltarlo retornar a "00000", no se si me explico bien?



 sub procedure interrupt

  if portb.7=1 then                        'Si el puerto B7 esta en1 5V entonces
     delay_ms(10)                          'Espera0,1 seg (antirrebote)
     porta=%000000                      'Apaga todos los puertos de A
     portc=0x79                             'Indica EEEEE en display 5 x 7 segmentos
     portb=%11100000                   'Puerto B inicia 765 y apaga el resto
     ClearBit(INTCON,rbif)             'Borra flag

  end if                                         'Fin de sentencia if
end sub            'Fin de interrupcion


main:
     ClearBit(OPTION_REG,INTEDG)                 ' configura interrupcion por flanco de bajada.
     INTCON.RBIE = 1                                     ' Se habilitan las interrupciones por el cambio en el puerto PORTB
     SetBit(INTCON,GIE)                                 ' habilita interrupciones globales.

  TRISA = %001100                      'Configura puertos A5, A4, A1 y A0 de salida y A3 y A2 de entrada
  TRISC = %00000000                   'Configura puertos C como salida
  TRISB = %11100000                    'Configura puertos de B4,3,2,1,0 de salida  y B7,6,5 entradas

            
inicio:

  portc = %00000000                     ' Pone todos los puertos de C en 0 (apaga puertos)
  portb= %11100000                      'Pone todos los puertos de C en 1 (inicia puertos)
  porta = %000011                        ' Pone puertos A 5,4,3,2 en 0 (apaga) y puertos A 1,0 en 1 (inicia)
  delay_ms 500                             ' Espera 1/2 segundo
  porta = %0000000                     ' Apaga todos los puertos de A

   espera:

    PORTc=0x3F                            'Indica en display 5 X 7 segmentos 00000 (correcta la recepcion y en espera)
    portb=%0000000                     'Apaga todos los puertos de B
    porta=%100001                       'Enciende puertos A7 y 0 apaga el resto

    goto espera

end.


« Última modificación: 24 de Noviembre de 2011, 08:14:32 por intimdq »

Desconectado Noelillo

  • PIC12
  • **
  • Mensajes: 94
Re: Interrupción por periféricos en los puertos RB4 a RB7 (PIC16F876)
« Respuesta #1 en: 24 de Noviembre de 2011, 15:07:53 »
 :) :) Coño! Ya somos dos!!! Nada tranquilo en un rato alguien te dejara toda la teoria y un ejemplo de dos led que parpadean, es muy bonito para estas Fechas. Navidad !! Navidad !!  :lol:

Un Saludo...

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Interrupción por periféricos en los puertos RB4 a RB7 (PIC16F876)
« Respuesta #2 en: 24 de Noviembre de 2011, 15:43:24 »
bueno no uso basic, pero cuando se entra en la interrupcion se debe leer o escribir en los bits 4-7 del puerto B y de ahi en adelante lo que hagas en la interrupcion y por supuesto poner a cero el flag
« Última modificación: 24 de Noviembre de 2011, 16:09:26 por jhozate »
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Noelillo

  • PIC12
  • **
  • Mensajes: 94
Re: Interrupción por periféricos en los puertos RB4 a RB7 (PIC16F876)
« Respuesta #3 en: 27 de Noviembre de 2011, 17:12:23 »
Coño!!! Y a volar!!  :mrgreen:

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Interrupción por periféricos en los puertos RB4 a RB7 (PIC16F876)
« Respuesta #4 en: 27 de Noviembre de 2011, 17:50:23 »
Hola.

Este tema se ha tratado muchas veces en Todopic.

Si miras el datasheet,vas a ver que la interrupcion por cambio de puerto funciona mediante la comparacion constante entre el valor actual de los pines configurados como entradas en RB4-RB7 y un registro LATCH que contiene el ultimo valor de los mismos del ultimo acceso al puerto B. Si hay una discrepancia, el flag de cambio en puerto B se mantiene en alto.

Directamente del datasheet:

Citar
Four of the PORTB pins, RB7:RB4, have an interrupton change feature. Only pins configured as inputs can cause this interrupt to occur (i.e., any RB7:RB4 pin configured as an output is excluded from the interrupton change comparison). The input pins (of RB7:RB4) are compared with the old value latched on the last read of PORTB. The “mismatch” outputs of RB7:RB4 are OR’ed together to generate the RB Port Change Interrupt with flag bit RBIF (INTCON<0>).

This interrupt can wake the device from SLEEP. The user, in the Interrupt Service Routine, can clear the interrupt in the following manner:
a) Any read or write of PORTB. This will end the mismatch condition.
b) Clear flag bit RBIF.
A mismatch condition will continue to set flag bit RBIF. Reading PORTB will end the mismatch condition and allow flag bit RBIF to be cleared

Entonces, lo que recomienda hacer es:
primero: leer(o escribir) el puertoB;
Hacer PORTB = PORTB puede servir.

Luego, limpiar el flag correspondiente.

al salir y reactivar INTCON,GIE deberias poder salir de la interr, excepto los valores de las entradas en RB4-RB7 hayan vuelto a cambiar durante ese período de tiempo.

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 intimdq

  • PIC10
  • *
  • Mensajes: 15
Re: Interrupción por periféricos en los puertos RB4 a RB7 (PIC16F876)
« Respuesta #5 en: 28 de Noviembre de 2011, 22:39:15 »
Bueno amigos ya solucione el problema, dejo acá la respuesta, por ahí a alguien le sirve. Gracias a todos por su colaboracion

dim button_pressed as byte
dim tempbyte as byte

sub procedure interrupt

         'Lo que quieras poner para que se ejecute la interrupcion  ej: IF portb.7 = 1 then......
        tempbyte = PORTB  ' Lee el PORTB en una variable de bytes para eliminar condición desajuste
        INTCON.RBIE = 0  ' Desavilita otras interrupciones
        INTCON.RBIF = 0  ' Apaga la bandera de interrupción "Turn off the interrupt flag"
        button_pressed = true
  end sub

main
SetBit(INTCON,GIE)              ' habilita interrupciones globales.
"tu programa"
INTCON.RBIE = 1


PD:Espero que a alguien le sirva......


 

anything