Hola, nocturno y cia, este es mi primer mensaje en este foro y he pensado que podía aportar algo a este post.
Alimentación:Sobre el tema de ruido en la alimentación, no hay demasiado misterio, siempre filtro la alimentación con condensadores de 100n cerca de cada integrado digital y hasta el momento 0 problemas.
Asimismo siempre es aconsejable al hace el rutado de la placa separar la pistas por las que circule potencia de las que sean para la lógica, cada una por su lado, así evitamos que haya caidas de tensión que afecten a la lógica.
También es importante evitar un rutado largo en la masa que va a los condensadores del cristal del pic (por experiencia se que puede provocar efectos indeseados en el oscilador).
En los accionamientos de relés y motores colocar siempre los correspondientes diodos, y si son de alterna los varistores adecuados o un par de diodos zéner en serie y al revés (una vez por culpa de un abrepuertas de alterna mal filtrado el PC saltaba a donde le daba la gana, fue poner el varistor y desaparecer el problema, los picos de tensión al desconectar radiaban al espacio tal interferencia que era capaz de actúar sobre el PIC).
Entradas y salidas:Yo no uso filtrado casi nunca ni en salidas ni en entradas digitales, lo que hago es siempre (siempre que esa entrada dependa de un pulsador, o una señal externa al circuito) filtrar por software mediante contadores el estado de las entradas digitales, de forma que sea inmune a rebotes rápidos.
En las entradas analógicas uso un promediado emulando una red RC:
Valor = Valor + (Valor_act - Valor)/K
con algún truco matemático para hacerlo rápido con enteros y no perder resolución.
El valor valor de la frecuencia de filtrado depende de la frecuencia con la que se llame a la función y de la constante K.
Puede que si sea necesario filtrar la entrada analógica si pueden presentarse problemas de aliasing debido a que la frecuencia de variacion de la entrada supere a la mitad que la de muestreo.
Eeprom:Sobre lo de la Eeprom nunca he tenido problemas (aunque tampoco he usado mucho), pero los problemas que ha tenido la gente normalmente se deben a usar PIC16F84 sin circuito de reset, y es que estos pic no tienen BOD, es decir si baja un poco la tensión y vuelve a subir ni se enteran, pero puede provocar efectos inesperados en el chip, yo usaba un circuito específico para el reset conectado a la patilla MCLR, pero ahora uso el PIC16F628A en donde usaba el PIC16F84, ya que es más barato y lleva muchas más cosas, entre ellas el BOD.
Cuelgues:Sobre lo de que el programa se quede colgado, se que debería usar más el WDT, pero no suelo tener necesidad porque siempre hago los programas con un programa ciclico que ejecuta una máquina de estados en vez de esperar a que terminen eventos fijos para continuar, es menos legible pero mucho más potente, seguro y eficiente.
Por ejemplo, casi nunca uso transmisión y recepcion serie sin interrupciones, uso un buffer que lleno en el programa cíclico cuando quiero enviar algo (cosa que finaliza instantáneamente) y que se envia al ritmo serie con la interrupción.
Igual para la recepción, los datos se llenan en otro buffer en la interrupción serie y en el programa cíclico se comprueba si ha llegado un dato nuevo, cuando se tiene una trama completa o se dispara un timeout (por pérdida de datos), se ejecutan las acciones adecuadas.
Lo que quiero decir es que el programa cíclico nunca para, de forma que no hay cuelgue nunca, normalmente el programa cíclico se ejecuta en un tiempo relativamente corto, dependiendo de lo complejo de la aplicación, desde unos pocos us hasta varios ms.
Inicialización de variables:Uso el compilador de C de Hi-tech y creo que por defecto inicializa toda la ram a 0.
Aún así suelo asegurarme de inicializar todo al inicio, a mi cuando me enseñarón C me dijeron que no puedes dar por sentado el valor de nada si no se lo asignas expresamente. ¿Es verdad que el ansi C obliga a inicializar las variables a 0 como ha dicho alguien?, yo diría que no a menos que se indique en la declaración:
Int Ic = 0;
Vaya tocho para ser el primer mensaje
.