Autor Tema: Problema con interrupcion  (Leído 1754 veces)

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

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Problema con interrupcion
« en: 19 de Abril de 2008, 15:37:20 »
Porque si uso delay_ms(100) por ejemplo antes de habilitar la interrupcion externa de B0 no me funciona? en cambio si meto codigo pero no el delay si

PEgo el codigo que falla

asi funciona

void main()
   {
   int i;
    setup_timer_1( T1_INTERNAL | T1_DIV_BY_8 );  //init timer1
    enable_interrupts(INT_TIMER1);  //turn on timer1 interrupt
    setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
    ext_int_edge(H_TO_L);           //init interrupt edge triggering for B0, Active Low
    enable_interrupts(GLOBAL);
   
   set_tris_a(0x00);  //set port A&B for correct data i/o directions
   set_tris_b(0xFF);

  port_A = paro_motor[0];

    for (i=0;i<100;i++)
      {
       port_A = paso_medio[ULTIMO_ESTADO+1];
      }
    for (i=0;i<100;i++)
      {
       port_A = paso_medio[ULTIMO_ESTADO];
       }
   
   enable_interrupts(INT_EXT);     //activa la interrupcion externa de B0

asi No funciona la interrupcion
void main()
   {
   int i;
    setup_timer_1( T1_INTERNAL | T1_DIV_BY_8 );  //init timer1
    enable_interrupts(INT_TIMER1);  //turn on timer1 interrupt
    setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
    ext_int_edge(H_TO_L);           //init interrupt edge triggering for B0, Active Low
    enable_interrupts(GLOBAL);
   
   set_tris_a(0x00);  //set port A&B for correct data i/o directions
   set_tris_b(0xFF);

  port_A = paro_motor[0];

    for (i=0;i<100;i++)
      {
       port_A = paso_medio[ULTIMO_ESTADO+1];
      }
    for (i=0;i<100;i++)
      {
       port_A = paso_medio[ULTIMO_ESTADO];
       }
delay_ms(100);   
   enable_interrupts(INT_EXT);     //activa la interrupcion externa de B0
 

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema con interrupcion
« Respuesta #1 en: 19 de Abril de 2008, 15:48:42 »
Hola

Sube el programa completo por favor, incluyendo el manejo de la interrupción del timer y del cambio en b0.

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Re: Problema con interrupcion
« Respuesta #2 en: 19 de Abril de 2008, 16:04:49 »
Gracias por responder, si quieres te paso el ISIS, no lo pegue antes por no llenar espacio


// Control de motor paso a paso con un STK6713B y un pic 16F628
// Funciona con pasos completos o medios pasos
// control de I del motor en funcion de dos resistencias en el STK
// paro de motor despues de no recibir pulsos en 3 min
// Pulsos en RB0
// RB1 no se usa
// Direccion en RB2
// Bloqueo en RB3
// seleccion de Paso completo/medio RB4
// Salidas RA0-A
//         RA1-B
//         RA2-!A
//         RA3-!B

#include <16F628A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,MCLR,NOPROTECT,BROWNOUT,NOLVP
#use delay(clock=4000000)
#use fast_io(B)
#use fast_io(A)
#BYTE port_A = 5

#define dir_direccion PIN_B2
#define dir_bloqueo   PIN_B3
#define dir_paso      PIN_B4

// salidas activas con 0
// Unipolar
BYTE  ULTIMO_ESTADO=0;
// medio paso
BYTE const paso_medio[8] = {0b00000111,
                            0b00000011,
                            0b00001011,
                            0b00001001,
                            0b00001101,
                            0b00001100,
                            0b00001110,
                            0b00000110};
                               
// paso completo
BYTE const paso_completo[8] = {0b00001100,
                               0b00001100,
                               0b00000110,
                               0b00000110,
                               0b00000011,
                               0b00000011,
                               0b00001001,
                               0b00001001};
                               
                               
BYTE const paro_motor[1] = {0b11111111};
static int16 contador = 0;

// interrupcion por sobrecarga del timer
#int_timer1                       //Esta funcion es llamada cada vez que
timer_isr() {                     //timer1 sobrepasa (2^16).
    contador++;
    }

// interrupcion por cambio de B0
#INT_EXT
void step (void){
   int1 Dir;
   int1 Bloq;
   int1 Paso;
   
   Dir = input(dir_direccion);
   Bloq = input(dir_bloqueo);
   Paso = input(dir_paso);
   If(Bloq)
       break;   
   if (Dir)  // comprueba el bit de direccion B2
      {         
      if(ULTIMO_ESTADO==7)
          {
          ULTIMO_ESTADO=0;
          }
      else
          ULTIMO_ESTADO++;
      }
   else
      {
      if(ULTIMO_ESTADO==0)
         {
         ULTIMO_ESTADO=7;
         }
      else
         ULTIMO_ESTADO--;
     }
   
      if(Paso)        // si esta a 1 el pin B4 paso completo 
          port_A = paso_completo[ULTIMO_ESTADO];
      else
          port_A = paso_medio[ULTIMO_ESTADO];
     
     // resetea el contador de tiempo maximo de motor parado cada vez que llega un pulso
     contador = 0;
}

void main()
   {
   int i;
    setup_timer_1( T1_INTERNAL | T1_DIV_BY_8 );  //init timer1
    enable_interrupts(INT_TIMER1);  //turn on timer1 interrupt
    setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
    ext_int_edge(H_TO_L);           //init interrupt edge triggering for B0, Active Low
   
     enable_interrupts(GLOBAL);
   
   set_tris_a(0x00);  //set port A&B for correct data i/o directions
   set_tris_b(0xFF);
   
  port_A = paro_motor[0];
 
    for (i=0;i<100;i++)
      {
       port_A = paso_medio[ULTIMO_ESTADO+1];
      }
    for (i=0;i<100;i++)
      {
       port_A = paso_medio[ULTIMO_ESTADO];
       }
   
   enable_interrupts(INT_EXT);     //activa la interrupcion externa de B0
 
   
while(TRUE)
   {
   if(input(PIN_B3))
      port_A = paro_motor[0];
   }
  }


Tambien encuentro un problema en el funcionamiento, si el bloqueo esta puesto PIN_B3 hay pequeños pulsos de salida y no bloquea realmente, y no se porque
« Última modificación: 19 de Abril de 2008, 16:11:26 por Algec »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema con interrupcion
« Respuesta #3 en: 19 de Abril de 2008, 16:31:13 »
Hola

Te recomiendo que le des una leída a este tema

http://www.todopic.com.ar/foros/index.php?topic=21226.0

Usa la recomendación de Pocher de incluir un asm en el código de la atención a la interrupción.

Veo innecesario que pongas...

Código: [Seleccionar]
while(TRUE)
   {
   if(input(PIN_B3))
      port_A = paro_motor[0];
   }

ya que dentro del void del intrb0 lo vuelves a checar. Sólo déjalo como

Código: [Seleccionar]
while(1);
y en la interrupción pon:

Código: [Seleccionar]
If(Bloq)
{
port_A = paro_motor[0];
       break;   
}

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Re: Problema con interrupcion
« Respuesta #4 en: 19 de Abril de 2008, 16:40:08 »
Lo de replicar el paro es poque si llega el cambio del bloqueo y no ha llegado a generarse de nuevo la interrupcion el motor se queda con corriente ya que se han quedado salidas activas. Leere el post que me recomiendas y gracias de nuevo

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Re: Problema con interrupcion
« Respuesta #5 en: 19 de Abril de 2008, 16:49:32 »
Vaya ya aparecio el fallo, y no era de soft, mis disculpas, era porque me habia equivocado al poner el pic en el ISIS porque aproveche un esquema anterior que llevaba un 16F84 y al ser casi similares en esquema no lo son en funcionamiento.
Gracias de todas formas, ya funciona correctamente