Probleme mit hausgemachten RS232-zu-TTL-Wandlerplatinen basierend auf dem MAX232 von TI

7

Ich habe eine RS232-zu-TTL-Wandlerkarte entworfen, die auf dem MAX232-IC von TI basiert und mit der ich einige benutzerdefinierte Arduino-Karten programmieren möchte, die ich habe. Ich habe jedoch Probleme mit dem Board und hoffe, dass mir jemand beim Debuggen helfen kann.

Lassen Sie mich zunächst mein Setup unten zeigen.

Mein Setup

Hier ist eine kurze Beschreibung dessen, was auf dem Bild zu sehen ist:

  • Zielplatine (A) : Es handelt sich um eine benutzerdefinierte eigenständige ATmega328P-Platine (eine Uhr), die ich mithilfe der seriellen Programmierung und der Arduino IDE programmieren möchte. Es ist über ein FTD-ähnliches Kabel über den Anschluss (H) mit der Platine B verbunden .

  • RS232-zu-TTL-Konverterkarte (B) : Es handelt sich um die MAX232-basierte RS232-zu-TTL-Konverterkarte, die ich entworfen habe und die ich zu debuggen versuche. Es ist das Hauptthema dieser Frage. Es wird mit dem FTDI-ähnlichen Kabel über den Anschluss (G ) mit der Zielplatine (A) und über eine DB9-Buchse (F) mit dem USB-zu-RS232-Kabel (C ) verbunden .

  • USB-zu-RS232-Kabel (C) : Ich habe keinen richtigen COM-Anschluss an meinem PC, daher verwende ich stattdessen einen seriellen Anschluss. Es ist über einen USB-Anschluss (D) mit dem PC und über einen DB9- Stecker (E) mit der Karte B verbunden .

Die Schemata von Board B sind unten.

RS232-zu-TTL-Wandlerkarte (B)

Das Programmier-Header-Schema auf der Zielplatine (A) ist unten dargestellt.

Serieller ATmega328P-Programmierheader auf der Zielplatine (A)

Die erst , was ich klar ist , dass das USB-zu-RS232 - Kabel (C) der ist billig Art . Anstatt RS232-Standardsignalpegel im Bereich von -12 V / + 12 V zu liefern, liefert es stattdessen 0 V / 5 V. Ich habe das mithilfe des folgenden Tests herausgefunden: Ich habe das USB-zu-RS232-Kabel (C) an den PC angeschlossen und den DB9-Stecker (E) von der Konverterplatine (B) getrennt und Pin 3 vom DB9-Stecker (E) geprüft. während ich eine Reihe von ASCII-Zeichen 'A'über den seriellen Monitor sendete . Unten sehen Sie das Ergebnis dieses Tests.

Charakterisierung des USB-RS232-Kabelsignals

Übrigens ist mir aufgefallen, dass die verschiedenen MAX232-ICs verschiedener Hersteller dafür ausgelegt sind, diese Verletzung der RS232-Signalpegel zu bewältigen und auch 0V / 5V-Signale zu akzeptieren. Unten sind zwei Scope-Aufnahmen, die ich verwendet habe, um es zu beweisen. In der ersten Aufnahme habe ich mit meinem hausgemachten Funktionsgenerator (verrauscht, ja) eine 0V / 5V-Rechteckwelle an MAX232-Pin 13 angelegt (während er von meiner Konverterplatine eingesteckt und mit Strom versorgt wird) (das ist die gelbe Kurve) und den Ausgang von Pin 12 überprüft ( TTL Level RX - grüne Spur). Zu meiner Überraschung reagiert der MAX232 von TI mit den richtigen TTL-Signalen. Die zweite Aufnahme ist ein korrektes RS232 -6V / + 6V-Signal, das von einer Rechteckwelle simuliert wird, die ich in denselben Pin eingefügt habe. Beide liefern die gleichen Ergebnisse.

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Ich habe einige andere Messungen an meiner Konverterplatine (B) durchgeführt, bis ich damit zufrieden war. Zum Beispiel zeigt Pin 2 an MAX232 + 9,5 V, während Pin 6 -9,5 V anzeigt. Das Oszilloskop zeigt, dass der Spannungsverdoppler und der Wechselrichter ebenfalls einwandfrei funktionieren, mit jeweils einer schönen und stetigen 40-kHz-Rechteckwelle. Ich habe auch 0 / 5V Rechteckwelle von ungefähr 68 kHz an Pin 10 des MAX232 und Pin 7 des MAX232 angelegt. Ich habe ein schönes und sauberes invertiertes -6V / + 6V RS232-Signal erhalten (Bilder hier nicht gezeigt).

