Autor Tema: deshabilitar interrupción externa.  (Leído 1641 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
deshabilitar interrupción externa.
« en: 11 de Septiembre de 2012, 15:36:25 »
Hola a todos. Tengo un problema con la interrupción externa por RB0. Lo que quiero realizar es que cuando se termine de ejecutar la interrupción por RB0 la misma sea deshabilitada, y luego habilitarla cuando yo lo desea. Lo que hice fue poner al final de la rutina de la interrupcion la instrución para desabilitarla, pero funciona muy mal.. la pila de desborda y no entiendo por que.. no puedo descubrir por que hace eso...


#include <16f882.h>
#device adc=10
#fuses xt,MCLR,nowdt,noput,nobrownout,nolvp,noprotect
#use delay(clock=4000000)

#use STANDARD_IO(B)

int16 TFB;                        // Tiempo flanco de bajada
float AP,AP1;                     // Valor final del ancho de pulso
int nuevopulso=0;                  // Entra otro pulso
int cambio=0;                     // Cambio de flanco de disparo

#define _FLEX_LCD
#define LCD_DB4   PIN_C0
#define LCD_DB5   PIN_C1
#define LCD_DB6   PIN_C2
#define LCD_DB7   PIN_C3   

#define LCD_RS    PIN_C4
#define LCD_RW    PIN_C5
#define LCD_E     PIN_C6


#include "flex_lcd.c"

#int_ext
void funcion_ext_int(){                //Función Interrupción
  if(cambio==0){                       // Flanco de Subida
    set_timer1(0);                     //Inicializa TMR1
//  ext_int_edge(0,H_TO_L);            // Configurar para flanco bajada
    cambio=1;                          // Control de cambio de flanco
  } else {                             // Flanco de Bajada
    TFB=get_timer1();                  //Valor del Timer1 para el Flanco de bajada
    ext_int_edge(0,L_TO_H);            //Configurar para flanco subida
    cambio=0;                          //Control de cambio de flanco
    if(nuevopulso==0){                 //Fin de pulso...
      nuevopulso=1;                    //Pulso a calcular

disable_interrupts(int_ext);
   }
  }
}

void main() {
  lcd_init();
  setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); // Configuración TIMER1
  ext_int_edge(0,L_TO_H);                   // Configurar para flanco subida
  cambio = 0;                             // Control de cambio de flanco
  enable_interrupts(int_ext);             //Habilitación interrupción RB0
  enable_interrupts(global);              //Habilitación general
  do {
    if(nuevopulso==1){                     // ¿Pulso nuevo?
   
   AP =  (TFB*0.000001);                    // Ancho de pulso en microsegundos de Timer1…
                                           // a 4MHZ el T=1us*Timer1
    AP1= 1/AP;   
   printf(lcd_putc,"\f%4.0f         ", AP1);   //Visualiza medida en LCD

      nuevopulso=0;             //Pulso medido
ext_int_edge(0,L_TO_H);
enable_interrupts(int_ext);
}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: deshabilitar interrupción externa.
« Respuesta #1 en: 11 de Septiembre de 2012, 18:35:00 »
Así estaría bien  :undecided: revisaste el ASM que te genera como para determinar porque se desborda la pila?
No contesto mensajes privados, las consultas en el foro

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: deshabilitar interrupción externa.
« Respuesta #2 en: 11 de Septiembre de 2012, 19:56:34 »
Ok. Yo pensé que no se podía deshabilitar una interrupción dentro de la misma rutina. El tema es que la interrupción se ejecuta muy rápido... y necesito que se corra todo el programa al menos una ves antes de la próxima interrupción. Voy a seguir buscando y no revise el ASM... lo simulo con el proteus y no funciona, en la proto menos.. jaa

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: deshabilitar interrupción externa.
« Respuesta #3 en: 11 de Septiembre de 2012, 20:14:16 »
Deshabilitar la interrupción dentro de la misma no es un problema, el algoritmo puede estar errado. Que intentas hacer?
No contesto mensajes privados, las consultas en el foro

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: deshabilitar interrupción externa.
« Respuesta #4 en: 12 de Septiembre de 2012, 14:17:41 »
Esa interrupción me controla la salida de un sensor inductivo. Es para hacer un tacometro para mi moto, hace tiempo que lo quiero hacer. Entonces con la interrupción externa  detecto dos flancos de subida, así determino el periodo. Cuando está a altas revoluciones, el periodo es de ponele 20 uS. Entonces si no deshabilito la interrupción, no me da el tiempo para correr el resto del programa y se arma quilombo...  No se si me explico?

Pdta: Ahora que tengo tiempo estoy a full.. jaa  :D También estoy modificando la libreria del teclado 4x4 y tengo algunas dudas que no puede encontrar en mis libros ni en la red...  :oops: :oops: :oops: Que significa esta sentencia??   kbd=~COL3&ALL_PINS; yo se que & es una "and" pero "=~" y esta... "&~".  Y esto #define ROW0 (1 << 7)??? Donde aprendo C avanzado..... jaaaaa  :5] :5]

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: deshabilitar interrupción externa.
« Respuesta #5 en: 12 de Septiembre de 2012, 14:46:26 »
Para estudiar sobre el tema:

Busca:
operadores a nivel de bits
~ operador complemento
& operador and
También precedencia de operadores.  Por esto =&

Y directivas de preprocesador por lo de #define

Como libro de consulta el libro El-lenguaje-de-programación-c-
de kernighan & Ritchie
En el tutorial de suky hay ejemplos.
Saludos.
       Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: deshabilitar interrupción externa.
« Respuesta #6 en: 12 de Septiembre de 2012, 14:56:45 »
Respecto al tacometro, si quieres contar pulsos podes hacerlo con el CCP, para eso la interrupción externa no sirve.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: deshabilitar interrupción externa.
« Respuesta #7 en: 13 de Septiembre de 2012, 10:06:20 »
Gracias  suky. Lo voy a probar!!!   ((:-))


 

anything