Diseñé una placa convertidora RS232 a TTL basada en el IC MAX232 de TI que planeo usar para programar algunas placas Arduino personalizadas que tengo. Sin embargo, tengo problemas con la placa y espero que alguien pueda ayudarme a solucionarlo.
Primero, déjame mostrarte mi configuración, a continuación.
Aquí hay una breve descripción de lo que hay en la imagen:
Tablero de destino (A) : es un tablero ATmega328P independiente personalizado (un reloj) que tengo la intención de programar usando la programación en serie y el IDE de Arduino. Se conecta a la Placa B a través de un cable tipo FTD a través del Conector (H) .
Placa convertidora de RS232 a TTL (B) : es la placa convertidora de RS232 a TTL basada en MAX232 que diseñé y estoy tratando de depurar. Es el tema principal de esta pregunta. Está conectado a la placa de destino (A) con el cable tipo FTDI a través del conector (G) y al cable USB a RS232 (C) a través de un conector hembra DB9 (F) .
Cable USB a RS232 (C) : no tengo un puerto COM adecuado en mi PC, así que eso es lo que uso para obtener un puerto serie. Se conecta a la PC a través de un conector USB (D) ya la Placa B a través de un Conector DB9 Macho (E) .
Los esquemas de la placa B están a continuación.
El esquema del encabezado de programación en la placa de destino (A) se muestra a continuación.
Lo primero que me di cuenta es que el cable USB a RS232 (C) es del tipo económico . En lugar de entregar niveles de señal estándar RS232 en el rango de -12V/+12V, entrega 0V/5V. Supuse que usando la siguiente prueba: conecté el cable USB a RS232 (C) a la PC y desconecté el conector DB9 macho (E) de la placa convertidora (B) y probé el pin 3 del conector DB9 macho (E) mientras enviaba una serie de caracteres ASCII 'A'
a través del monitor serial. A continuación se muestra la toma de alcance resultante de esta prueba.
Por cierto, he notado que los diversos IC MAX232 fabricados por varios proveedores están diseñados para hacer frente a esta violación de los niveles de señal RS232 y también aceptan señales de 0V/5V. A continuación hay dos tomas de alcance que usé para probarlo. En la primera toma, apliqué una onda cuadrada de 0V/5V en el pin 13 del MAX232 (mientras estaba insertado y alimentado por mi placa convertidora) con mi generador de funciones casero (ruidoso, sí), ese es el rastro amarillo, y verifiqué la salida del pin 12 ( Nivel TTL RX - rastro verde). Para mi sorpresa, el MAX232 de TI responde con las señales TTL correctas. El segundo disparo es una señal RS232 -6V/+6V correcta simulada por una onda cuadrada que inserté en el mismo pin. Ambos dan los mismos resultados.
Hice algunas otras mediciones en mi placa convertidora (B) hasta el punto en que quedé satisfecho con ella. Por ejemplo, el pin 2 en MAX232 muestra +9.5V mientras que el pin 6 muestra -9.5V. El osciloscopio muestra que el duplicador de voltaje y el inversor también funcionan bien, con una onda cuadrada agradable y constante de 40 kHz en cada caso. También apliqué una onda cuadrada de 0/5 V de aproximadamente 68 kHz al pin 10 del MAX232 y al pin 7 del MAX232. Obtuve una buena y limpia señal invertida -6V/+6V RS232 (las imágenes no se muestran aquí).
Luego probé el eco del monitor en serie acortando los pines TX/RX en varios puntos. Los resultados donde:
Luego conecté la configuración para programar mi placa de destino ATmega328P (A) . El resultado de avr-dude se muestra al final de esta publicación. A continuación se muestra un resumen con solo el mensaje de error:
...
avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x90
...
avrdude: stk500_cmd(): protocol error
Durante este intento de programación, medí las señales a continuación. El rastro amarillo son los datos que se envían a la MCU, mientras que el rastro verde son los datos que recibe:
Cuando recibo el error, hay una interrupción repentina en la comunicación. De un intento a otro, el problema ocurre en diferentes puntos durante la comunicación.
Finalmente, reemplacé mi placa MAX232 con una más antigua que tengo, que usa el truco del transistor en lugar del MAX232 IC, y todo comienza a funcionar correctamente. Con la placa anterior puedo programar la placa de destino. A continuación se muestra la captura de alcance que muestra la comunicación exitosa durante la programación de la placa de destino en este caso.
Ciertamente estoy pasando por alto algo, pero no puedo decir qué es. Entonces mi pregunta es: ¿qué pasa con mi configuración? ¿Qué más puedo comprobar o medir para resolver el problema?
Aquí está el IDE de Arduino y la salida 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
Su pregunta fue demasiado larga para leer, pero parece que tiene algunos problemas con un circuito convertidor de tipo MAX232. Hice lo que parece ser un circuito muy similar usando una de las variantes TI del chip e incluso lo vendo como un producto. Vaya a www.embedinc.com/products/rslink2 y podrá ver toda la documentación, desde una imagen hasta el diseño de la placa y el esquema. Tal vez puedas ver lo que estás haciendo de manera diferente.
Una cosa que noté mientras revisaba su pregunta es que está usando tapas electrolíticas. Vuelva a verificar que la polaridad de cada uno sea correcta. Otro problema es que algunos puertos COM, en particular los convertidores de USB a RS-232, no funcionarán sin RTS/CTS, ya sea que esté habilitado en el software o no. Observe cómo tengo los pines 7 y 8 conectados entre sí en el conector DB9-F.
Dices que miraste el pin 3 del DB9 y viste 0-5V. El pin 3 recibe datos del mundo exterior y es impulsado por su cable serial USB a TTL.
El MAX232 recibe niveles RS-232 en los pines 8 y 13, convirtiéndolos a niveles TTL en los pines 9 y 12, respectivamente. El MAX232 recibe niveles TTL en los pines 10 y 11, impulsando niveles RS-232 en los pines 7 y 14, respectivamente.
Parafraseando al Dr. Indiana Jones, el destacado profesor de arqueología, estás mirando los pines equivocados.
Ejecute un generador de tren de pulsos 555 simple fuera de +5, aplíquelo al pin 10 del MAX232 (no conectado en su esquema), alcance el pin 7 del MAX232 y vea lo que obtiene.
crosley
ricardo
marcajes
ricardo
chris stratton
ricardo
chris stratton
ricardo
chris stratton
ricardo
chris stratton