La carte Arduino personnalisée émet un bip et le processus se bloque pendant que je télécharge un croquis dessus. Pourquoi?

8

La chose la plus étrange arrive à une carte Arduino autonome que j'ai conçue et construite. La carte (dont les schémas sont ci-dessous) présente les caractéristiques suivantes:

  1. Il dispose d'un ATmega328P avec un régulateur de tension de 5 V et des circuits habituels lorsqu'il est configuré en tant que contrôleur autonome.
  2. Il contrôle un tableau de bord avec plusieurs chiffres à 7 écrans reliés par les connecteurs de droite (JP1 à JP12).
  3. Il a des boutons de curseur décodés à l'aide d'une échelle de tension via ANALOG_0 (A0).
  4. Il a une horloge en temps réel pour garder l'heure quand il est éteint.
  5. Il dispose d'un module récepteur RF.
  6. Il a un en-tête UART (JP17) afin que je puisse programmer la carte en utilisant un port série.
  7. Il a un haut-parleur attaché à la broche numérique 3 (D3).

Schémas du contrôleur

J'y télécharge des croquis à l'aide d'un adaptateur RS232-à-TTL que j'ai également construit (schémas également ci-dessous) et d'un câble série-USB. Lors de sa programmation, la carte se comporte comme une carte Severino .

entrez la description de l'image ici

Ce qui est étrange, c'est que lorsque je télécharge un croquis, le processus est interrompu au milieu, puis le haut-parleur commence à émettre un bip continu. Il s'arrête avec les messages avrdude suivants:

avrdude: Version 5.11, compilée le 2 septembre 2011 à 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

Lorsque j'appuie sur reset sur le tableau, avrdude continue de sortir ses messages (comme ci-dessous), le bip s'arrête, le téléchargement continue et l'esquisse est téléchargée avec succès sur le tableau.

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

Je n'ai pas le reste des messages à portée de main ici, mais j'espère que vous avez compris l'idée.

Donc, mes questions sont:

  1. Qu'est-ce qui met le processus de téléchargement en pause?
  2. Pourquoi le signal sonore retentit-il lorsque le processus s'arrête?
Ricardo
la source
1
Dans les préférences de l'IDE, activez le Verbose pour le téléchargement. Ce journal devrait fournir des informations ou davantage d'indices.
mpflaga
1
Question stupide: avez-vous programmé l'ATmega328p avec un chargeur de démarrage?
Connor Wolf
1
"fonctionne parfaitement dans un UNO" - C'est une information utile. Votre carte doit donc avoir une prise. Si c'est le cas - Vous pouvez déterminer la source plus spécifiquement avec une expérience rapide. Pour chacune des broches IO, pliez la broche pour ne pas établir de contact. Flottant! Lorsque vous insérez le CI dans votre socket. Finalement, avec toutes les broches flottantes, votre circuit sera hors de question. Et comme un certain point entre le délai / bip devrait s'arrêter. Et faites votre rapport.
mpflaga
1
@jfpoilpret si le haut-parleur est en fait un buzzer (piezo), alors il n'y a pas d'induction, donc pas de diode nécessaire. Oubliez mon commentaire d'origine.
jfpoilpret
1
Un de mes amis qui a fait beaucoup d'électronique dans sa jeunesse m'a dit un jour: "si cela ne fonctionne pas comme prévu, ajoutez un condensateur de découplage". À plusieurs reprises, j'ai suivi ce conseil avec beaucoup de succès! Dans votre schéma, cependant, il n'est pas clair pour moi où vous pourriez ajouter une capacité de découplage. Avez-vous essayé // avec le buzzer? Vous pouvez également en essayer 2 (un pour les basses fréquences, un pour les hautes fréquences): un électrolytique au moins 1 uF, un en céramique 100 nF. Au pire, cela n'aura aucun effet :-)
jfpoilpret

Réponses:

3

Qu'est-ce qui met le processus de téléchargement en pause?

Eh bien, compte tenu de tous les commentaires formulés dans le cadre de votre question, celle-ci est certainement délicate. Vous voudrez peut-être essayer d'ajouter un condensateur de découplage comme suggéré par @jfpoilpret, bien que vos schémas me semblent bien… (peut-être demander un examen sur EE SE ).

Je vous conseille également de copier la avrdudecommande à partir de la sortie Arduino IDE (vous la trouverez en haut) et de l'exécuter dans le shell de commande avec un débit binaire inférieur:

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

