Autor Tema: Luchando contra el ruido POR SOFTWARE  (Leído 83346 veces)

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

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 134
Re:Luchando contra el ruido POR SOFTWARE
« Respuesta #135 en: 08 de Noviembre de 2015, 09:59:55 »
Pues parece que van saliendo problemas de software :oops:

La funcion de LCD_Linea1 la llamo siempre desde el banco 0, por ahi creo que no va a tener problema, pero el TRISD ya es diferente...

Mi placa se conecta al LCD utilizando RD4~RD7 como bus de datos (4bits).
El pin E va al RD2, el RS va al RD0 y el Pin R/W va al RD1. En efecto, la parte baja del TRISD la utilizo para el control del LCD. :shock:

Escuchando tu explicacion esto puede dar problemas.
Pero, precisamente para no alterar el puerto D pense que funcionaba esta parte:

;       movf           TRISD,W     
;       banksel       PORTD
;       movwf        LCD_GuardaTRISD

conservando el dato en un registro (LCD_GuardaTRISD), para al final de la rutina volver a restaurarlo;

;       movf           LCD_GuardaTRISD,W   
;       banksel       TRISD
;       movwf        TRISD     

Pense que de esta manera el TRISD del principio de la rutina y al final de la misma no ha variado y no provocaria problemas?   
Como he dicho todavia soy novato en esto y noto algo raro pero no acabo de ver el error...


- Tenes una instruccion sin sentido:

   btfss   LCD_PinRS   


Cierto, esta instruccion no tiene sentido y esta utlizando linea de codigo sin sentido. Borrada.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7390
Re:Luchando contra el ruido POR SOFTWARE
« Respuesta #136 en: 08 de Noviembre de 2015, 10:24:12 »
Yo tengo mis ciertas dudas, pero voy a intentar explicar como creo yo que funcionaria. Voy a hacer un ejemplo

PORTD = 0b0100 1010
TRISD = 0b0000 0000

Vos guardas el PORTD y cambias los bits de datos

PORTD = 0b0100 1010
Guardado = 0b1100 1010
TRISD = 0b0000 0000

Luego cambias el TRISD a entrada y escribis el PORTD

TRISD = 0b0000 1111
Escribo el PORTD
PORTD = 0x1100 xxxx

Esas x es por que no puedo modificarlas (son entradas, el valor depende del pin), ya que esos valores dependen exclusivamente de la entrada , y ahora estan flotando, no estan ni a 0 ni a 1.  A no ser que tengas un pull-up / pull-down externo O tal ves lo posea el puerto. Supongamos que el puerto tiene pull-up activado, como esos pines son entradas al LCD, el LCD no va a presentar tension alli, tendrias un 1.

PORTD = 0b1100 1111           // Lo tuyo mas lo leido por ser entradas
Ahora vuelvo el TRISD como estaba antes
TRISD = 0b0000 0000

Y PORTD como queda? queda con los valores que grabaste antes ? con los valores guardados ? o queda con los valores de la entrada? Creo que esta ultima suposicion seria para mi la correcta. Ya que la entrada afecta al PORTD. Quedandote al final.

PORTD = 0b1100 1111

Ese es el unico error que suponia.  La unica forma de haber realizado lo que hiciste es por si tenia que leer el LCD, lo que no creo que hagas por que usas un delay para esperar que termine de procesarse la instruccion o dato. Ni estas leyendo una entrada. Por eso pense que eso esta demas.
Si no lo ponias era algo tan simple como esto:

PORTD = 0b0100 1010  //Original
TRISD = 0b0000 0000  // Original
-------
Guardado = 0b1100 1010  // AND + OR, solo cambian el nibble superior
-------
PORTD = 0b1100 1010  // Paso al PORTD

Los bits de control no varian para nada y se cambio el valor de PORTD sin problemas.

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 134
Re:Luchando contra el ruido POR SOFTWARE
« Respuesta #137 en: 08 de Noviembre de 2015, 21:36:10 »
Hummm, creo que empiezo a ver lo que quieres decir.

Como ya te escrito todavia no soy mas que un novato y mirando mi codigo seguro que hay mas sitios que un profesional escribiria de otra manera.
Poco a poco ire estudiando y repasando, no solo esta parte, sino el codigo en general.

De todas maneras, y a riesgo de ponerme pesado, si el problema saliera de esta secuencia, porque se descubre ahora?
No tendria que salir mucho antes?. Sigo pensando que hay otro factor que hace fallar al PIC.....