Dann habe ich das Echo des seriellen Monitors getestet, bei dem die TX / RX-Pins an verschiedenen Stellen kurzgeschlossen wurden. Die Ergebnisse waren:

  1. Ohne MAX232 IC im Sockel habe ich die Pins 2 und 3 am DB9 kurzgeschlossen. Echo ok.
  2. Platzierte den MAX232 IC auf der Platine und schloss die Pins 11 und 12 kurz. Echo ok.
  3. Mit ATmega328P aus der Steckdose habe ich die Pins 2 und 3 kurzgeschlossen. Echo ok.

Dann habe ich das Setup angeschlossen, um meine ATmega328P-Zielplatine (A) zu programmieren . Die avr-dude-Ausgabe wird am Ende dieses Beitrags angezeigt. Unten finden Sie eine Zusammenfassung mit nur der Fehlermeldung:

...
avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x90
...
avrdude: stk500_cmd(): protocol error

Während dieses Programmierversuchs habe ich die folgenden Signale gemessen. Die gelbe Spur sind Daten, die an die MCU gesendet werden, während die grüne Spur Daten sind, die von dieser empfangen werden:

Geben Sie hier die Bildbeschreibung ein

Wenn ich den Fehler erhalte, wird die Kommunikation plötzlich unterbrochen. Von einem Versuch zum nächsten tritt das Problem an verschiedenen Stellen während der Kommunikation auf.

Schließlich habe ich meine MAX232-Karte durch eine ältere ersetzt, die den Transistor-Trick anstelle des MAX232-IC verwendet, und alles beginnt ordnungsgemäß zu funktionieren. Mit der alten Karte kann ich die Zielkarte programmieren lassen. Unten sehen Sie die Scope-Aufnahme, die die erfolgreiche Kommunikation während der Programmierung der Zielplatine in diesem Fall zeigt.

Geben Sie hier die Bildbeschreibung ein

Ich übersehen sicherlich etwas, aber ich kann nicht sagen, was es ist. Meine Frage ist also: Was ist mit meinem Setup falsch? Was kann ich noch überprüfen oder messen, um das Problem herauszufinden?

Hier ist die Ausgabe von Arduino IDE und avr-dude:

Binary sketch size: 9.946 bytes (of a 32.256 byte maximum)
C:\Users\Ricardo\Documents\arduino-1.0.5\hardware/tools/avr/bin/avrdude -CC:\Users\Ricardo\Documents\arduino-1.0.5\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -carduino -P\\.\COM5 -b115200 -D -Uflash:w:C:\Users\Ricardo\AppData\Local\Temp\build2465731745810216807.tmp\DefusableClock_v2.cpp.hex:i 

avrdude: Version 5.11, compiled on Sep  2 2011 at 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:\Users\Ricardo\Documents\arduino-1.0.5\hardware/tools/avr/etc/avrdude.conf"

         Using Port                    : \\.\COM5
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
         AVR Part                      : ATMEGA328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino
avrdude: Send: A [41] . [80]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [83] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [81]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [84] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [82]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [04] 
avrdude: Recv: . [90] 

avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x90
avrdude: Send: A [41] . [98]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [03] 
avrdude: Recv: . [10] 
         Hardware Version: 131
         Firmware Version: 132.1077487570
avrdude: Send: A [41] . [84]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [03] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [85]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [03] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [86]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [03] 
avrdude: Recv: . [90] 

avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x90
avrdude: Send: A [41] . [87]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [03] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [89]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [83] 
avrdude: Recv: . [10] 
         Vtarget         : 0.3 V
         Varef           : 0.3 V
         Oscillator      : 921.600 kHz
         SCK period      : 142.2 us

