Está en la página 1de 6

LICENCIATURA EL ELECTRONICA

Diseño Digita III

Docente: Pedro Pablo Uribe G

Guía #5 Direccionamiento e interrupciones

La memoria RAM puede ser accedida de dos maneras distintas, ya sea por direccionamiento
directo o por direccionamiento indirecto.

El direccionamiento directo es hecho a través de nueve bits de dirección compuestos por os 7 bits
de dirección de a instrucción y dos bits (RP0 y RP1) del registro STATUS:

EJEMPLO:
Bsf STATUS, RP0 ;Bankl
movlw 0xFF ;w=0xFF
movwf TRISA ;address of TRISA register is taken from
;instruction movwf
DIRECCIONAMIENTO INDIRECTO:

En este tipo de direccionamiento no se toma la dirección directamente de la instrucción y se hace


uso del bit 7 del registro STATUS (IRP)y de un registro de propósito especifico (FSR).

Por ejemplo, si en el registro de propósito general de dirección 0x0F se coloca el valor 0x20 y se
escribe el valor de 0x0F en el registro de especifico (FSR)se tendrá un indicador de registro a la
dirección 0x0F y leyendo esta dirección indicada, desde el registro INDF se obtendrá el valor 0x20.

Ejemplo:

INTERRUPCIONES:

Las interrupciones son un mecanismo del microcontrolador que se encarga de responder a un


evento particular en el mismo momento en el que este ocurre, cada interrupción cambia el flujo
normal del programa para atender el evento en forma de sub – rutina, y una vez terminada esta
regresa al punto donde había dejado el programa principal.
El registro encargado de las interrupciones se llama INTCON en la dirección 0x8B

En el momento en el que se produce la interrupción solo e valor del contador de programa es


guardado en la memoria de pila (para que al encontrar la instrucción RETURN este regrese a la
instrucción siguiente del punto donde se produjo la interrupción), sin embargo no es suficiente
almacenar solo este valor, ya que en el momento en el que se produce la interrupción es posible
que algunos registros tanto de propósito general como especifico tengan algunos valores que se
pueden perder al ejecutar la subrutina, por esta razón es de vital importancia que los datos
almacenado en los registros que se necesiten en la subrutina (ejemplo, el registro w) sean
guardados en algún lugar de la memoria donde puedan ser leídos después de la ejecución de la
subrutina.

Rutina de Servicio de Interrupciones (ISR):

Primero debemos guardar el contenido del registro W, el problema de mover W a otro


registro (haciendo uso de MOVF) es que esta instrucción corrompe la bandera Z,
modificando el registro de Estado. Según la hoja de datos otorgada por Microchip, en
uno de sus apartados recomienda una secuencia de código que permite guardar y
restaurar los registros sin modificarlos.
Suponga que W=0x0A y ESTADO=0xAF, La forma de guardarlos y recuperar estos
registros sería la siguiente:

La tarea de guardar todos los registros importantes puede ser mas o menos complicada si el programa que
estás realizando es demasiado extenso o principalmente cuando en la ISR modificas alguno de los valores de
esos registros, en algunos casos no es necesario ya que por lo general se trata de no modificarlos utilizando
registros alternativos.

Reg_W y Reg_S son registros alternativos para guardar los valores del registro W y del registro de
estado respectivamente.
SWAPF ESTADO,W
Es como decirle "invierta los nibbles del registro ESTADO y guárdelos en W".
La instrucción SWAPF invierte los nibbles del registro, por ejemplo si el registro tenia 0xAF luego
de SWAPF quedará 0xFA, si especificas W el valor invertido se guarda en W si indica f se
guardará en el mismo registro, así...
SWAPF Reg_W,f
Es como decirle "invierta los nibbles de Reg_W y guárdalos en Reg_W".

Lo bueno de utilizar la instrucción SWAPF en lugar de MOVF es que no afecta la bandera Z del
registro de ESTADO, y aunque los nibbles se invierten, al restaurarlos los vuelves a invertir
nuevamente para dejarlos como estaban.

RETFIE
Si se ha producido una interrupción, obviamente una de las banderas del registro
INTCON cambiará de estado y el micro irá a la dirección 0x04 como si se hubiera producido un
CALL (una llamada) a esa dirección para ejecutar la ISR, por lo tanto la pila o STACK se carga una
posición más, y el mecanismo de las interrupciones se deshabilita (es decir GIE=0) para dar lugar a
la ISR.
Ahora bien, debe recuperar los registros importantes (lo que acabamos de ver), averiguar la fuente
de interrupción, atender la interrupción, luego restaurar aquellos registros importantes, reponer el
estado de las banderas del registro INTCON (aquellas que fueron modificadas por la interrupción) y
regresar, pero no con un RETURN, ya que no esta regresando de una rutina cualquiera, sino de
una interrupción, la cual está deshabilitada, y para habilitarla nuevamente es recomendable utilizar
la instrucción RETFIE.
Y ahora todas las interrupciones están habilitadas nuevamente, es decir GIE=1
Nada impide que utilice RETURN pero debe usar una instrucción más para habilitar GIE si desea
continuar usando la interrupción, esto queda a criterio del programador, Microchip recomienda el
uso de RETFIE.
Algunos de los parámetros para las interrupciones se encuentran en otro registro, el registro
OPTION.
El Registro OPTION
Este es otro de los registros que tienen mucho que ver con las interrupciones, algunos de sus Bit's
deben ser modificados, según la aplicación que este realizando.
Por ejemplo; dijimos que por el pin RB0/INT, regresa al PIC del modo SLEEP, lo cual podría
hacerse mediante un pulsador, suponga que el pulsador está al polo positivo (VCC) y con una
resistencia a GND, de tal modo que la interrupción se produzca al enviar un 1 (presionando el
pulsador), pero también se podría hacer enviando un 0 (liberando al pulsador). por lo tanto la
interrupción debe ser sensible a un 1 o bien a un 0, como sabrá esto el micro...???, pues muy
fácil, hay que especificarlo, y esto se hace en el Bit6 (INTDEG) del registro OPTION, con un 1 será
sensible al flanco ascendente, y en el momento que envié un 1 por el pulsador se producirá la
interrupción, si pone ese Bit a 0 será sensible al flanco descendente y la interrupción se producirá
cuando libere el pulsador, es decir enviando un 0.
Este es el registro OPTION...
EJERCICIOS PARA MONTAR EN EL LABORATORIO:

1) El programa consiste en preparar todo para el encendido de un LED que se conectara en


RB1, sólo prepararemos todo, porque luego se hará dormir al micro hasta que
interrumpamos su sueño para atender un pulsador conectado a RB0/INT, momento en el
cual deberá encender el LED, y regresar a dormir nuevamente, y cuando vuelva a
presionar el pulsador se hará que lo apague y otra vez se mandara a dormir.

2) Realice los cambios que considere necesarios de tal forma que el programa principal utilice
el registro w y deba guardarse antes de atender la subrutina y siga teniendo el mismo valor
después de atendida la subrutina.

También podría gustarte