El miercoles cuando vaya espero llegar a alguna conclusion



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7390
Re:Luchando contra el ruido POR SOFTWARE
« Respuesta #138 en: 08 de Noviembre de 2015, 23:23:19 »
Si y es lo raro, puede llegar a ser la placa, o tal ves el LCD. Realmente puede ser algo unico a eso. Yo te comento el posible error, deberia haber podido simularlo para ver si exactamente lo que comento ocurre. Tambien depende de que si tu programa a medida que pasa el tiempo tal ves modifica algo sin querer. Todo es posible xD

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 134
Re:Luchando contra el ruido POR SOFTWARE
« Respuesta #139 en: 13 de Noviembre de 2015, 00:37:14 »
Bueno, pues encontre el problema y no era el ruido.

Llegue ante la placa del problema. El ambiente no era, para nada, ruidoso. He estado en sitios mucho peores que este.
Encendi la maquina y sin pasar 5 minutos las letras empezaron a moverse y a cambiar (algo diferente de lo que me habian explicado por telefono).
Lo probe varias veces y siempre salia el mismo problema cambiando los tiempos: a veces unos 5 minutos otras unos 3 y a veces mas de 7 u 8 minutos. Lo
del tiempo al que salia el fallo no era fijo.

Medi con el tester y luego con el oscilo la entrada de 5V. Limpia.
Cambie el cable entre el LCD y la placa por uno mas corto. Sigue saliendo el problema.
Cambie el LCD.....y se arreglo!!!. Estuvo mas de 40 minutos sin salir el fallo.
Volvi a conectar el LCD sospechoso y zas!. A los pocos minutos salio el mismo problema.

Cambie el LCD y despues de comprobar otra vez que no salia el fallo durante mas de 1 hora, me volvi.

Al llegar al laboratorio y probar el LCD ni siquiera sale nada desde el principio. Esta totalmente muerto.

Ahora me preocupa como se ha estropeado el LCD (se prueban todos los montajes antes de salir al cliente y este no tenia problema) pero, de momento, creo que puedo respirar durante un tiempo.

Gracias por la ayuda y los consejos. He aprendido bastante.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7390
Re:Luchando contra el ruido POR SOFTWARE
« Respuesta #140 en: 13 de Noviembre de 2015, 01:11:41 »
Bueno por lo menos era eso, asi que te salvaste xD..

Desconectado bluesboy

  • PIC12
  • **
  • Mensajes: 67
Re:Luchando contra el ruido POR SOFTWARE
« Respuesta #141 en: 01 de Diciembre de 2015, 10:16:00 »
Les cuento, tal vez a alguno le sirva. Si es redundante o no sirve, le dejo al moderador la posibilidad de borrarlo o lo que le parezca.
Debo contarles del hardware primero.
Mucha de esta info esta en un link que saque de esta web que pueden buscar en google: pongan Ruidos MCUs. RECOMIENDO FUERTEMENTE LEERLO.
Hay extras de mi parte.

La mayoría de los problemas que tengo en mis aplicaciones son por bajas de tensión. El equipo, con su pic, esta siendo usado para automatizar o controlar alguna máquina y en gral esas máquinas tienen motores.
Algunos de mis clientes tienen instalaciones no calculadas, con lo cual, cuando sus motores se encienden, su cableado funciona como una gran resistencia, bajando la tensión, y dependiendo de como sea ese bajón, el equipo actua raro. Muy, pero muy pocas veces se resetea, les diria que me paso una vez sola, pero si pasa que actua erráticamente, por ej si esta contando piezas, cuenta una de mas.
Otras veces, usan motores de carbones. Una fuente de ruido perfecta, una porquería.

Bue, que hago: Por hard, una fuente lo mas filtrada posible. Viniendo desde la alterna:  fusible, varistor, filtro con dos capacitores 0,047uF y dos choque rf de 1 mHy, trafo, después del trafo capacitor de filtro 2200uF, luego 100 nF, luego choque rf 1mHy, capacitor 1500uF, regulador con 0,33uf entre In y masa y 0,1uf entre out y masa (ambos soldados directamente en las patas del regulador).
Si la aplicaión es crítica, por ej a veces tengo que contar tiempos con precisión, después del regulador y antes de alimentar al micro pongo un capacitor de 1 F (un faradio).
Entre las patas del micro, entre V+ y masa, un capacitor de bypas, en mi caso, como manejo 4 Mhz habitualmente, uso un capacitor de 33 nF, Todos los capacitores son muticapa.
Y todo esto con una salida a un borne para poner masa a tierra (una puesta a tierra como corresponde. Exclusiva, no quiero fallas de otras máquinas dañando mis equipos). Cuando hay mucho ruido, blindo todo y a masa).
Tengan en cuenta usar placas de fibra de vidrio si usan frecuencias de mas de 4 Mhz.

