Carga de programas a través de Serial (con bootloader).

Hace tiempo que no escribia nada por aquí, y he pensado que a lo mejor me ayudabais a entender el problema que tengo.

He hecho un pequeño circuito pseud-automata de los que suelo hacer bastantes. Hasta ahora el método de programación era sacando el chip y programando con un arduino Uno como ISP. Es bastante engorroso, pero para programas pequeños pues es bastante útil.

Pero en la nueva generación de placas quiero poder programar el circuito a través del puerto serie a través del bootloader como hacen las placas normales.

Para ello en la placa tengo un conector con acceso a los pines RESET, TX y RX, además de un GND del circuito. El proceso de grabado lo hago con un Uno sin el atmega328p, uniendo los pines con sus correspondientes. Y como era de esperar no funciona, el resultado es el siguiente:

Obviamente el problema debe venir de lo que haya conectado a los pines de programación. Para ello desoldé los componentes del circuito RC del reset y del RS485. Y funcionando perfectamente (previa quema de bootloader).

Primero me centré en el Reset.

Cuando soldé de nuevo los componentes, volvía a tener el mismo problema, pero ahora, si pulsaba el reset de la placa justo en el momento adecuado si carga el sketch. Indagando un poco, vi que el atmega ya posee una resistencia PULL-UP que le permite prescindir de una externa, a no ser, que trabaje en ambientes ruidosos, con lo cual se recomienda, y por eso en las placas arduino se prescinde de ella y se conecta directamente el botón. De momento está funcionando así, pulsando el botón de reset yo mismo.

Este es el circuito de RS485 que uso. Quitando el MAX485, la placa se deja programar, pero con el conectado me sigue dando el mismo error. Por si alguien me dice que quite la resistencia del PULL_UP en la patita RX, debo decir que esa no molesta y solo es el IC. En esta parte es donde me he quedado bloqueado, aunque sigo investigando.

La solución mas sencilla sé que es utilizar jumpers, que cuando quiera programar aisle el reset y el rs485 del circuito, y cuando termine volver a ponerlos... aunque no es una solución muy de mi agrado... ya que me gustaria entender el por qué del fallo.

¿Algún consejo, truco, recomendación?

PD. Iba a poner una foto de la placa, pero la he trastocado en el teléfono y no la encuentro, pero mañana seguro que la subo.

Hola de nuevo.

Encontré la foto de la criatura y aquí las dejo:

Esa es la buena, sin estorbos. Aquí la descripción de las zonas:

  • Fuente de alimentación de 5v voltios usando un 7805, con diodos de protección y filtro RC a la entrada. Hay un diodo verde que indica que la alimentación está ON.
  • Entradas optoacopladas usando pc817's con led indicador. No utilizo resistencias PULL-UP ya que utilizo las del propio micro, y la lectura invertida la hago por software.
  • Salidas a transistor optoacopladas usando un TLP627, que es un opto con gran CTR y permite manejar corrientes altas, suficientes para mover un relé.
  • Conexión RS485, la del circuito descrito antes. Uso conectores RJ45 para conectar los dispositivos entre si ya que uso cable SFTP CAT 6 apantallado.
  • Led Run. Un invento para ver si el sketch está corriendo o no, simplemente hace que el
    led rojo, parpadee cada segundo.
  • Conector de programación. Como veis es una tira de pines, de izquierda a derecha son: GND, RESET, RX, TX. Y por la localización del conector vereis que esta directamente conectado a los pines correspondientes.
  • Micro, que en la foto no esta, ya que estaba en proceso de quedamo

Hay lo dejo :wink:

si he entendido bien, tienes el problema de que necesitas pulsar el botón de reset para que pueda programarse.

yo tambien tuve ese problema cuando programaba el arduino sobre protoboard. aclaro que mi "arduino" era un atmega con su cristal y condensadores a los que le había cargado previamente el bootloader.

para cargar tenia que pulsar el boton de reset hasta que cambiaba de compilando a cargando. pues mi conversor no disponia del pin reset. el que compre despues fue un cp2102 que ya cuenta con el pin dtr y nunca me puso pegas para programar.

¿puede ser que tus fallos sean por culpa del conversor rs485? a mi en un arduino normal con un shield wifi me da problemas para programar y tengo que desconectar la wifi o cambiar un switch que me aísla la placa.

si pudieses cambiar un poco la placa seria interesante, añadir un pin de 5v en el programador para que sea conectar el usb y listo. Al lado de los pins tx rx añadir 2 pines para por medio de jumper's poder puentear el tx del arduino con el rx del conversor.

no se si puede ser el problema del pin dtr o de fallo en tx rx te toca descubrirlo a ti.

me gusta mucho tu placa la verdad, ¿es de dominio publico o diseño propio? ¿has pensado convertirla en smd? sería mas pequeña, o una fuente conmutada para los 5v, asi como poder tener salidas a rele que siempre son utiles

