TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: madriles75 en 14 de Mayo de 2005, 07:18:00

Título: Sobre interrupciones
Publicado por: madriles75 en 14 de Mayo de 2005, 07:18:00
Hola a todos.

Estoy realizando el proyecto de fin de carrera, y trata sobre domótica. La idea es controlar varios dispositivos con un 16F876, y poder llevar un control desde un dispositivo basado en el microcontrolador, con un display y un teclado, y aparte, poder comunicarme con un programa en Visual C++ corriendo en un PC, a traves del cuál podemos controlar también nuestro dispositivo.

La pregunta es, si en el 16F876 sólo tenemos una posición de memoria para el vector de interrupción, ¿cómo hago para controlar distintas interrupciones?, en mi caso tendría que controlar la interrupción del TMR0 (para el control de tiempo) y otra interrupción para la comunicación vía línea serie. Lo único que se me ocurre es crear una subrutina que en caso de cualquier interrupción, primero identifique la causa de la misma, y después actue en consecuencia.

Ah! se me olvidaba, para realizar el proyecto he adquirido un Pic Laboratory.

Gracias.
Título: RE: Sobre interrupciones
Publicado por: adrian2a1 en 14 de Mayo de 2005, 09:06:00
El procedimiento depende del lenguaje de programación, ¿vas a trabajar en ensamblador, C, Basic, Niple, etc?, en caso de C, ¿qué compilador vas a utilizar?.

Adrian.
Título: RE: Sobre interrupciones
Publicado por: madriles75 en 15 de Mayo de 2005, 09:39:00
Estoy trabajando en ensamblador directamente. Se que se puede hacer con C, pero no tengo ni idea de que herramientas usar.
Título: RE: Sobre interrupciones
Publicado por: adrian2a1 en 15 de Mayo de 2005, 10:04:00
El microcontrolador sólo dispone de un vector de interrupción en la dirección 004h. Esto quiere decir que, sea cual sea la fuente de la interrupción, el contador de programa se carga con la dirección 004h.

Si vas a trabajar en ensamblador, dentro de la subrutina de atención a la interrupción, el programa deberá identificar la causa de la interrupción. Para ello, debe testear el estado de los flags de interrupción de cada una de las fuentes habilitadas, para deducir cual fue la que causó la interrupción y así decidir que acción tomar. En el siguiente fragmento de programa se muestra una forma de hacerlo:
Codigo:
        ..... .....
   ORG   0      ; Dirección de comienzo del programa
   goto   Inicio
   ORG   4      ; Vector de interrupción.
   goto   SevicioInterrupcion.
   …..
   Inicio
   … (Aquí iría el resto del programa principal).
   ….
; Pasa a detectar la causa de la interrupción y ejecutar la subrutina correspondiente.

ServicioInterrupcion
   btfsc   INTCON,INTF   ; ¿Interrupción por activación línea RB0/INT?
   call   Interrupcion_INT   ; Ejecuta la subrutina de atención a interrupción INT.
   btfsc   INTCON,RBIF   ; ¿Interrupción por cambio en el Puerto B?
   call   Interrupcion_RBI   ; Ejecuta la subrutina de atención a interrupción RBI.
   btfsc   INTCON,T0IF   ; ¿Interrupción por desbordamiento TMR0?
   call   Interrupcion_T0I   ; Ejecuta la subrutina de atención a interrupción T0I.
        ..... .....
   … y así con el resto de las interrupciones.


Espero te sirva, suerte.

Adrian.
Título: RE: Sobre interrupciones
Publicado por: madriles75 en 15 de Mayo de 2005, 10:19:00
Muchísimas gracias!!!! Sonrisa