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

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5427
    • Picmania by Redraven
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #15 en: 12 de Septiembre de 2007, 17:41:28 »
En efecto, en todos los PIC's en que he probado esto hasta ahora se dá ese efecto, tras un Reset, MCLR a masa, la RAM queda intacta con todos los valores que tenía anteriormente (16F628, 16F777, 16F876, 18F2550 y 18F4550)

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5102
    • uControl
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #16 en: 12 de Septiembre de 2007, 17:55:26 »
Hola amigos!
Es posible que no exista una rutina de "sobreescribir toda la ram con...." cada vez que se hace un RESET, tal como ha comprobado Diego. De hecho, es algo que tomaria algun tiempo hacer....demorando el reinicio del programa.

Esto es algo bastante similar (o al menos yo lo encuentro parecido) a lo que ocurre al eliminar un archivo en DOS : el fichero aparece como borrado, pero solo se elimino su entrada en la FAT, los datos siguen donde estaban, y no se perdio tiempo borrandolos fisicamente.

Esta muy buena la idea de aprovechar esta caracteristica, que seguramente no esta siquiera documentada... :)

Saludos!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #17 en: 12 de Septiembre de 2007, 19:31:37 »
En efecto, en todos los PIC's en que he probado esto hasta ahora se dá ese efecto, tras un Reset, MCLR a masa, la RAM queda intacta con todos los valores que tenía anteriormente (16F628, 16F777, 16F876, 18F2550 y 18F4550)

Excelente dato para tenerlo muy en cuenta.


Un saludo desde Alicante.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3594
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #18 en: 12 de Septiembre de 2007, 21:10:22 »
Esta técnica (la recuperación de una máquina despues de un apagado) es algo que se hace desde hace mucho tiempo en los sistemas microprocesados, se conoce como arranque en caliente (se mantienen los datos) o arranque en frio (se inicializa la máquina). Es muy conveniente realizar un checksum de la memoria en el momento del arranque y si los datos no son coherentes realizar una arranque en frio, en caso contrario realizar el arranque en caliente.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3574
    • Juntos es mejor
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #19 en: 12 de Septiembre de 2007, 21:43:15 »
Yo siempre Uso el WDT, En muchos equipos que diseñaba antes, cualquier problemita en la RED generaba que el PIC se enlocara y saliera de si bucle principal de Funcionamiento. Y si tenia pantalla LCD, salian caracteresa raros y eso. Al final WDT, es la solucion para cuando ocurren ese tipo de cosas.


Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #20 en: 12 de Septiembre de 2007, 23:12:02 »
 Hasta ahora el único problema que tuve con el ruido ha sido en la entrada de un lm35 al ADC del micro con un par de metros de cable mallado, aún así se metía ruido y la lectura en el display era fluctuante, incluso el último dígito variaba tanto que no se podía leer. Esto lo solucioné por soft, no es el método de sacar promedio, es  un poco menos elegante pero mucho más fácil de programar y me ha dado buenos resultados. Es un filtro pasa bajos por soft.
 Lo que hice es tomar el valor mostrado en el display, guardarlo en un registro y compararlo con los valores siguientes que me vá entregando el adc, tengo dos contadores que voy decrementando según sea el valor del adc, un contador para los valores que son mayores y el otro para los menores, si es mayor que el valor del display decremento uno y reseteo el otro, y viceversa.
si alguno de de los contadores llegó a cero es porque hubo 25 mediciones seguidas que fueron mayores, ó 25 mediciones seguidas que fueron menores, eso quiere decir que la variación es real y actualizo el display y aparte trabajo con ese valor nuevo para la toma de deciciones.
 Al valor inicial de los contadores lo elegí en 25 empíricamente, fuí probando lo más conveniente para mi proyecto, ya que un valor mayor me mostraba saltos entre cada temperatura y un valor menor ya no era tan eficaz en el filtrado, osea que aún se veía alguna fluctuación.
espero les sirva y perdón por ser tan extenso.
« Última modificación: 12 de Septiembre de 2007, 23:21:25 por flacoclau »
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5427
    • Picmania by Redraven
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #21 en: 13 de Septiembre de 2007, 01:57:21 »

Esta muy buena la idea de aprovechar esta caracteristica, que seguramente no esta siquiera documentada... :)


No solo no está documentada sino que me volvió loco hasta que descubrí que valores que yo asumía como ceros tenían un valor distinto tras un reset (Nota importante: ¡Que no implicase un corte total de la alimentación!)

