TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Enigma en 21 de Junio de 2007, 13:08:28
-
Hola que tal... una preguntica.... Es posible saber por cual bit del puerto B ocurrio una determinada interrupción.... y si es así??? esa rutina va dentro de la rutina de la interrupción ovbiamente, pero la haria como, haciendole encuesta a cada bit del puerto?, es decir, preguntando el estado de cada bit???
Atte: Enigma... la llanerita de Guayana :P
-
Hola.
No especificás a qué modelo de PIC te estás refiriendo.
Si vamos al más básico, el 16F84A, depende la interrupción. Si usás la INTF(RB0) obviamente vas a saberlo debido a que posee una interrupción específica. Si usás la interrupción por cambio en el puertob(RB4~RB7) entonces podés averiguar también cuál fué el/los pin/es que cambió/aron de estado recurriendo a guardar el ultimo estado conocido de los pines en un registro auxiliar antes de reactivar la interrupción.
Ej:
movf PORB,W
movwf AUXPB ;guardar ultimo estado conocido del PuertoB antes de reactivar interrupciones...
bsf INTCON,GIE ;activar interr
org 0x0004
....
movf PORTB,W ;leo PB
btfsc INTCON,RBIF
call CambioPB
....
....
....
retfie
CambioPB
xorwf AUXB,W ;comparo con valor guardado
.... ;aqui chekearias que pines se modificaron(la XOR devuelve los bits modificados = 1)
movf PORB,W
movwf AUXPB ;guardar ultimo estado conocido del PuertoB antes de reactivar interrupciones...
return
Aunque debo destacar que no es 100% eficaz. Puede que algunas veces no funcione correctamente. Depende de la velocidad con la que ocurren los cambios en los pines.
El error ocurre debido a que pasa un cierto tiempo entre que ocurre la interrupcion y se lee el puertoB. Durante este tiempo los pines pueden volver a cambiar, y sin embargo no ha forma de capturarlo.
Lo mismo ocurre cuando guardas el ultimo estado del puertob. Entre que lo guardas y reactivas las interr, vuelve a pasar un cierto tiempo, durante el cual pueden ocurrir cambios en el puertob que no serán contemplados.
Suerte!