TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: intimdq 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.
-
:) :) 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...
-
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
-
Coño!!! Y a volar!! :mrgreen:
-
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:
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.
-
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......