Autor Tema: Mo me funcionan las interrupciones  (Leído 2530 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Mo me funcionan las interrupciones
« en: 01 de Noviembre de 2005, 15:42:00 »
Hola al foro. LLevo varios dias intentando hacer que me funcionen bien las interrupciones. Al final he llegado al programa mas simple, pero no se por que no funciona. LLevo mas de una semana dandole vueltas y nada. El código es:

#include <16F84.h>
#fuses NOWDT,RC, NOPUT, NOPROTECT
#use delay(clock=4000000)

int nInd;
BOOLEAN lInterrupt;

#int_RB
RB_isr()
{
   nInd++;
   lInterrupt = TRUE;
}

void main() {

   nInd = 0;
   lInterrupt = FALSE;

   set_tris_a(0x0);     // Todo salidas
   set_tris_b(0xFF);    // Todo entradas
   output_a(0xFF);

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);

   while(true)
      {
      if (lInterrupt==TRUE)
         {
         output_a(nInd);
         lInterrupt = FALSE;
         }
      }

}

tambien dejo el fichero adjunto con el fuente, el hex y una simulacion en proteus.

Otra pregunta, he estado buscando un ejemplo de un esclavo para bus i2c implementado en un 16F84 y no lo he encontrado, es que no se puede implementar?.

Gracias por vuestro tiempo y un saludo.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Mo me funcionan las interrupciones
« Respuesta #1 en: 02 de Noviembre de 2005, 05:57:00 »
Buenas!!!bien primero prueba a cambiar el nombre de la variable esta lInterrupt; ya que el caracter | no se si vale para ponerlo como un nombre de una variable...para implementar un bus i2c mira e la libreria del CCS haber si esta dicha libreria creada para el dispositivo a tratar por lo que si esta simplemente tendras que definir los pines SDA  y SCL si no esta dicho dispositivo en las librerias definido pues tendras que especificar los pines y la funcion manualmente asi
#use i2c(master, sda=pin a usar, scl=pin a usar)
Suerte!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
RE: Mo me funcionan las interrupciones
« Respuesta #2 en: 02 de Noviembre de 2005, 07:59:00 »
Gracias por tu contestación. En primer lugar el signo l es una "l" minúscula, es una vieja costumbre mia de programación empezar todas las variables por la letra del tipo que es (en este caso lógica), por lo tanto no tiene ningun problema par definir el nombre de la variable. En segundo lugar mi idea es implementar un bus i2c en un micro que no lo posea, bien para poder utilizar este micro como adaptador de bus y programarle a mi gusto o para poder implementar un doble bus en un micro que posea uno solo. Sigo investigando, pero parece ser que la implementación de la interrupción del cambio de nivel en el puerto B no esta bien implementada en Proteus y da muchos fallos.

Un saludo al grupo.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
RE: Mo me funcionan las interrupciones
« Respuesta #3 en: 03 de Noviembre de 2005, 12:10:00 »
Bueno por fin esta localizado el fallo, como siempre de programación o de no leer los datasheet con suficiente detenimiento. Al grano, el datasheet dice lo siguiente de la interrupción por nivel del puerto "B":

This interrupt can wake the device from SLEEP. The
user, in the Interrupt Service Routine, can clear the
interrupt in the following manner:
a) Any read or write of PORTB. This will end the
mismatch condition.
b) Clear flag bit RBIF.
A mismatch condition will continue to set flag bit RBIF.
Reading PORTB will end the mismatch condition and
allow flag bit RBIF to be cleared.

O lo que es lo mismo en cristiano para tratar esta interrupción a la hora de salir debemos en primer lugar "leer" o "escribir" el puerto b para que los lacht"s se refresquen y en segundo lugar borrar la bandera de la interrupción. Si no se lee o escribe anter de salir de la interrupción la bandera de la interrupcion se volvera a activar anque la desactive ya quelos valores del puerto antiguos y nuevos son distintos.

Cuando programamos con el CCS borra la bandera pero no actualiza los latch"s y lo que tenemos que añadir antes de salir de la interrupción es tan sencillo como:

#asm movf PORTB,0 #endasm

Espero que todos aquellos que tienen problemas con la interrupcion por nivel como las que yo tenia se solucionen.

Un saludo al foro.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús