Autor Tema: Suspender-Salir-Break una funcion por interrupcion  (Leído 1698 veces)

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

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Suspender-Salir-Break una funcion por interrupcion
« en: 07 de Febrero de 2016, 06:49:49 »
Me encuentro con el problema de que durante el curso de una funcion esta es interrunpida por INT_EXT Las dos tratan los mismos valores pero solo deben prevalecer los resultados que opero INT_EXT Una vec que se salta a la int_ext no se debe volver al punto donde salto dentro de la funcion De hecho es perjudicial altere los mismos valores que trato le interrupcion.

Se me ocurre preguntarle a la funcion si se cambio algun valor que no trato ella para que esta se rompa pero esto es muy pesado y no tiene porque coincidir el punto de reentrada con este "if" (puede ser tarde)

Luego esta el "go to" que dicen que es lo ultimo que hay que hacer

Hay alguna forma de saltarse la funcion actual despues de una interrupcion???

Desconectado vixctor

  • PIC16
  • ***
  • Mensajes: 109
Re:Suspender-Salir-Break una funcion por interrupcion
« Respuesta #1 en: 07 de Febrero de 2016, 08:16:26 »
En lenguaje ensamblador por supuesto que sí...

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re:Suspender-Salir-Break una funcion por interrupcion
« Respuesta #2 en: 07 de Febrero de 2016, 13:52:54 »
Podrías explicar mejor qué es lo que estás programando? Me suena más a una mala implementación del código que seguramente pueda ser reprogramada para funcionar sin problemas.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Suspender-Salir-Break una funcion por interrupcion
« Respuesta #3 en: 07 de Febrero de 2016, 14:31:02 »
Podrías explicar mejor qué es lo que estás programando? Me suena más a una mala implementación del código que seguramente pueda ser reprogramada para funcionar sin problemas.

Opino igual que BrunoF...

De todas formas si quisieras momentaneamente que eso no ocurra, podrias deshabilitar la interrupcion hasta que cambies completamente el valor y vuelvas a habilitarla.
Aunque va a depender que tan grande sea la funcion o que tanto tarde.

No vas a perder la interrupcion por hacer esto, sino que lo unico que vas a hacer es retrasarla. Pero no es lo ideal y lo mejor es lo que apunta BrunoF

Citar
Luego esta el "go to" que dicen que es lo ultimo que hay que hacer

En este caso no es "lo ultimo", sino que NO se debe realizar eso en una interrupcion.
« Última modificación: 07 de Febrero de 2016, 14:46:41 por KILLERJC »

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Suspender-Salir-Break una funcion por interrupcion
« Respuesta #4 en: 08 de Febrero de 2016, 20:46:56 »
Deshavilitar la interrupcion no fue bueno. Tambien utilice un pin para impedir que el otro interrumpiese nada en momento innapropiado. NO esto congela toda la accion . De todas creo que esto ya esta casi resuelto.
Podriais ayudarme en lo siguiente.
Al cabo de un tiempo todo se me traba por el spiwrite() o spiread() de SPI Aveces se recupera a base de mandar una y otra vec la imformacion ocurre:
variable1--->dato1       variable2--->dato2      variable2--->dato2       variable3--->dato3 ....lo que deberia ser
variable1--->dato2       variable2--->dato3      variable3--->dato4       variable4--->dato1 ....desconcierto
(los datos se falsean durante un momento pero vuelven a recuperarse)* otras no. Se queda totalmente noqueado dentro de esta funcion
Si se como anotar el fallo
¿pero como se desavilita el spi, y que pase de las cualquiera de las dos funciones?

Aunque exista el #in_spp y #in_spa me gusta el #int_ext porque mediante puertas con pocos pins emulo a las llamadas SS de MISO y MOSI

Esto es lo principal
 micro-sensor
Código: [Seleccionar]
void re2(){///transcurso de juego aleatorio
//re2 Se encarga de datos como enviarlos -numero posicion[distancia]-
unsigned int8 i,p;//,aa;
unsigned int16 d;
//CONVER(1);
MF=0;

output_high(PIN_C2);//RW TRUE
spi_write(nu);//numero total-de-objetivos int8
 PM();
for(i=0;nu>i;i++){//for(cx)//MANDAR--->
p=psz[i];
spi_write(p);  PM();///posicion int8 
d=dis[p];
v8=make8(d,0);///distancia INT16
spi_write(v8);  PM(); 
v8=make8(d,1);
spi_write(v8); PM();
}//for(i)
output_low(PIN_C2);//RW FALSE 
}

int1 PM() {/// protocolo de envio vajo SPI MAESTRO
delay_ms(4);//4
if(Input(PIN_C0)){ delay_ms(4); return 0; }//recivido
int8 t=0;
for(t=0;20>t;t++); { delay_ms(1);  //Impide + envios asta SLAVE lo diga con su S.pin_a0_(S.recivido) -----> E.pin_c0_MASTER(E.recivido)
if(Input(PIN_C0)){ delay_ms(2); return 1; }//recivido
}
MF++; lcd_gotoxy(33,2);   printf(lcd_putc,"MF %d ",MF); return 1;///FALLO MF++

}