avrdude: Send: A [41] . [81]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [04] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [82]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [04] 
avrdude: Recv: . [10] 
avrdude: Send: B [42] . [86] . [00] . [00] . [01] . [01] . [01] . [01] . [03] . [ff] . [ff] . [ff] . [ff] . [00] . [80] . [04] . [00] . [00] . [00] . [80] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: E [45] . [05] . [04] . [d7] . [c2] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: P [50]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: AVR device initialized and ready to accept instructions

Reading | avrdude: Send: u [75]   [20] 
avrdude: Recv: . [14] . [1e] . [95] . [0f] . [10] 
################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f
avrdude: Send: V [56] . [a0] . [03] . [fc] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: V [56] . [a0] . [03] . [fd] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: V [56] . [a0] . [03] . [fe] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: V [56] . [a0] . [03] . [ff] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [90] 
avrdude: stk500_cmd(): protocol error
Ricardo
quelle
6
Schön dokumentiert.
Tcrosley
@tcrosley Danke! Ich habe mein Bestes versucht, aber es gab immer noch einige dunkle Punkte, die ich mit meiner letzten Bearbeitung zu klären versuchte.
Ricardo
2
Gibt es einen Grund, warum die "Reset" -Leitung RS232-Spannungen aufweist und nicht durch den Konverter verläuft? Benötigt der Arduino eine höhere Spannung zum Programmieren oder so?
Markrages
1
Während die Rücksetzschaltung, die Sie haben, möglicherweise die Spannung des RS232-Treibers ohne Beschädigung absorbieren kann, ist ein möglicherweise übersehenes Problem, dass RS232-Treiber und -Empfänger traditionell invertiert werden . Die Logik der Rücksetzleitung kann also rückwärts von dem sein, was die Software erwartet. Sie haben einen nicht verwendeten Empfängerkanal, vielleicht sollten Sie diesen verwenden. Stellen Sie außerdem sicher, dass die Software eine der RTS- oder DTR-Möglichkeiten steuert, für die Sie verkabelt sind. Wenn Sie eine Skizze vorprogrammieren können, die mit der Seriennummer interagieren würde, können Sie eine zusätzliche Validierung durchführen.
Chris Stratton
1
Siehe zum Beispiel ftdichip.com/Support/Documents/DataSheets/Cables/DS_UC232R.pdf, wo die Daten- und Statusleitungen über identische Kanäle des Pegelwandlers verlaufen. Ich glaube, wenn Leute diesen USB-seriellen Chip mit einem Arduino und ohne Pegelverschiebung verwenden, invertieren sie den Reset nicht. Wenn er also einen Wechselrichter im Pegelumsetzer Ihres Kabels durchläuft, muss er einen anderen in Ihrer Schaltung durchlaufen oder es wird entgegengesetzt zu seinem üblichen Sinn enden.
Chris Stratton

Antworten:

2

Ihre Frage war viel zu lang zum Lesen, aber es scheint, dass Sie einige Probleme mit einer Wandlerschaltung vom Typ MAX232 haben. Ich habe mit einer der TI-Varianten des Chips eine scheinbar sehr ähnliche Schaltung hergestellt und sie sogar als Produkt verkauft. Gehen Sie zu www.embedinc.com/products/rslink2 und Sie können die gesamte Dokumentation sehen, von einem Bild über das Platinenlayout bis zum Schaltplan. Vielleicht können Sie sehen, was Sie anders machen.

Eine Sache, die mir beim Überfliegen Ihrer Frage aufgefallen ist, ist, dass Sie Elektrolytkappen verwenden. Überprüfen Sie noch einmal, ob die Polarität korrekt ist. Ein weiteres Problem ist, dass einige COM-Anschlüsse, insbesondere USB-zu-RS-232-Konverter, ohne RTS / CTS nicht funktionieren, unabhängig davon, ob dies in der Software aktiviert ist oder nicht. Beachten Sie, wie ich die Pins 7 und 8 am DB9-F-Anschluss miteinander verbunden habe.

