Sobre la programación del chip, arduino standalone sin bootloader.

Hola a todos.

Hoy me ha surgido una duda en el último proyecto que estoy realizando. Os pongo en situación.

El circuito es una protección para un generador de corriente continua, este entrega una tensión máxima de 110 voltios y lo regulo mediante un reostato. Es un sistema bastante arcaico, pero lo estoy modernizando. La cosa está en que trabaja dentro de un determinado rango de tensión, existiendo un mínimo y un máximo, fuera del cual la máquina se ha de parar.

El sistema se compone de: divisor de tensión en la salida del generador, para convertir los 110VDC en 5VDC; potenciometro para definir la tensión mínima, potenciometro para máxima y potenciometro de tiempo. Las salidas son a relé, tanto para la máxima como para la mínima. Fuente de alimentación de 5VDC incorporada, alimentando el conjunto a 12V (los relés son de 12V). Y atmega328p como corazón del sistema.

He fabricado la placa PCB, montado los componentes y estoy comprobando el funcionamiento y de momento se está comportando bien.

El potenciometro de tiempo determina cuanto tiempo ha de esperar antes de activar o no los relés de salida.

He usado la simple aritmetica:

time=analogRead(A5); // me devolverá un valor entre 0 y 1023 según la posición del potenciometro.
time = 10*time;         // si espero 1023 milisegundos (1 segundo), es poco tiempo, así que multiplico
                              // por 10 y obtendré 10 segundos.

Para el retardo tengo una funcion de retardo al encendido que funciona perfectamente, si la condición de inicio es cierta (tension leida compara con el mínimo o el máximo) empieza a contar y cuando pase el tiempo indicado devuelve 1.

Mi duda está en que al programar el arduino y al hacer la prueba, si muevo un poco el potenciometro (que tengo que calibrar) se dispara el tiempo mas allá de esos 10 segundos. He usado la función de retardo en mas de una ocasión que se basa en millis() mas de una vez, la diferencia con está vez es que no he puesto el bootloader en el micro ya que no uso comunicación ni nada por el estilo con el exterior.

No estoy seguro de si hay que quemar los FUSES, si tengo que quemar el bootloader siempre o que deberia hacer ya que supongo que será en alguno de estos dos sitios donde se inicializa el timer, los preescaler, etc que hacen que las funciones siempre funcionen. ¿Qué me podeís contar al respecto?

Obviamente me direis que mire el datasheet, aunque puestos ya de paso, pediria que me recomendarais algún libro en español para poder entender los micros de atmel y, por si no fuera poco, que sea legal su descarga.

Cuidado con esa multiplicación. Cuando el valor del potenciometro sea cero, el tiempo, también será cero. Yo usaría map.

Yo he usado millis, en un proyecto, grabado directamente por ICSP, y funciona correctamente.

No hay peligro en la multiplicación. Obvio que si la entrada analógica está cerca de 0 (o incluso 0) el valor de tiempo, es pequeño (o incluso 0). Pero es algo que está dentro de las caracterisitcas del proyecto. El tiempo será ajustable de 0 a 10 segundos (aproximados).

Viendo el codigo de map:

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Para valores de entrada de 0..1023 y salida de 0..10000 (10 segundos en milisegundos), al final me queda que (10000x)/1023, es decir 9x, ya que al ser divisiones enteras pierdo los decimales. Así que la aproximación de 10 es casí igual. De todas formas lo probaré (total no cuesta nada).

En cuanto a la programación a través del icsp, tengo un Uno con una plaquita de pruebas montada para la programación del chip. A través del IDE, con la opción "subir usando programador" programo el chip. Los chips son virgenes, es decir no tienen bootloader. ¿También los tuyos son virgenes o vienen pregrabados?

No, la verdad es que en mi proyecto, he usado arduinos nano, programados por ICSP. ¿Has probado a grabarles el bootloader y luego grabar el código? Al grabar el código, pierdes el bootloader, pero si es un tema de fuses, que se graban al grabar el bootloader, podría solucionarse así.

Efectivamente. Esta tarde he cogido el avrdudess y he leido lo fuses L=0x00, H=0x00, E=0x00. He intentado escribirles los de arduino (0xFF, 0xDE, 0x05) y no he sido capaz de ponerselo. Y el ide tampoco me dejaba ponerle el bootloader. Asi que he cogido otro micro virgen y he hecho el proceso a la inversa, he grabado el bootloader (a la primera), y el sketch después. Funcionando el tiempo a la perfección.

Ahora bien, ¿no se pueden modificar los fuses con el avrdude en chip ya grabado?

Pues diría que no. Una vez grabados, no son modificables, por eso los llaman "fuses", o sea, fusibles, que una vez "fundidos" no se pueden modificar.

Hoy he hecho una prueba aprovechando que he terminado una placa nueva para programar chips y efectivamente, los fuses no me deja cambiarlos, en tanto que si me deja programarlos, el chip aun no esta muerto.

He estado investigando un poco sobre los fuses y como cambiarlos, se que necesito hacer un programador de alto voltaje y he estado mirando por algunos. He encontrado este: Programdor arduino HVSP. Creo q lo montaré y haré alguna prueba (ya tengo unos cuantos micros en teoria para la basura). ¿Alguien lo ha probado?

Yo no sabia ni que existia eso...