Por soft, como mis problemas son por baja tensión, picos de baja tensión, tengo un transistor polarizado de forma tal que cuando la tensión baja a 4V, la de alimentación, le manda un 1 a una patita del micro y eso hace que grabe todos los estados que me interesan en la eeprom. Entonces, cuando arranca el programa, lee esos estados y vuelve a empezar. Si al transistor se le da un buen ¨zapatazo¨ de corriente (sin quemarlo, pero sin escatimar) tiene velocidades de 100 Mhz, y eso usando uno común, BC327 o 337.
Para evitar que grabe datos sin sentido cuando se apaga la máquina, hay que poner un boton de ¨puesta a cero¨ para incializar. También se puede hacer que esto se haga solo con una mezacla de soft y hard. Depende del presupuesto del cliente.
Es molesto, pero es lo único que me ha servido para evitar el problema de los cortes de luz.

En otras ocasiones, para evitar ruido, si me da la velocidad, hago demoras en las entradas de los sensores, de forma tal que el dato entregado por el sensor este siendo ¨sensado¨ durante x cantidad de tiempo. Si el tiempo esta ok, entonces ese dato vale, sino, es ruido.
Un capacitor en la entrada de sensores en ambientes ruidosos colabora mucho.

Saludos.

Desconectado bluesboy

  • PIC12
  • **
  • Mensajes: 67
Re:Luchando contra el ruido POR SOFTWARE
« Respuesta #142 en: 01 de Diciembre de 2015, 10:44:15 »
Me acordé de algo que tal vez pueda servir.
Antés, usaba relés para encender y apagar cargas en 220V, y aunque les agregaba una red snuber, igual metían ruido.
Lo solucione usando: Para continua, transistores.
                                   Para alterna, optotriac + triac y de ahí (fusible mediante) a la bobina de un contactor.

Se acabaron los ruidos por prender y apagar cosas.
Saludos.

Desconectado proteus

  • PIC10
  • *
  • Mensajes: 28
Re:Luchando contra el ruido POR SOFTWARE
« Respuesta #143 en: 24 de Marzo de 2016, 03:14:26 »
Hola, muy interesante el hilo, Yo considero que lo principal es eliminar el ruido desde la fuente de este (voy a buscar información para compartir), para mí, el 99% de los problemas de ruido radican en el hardware, si allí no se ha solucionado, será practicamente imposible hacerlo por software.

Algo que acostumbro a hacer, es usar el WDT, pero cambio los tiempos de acuerdo a los procesos que se ejecutan, por ejemplo:

 setup_wdt(WDT_ON);
 setup_wdt(WDT_64S);      //~64 s reset

 do
 {
  printf("AT+CREG?");
  putc(0x0D); 
  Fin_comando=0;
  while(Fin_comando==0);
  procesa_comando();
 }while(Resp!=3);
restart_wdt();
 setup_wdt(WDT_4S);      //~4 s reset

 restart_wdt();
 do
 {
  printf("AT");
  putc(0x0D); 
  Fin_comando=0;
  while(Fin_comando==0);
  procesa_comando();
 }while(Resp!=2);
setup_wdt(WDT_OFF);
 printf("ATD>AD1;");
 putc(0x0D);
 do
 {
  Fin_comando=0;
  while(Fin_comando==0);
  procesa_comando();
 }while(Resp!=2);

Esto es una parte de un código para realizar una comunicación con un modem GPRS y hacer una llamada  :mrgreen:

En otros casos, además de esto, he colocado contadores dentro del proceso, así, en caso de que la rutina se haya realizado muchas veces, se sale de allí y regresa a un punto de control.

Como estoy con el PC recien formateado, debo buscar todo en el disco con la copia de seguridad, pero quedo pendiente de subir la información y de colocar el código que explique el segundo truco.

Gracias a todos!


 

anything