TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Enigma en 21 de Junio de 2007, 13:08:28

Título: Interrupciones
Publicado 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
Título: Re: Interrupciones
Publicado por: BrunoF en 21 de Junio de 2007, 13:31:45
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!