La placa Arduino personalizada emite pitidos y el proceso se congela mientras estoy cargando un boceto. ¿Por qué?

8

Lo más extraño le está sucediendo a una placa Arduino independiente que diseñé y construí. El tablero (cuyos esquemas están a continuación) tiene las siguientes características:

  1. Tiene un ATmega328P con un regulador de voltaje de 5V y circuitos habituales cuando se configura como un controlador independiente.
  2. Controla un marcador con varios dígitos de 7 pantallas vinculados a través de los conectores de la derecha (JP1 a JP12).
  3. Tiene botones de cursor decodificados usando una escala de voltaje a través de ANALOG_0 (A0).
  4. Tiene un reloj de tiempo real para mantener la hora cuando está apagado.
  5. Tiene un módulo receptor de RF.
  6. Tiene un encabezado UART (JP17) para que pueda programar la placa utilizando un puerto serie.
  7. Tiene un altavoz conectado al pin digital 3 (D3).

Esquemas del controlador

Le subo bocetos utilizando un adaptador RS232 a TTL que también he construido (esquemas también a continuación) y un cable de serie a USB. Al programarlo, la placa se comporta como una placa Severino .

ingrese la descripción de la imagen aquí

Lo extraño es que, cuando subo un boceto, el proceso se detiene en el medio y luego el altavoz comienza a pitar continuamente. Hace una pausa con los siguientes mensajes de avrdude:

avrdude: Versión 5.11, compilada el 2 de septiembre de 2011 a las 19:38:36 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2009 Joerg Wunsch

     System wide configuration file is "C:\arduino-1.0.3\hardware/tools/avr/etc/avrdude.conf"

     Using Port                    : \\.\COM1
     Using Programmer              : arduino
     Overriding Baud Rate          : 115200

Cuando presiono reiniciar en el tablero, avrdude continúa emitiendo sus mensajes (como se muestra a continuación), el pitido se detiene, la carga continúa y el boceto se carga con éxito en el tablero.

avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
... messages and upload continue and completes successfully.

No tengo el resto de los mensajes a mano aquí, pero espero que entiendas la idea.

Entonces, mis preguntas son:

  1. ¿Qué hace que el proceso de carga se detenga?
  2. ¿Por qué suena el timbre cuando el proceso se detiene?
Ricardo
fuente
1
En las preferencias del IDE encienda el Verbose para cargar. Este registro debe proporcionar una idea, o más pistas.
mpflaga
1
Pregunta estúpida: ¿Has programado el ATmega328p con un gestor de arranque?
Connor Wolf
1
"funciona perfectamente en UNO" -Esa es información útil. Por lo tanto, su placa debe tener un zócalo. Si es así, puede determinar la fuente más específicamente con un experimento rápido. Para cada uno de los pines IO, doble el pin hacia afuera para no hacer contacto. ¡Flotante! A medida que inserta el IC en su zócalo. Eventualmente, con todos los pines flotando, su circuito quedará fuera de discusión. Y como algún punto entre el retraso / pitido debería detenerse. E informar de nuevo.
mpflaga
1
@jfpoilpret si el altavoz es de hecho un zumbador (piezo), entonces no hay inducción, por lo tanto, no se necesita diodo. Olvida mi comentario original.
jfpoilpret
1
Un amigo mío que hizo mucha electrónica en su juventud me dijo una vez: "si no funciona como es de esperar, agregue un condensador de desacoplamiento". ¡En muchas ocasiones, he seguido este consejo con gran éxito! Sin embargo, en su esquema, no está claro para mí, dónde podría agregar una capacidad de desacoplamiento. ¿Has probado en // con el timbre? También puede probar 2 (uno para frecuencias bajas, uno para frecuencias altas): uno electrolítico al menos 1uF, uno cerámico 100nF. En el peor de los casos, no tendrá ningún efecto :-)
jfpoilpret

Respuestas:

3

¿Qué hace que el proceso de carga se detenga?

Bueno, dados todos los comentarios hechos bajo su pregunta, esta es definitivamente una pregunta difícil. Es posible que desee intentar agregar un condensador de desacoplamiento como lo sugiere @jfpoilpret, aunque sus esquemas me parecen correctos ... (tal vez solicite una revisión en EE SE ).

También le aconsejo que copie el avrdudecomando de la salida IDE de Arduino (lo encontrará en la parte superior) y lo ejecute en el shell de comandos con una tasa de bits más baja:

