Mis primeros programas en assembler - Micros Designs
Mis primeros programas en assembler - Micros Designs
Mis primeros programas en assembler - Micros Designs
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