Das benutzerdefinierte Arduino-Board piept und der Prozess friert ein, während ich eine Skizze hochlade. Warum?


8

Das Seltsamste passiert mit einem eigenständigen Arduino-Board, das ich entworfen und gebaut habe. Die Karte (deren Schaltpläne unten aufgeführt sind) weist die folgenden Funktionen auf:

  1. Es verfügt über einen ATmega328P mit einem 5-V-Spannungsregler und üblichen Schaltkreisen, wenn es als eigenständiger Controller eingerichtet ist.
  2. Es steuert eine Anzeigetafel mit mehreren 7-stelligen Ziffern, die über die Anschlüsse rechts (JP1 bis JP12) verbunden sind.
  3. Es verfügt über Cursortasten, die mithilfe einer Spannungsleiter über ANALOG_0 (A0) decodiert wurden.
  4. Es hat eine Echtzeituhr, um die Zeit zu halten, wenn es ausgeschaltet ist.
  5. Es verfügt über ein HF-Empfängermodul.
  6. Es hat einen UART-Header (JP17), so dass ich die Karte über eine serielle Schnittstelle programmieren kann.
  7. An den digitalen Pin 3 (D3) ist ein Lautsprecher angeschlossen.

Steuerungsschemata

Ich lade Skizzen mit einem RS232-zu-TTL-Adapter, den ich ebenfalls erstellt habe (Schaltpläne siehe unten), und einem Serial-zu-USB-Kabel hoch. Bei der Programmierung verhält sich die Karte ähnlich wie eine Severino-Karte .

Geben Sie hier die Bildbeschreibung ein

Was seltsam ist, ist, dass beim Hochladen einer Skizze der Vorgang in der Mitte angehalten wird und der Lautsprecher dann kontinuierlich piept. Es wird mit den folgenden avrdude-Nachrichten angehalten:

avrdude: Version 5.11, zusammengestellt am 2. September 2011 um 19:38:36 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2009 Jörg 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

Wenn ich auf der Karte auf Zurücksetzen drücke, gibt avrdude seine Nachrichten weiter aus (siehe unten), der Piepton stoppt, der Upload wird fortgesetzt und die Skizze wird erfolgreich auf die Karte hochgeladen.

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

Ich habe den Rest der Nachrichten hier nicht zur Hand, aber ich hoffe, Sie haben die Idee.

Meine Fragen sind also:

  1. Wodurch wird der Upload-Vorgang angehalten?
  2. Warum piept der Summer, wenn der Vorgang angehalten wird?

1
Aktivieren Sie in den Einstellungen der IDE das Verbose zum Hochladen. Dieses Protokoll sollte einige Einblicke oder weitere Hinweise geben.
mpflaga

1
Dumme Frage: Hast du den ATmega328p mit einem Bootloader programmiert?
Connor Wolf

1
"funktioniert perfekt in einer UNO" - Das sind nützliche Informationen. Ihr Board muss also eine Steckdose haben. Wenn ja - Sie können die Quelle mit einem kurzen Experiment genauer bestimmen. Biegen Sie für jeden der E / A-Stifte den Stift heraus, um keinen Kontakt herzustellen. Schwimmend! Während Sie den IC in Ihren Sockel stecken. Wenn alle Pins schweben, kommt Ihre Schaltung schließlich nicht in Frage. Und da sollte irgendwann zwischen Verzögerung / Piepton aufhören. Und melde dich zurück.
mpflaga

1
@jfpoilpret Wenn der Lautsprecher tatsächlich ein Summer (Piezo) ist, gibt es keine Induktion, daher wird keine Diode benötigt. Vergiss meinen ursprünglichen Kommentar.
jfpoilpret

1
Ein Freund von mir, der in seiner Jugend viel Elektronik gemacht hat, sagte mir einmal: "Wenn es nicht wie erwartet funktioniert, fügen Sie einen Entkopplungskondensator hinzu." Bei vielen Gelegenheiten habe ich diesen Rat mit großem Erfolg befolgt! In Ihrem Schaltplan ist mir jedoch nicht klar, wo Sie eine Entkopplungskapazität hinzufügen könnten. Haben Sie es mit dem Summer versucht? Sie können auch 2 ausprobieren (eine für niedrige Frequenzen, eine für hohe Frequenzen): eine Elektrolyse mit mindestens 1 uF, eine Keramik mit 100 nF. Im schlimmsten Fall wird es keine Wirkung haben :-)
jfpoilpret

Antworten:


3

Wodurch wird der Upload-Vorgang angehalten?

Nun, angesichts all der Kommentare, die unter Ihrer Frage gemacht wurden, ist dies definitiv eine schwierige Frage. Vielleicht möchten Sie versuchen, einen Entkopplungskondensator hinzuzufügen, wie von @jfpoilpret vorgeschlagen, obwohl Ihre Schaltpläne für mich in Ordnung sind… (fragen Sie vielleicht bei EE SE nach einer Überprüfung ).

Ich würde Ihnen auch raten, den avrdudeBefehl von der Arduino IDE-Ausgabe zu kopieren (Sie finden ihn oben) und ihn in der Befehlsshell mit niedrigerer Bitrate auszuführen:

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