No utilizo ningún conversor usb-ttl. Utilizo una placa arduino uno clónica de velleman que no utiliza ningún chip conversor, sino el atmega16AU como en el
original.

Cuando desmonté el circuito de reset (resistencia, pulsador y condensador) y el circuito del rs485 (max485 y resistencia de PULLUP en RX) el circuito me dejaba subir skechts de forma normal y sin problemas.

Después monte el pulsador y seguia funcionando. El problema es veo necesario tener el conjunto resistencia-condesador para evitar reinicios indeseados, así que procedí primero con el condesador, y nada ya volvió a fallar. Hay es cuando descubrí que pulsando yo el reset se dejaba programar. Así que volví a soldar la resistencia y deduje que hay algo que no le gusta al reset. Supongo que tiene que ver con la duración del pulso que envia la placa de arduino al atmega para reinicicarlo. Al haber un condensador y una resistencia ese pulso es insuficiente para reiniciar el arduino, por eso al generarlo yo si se deja programar.

En cuanto al rs485 nunca he usado un shield, pero por los esquemas que he visto no se diferencian en mucho, salvo que las líneas RE y DE no estan unidas en muchos y hay que hacerlo. Primero soldé la resistencia y comprobé que se dejaba subir los sketchs, en cuanto pongo el IC ya empiezo a tener el mismo error.

La placa es totalmente artesana, creación propia, hecha con proteus y a la plancha. El objetivo es sustituir un PLC OMRON CPM2A, que ya es un poco yayo y necesito que tenga modbus, cosa que no tiene y la opción lógica era un arduino.

He aquí unas fotos del proceso:





Ejem... todavia no se soldar SMD...

Prueba con un osciloscopio a ver que voltage hay en el pin rst mientras se programa. Igual es culpa que la salida del 16au no es capaz de descargar todo lo rápido que se necesita.

Si careces de osciloscopio se puede utilizar la entrada de micro del ordenador o incluso del movil.

Prueba con un condensador menor, incluso uno de 22pf de los que se usan para el cristal.

Ida de olla muy bestia mía--->poner el condensador en paralelo con la resistencia? O solo la resistencia sin condensador.

No entiendo la necesidad de ese condensador

otra solución podría ser poner 2 diodos para que con que una de las 2 entradas este a 0 ya tengas un 0 en el pin y que el condensador solo afecte al pulsador y el rst de programar vaya directo.

O algún arreglo con un par de transistores.

Por otra parte con que te estas comunicando? Periferia o alguna pantaya?

Buenas de nuevo.

Hoy he podido trastear un poquito a ver que podia pasar, así que he cogido la placa de pruebas y he montado el atmega, el max485 y un circuito de reset.

Lo primero el reset. El conjunto RC forma un filtro en la entrada de reset para evitar ruidos en entornos ruidosos. Como comenté anteriormente, el atmega328p posee un pequeño filtro en la entrada con esa misión, pero cuyo valor en determinadas aplicaciones suele ser insuficiente. Básicamente eso explica porque el arduino cuando lo metemos en el mundo real se vuelve loco y se reinicia. La recomendación típica de RC es de 10K y 100nF que son los valores que yo he puesto en mi circuito, y forman un filtro RC paso bajo a una frecuencia de corte de 159Hz. En cambio a la hora de programar, por lo que he deducido, es un estorbo ya que no se deja. He bajado el valor a 10nF y ya dejaba programar el chip. Lo malo: es que al bajar el valor del codensador aumenta la frecuencia de corte, en este caso a 1.59KHz.

En este punto es cuando pido a los expertos su opinión, ya que es un tema un poco complicado; soy informático-programador y no electrónico.

Por si a alguien le interesa les dejo el link a la nota de aplicación de donde he sacado la información.

AVR Hardware Design Considerations

Ahora la segunda parte, el rs485. Me vino una duda filosofica... ¿qué sucede cuando el max485 no está trabajando, y tiene sus lineas de control a alta impedancia? Pues realmente, ni idea. Lo cual me ha llevado a pensar que lo mismo es necesario establecer un valor en las patitas a priori. Así que despues de comprobar que el max485 no me dejaba programar in situ, he colocado resistencias PULL-UP en las tres líneas de control RO, RE/DE y DI. Sorpresa!! Funcianando.

Juand91, el automata en sí forma parte de una red en la que ya tengo varios pseudo-automatas funcionando, un par de medidores comerciales que estan vigilados por un ordenador que hace las veces de maestro del sistema. Supongo que si decidiera colocar una pantalla, seria un arduino con una lcd/tft.

Con esa frecuencia en entorno industrial tienes problemas de reinicios?

Luego has pensado en una puerta and? Una entrada seria con filtro a 150hz para pulsador, y otra con filtro a 1,5 kHz para la salida de la and.