Lo peor eran los flags activados: Mi programa empezaba de nuevo con algun flag a 1, indicador de que algún evento había ocurrido,  cuando era absolutamente falso ya que el evento había ocurrido antes del reset y el programa estaba construido para comenzar suponiendo que todos los flags estaban a cero.

Solución: La primera linea de mi main() comienza siempre con una llamada a una función denonminada on_reset() donde pongo explícitamente los valores que deben tener todas las variables al inicio de la ejecución del programa, sea cual sea el valor que tuviesen anteriormente. Una variable no inicializada en esta sección podría servirme para pasar mensajes desde antes hasta después de un reset (que no sea por corte de alimentacion)

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5102
    • uControl
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #22 en: 13 de Septiembre de 2007, 07:29:55 »
Hola Diego!

Si Bill Gates fuese el dueño de Microchip, toma este bug, lo documenta, y lo transforma en una de las ventajas del "nuevo core PIC version xxx.yyy" :) :) :)

Me imagino por las que has pasado.

Saludos!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5427
    • Picmania by Redraven
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #23 en: 13 de Septiembre de 2007, 09:11:56 »
Si, Ariel, y especialmente a mi que mis main() son un compendio de flag's en cascada ... imáginate un reset con todos esos flag's  LFADN (Los Flag's Locos Atacan De Nuevo)

Ejemplo de un main() que es puro flag (he quitado lo que cada flag dispara) ...

Código: C++
  1. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // M A I N
  4. //
  5. ///////////////////////////////////////////////////////////////////////////////////////////////////
  6.  
  7. void main(void){
  8.  
  9.  
  10. main_on_reset:
  11.  
  12.    main_on_reset();
  13.  
  14.    do{
  15.  
  16.       /////////////////////////////////////////////////////////////////////////////////////////////
  17.       //
  18.       // Registra estado de Entradas Digitales
  19.       //
  20.       /////////////////////////////////////////////////////////////////////////////////////////////
  21.  
  22.       task_registry_digital_sensors();
  23.       // Si hay cambio estable en STATUS ...
  24.       if(flag_change_STATUS_stable==1){
  25.          flag_change_STATUS_stable=0;
  26.          ...
  27.       }
  28.       /////////////////////////////////////////////////////////////////////////////////////////////
  29.       //
  30.       // Detecta y Ejecuta la necesidad de Realizar un Reset por Software
  31.       // realizando la secuencia normal implementada en main_on_reset()
  32.       //
  33.       /////////////////////////////////////////////////////////////////////////////////////////////
  34.       if(flag_force_Reset==1){
  35.       ...
  36.       }
  37.       /////////////////////////////////////////////////////////////////////////////////////////////
  38.       //
  39.       // Detecta y Ejecuta la necesidad de Actualizar el Firmware mediante el Bootloader
  40.       // Escribe la marca de EEINT_Device_Status_Firmware en la EEPROM interna y ejecuta el bootloader.
  41.       //
  42.       /////////////////////////////////////////////////////////////////////////////////////////////
  43.       if(flag_force_Boot==1){
  44.        ...
  45.       }
  46.       /////////////////////////////////////////////////////////////////////////////////////////////
  47.       //
  48.       // Detecta necesidad de procesar el buffer USART
  49.       // y lo procesa en la rutina correspondiente.
  50.       //
  51.       /////////////////////////////////////////////////////////////////////////////////////////////
  52.       if(flag_recUSARTComplete==1 or flag_USART_Time_Out_Error==1){
  53.          // Filtra recepcion por canal RS485
  54.          if(flag_RS485_reception_active==1){
  55.             flag_RS485_reception_active=0;
  56.             .....
  57.          }
  58.          else ...
  59.       }
  60.       /////////////////////////////////////////////////////////////////////////////////////////////
  61.       //
  62.       // Detecta necesidad de desactivar alguno de los Relés
  63.       // desactiva el rele y el flag correspondiente.
  64.       //
  65.       /////////////////////////////////////////////////////////////////////////////////////////////
  66.       if(flag_RELAY_1_elapsed==1){
  67.          flag_RELAY_1_elapsed=0;
  68.          ...
  69.       }
  70.       if(flag_RELAY_2_elapsed==1){
  71.          flag_RELAY_2_elapsed=0;
  72.          ...
  73.       }
  74.       /////////////////////////////////////////////////////////////////////////////////////////////
  75.       //
  76.       // Detecta Lectura Completa en HEAD1 o timeout de <XRHEAD,1,...>
  77.       // transmite y/o registra y desactiva el flag
  78.       //
  79.       /////////////////////////////////////////////////////////////////////////////////////////////
  80.       // Si lectura completa de HEAD1
  81.       if(flag_Head1_Read_Complete==1 OR flag_RHEAD1_timeout==1){
  82.          flag_Head1_Read_Complete=0;
  83.          // si no acaba de realizarse una conmutacion set_to_i2c_channel()
  84.          if(flag_after_CD4053_Comnutation==1){
  85.             flag_after_CD4053_Comnutation=0;
  86.             ...
  87.          }
  88.          else{
  89.             // Realizo las tareas necesarias tras una lectura completa de HEAD1.
  90.             ...
  91.          }
  92.       }
  93.       // Si lectura completa de HEAD2
  94.       if(flag_Head2_Read_Complete==1 OR flag_RHEAD2_timeout==1){
  95.          flag_Head2_Read_Complete=0;
  96.          // Realizo las tareas necesarias tras una lectura completa de HEAD2.
  97.          ...
  98.       }
  99.       /////////////////////////////////////////////////////////////////////////////////////////////
  100.       //
  101.       // Detecta timeout por ausencia de respuesta del Server
  102.       //
  103.       /////////////////////////////////////////////////////////////////////////////////////////////
  104.       // No hay <RQUERY> o respuesta <XRQST,1...> para >DQRST,1...>
  105.       if(flag_REQUEST_timeout1==1){
  106.          flag_REQUEST_timeout1=0;
  107.          flag_REQUEST_Pending1=0;
  108.          // No recibo a tiempo <RQUERY> o <XRQST> No hay Polling y estoy en alguno de los modos que lo requieren.
  109.          ...
  110.       }
  111.       // No hay <RQUERY> o respuesta <XRQST,2...> para >DQRST,2...>
  112.       if(flag_REQUEST_timeout2==1){
  113.          flag_REQUEST_timeout2=0;
  114.          flag_REQUEST_Pending2=0;
  115.          // No recibo a tiempo <RQUERY> o <XRQST> No hay Polling y estoy en alguno de los modos que lo requieren.
  116.          ...
  117.       }
  118.       /////////////////////////////////////////////////////////////////////////////////////////////
  119.       //
  120.       // Detecta timeout por ausencia de respuesta del Canal RS485
  121.       //
  122.       /////////////////////////////////////////////////////////////////////////////////////////////
  123.       if(flag_RS485_elapsed==1){
  124.          flag_RS485_elapsed=0;
  125.          ...
  126.       }
  127.       /////////////////////////////////////////////////////////////////////////////////////////////
  128.       //
  129.       // Detecta Segnal de Card Present en Cabezal 1 o Cabezal 2
  130.       // y ...
  131.       //
  132.       /////////////////////////////////////////////////////////////////////////////////////////////
  133.       if(flag_RHEAD1_Card_Present==1 OR flag_RHEAD2_Card_Present==1){
  134.          ...
  135.       }
  136.       /////////////////////////////////////////////////////////////////////////////////////////////
  137.  
  138.  
  139.    }while(1);
  140. }
  141.  
  142.  

P.D. Meguta el GeSHi modelo cpp  :mrgreen:
« Última modificación: 13 de Septiembre de 2007, 09:14:28 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5435
    • Electrónica Didacta
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #24 en: 13 de Septiembre de 2007, 13:35:16 »
Azicuetano ese programa que colgaste se asemeja un poco a lo que hacen las bios cuando identifican fallas en la motherboards, el código de pitidos
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3362
    • PICKEY ELECTRÓNICA
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #25 en: 13 de Septiembre de 2007, 14:02:27 »
Aquí dejo algo de mis costumbres ya que no me acuerdo de todas, porque en esto también hay mucho de intuición
De seguro que ya se han hablado de ellas, pero aquí las dejo he iré ampliando según me acuerde de mas detalles.

Mis pequeños trucos básicos para paliar los efectos del ruido:

Hard:
  La fuente de alimentación:
    AC: En la entrada un varistor siempre y su filtro con transformador y condensadores junto con su conexión a tierra.
    DC: Capacidades variadas, 10nF, 100 a 330nF y Electrolítico

  Esquema:
     En el circuito en si, 100pF en las salidas digitales y 1nF en las entradas.
    Condensador de desacople en cada circuito integrado y módulos, 100nF.
    Si la placa no es muy grande un condensador de tántalo de entre 10 y 33uF en una zona central de la placa en la
    alimentación general y si la placa es muy grande varios de 1uF distribuidos según criterio junto con algunos de 10nF   
    y 100nF en la misma línea.
    Si hay módulos exteriores lo mismo condensadores de desacoplo de varios tipos mas uno electrolítico entre 1 y 10uF,
    lo mas cerca del conector que sea posible. Y las capacidades totales puestas en la línea de alimentación de la   
    placa no deben superar entre el 10% y 20% de la capacidad total de la fuente de alimentación. Y tener en cuenta que
    los condensadores solo tienen influencia en una determinada zona de la placa por eso es de colocarlos repartidos 
    amen de varias capacidades antes que una grande.

  PCB:
    Después aplicar el sentido común al ruteado, si una parte de la placa tiene mayor consumo pues reforzar en esa zona
    las capacidades, si se utilizan módulos de protección externos como watchdog (refrescarlo lo menos posible y
    con el tiempo justo y por supuesto no refrescarlo en las interrupciones ya que estas no suelen bloquearse) o supervisor
    de la alimentación, colocar estos circuitos lo mas cerca posible de la zona a escanear, ya que se puede dar el caso
    que se detecten parásitos que puede que el microcontrolador sea inmune a ellos, y si se puede escanear la fuente de
    alimentación que nos servirá para guardar datos con suficiente antelación.
    En el caso de prever interferencias fuera de lo normal, colocar bobinas en serie con la alimentación y con las entradas
    y salidas e incluso utilizar optoacopladores (alimentado el led con una tensión aislada galvanicamente de la de
    nuestra placa).

Soft:
   Hay que intentar trabajar de forma que se pueda dejar rastro de lo que estaba haciendo el programa ya sea con flag,
   variables, datos en la eeprom, etc. Y verificar los flag de los módulos de protección que también son una buena 
   fuente de información para evitar tener que hacer reset absolutos. En las interrupciones cíclicas se puede hacer
   una comprobación de los registros para ver el buen funcionamiento del sistema, y por supuesto intentar verificar todo lo 
   que se escribe siempre que se pueda.
« Última modificación: 13 de Septiembre de 2007, 15:19:41 por dogflu66 »
Saludos desde Granada, España.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5102
    • uControl
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #26 en: 13 de Septiembre de 2007, 14:24:18 »
Maestros, gracias por la guia. Se toma debida nota, se archiva para futuros usos y abusos. ;)

