Página de inicio Mi Correo






   » Foro
   » Nuevo Foro
   » Mi Correo
   » Mis Actividades...


--- Novedades ---



    
  » Microcontroladores » Interrupciones y Temporizaciones (5 de 15)  

.: Simulando la interrupción con MPLAB

Antes de comenzar con la simulación vamos a aclarar un pequeño detalle, o mejor dicho... vamos a dar respuesta a la pregunta del millón... no pensarías que te dejaría así...!!!, noooooooo...!!!

Bueno, antes de que copies el código en MPLAB e intentes ensamblarlo, lo cual seguramente te dará quinientos mil errores, debes saber que Cuando instalaste MPLAB allá en:

C:\Archivos de programa\MPLAB

Se instaló también un pequeño archivito en el mismo directorio, llamado P16F84.INC, Bien, búscalo y una vez lo tengas a mano... lo abres, que le haremos un par de modificaciones...

Te encontrarás con algo como esto...

;=================================
;
;       Register Definitions
;
;=================================

W                           EQU     H'0000'
F                            EQU     H'0001'

;----- Register Files--------------------------------------

INDF		EQU     H'0000'
TMR0		EQU     H'0001'
PCL		EQU     H'0002'
STATUS		EQU     H'0003'
FSR		EQU     H'0004'
PORTA		EQU     H'0005'
PORTB		EQU     H'0006'
EEDATA		EQU     H'0008'
EEADR		EQU     H'0009'
PCLATH		EQU     H'000A'
INTCON		EQU     H'000B'

OPTION_REG	EQU     H'0081'
TRISA		EQU     H'0085'
TRISB		EQU     H'0086'
EECON1		EQU     H'0088'
EECON2		EQU     H'0089'

Bueno, es sólo una parte del archivo P16F84.INC, éste archivo contiene los nombres de los registros con sus respectivas posiciones de memoria, aquello que nosotros veníamos indicando en cada código que íbamos escribiendo, y una que otra cosita más como los nombres de los Bit's de cada uno de los registros, y si recuerdas siempre debíamos indicar la posición 0x05 para TRISA y 0x06 para TRISB, por tanto para OPTION_REG (registro OPTION) sería 0x01, te preguntarás... porque aquí las cosas se ven totalmente distintas...???

Lo que ocurre, es que cuando pasas al banco 1... TRISA está quinto en ese banco, es decir está en la posición 0x05, lo mismo ocurre con TRISB en 0x06, y por ende OPTION_REG está en 0x01, observa ahora los bancos de la RAM de nuestro primer tutorial... y compara con lo que acabamos de ver...

Convencido...???.

El tema es que para evitar tener que definirlos, tomaremos aquello que marqué en rojo y lo cambiaremos por...


OPTION_REG           EQU     H'0001'
TRISA                     EQU     H'0005'
TRISB                     EQU     H'0006'

De ahora en más siempre que hagamos un programa será obligación colocar en el encabezado de nuestro código la siguiente línea...

#include     <P16F84.INC>

De acuerdo... Ahora guardamos los cambios, cerramos el archivo y comenzamos un nuevo proyecto en MPLAB al cual lo llamaremos INT_LED.pjt, y en él creamos int_led.asm, copias el código, lo pegas y le das a...

Project --> Build All

Y como todo está perfecto...!!! comenzaremos la simulación, te debería quedar algo así...

Simulando la Instrucción SLEEP

No te asustes por todas las ventanas abiertas, son sólo 4, y todas accesibles desde el menú Window, la primera es el código, la que está al lado es Special Function Register en la que veremos como cambian los registros, la de abajo es la ventana que nos muestra la pila o STACK y la última es la de Asynchronous Stimulus esta última se encuentra en el menú Debug --> Simulator Stimulus, cuando la abras configura Stim 1 (P) como RB0 (P), eso hará que cuando lo presionemos envíe un pulso de nivel alto por el pin RB0, al configurarlo como (P) se convierte en un pulsador, ahora sí, ya estamos listos para comenzar...

Reseteamos el Micro o presionamos F6, y te habrás ubicado en GOTO inicio, ahora ve a...

Debug --> Run --> Animate

y quedará todo como está en la imagen anterior

Aquí haremos un par de observaciones, fíjate que estas en GOTO sueño, ésta es la siguiente instrucción que se debería ejecutar, pero no lo hace ya que el micro está dormido gracias a la instrucción SLEEP, observa también que en la ventana Special Function Register todo se pintó de azul por tanto el micro se detuvo y apagó casi todo. El STACK está vacío ya que no se produjo ninguna llamada, PORTB está en 00000000, es decir que el LED está apagado (RB1=0) y no hay ninguna interrupción todavía (RB0=0), finalmente échale una mirada al registro INTCON que esta en 10010000 es decir GIE=1 e INTE=1 las interrupciones están habilitadas

Ahora viene lo bueno...

Envía un pulso por RB0 (P), y verás que la interrupción hace saltar al micro en la dirección 0x04, (no esperes ver en PORTB que RB0 se ponga a 1 ya que al configurar RB0 (P) sólo envía un pulso momentáneo el cual es difícil notar), el STACK se incrementa en una posición, y en el registro INTCON se deshabilita GIE, la bandera INTF se pone a 1, luego el micro apunta a ISR, atiende la interrupción encendiendo el LED (RB1=1), luego Borra la bandera INTF y con RETFIE vacía la pila habilitando GIE nuevamente para regresar a GOTO sueño donde ejecutará SLEEP, para dormirse y esperar a que presiones nuevamente el pulsador...

Bravooooo...!!!

Tienes mucho para entretenerte, una jugada que te pondrá de pelos...

Observa lo que harás; configura RB0 (P) como RB0 (T), resetea el micro y comienza nuevamente, la mayor sorpresa es que cuando lo presiones, RB0 se pondrá a 1 y no habrá interrupción, esto es así por que seleccionamos flanco de bajada para la interrupción en RB0/INT, aquello que hicimos en el Bit6 del registro OPTION, recuerdas eso...???, ok... entonces debería haber interrupción cuando presiones nuevamente RB0 y ya no diré más...

Bueno... sólo dejarte el circuito para que lo pruebes cuando grabes el programa en el PIC...

Esquema del circuito para la interrupción

Suerte...!!!, y a no bajar los brazos que lo probé y funciona perfectamente.

Por si te quedan dudas de como funciona el programa, realiza la simulación en modo STEP (con el botón de los zapatitos), eso debería responder a todas tus dudas...



R-Luis...

<-- Anterior   Introducción   Siguiente -->
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15
Tabla de Referencias


    
--| |--