13.11.2012 Views

Mis primeros programas en assembler - Micros Designs

Mis primeros programas en assembler - Micros Designs

Mis primeros programas en assembler - Micros Designs

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

programa de at<strong>en</strong>ción a la interrupción el que se <strong>en</strong>cargue de salvar su estado al inicio de la rutina y de<br />

devolverlos al final del mismo.<br />

Resumi<strong>en</strong>do, las acciones que se realizan automáticam<strong>en</strong>te el microcontrolador y las que el programador debe<br />

t<strong>en</strong>er <strong>en</strong> cu<strong>en</strong>ta <strong>en</strong> sus <strong>programas</strong> son las sigui<strong>en</strong>tes:<br />

Bits utilizados.<br />

Cuando se activa una posible causa de interrupción, el flag correspondi<strong>en</strong>te se activa. Si el bit de<br />

permiso correspondi<strong>en</strong>te está a 1 y el bit de habilitación de todas las interrupciones (GIE) está a 1, se<br />

produce la interrupción.<br />

Para evitar que se produzca otra interrupción mi<strong>en</strong>tras se está at<strong>en</strong>di<strong>en</strong>do a otra anterior, el bit GIE se<br />

pone a 0.<br />

El valor del PC se guarda <strong>en</strong> la PILA<br />

El PC se carga con el valor 0x04, que es el vector de interrupciones<br />

El programador, debe com<strong>en</strong>zar la rutina de at<strong>en</strong>ción a la interrupción con un salto a la posición de<br />

memoria donde se <strong>en</strong>cu<strong>en</strong>tra el programa, seguidam<strong>en</strong>te se guardan todos los registros que puedan ser<br />

modificados por esta, seguidam<strong>en</strong>te si están habilitadas varias vías de interrupción, se debe explorar el<br />

valor de las banderas para determinar la causa de la interrupción.<br />

Dep<strong>en</strong>di<strong>en</strong>do de la causa de la interrupción, la rutina de interrupción se bifurca a la subrutina<br />

correspondi<strong>en</strong>te.<br />

Se deb<strong>en</strong> devolver los valores que t<strong>en</strong>ían los registros antes de producirse la interrupción y se deb<strong>en</strong><br />

borrar por software las banderas que indican las fu<strong>en</strong>tes de las interrupciones, antes del retorno al<br />

programa principal.<br />

Cuando se llega a la última instrucción de la rutina de interrupción, RETURN, se carga el PC con el<br />

valor que se guardó inicialm<strong>en</strong>te <strong>en</strong> la PILA y el bit GIE se pone automáticam<strong>en</strong>te a 1.<br />

INTF para RB0/INT, bit 1 de INTCON, si es 1 ocurrió interrupción externa<br />

RBIF para los pines B4 a RB7, bit 0 de INTCON, si es 1 por lo m<strong>en</strong>os un pin cambio de estado<br />

T0IF para TMR0, bit 2 de INTCON, si es 1 TMR0 desbordado<br />

EEIF para la EEPROM, bit 4 de EECON1, si es 1 se ha completado escritura<br />

GIE, bit 7 de INTCON, si es 1 habilita todas las interrupciones<br />

EEIE, bit 6 de INTCON, si es 1 se activa interrupciones de periféricos<br />

T0IE, bit 5 de INTCON, si es 1 int. TMR0 activada<br />

INTE, bit 4 de INTCON, si es 1 int. Externa activada<br />

RBIE, bit 3, si es 1 int. Por RB4 a RB7 activada<br />

Todos estos bits al resetearse o iniciarse el micro se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> 0.<br />

Rutina de Servicio de Interrupciones:<br />

Primero debes guardar el cont<strong>en</strong>ido del registro W, el problema de mover W a otro registro (haci<strong>en</strong>do uso de<br />

movf) es que esta instrucción corrompe la bandera Z, modificando el registro de STATUS. Según la hoja de<br />

datos otorgada por Microchip, <strong>en</strong> uno de sus apartados recomi<strong>en</strong>da una secu<strong>en</strong>cia de código que permite<br />

guardar y restaurar los registros sin modificarlos.<br />

Código<br />

1. ;**** Rutina de servicio de Interrupcion ****<br />

2. ; Guardado de registro W y STATUS.-<br />

3. Inicio_ISR<br />

4. movwf W_Temp ; Copiamos W a un registro Temporario.-<br />

5. swapf STATUS, W ;Invertimos los nibles del registro STATUS.-<br />

6. movwf STATUS_Temp ; Guardamos STATUS <strong>en</strong> un registro temporal.-<br />

Autor: Suky Mail: inf.pic.suky@live.com.ar Web: www.micros-designs.com.ar

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!