plus la -Bvaleur est élevée, plus votre débit binaire est faible. et -bà la vitesse de transmission correcte pour votre chargeur de démarrage (êtes-vous sûr que c'est 115200? il est plus courant de voir 57600).

Avez-vous également réglé correctement les fusibles? Vous pourriez aussi bien vouloir vérifier les valeurs des fusibles pour voir si les horloges sont correctement configurées:

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

qui affichera les valeurs des fusibles. Ensuite, pour rendre les valeurs lisibles, placez les valeurs au bas du formulaire sur le site du calculateur de fusible , après avoir choisi le Atmega328PMCU dans la liste déroulante.

Vérifiez que:

  • vous avez suffisamment de taille pour le chargeur de démarrage (généralement plus vous en donnez, mieux c'est);
  • vous avez correctement installé la configuration des cristaux pour votre conception (qui peut ne pas être compatible avec les paramètres Uno par défaut tels que définis par l'Arduino IDE), en vérifiant si vous avez correctement installé le cristal externe à 16 MHz…

Pourquoi le signal sonore retentit-il lorsque le processus s'arrête?

C'est parce que lorsque le processeur n'a pas configuré la sortie, les valeurs dans les registres sont dans un état indéfini et imprévisible. Ce qui signifie qu'il conserve généralement la dernière valeur qu'il avait avant une réinitialisation ou un état changé en raison d'une étrangeté électrostatique, ou donne une sortie PWM étrange en raison de l'influence d'une horloge à proximité.

Donc, fondamentalement, quelque chose ne va pas lorsque vous téléchargez votre code et cette mauvaise chose a un effet indirect sur l'audio. Je ne m'inquiéterais pas beaucoup de ces trucs, mais plutôt de la cause de la pause.

Malheureusement, je n'ai pas de réponse directe pour vous, mais au mieux quelques pistes que vous devriez approfondir. HTH

zmo
la source
+1 Merci pour les indices! Très utile. Je vais tous les essayer et je ferai rapport dans quelques jours.
Ricardo
Je voulais juste vous faire savoir que j'ai résolu le problème. Voir ma réponse à cette question. Merci quand même!
Ricardo
3

J'ai finalement trouvé la cause du problème: le signal de réinitialisation de la broche 4 (DTR - Data Terminal Ready) sur le connecteur DB9-Femelle atteignait 10 V avant de passer à 0 V et déclenchait une programmation haute tension sur l'ATmega. Ci-dessous, une vue d'ensemble montrant la situation:

Prise de vue montrant une pointe de tension à 10 V

La trace jaune est le DTRsignal tandis que la trace verte est le RESETsignal sur l'ATmega.

Selon la note d'application Atmel AVR042: AVR Hardware Design Considerations d' Atmel , il convient d'ajouter une diode ESD entre les ATmega RESETet Vccd'empêcher le signal de réinitialisation de déclencher le mode de programmation haute tension, comme ceci:

Connexion de broche RESET recommandée pour ATmegas

Après avoir ajouté une si petite diode de signal (1N4148) comme la note d'application recommandée, j'ai résolu le problème. Voir ci-dessous la prise de vue prise après l'ajout de la diode.

Prise de vue après fixation de la planche

Maintenant, le pic de 10V a disparu.

C'était une question délicate !! Mais je ne pourrais jamais trouver ce qui n'allait pas sans la recherche et les bons outils. L'argent sur une lunette est de l'argent bien dépensé !!

Ricardo
la source
1
Cela est dû au fait que votre ligne de réinitialisation n'a pas le type de traducteur de niveau appliqué à la ligne de données série. La plupart utilisent un traducteur de niveau ic et exécutent la réinitialisation via un canal de cela.
Chris Stratton
@Chris - Ouais, je me souviens que tu m'as dit d'utiliser le 2ème convertisseur MAX232 pour résoudre ce problème. Je vais jeter un autre coup d'œil et voir si je peux réparer ce design. Merci!!
Ricardo
1

Je ne suis pas sûr, mais le problème peut également être lié à la fonction de réinitialisation automatique de la carte convertisseur.

J'ai copié la conception de la carte convertisseur de l' Arduino Severino et selon son manuel , la communication série doit être réglée à 19 200 bps pour que la fonction de réinitialisation automatique fonctionne.

Assurez-vous que la vitesse du port COM de l'ordinateur est définie sur 19200 bps, sinon la réinitialisation automatique ne fonctionnera pas correctement.

Eh bien, j'utilise 115 200, donc ça doit être un problème.

Ricardo
la source