TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: devilevil en 23 de Noviembre de 2006, 19:50:37

Título: Interupcion ext
Publicado por: devilevil en 23 de Noviembre de 2006, 19:50:37
hola muchachos estoy usando el siguiente programa usando intrupcion externa
es un programa sencillo
cuando ocurra la Interrupcion por RB0 debe incrementar un contador en este caso m3 y mostrarlo en al LCD y guardarlo en la eeprom

#include<16f877A.h>
#fuses hs,NOLVP,NOPUT,nowdt,noBROWNOUT
#use delay(clock=20000000)
#include<lcd420portd.c>
#INT_EXT
int m3=0;

//////////////////////////////////////////////////////MAIN/////////////////////////////////////////////////////////////////
void main(void){
   enable_interrupts(int_ext);      //activar interrupcion externa
   ext_int_edge(H_TO_L);         //configuracion:interrupcion cuando señal esta en alta
   enable_interrupts(GLOBAL);      //todas las interrupciones desactivadas
   lcd_init();                   //iniciar lcd
for(;;){
lcd_gotoxy(1,1);
printf(lcd_putc,"%u",m3);
}}
////////////////////////////////////////////////////INTERRUPCION/////////////////////////////////////////////////////////
void IntRB0()
{m3++;write_eeprom(1,m3);}


No entiendo por que no funciona, como ven me estoy guiando por medio de un ejemplo dado en este foro.
Por favor si alguien me puede ayudar a encontrar el error o simplemente a darme un codigo sencillo que funcione.
Gracias
Título: Re: Interupcion ext
Publicado por: samshiel_pic en 23 de Noviembre de 2006, 20:04:08
Hola devilevil lo primero que veo a bote pronto es que en el main no creas un bucle infinito para que el programa corra siempre y no lo haga solo una vez. Lo puedes realizar con un while ó un do while.
Ejemplo

Código: C
  1. #include<16f877A.h>
  2. #fuses hs,NOLVP,NOPUT,nowdt,noBROWNOUT
  3. #use delay(clock=20000000)
  4. #include<lcd420portd.c>
  5. #INT_EXT
  6. int m3=0;
  7.  
  8. //////////////////////////////////////////////////////MAIN/////////////////////////////////////////////////////////////////
  9. void main(void){
  10. while(1)  ///////// ESTO ES LO QUE HE AÑADIDO
  11.    {
  12.    enable_interrupts(int_ext);      //activar interrupcion externa
  13.    ext_int_edge(H_TO_L);         //configuracion:interrupcion cuando señal esta en alta
  14.    enable_interrupts(GLOBAL);      //todas las interrupciones desactivadas
  15.    lcd_init();                   //iniciar lcd
  16. for(;{
  17. lcd_gotoxy(1,1);
  18. printf(lcd_putc,"%u",m3);
  19. }}
  20.    }
  21. ////////////////////////////////////////////////////INTERRUPCION/////////////////////////////////////////////////////////
  22. void IntRB0()
  23. {m3++;write_eeprom(1,m3);}

Espero que te funcione ya que yo no lo he probado.  Ah!! otra cosa cual tipo de oscilador estas usando un cuarzo de 20Mhz??? si es asi en los fusibles tendrias que cambiar la configuracion hs.
Título: Re: Interupcion ext
Publicado por: Azicuetano en 24 de Noviembre de 2006, 05:19:14
Hola Devilevil!

He modificado un poco el programa:

Código: [Seleccionar]
#include<16f877A.h>
#fuses hs,NOLVP,NOPUT,nowdt,noBROWNOUT
#use delay(clock=20000000)
#include<lcd420portd.c>

int m3=0;

////////////////////////////////////////////////////INTERRUPCION/////////////////////////////////////////////////////////

#int_ext
void int_ext_isr(void)
{
   m3++;
   write_eeprom(1,m3);
}

//////////////////////////////////////////////////////MAIN/////////////////////////////////////////////////////////////////
void main(void)
{
   enable_interrupts(int_ext);      //activar interrupcion externa
   ext_int_edge(H_TO_L);         //configuracion:interrupcion cuando señal esta en alta
   enable_interrupts(GLOBAL);      //todas las interrupciones desactivadas
   lcd_init();                   //iniciar lcd

   while(1)
   {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"%u",m3);
   }
}

No lo he probado pero... esto sería lo primero que yo haría.


Un saludo desde Alicante.
Título: Re: Interupcion ext
Publicado por: vszener en 24 de Noviembre de 2006, 12:05:31
Vamos a ver, la porción de código:
Código: C
  1. #INT_EXT
declara donde debe ir la interrupción externa, por lo tanto la función de dicha interrupción externa debe ir a continuación de dicha linea de código.

El programa propuesto por Azicuetano es el correcto, aunque si en vez de querer declarar una variable global la quieres local dentro de la función de interrupción, debes declararla como static.


Suerte!!! ;)