Torret
nu=spi_read(); x2=1; PS();   
for(co=0;nu>co;co++){//VJ
//psz[co]=spi_read(); PS();///posicion int8
k8=spi_read(); PS();///posicion int8
v8=spi_read(); PS();//distancia INT16
v16=spi_read();
k16=v16*256+v8;//distancia int16
if(co>con){ PS(); } else {//protocolo PS(); alterado se exige mucho-tiempo-d-ejecuciones tras la ultima lectura.....
output_high(PIN_a0); delay_ms(4); output_low(PIN_a0);//6 valido
lcd_gotoxy(x2,2); printf(lcd_putc,"%u[%lu] ",k8,k16); x2+=5;
delay_ms(1);//protocolo PS(); alterado se exige mucho-tiempo-d-ejecuciones tras la ultima lectura......2 valido
if(k8>99) { x2+=2; } else { x2++; }//if(k8>9){ x2++; } }
if(k16>99) { x2+=2; } else { if(k16>9){ x2++; } else { if(k16<5){ lex++; } } }//distancia-(k16<5) objetivo alcanzo la torreta y la esta dañando lexion++;
}
psz[co]=k8; dis[k8]=k16;///..............................................
}//for(co)
lcd_gotoxy(x2,2); lcd_putc("            ");

void PS(){///protocolo de recivo vajo SPI pic2SLAVE
output_high(PIN_a0);//S.recivido=true -----> pin_c0_MASTER/E.recivido
delay_ms(5);   
//int8 tra=0;
//do{ delay_ms(1);  //Espera a k pin_c6_MASTER/S.envio=true -----> b7=true
//if (tra>15) { SF++; lcd_gotoxy(33,2);    printf(lcd_putc,"s_f %d",SF);   break; } tra++; }while(Input(!PIN_C1));
output_low(PIN_a0);
delay_ms(1);
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Suspender-Salir-Break una funcion por interrupcion
« Respuesta #6 en: 25 de Marzo de 2016, 11:06:04 »
Me respondo a mi mismo Respecto a esto:
Citar
Al cabo de un tiempo todo se me traba por el spiwrite() o spiread()
E comprobado que el Slave se queda encerrado dentro de un spiread() y no sale de aqui asta recivir otro spiwrite() del Master
esto es lo que hacia recivir el dto3 del master en el dato 2 del slave
A la hora de romper este error esto me funciona muy bien

Código: [Seleccionar]
//Teniendo en cuenta que utilizo INT_EXT para leer todos los  spiwrite() del Master
//Slave siempre activa el pin B1 de Master cada vez que es interrumpido para leer
//Si se queda atrapado en un spireat tambien se queda atrapado dentro de su INT EXT
if(Input(PIN_B1)){ //ERROR Slave no deberian estar en RS............*
      Fallo[1]++; v8=30;//30 intentos para romper INT EXT en Slave
      for(co=0;v8>co;co++){//No se comunican los new valores//PRIORIDAD es romper atasco
      output_high(PIN_A3);  delay_us(10);//RW TRUE este pin actua directamente en B0 de Slave "INT_EXT"
      spi_write(1);//No importa el valor solo pasarlo para interferir en su spi_read();
      delay_ms(4);// dalay(5) es el tiempo que utiliza normalmente Master para asegurarse que Slave lo recivio
                           //Mejor delay menor "X RW" asegura no volverse a meter en INT_EXT Si no es necesario*
      output_low(PIN_A3);//RW FALSE........RW TRUE puede volver a meterle en INT EXT sin ser necesario*
    //si no hay mas readspi(); atascados se le da + tiempo a poner su RS=0   
     delay_ms(3);//se espera un tiempo mayor a delay_ms(5) "total 4+3"
     
      if(!Input(PIN_B1)){  lcd_gotoxy(1,2); printf(lcd_putc,"BREAK %u V1-",co); delay_ms(3); break; }//rompe(for) se             //consigio Slave RS=0 consigio salir de INT EXT
      }//for(co) ERROR de COMUNICACION en Slave sige sumergido en INT_EXT
   
   //if(T1 RS=1) No se consigio rromper INT EXT con v8=30 intentos, pero no se pierde + tiempo se intentara en la prosima vuelta
      if(Input(PIN_B1)){ Fallo[3]++; lcd_gotoxy(1,2); printf(lcd_putc,"ERROR %u V1-",v8); break; }//rompe(funcion //refresco()) No la ejecutara no ara mas que desordenar los datos recividos no corresponderan en las variables correspondientes
      }

Esto va bien siempre desde proteus


 

anything