TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Berto 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???
-
En lenguaje ensamblador por supuesto que sí...
-
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.
-
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
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.
-
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
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);
}
-
http://www.todopic.com.ar/foros/index.php?topic=45879.0
-
Me respondo a mi mismo Respecto a esto:
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
//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