-BJe höher der Wert ist, desto niedriger ist Ihre Bitrate. und -bauf die richtige Baudrate für Ihren Bootloader (sind Sie sicher, dass dies 115200 ist? Es ist üblicher, 57600 zu sehen).

Haben Sie auch die Sicherungen richtig eingestellt? Sie können auch die Werte der Sicherungen überprüfen, um festzustellen, ob die Uhren richtig eingestellt sind:

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

Dadurch werden die Werte der Sicherungen ausgegeben. Um die Werte lesbar zu machen, platzieren Sie die Werte am unteren Rand des Formulars auf der Sicherungsrechner-Site , nachdem Sie die Atmega328PMCU aus der Dropdown-Liste ausgewählt haben.

Überprüfen Sie Folgendes:

  • Sie haben genug Größe für den Bootloader (normalerweise ist es umso besser, je mehr Sie ihm geben).
  • Sie haben die Kristallkonfiguration für Ihr Design korrekt eingerichtet (die möglicherweise nicht mit den von der Arduino IDE eingerichteten Uno-Standardeinstellungen kompatibel ist) und überprüft, ob Sie den externen Kristall bei 16 MHz richtig eingerichtet haben.

Warum piept der Summer, wenn der Vorgang angehalten wird?

Dies liegt daran, dass sich die Werte in den Registern in einem undefinierten und unvorhersehbaren Zustand befinden, wenn der Ausgang des Prozessors nicht eingerichtet ist. Dies bedeutet, dass es normalerweise den letzten Wert beibehält, den es vor einem Zurücksetzen hatte oder den Zustand aufgrund einer elektrostatischen Verrücktheit geändert hat, oder aufgrund des Einflusses einer Uhr in der Nähe eine seltsame PWM-Ausgabe liefert.

Grundsätzlich passiert also etwas nicht, wenn Sie Ihren Code hochladen, und das Falsche wirkt sich indirekt auf das Audio aus. Ich würde mir nicht viel Sorgen um dieses Zeug machen, sondern mehr um die Ursache der Pause.

Leider habe ich keine direkte Antwort für Sie, aber bestenfalls ein paar Wege, die Sie genauer untersuchen sollten. HTH


+1 Danke für die Hinweise! Sehr hilfreich. Ich werde sie alle ausprobieren und mich in ein paar Tagen melden.
Ricardo

Ich wollte Sie nur wissen lassen, dass ich das Problem behoben habe. Siehe meine Antwort auf diese Frage. Danke trotzdem!
Ricardo

3

Endlich habe ich herausgefunden, was das Problem verursacht hat: Das Rücksetzsignal von Pin 4 (DTR - Data Terminal Ready) an der DB9-Buchse stieg auf 10 V an, bevor es auf 0 V ging, und löste eine Hochspannungsprogrammierung auf dem ATmega aus. Unten sehen Sie eine Scope-Aufnahme, die die Situation zeigt:

Scope Shot zeigt Spannungsspitze auf 10V

Die gelbe Spur ist ein DTRSignal, während die grüne Spur das RESETSignal auf dem ATmega ist.

Nach Atmels Atmel AVR042: AVR Hardware Design Considerations Anwendungshinweis , sollte man eine ESD - Diode zwischen ATmega der hinzufügen RESETund Vccdas Rücksetzsignal zu verhindern , Hochspannungs - Programmiermodus auslöst, etwa so:

Empfohlene RESET-Pin-Verbindung für ATmegas

Nachdem ich eine so kleine Signaldiode (1N4148) wie im empfohlenen App-Hinweis hinzugefügt hatte, wurde das Problem behoben. Siehe unten die Scope-Aufnahme, die nach dem Hinzufügen der Diode gemacht wurde.

Scope Shot nach dem Fixieren des Boards

Jetzt ist der 10V Peak weg.

Das war eine knifflige Sache !! Aber ohne Forschung und die richtigen Werkzeuge konnte ich nie herausfinden, was falsch war. Geld für ein Zielfernrohr ist gut angelegtes Geld !!


1
Dies liegt daran, dass auf Ihrer Rücksetzleitung nicht die Art von Pegelübersetzer auf die serielle Datenleitung angewendet wird. Die meisten verwenden einen Level-Übersetzer ic und führen den Reset über einen Kanal davon aus.
Chris Stratton

@Chris - Ja, ich erinnere mich, dass Sie mir gesagt haben, ich soll den 2. MAX232-Konverter verwenden, um das zu beheben. Ich werde noch einmal nachsehen, ob ich dieses Design reparieren kann. Vielen Dank!!
Ricardo

1

Ich bin nicht sicher, aber das Problem kann auch mit der Funktion zum automatischen Zurücksetzen der Konverterplatine zusammenhängen.

Ich habe das Design der Konverterplatine vom Arduino Severino kopiert und laut Handbuch muss die serielle Kommunikation auf 19.200 Bit / s eingestellt sein, damit die Funktion zum automatischen Zurücksetzen funktioniert.

Stellen Sie sicher, dass die COM-Port-Geschwindigkeit des Computers auf 19200 Bit / s eingestellt ist, da sonst das automatische Zurücksetzen nicht ordnungsgemäß funktioniert.

Nun, ich benutze 115.200, also muss das ein Problem sein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.