avrdude -v -v -v -v -C "C:\arduino-1.0.3\hardware/tools/avr/etc/avrdude.conf" -P COM1 -patmega328 -U… -B3 -b115200

cuanto mayor sea el -Bvalor, menor será su tasa de bits. y -ba la velocidad de transmisión correcta para su gestor de arranque (¿está seguro de que es 115200? Es más común ver 57600).

¿También configuró los fusibles correctamente? Es posible que también desee verificar los valores de los fusibles para ver si los relojes están configurados correctamente:

avrdude -U lfuse:r:-:i -U hfuse:r:-:i -U efuse:r:-:i

que dará salida a los valores de los fusibles. Luego, para que los valores sean legibles, coloque los valores en la parte inferior del formulario en el sitio de la calculadora de fusibles , después de elegir la Atmega328PMCU de la lista desplegable.

Verifique que:

  • tiene el tamaño suficiente para el gestor de arranque (por lo general, cuanto más le dé, mejor);
  • ha configurado correctamente la configuración de cristales para su diseño (que puede no ser compatible con la configuración predeterminada de Uno según la configuración del Arduino IDE), verificando si configuró correctamente el cristal externo a 16MHz ...

¿Por qué suena el timbre cuando el proceso se detiene?

Es porque cuando el procesador no tiene la salida configurada, los valores dentro de los registros están en un estado indefinido e impredecible. Lo que significa que generalmente mantiene el último valor que tenía antes de un reinicio o un estado cambiado debido a alguna rareza electrostática, o está dando una salida PWM extraña debido a la influencia de un reloj cercano.

Básicamente, está sucediendo algo incorrecto cuando está cargando su código y ese error tiene un efecto indirecto en el audio. No me preocuparía mucho por esas cosas, sino más por la causa de la pausa.

Lamentablemente, no tengo una respuesta directa para usted, pero en el mejor de los casos debería investigar más. HTH

zmo
fuente
+1 ¡Gracias por las pistas! Muy útil. Los probaré todos e informaré en un par de días.
Ricardo
Solo quería hacerle saber que solucioné el problema. Vea mi respuesta a esta pregunta. ¡Gracias de cualquier manera!
Ricardo
3

Finalmente encontré lo que estaba causando el problema: la señal de reinicio del pin 4 (DTR - Terminal de datos lista) en el conector DB9-Hembra se disparó hasta 10 V antes de ir a 0 V y estaba activando la programación de alto voltaje en el ATmega. A continuación se muestra una imagen de alcance que muestra la situación:

Disparo de alcance que muestra un pico de voltaje a 10V

El rastro amarillo es DTRseñal mientras que el rastro verde es la RESETseñal en el ATmega.

De acuerdo con la nota de aplicación Atmel AVR042 Atmel AVR042: Consideraciones de diseño de hardware , se debe agregar un diodo ESD entre ATmega RESETy Vccevitar que la señal de reinicio active el modo de programación de alto voltaje, así:

Conexión de pin RESET recomendada para ATmegas

Después de agregar un diodo de señal tan pequeño (1N4148) como la nota de la aplicación recomendada, solucioné el problema. Vea a continuación la toma del alcance tomada después de agregar el diodo.

Alcance después de arreglar el tablero

Ahora el pico de 10V se ha ido.

¡Eso fue complicado! Pero nunca podría encontrar lo que estaba mal sin la investigación y las herramientas adecuadas. ¡El dinero en un telescopio es dinero bien gastado!

Ricardo
fuente
1
Esto ocurre porque su línea de reinicio no tiene el tipo de traductor de nivel aplicado a la línea de datos en serie. La mayoría usa un traductor de nivel ic y ejecuta el reinicio a través de un canal de eso.
Chris Stratton
@ Chris - Sí, recuerdo que me dijiste que usara el segundo convertidor MAX232 para arreglar eso. Echaré otro vistazo y veré si puedo arreglar ese diseño. ¡¡Gracias!!
Ricardo
1

No estoy seguro, pero el problema también puede estar relacionado con la función de reinicio automático de la placa del convertidor.

Copié el diseño de la placa del convertidor del Arduino Severino y, de acuerdo con su manual , la comunicación en serie debe configurarse a 19.200 bps para que funcione la función de reinicio automático.

Asegúrese de que la velocidad del puerto COM de la computadora esté establecida en 19200 bps; de lo contrario, el restablecimiento automático no funcionará correctamente.

Bueno, estoy usando 115.200, así que eso debe ser un problema.

Ricardo
fuente