GRACIAS!  :mrgreen:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #27 en: 13 de Septiembre de 2007, 19:27:16 »
Ooohhhh !! Con esto se me saltan las lágrimas !!!!

    Si la placa no es muy grande un condensador de tántalo de entre 10 y 33uF en una zona central de la placa en la
    alimentación general y si la placa es muy grande varios de 1uF distribuidos según criterio junto con algunos de 10nF   
    y 100nF en la misma línea.
    Si hay módulos exteriores lo mismo condensadores de desacoplo de varios tipos mas uno electrolítico entre 1 y 10uF,
    lo mas cerca del conector que sea posible. Y las capacidades totales puestas en la línea de alimentación de la  
    placa no deben superar entre el 10% y 20% de la capacidad total de la fuente de alimentación. Y tener en cuenta que
    los condensadores solo tienen influencia en una determinada zona de la placa por eso es de colocarlos repartidos 
    amen de varias capacidades antes que una grande.

 

Jeje... te esperaba porque sabía que de este tema tú sabías mucho (por los post tuyos que he leido en estos 2 años y pico). Thanks.

Azicuetano ese programa que colgaste se asemeja un poco a lo que hacen las bios cuando identifican fallas en la motherboards, el código de pitidos

Pues ahora que lo dices tienes razón. La pregunta es... cuando el ordenador hace 3 pitiditos intermitentes y rápidos... el problema es de la RAM o de la tarjeta gráfica???  :D  :D  :D Siempre se me olvida  :mrgreen:

Otra cosa que suelo hacer yo (y si la aplicación lo permite) es comprobar que todos los valores que guardo en la eeprom están dentro de un determinado rango (función que siempre llamo 'comprueba_eeprom()' y que tengo en el bucle principal). En el mismo instante que un valor de la eeprom se va de fiesta lo reinicio a su valor por defecto. También suelo intentar hacer el programa de forma que no se quede atontao cuando un valor no es el esperado.


Un saludo desde Alicante.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5435
    • Electrónica Didacta
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #28 en: 14 de Septiembre de 2007, 15:58:32 »
... La pregunta es... cuando el ordenador hace 3 pitiditos intermitentes y rápidos... el problema es de la RAM o de la tarjeta gráfica???  :D  :D  :D Siempre se me olvida  :mrgreen:
...

según en la AMI es la RAM.
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5427
    • Picmania by Redraven
Re: Luchando contra el ruido POR SOFTWARE
« Respuesta #29 en: 14 de Septiembre de 2007, 16:52:03 »
Me encanta el tono y el nivel que va alcanzando este hilo.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania


 

anything