SoftwareSerial en Arduino Mega

4

Estoy intentando averiguar si puedo enviar y recibir datos en serie en los puertos 23 y 25 del Arduino Mega 2560, y estoy muy confundido por la información aparentemente contradictoria en el sitio web de Arduino. De la página SoftwareSerial :

  

No todos los pines en Mega y Mega 2560 admiten interrupciones de cambio, por lo que solo se pueden usar los siguientes para RX: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

En la página de Arduino Mega :

  

Una biblioteca de SoftwareSerial permite la comunicación en serie en cualquiera de los pines digitales de Mega2560.

Los pines que especifica como compatibles con las interrupciones son:

  

2 (interrupción 0), 3 (interrupción 1), 18 (interrupción 5), 19 (interrupción 4), 20 (interrupción 3) y 21 (interrupción 2).

y no se superpongan con los pines que la primera cita. Estos parecen completamente contradictorios. ¿Me estoy perdiendo de algo? ¿Puedo usar la serie en los puertos 23 y 25?

    
pregunta 0xFE

2 respuestas

3

La razón detrás de la discrepancia en la documentación es que la documentación se refiere a dos versiones diferentes del software y está desactualizada.

En la versión 0023 de Arduino e inferior, SoftSerial era una biblioteca muy básica escrita por David Mellis. Solo usa millis (), digitalRead / Write y bloquea al enviar o recibir. Esto significa que puede funcionar en cualquier pin. Sin embargo, funciona mal y lentamente. Recomiendo encarecidamente evitar esto.

En Arduino versión 1 y superior, SoftSerial fue reemplazado por NewSoftSerial . Esto utiliza interrupciones y temporizadores, y es mucho más eficiente. Esto limita los pines en los que puede funcionar, aunque a los que tienen interrupciones de cambio de pines.

Con respecto a los pines contradictorios; Hay dos tipos de pin de interrupción en el ATmega2560: las interrupciones externas (INT7 - INT0) y las interrupciones de cambio de pin (PCINT23 - PCINT0). Las interrupciones externas son más complejas y pueden configurarse para activarse en bordes ascendentes y / o descendentes. Las interrupciones de cambio de pin se activan siempre que se produzca algún cambio.

La larga lista de:

10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

son interrupciones de cambio de pin que son las que se requieren para NewSoftSerial (llamado SoftSerial en Arduino 1.0 y versiones posteriores).

La lista corta de:

2 (interrupt 0), 3 (interrupt 1), 18 (interrupt 5), 19 (interrupt 4), 20 (interrupt 3), and 21 (interrupt 2).

son interrupciones externas.

Puede verlos en el diagrama de asignación de pines para el ATmega2560 (que es correcto, AFAIK). La función de los pines de interrupción se describe en la página 105 en adelante de la hoja de datos .

Hay 4 USARTs de hardware en el ATmega2560. Estos son mucho más fáciles de usar y mucho más eficientes que cualquier biblioteca de serie de software. Están en los pines 0/1, 14/15, 16/17, 18/19.

También hay AltSoftSerial que es mejor que NewSoftSerial en términos de rendimiento, pero está aún más limitado en el pin elección.

En esta etapa, tengo que preguntar "¿por qué esos pines?". ¿No podría cambiar el diseño?

    
respondido por el Cybergibbons
2

Se topó con la diferencia entre el hardware serie / UART y la serie emulada en el software.

serie de hardware

Los siguientes pines admiten serie de hardware / UART. Implica poca sobrecarga del procesador ya que el hardware se encarga del trabajo duro.

  

Serie: 0 (RX) y 1 (TX); Serial 1: 19 (RX) y 18 (TX); Serie 2: 17   (RX) y 16 (TX); Serial 3: 15 (RX) y 14 (TX). Se utiliza para recibir (RX)   y transmitir (TX) datos en serie TTL. Los pines 0 y 1 también están conectados a   los pines correspondientes del chip serie ATmega16U2 USB a TTL.

Use los comandos que se encuentran en esta página: enlace

serie de software

La biblioteca de SoftwareSerial a la que hace referencia no usa el hardware integrado de UART, en su lugar usa software para emular el puerto serie. Utiliza varios mecanismos de tiempo (como interrupciones) y bit banging (directamente impulsando los pines bajo / alto) para actuar como si fuera un UART real.

  

No todos los pines en Mega y Mega 2560 admiten interrupciones de cambio, por lo que   solo se puede usar lo siguiente para RX: 10, 11, 12, 13, 50, 51, 52, 53,   62, 63, 64, 65, 66, 67, 68, 69

Use los comandos que se encuentran en esta página: enlace

en conclusión

Sin conocer sus requisitos exactos, diría que primero use el hardware de UART (debido a una menor sobrecarga de la CPU) y si se queda sin ellos, use SoftwareSerial.

    
respondido por el jippie

Lea otras preguntas en las etiquetas