Novato en serie: ¿por qué no puedo simplemente conectar los cables?

14

Estoy tratando de transmitir desde un ATtiny85 a una PC usando el código Arduino-esque a través de un convertidor USB-Serial sin entender mucho de nada. Me sorprendió y me horrorizó que no funcionara.

Confirmé que el diminuto está parpadeando el voltaje en uno de sus pines, pero cuando conecto ese pin para transmitir o recibir en el cable USB serie e intento escuchar con un programa de terminal, no obtengo nada.

No estoy seguro de cómo saber qué parte está rota.

  

¿Necesito más que VCC, GND y TXD para transmitir en serie?

Detalles :

El código para el diminuto está escrito en el entorno de Arduino y un código similar parpadea con éxito en los 4 pines "PORTB", al menos de acuerdo con los LED. Utilizo el código de HLT y Saporetti para dejarme usar el dialecto Arduino de C ++ para programarlo. El programa todavía viene bajo una K

#include <SoftwareSerial.h>

SoftwareSerial s(0,1); //receive on "0", and transmit on "1" aka "PB1" aka pin 6

void setup() { s.begin(4800); } // assuming 1Mhz, 4800 baud
void loop() { s.println(millis()); } // transmit something at every opportunity

Hay mucha traducción involucrada, pero el código es bastante básico. El código que establece la velocidad en baudios parece asumir 1MHz, pero afortunadamente mi attiny tiene fusibles predeterminados de fábrica y funciona a 1MHz. En cualquier caso, el pin 6 está parpadeando su voltaje de acuerdo con el LED.

Así que uso los pequeños cables para conectar el extremo "ftdi" del FTDI USB-serial converter a tiny: black a GND, red a VCC, orange a 6. Abro el programa "minicom" en la PC, establezco la velocidad en baudios a 4800 y no espero nada. Al hablar con mi Boarduino , no tiene problemas.

El cable convertidor FTDI tiene el siguiente pinout: negro es GND, marrón es "CTS", rojo es VCC (+ 4.98V), naranja es "TXD", amarillo es "RXD", verde es "RTS".

  

Si quiero transmitir desde el pequeño a la PC, ¿debería parpadear el voltaje en "TXD" o "RXD"? En otras palabras, ¿el cable de transmisión para transmitir del esclavo al host o el host al esclavo?

En realidad probé ambos, ninguno funcionó. He frito menos de un dólar de equipo hasta ahora, y me estoy volviendo engreído, así que simplemente conecto los cables al cable. Tal vez no deba ignorar los cables "CTS" y "RTS".

  

¿Necesito usar otros cables? ¿RTS y CTS hacen algo?

El hardware es un ATTiny85-PU (paquete DIP-8, que funciona a 1MHz, clasificado a 20MHz) alimentado por USB a 4.98V. El PC host es un MacBook, y hace arduino todo lo que hace con éxito, incluido el uso de ArduinoISP para programar el ATtiny para parpadear su pequeño corazón.

    
pregunta Jack Schmidt

2 respuestas

9

Definitivamente puedes transmitir datos usando solo TX & GND.

En primer lugar, desea conectar la línea ATtiny85 TX a la línea FTDI RX (amarilla en el TTL-232R). Asegúrese de que el adaptador USB pueda manejar 5V; estoy bastante seguro de que incluso el 3.3L TTL-232R es tolerante a 5V.

De acuerdo con la página de ejemplo de SoftwareSerial , debe establecer la dirección de TX & Líneas de RX en su función de configuración:

// include the SoftwareSerial library so you can use its functions:
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
#define ledPin 13

// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
byte pinState = 0;

void setup()  {
  // define pin modes for tx, rx, led pins:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
}

La velocidad en baudios será de 4800 en su caso. La biblioteca de SoftwareSerial no parece admitir CTS & RTS, así que asegúrate de no usarlos en el software host.

Consulte la página de referencia para obtener más detalles, donde hablan sobre posibles problemas de tiempo que pueden agravarse. si está ejecutando a 1MHz usando el oscilador interno en el pequeño.

    
respondido por el Peter Gibson
6

Entonces, la respuesta parece ser: usted puede simplemente conectar los cables, de hecho, solo GND (negro) y RXD (amarillo), y todo funciona siempre que el software sea bueno.

Cosas que no importaban:

  • El oscilador interno funciona bien. Parece relativamente estable a mis pruebas limitantes. A 9600 baudios, cualquier problema que tenga es insignificante.

  • El uso de la alimentación por USB en las señales funciona bien. Puede usar una fuente de voltaje separada (compartiendo una conexión a tierra común), pero el cable FTDI lee perfectamente las señales de 3V y 5V. Conecté una batería, - a GND tanto del FTDI como del diminuto, + al VCC del diminuto, y esto funcionó bien. Sin embargo, solo usar el VCC (rojo) del FTDI (USB 5V) es mucho más simple y efectivo.

Cosas que hice mal:

  • La línea amarilla "RXD" de FTDI recibe bits del microcontrolador, por lo que se conecta a la transmisión en el microcontrolador. Podría haberlo resuelto yo mismo conectando las líneas de transmisión y recepción (naranja y amarilla) a los LED o un Arduino y comprobando qué voltaje parpadeaba cuando transmití desde la PC.

  • Ni SoftwareSerial ni NewSoftSerial funcionan fuera de la caja con un ATTIN. Si bien el ATmega328p y el ATtiny85 comparten muchas similitudes, existen suficientes diferencias para que el simple hecho de compilar el nuevo chip no sea suficiente.

  • Las velocidades de transmisión más lentas no curan las cosas. 300 baudios requieren rutinas de retardo más complicadas ya que el número de ciclos entre bits es significativamente más que un contador de 8 bits. 9600 baudios funcionan bien, y se pueden lograr mayores velocidades en baudios.

  • Tenga cuidado al escribir código crítico de tiempo en C, especialmente en las funciones en línea. El tiempo de ejecución dependerá de cómo el compilador lo optimice. En particular, al calibrar el retardo simplemente cambiándolo hacia arriba y hacia abajo, obtendrá una respuesta diferente a la del uso de un retardo constante (tiempo de compilación detectable), porque el ensamblaje generado puede ser bastante diferente. No es que C sea "lento", sino que fue demasiado rápido. En un momento dado, estaba enviando 1s más rápido que 0s (probablemente son más aerodinámicos).

  • Para iniciar una transmisión, traiga la línea LOW (el bit de inicio) y luego debe asegurarse de que la línea esté en el voltaje correcto en cada uno de los siguientes 8 puntos de muestra, y luego asegurarse de que el voltaje Es ALTO en la novena muestra. NewSoftSerial menciona hacer un retraso de media longitud en el bit de inicio, pero esto no funcionó bien para mí. Utilicé un retraso del 75% en el inicio y un retraso del 125% en el final.

  • La preocupación real por el voltaje puede ser que algunos "en serie" (especialmente RS232) son ± 12V, no 0V / 5V. Pasé mucho tiempo tratando de entender cómo podía ajustar el voltaje de 5V a 3.3V, pero creo que eso fue completamente irrelevante.

En cualquier caso, la transmisión en serie es fácil, pero obtener el tiempo "perfecto" parece bastante importante. Para mí, esto era solo una cuestión de codificar la transmisión en ensamblaje para poder contar los ciclos.

    
respondido por el Jack Schmidt

Lea otras preguntas en las etiquetas