Olin Lathrop
quelle
1
Ich wusste nicht, wie ich die Frage verkürzen sollte, da ich nicht weiß, wo das Problem liegt. Also habe ich beschlossen, alles, was ich habe, im Detail zu zeigen.
Ricardo
Während des Studiums bin ich auf Ihre Produktseite und die von dort verlinkten Schaltpläne gestoßen. Wirklich nett! Aber ich habe es nicht genauer studiert, weil der IC, den Sie verwendet haben, nicht mit meinem kompatibel zu sein schien. Aber ich werde genauer hinsehen. Danke für Ihre Hilfe! +1
Ricardo
Dies kommt einer Antwort, die ich darauf erhalten habe, am nächsten, also akzeptiere ich sie. Vielen Dank!! Ich habe das Problem eingegrenzt: Es bezieht sich auf eine Zunahme von Fehlern (aufgrund von Rauschen oder Kristallsynchronisation) bei 115200 Bit / s, die bei 57600 Bit / s nicht auftreten. Siehe meine andere Frage für Details .
Ricardo
2

Sie sagen, Sie haben Pin 3 des DB9 erfasst und 0-5 V gesehen. Pin 3 empfängt Daten von der Außenwelt und wird von Ihrem seriellen USB-zu-TTL-Kabel angesteuert.

Der MAX232 empfängt RS-232-Pegel an den Pins 8 und 13 und wandelt sie in TTL-Pegel an den Pins 9 bzw. 12 um. Der MAX232 empfängt TTL-Pegel an den Pins 10 und 11 und treibt RS-232-Pegel an den Pins 7 bzw. 14 an.

Um Dr. Indiana Jones, den bekannten Professor für Archäologie, zu paraphrasieren: Sie suchen nach den falschen Stiften.

Lassen Sie einen einfachen 555-Impulsfolgengenerator mit +5 laufen, wenden Sie ihn an Pin 10 des MAX232 (nicht an Ihrem Schaltplan angeschlossen), an Pin 7 des MAX232 an und sehen Sie, was Sie erhalten.

John R. Strohm
quelle
Entschuldigung, ich war vielleicht nicht klar genug. Ich habe kein serielles USB-zu-TTL-Kabel. Ich versuche, eines zu simulieren, indem ich ein USB-zu-RS232-Kabel verwende, das an diesen von mir hergestellten RS232-zu-TTL-Konverter angeschlossen ist.
Ricardo
Bei der Prüfung, die Sie in Ihrem ersten Absatz erwähnt haben, habe ich das USB-zu-RS232-Kabel an meinen Computer angeschlossen und den DB2 nicht angeschlossen. Dann habe ich Pin 3 beim Senden von Daten über das Terminal geprüft. Dann bekam ich das 0V / 5V-Signal und kam zu dem Schluss, dass das Kabel nicht den RS232-Standards entspricht. Gemäß diesem Bild ist Pin 3 TXD am DB9-Stecker. Oder bin ich nur verwirrt?
Ricardo
Pin 3 am männlichen DB9 überträgt also Daten vom Computer und steuert Daten in den RS232-zu-TTL-Wandler, oder? Es ist das Gegenteil von dem, was Sie in Ihrem ersten Absatz gesagt haben.
Ricardo
Außerdem habe ich getan, was Sie im letzten Absatz Ihrer Antwort vorgeschlagen haben. Ich habe eine 0 / 5V-Rechteckwelle von ungefähr 68 kHz an Pin 10 des MAX232 und Pin 7 des MAX232 angelegt. Ich habe ein schönes und sauberes invertiertes -6V / + 6V RS232-Signal.
Ricardo
1
@ JohnR.Strohm Das OP sagte jedoch, er könne die Pins 11 und 12 des MAX232 kurzschließen und den MAX232 mit dem DB9 an ein Kabel anschließen, das von einem PC kommt. Das heißt , die DB9 hat korrekt verdrahtet werden, oder der Sender / Empfänger in dem MAX232 würde nicht auf den TX / RX - Pins auf dem DB9 richtig angeschlossen werden.
Tcrosley